Skip to content

abnormal long compilation time of match over case classes structure #13565

Closed
@rssh

Description

@rssh

Compiler version

3.1.0-RC2

Minimized example

package ips.clang

trait LongCompilation {

  def toCastExpression(expr: Expression): CastExpression =
    expr match
      case cExpr: CastExpression => cExpr
      case _ => WrappedExpression(expr)

}
sealed trait C_Ast
sealed trait Expression extends C_Ast

sealed trait PrimaryExpression extends PostfixExpression
case class Identifier(value:String)  extends PrimaryExpression
case class IntConstant(value: Int)  extends PrimaryExpression
case class CharConstant(value: Char)  extends PrimaryExpression
case class StringLiteral(value: String) extends PrimaryExpression
case class WrappedExpression(value: Expression)  extends PrimaryExpression
case class GenericSelection( qualifier: PrecAssigmentExpression, associations: List[Int] )

sealed trait PostfixExpression extends UnaryExpression
case class ArrayIndexExpression(base: PostfixExpression, index: Expression) extends PostfixExpression
case class FunctionCallExpression(fun: PostfixExpression, arguments: List[PrecAssigmentExpression]) extends PostfixExpression
case class DotSelectExpression(qualifier: PostfixExpression, select: Identifier) extends PostfixExpression
case class ArrowSelectExpression(qualifier: PostfixExpression, select: Identifier) extends PostfixExpression
case class PostfixIncrementExpression(base: PostfixExpression) extends PostfixExpression
case class PostfixDecrementExpression(base: PostfixExpression) extends PostfixExpression
case class CompoundLiteral(typeName: TypeName, initializers: List[Int]) extends PostfixExpression

sealed trait UnaryExpression extends CastExpression
case class PrefixIncrementExpression(base: UnaryExpression) extends UnaryExpression
case class PrefixDecrementExpression(base: UnaryExpression) extends UnaryExpression
case class UnaryOperatorExpression(op: String, argument: CastExpression) extends UnaryExpression
case class SizeofConstExpression(expression: UnaryExpression) extends UnaryExpression
case class SizeofTypeExpression(typeName: TypeName) extends UnaryExpression
// each AdditionalUnaryExpressionX increase compilation time
sealed trait AdditionalUnaryExpression1 extends UnaryExpression
sealed trait AdditionalUnaryExpression2 extends UnaryExpression
sealed trait AdditionalUnaryExpression3 extends UnaryExpression
sealed trait AdditionalUnaryExpression4 extends UnaryExpression
sealed trait AdditionalUnaryExpression5 extends UnaryExpression

sealed trait CastExpression extends MultiplicativeExpression
case class Cast(typeName: TypeName, argument: CastExpression) extends CastExpression

sealed trait BinaryExpression {
  def op: String
  def frs: Expression
  def snd: Expression
}

sealed trait MultiplicativeExpression extends AdditiveExpression
case class MultiplicativeBinaryExpression(op: String,
                                          frs: MultiplicativeExpression,
                                          snd: CastExpression) extends MultiplicativeExpression
                                                                 with BinaryExpression

sealed trait AdditiveExpression extends ShiftExpression
case class AdditiveBinaryExpression(op: String,
                                    frs: MultiplicativeExpression,
                                    snd: CastExpression) extends MultiplicativeExpression with BinaryExpression

sealed trait ShiftExpression extends RelationalExpression
case class ShiftBinaryExpression(op: String,
      frs: MultiplicativeExpression, snd: CastExpression) extends MultiplicativeExpression with BinaryExpression

sealed trait RelationalExpression extends EqualityExpression
case class RelationalBinaryExpression(op: String,
      frs: RelationalExpression, snd: ShiftExpression) extends RelationalExpression with BinaryExpression

sealed trait EqualityExpression extends PrecAndExpression
case class EqualityBinaryExpression(op: String,
      frs: RelationalExpression, snd: ShiftExpression) extends EqualityExpression with BinaryExpression

sealed trait PrecAndExpression extends PrecExclusiveOrExpression
case class AndBinaryExpression(op: String,
     frs: PrecAndExpression, snd: EqualityExpression) extends PrecAndExpression with BinaryExpression


sealed trait PrecExclusiveOrExpression extends PrecInclusiveOrExpression
case class ExclusiveOrBinaryExpression(
    op: String,
    frs: PrecExclusiveOrExpression,
    snd: PrecAndExpression) extends PrecExclusiveOrExpression with BinaryExpression

sealed trait PrecInclusiveOrExpression extends PrecLogicalAndExpression
case class InclusiveOrBinaryExpression(op: String,
          frs: PrecExclusiveOrExpression,
          snd: PrecAndExpression) extends PrecInclusiveOrExpression with BinaryExpression

sealed trait PrecLogicalAndExpression extends PrecLogicalOrExpression
case class LogicalAndBinaryExpression(op: String,
    frs: PrecLogicalAndExpression,
    snd: PrecInclusiveOrExpression) extends PrecLogicalAndExpression with BinaryExpression

sealed trait PrecLogicalOrExpression extends PrecConditionalExpression
case class LogicalOrBinaryExpression(op: String,
        frs: PrecLogicalAndExpression,
        snd: PrecInclusiveOrExpression) extends PrecLogicalOrExpression with BinaryExpression


sealed trait PrecConditionalExpression extends PrecAssigmentExpression
case class ConditionalExpression(
        cond: PrecLogicalOrExpression,
        frs: Expression,
        snd: PrecConditionalExpression) extends PrecConditionalExpression

sealed trait PrecAssigmentExpression extends Expression
case class AssigmentExpression(
        op: String,
        frs: UnaryExpression,
        snd: PrecAssigmentExpression) extends PrecAssigmentExpression

case class CommaExpression(frs: Expression, snd: Expression) extends Expression
case class CommaExpression2(frs: Expression, snd: Expression) extends Expression

case class Declarator(pointer: Option[Pointer], base: String)
case class TypeName(specifiers: List[DeclarationSpecifier], declarator: Option[AbstractDeclarator])

sealed trait AbstractDeclarator
case class Pointer( typeQual: List[DeclarationSpecifier], pointer: Option[Pointer]) extends AbstractDeclarator

sealed trait DeclarationSpecifier

Output

info] compiling 1 Scala source to /Users/rssh/work/oss/algorithmic-algebras-embedding/target/scala-3.1.0-RC2/classes ...
[success] Total time: 151 s (02:31), completed 20 Sept 2021, 07:38:15

Expectation

compilation speed should be significantly faster.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions