diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/FlagSet.scala b/compiler/src/dotty/tools/dotc/tastyreflect/FlagSet.scala index 51a20c91c0e3..27f56edb6e2c 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/FlagSet.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/FlagSet.scala @@ -48,7 +48,7 @@ class FlagSet(flags: Flags.FlagSet) extends scala.tasty.FlagSet { if (isInline) flags += "inline" if (isMacro) flags += "macro" if (isStatic) flags += "javaStatic" - if (isObject) flags += "module" + if (isObject) flags += "object" if (isTrait) flags += "trait" if (isLocal) flags += "local" if (isSynthetic) flags += "synthetic" diff --git a/library/src/scala/tasty/util/ShowSourceCode.scala b/library/src/scala/tasty/util/ShowSourceCode.scala index 07265e834e90..c4b18859deec 100644 --- a/library/src/scala/tasty/util/ShowSourceCode.scala +++ b/library/src/scala/tasty/util/ShowSourceCode.scala @@ -112,8 +112,24 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty } } + def keepDefinition(d: Definition): Boolean = { + val flags = d.flags + def isCaseClassUnOverridableMethod: Boolean = { + // Currently the compiler does not allow overriding some of the methods generated for case classes + d.flags.isSynthetic && + (d match { + case DefDef("apply" | "unapply", _, _, _, _) if d.owner.flags.isObject => true + case DefDef(n, _, _, _, _) if d.owner.flags.isCase => + n == "copy" || + n.matches("copy\\$default\\$[1-9][0-9]*") || // default parameters for the copy method + n.matches("_[1-9][0-9]*") // Getters from Product + case _ => false + }) + } + !flags.isParam && !flags.isParamAccessor && !isCaseClassUnOverridableMethod + } val stats1 = stats.collect { - case stat@Definition() if !stat.flags.isParam && !stat.flags.isParamAccessor => stat + case stat@Definition() if keepDefinition(stat) => stat case stat@Import(_, _) => stat case stat@Term() => stat } @@ -721,6 +737,10 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty case Type.ThisType(tp) => printType(tp) + tp match { + case Type.SymRef(cdef @ ClassDef(_, _, _, _, _), _) if !cdef.flags.isObject => this += ".this" + case _ => this + } case _ => throw new MatchError(tpe.show) diff --git a/tests/pos/simpleCaseClass-1.decompiled b/tests/pos/simpleCaseClass-1.decompiled new file mode 100644 index 000000000000..c746d4e0e995 --- /dev/null +++ b/tests/pos/simpleCaseClass-1.decompiled @@ -0,0 +1,19 @@ +/** Decompiled from out/posTestFromTasty/pos/simpleCaseClass-1/A.class */ +case class A() { + override def hashCode(): scala.Int = 1914112431 + override def equals(x$0: scala.Any): scala.Boolean = this.eq(x$0.asInstanceOf[java.lang.Object]).||(x$0 match { + case x$0: A => + true + case _ => + false + }) + override def toString(): java.lang.String = scala.runtime.ScalaRunTime._toString(this) + override def canEqual(that: scala.Any): scala.Boolean = that.isInstanceOf[A] + override def productArity: scala.Int = 0 + override def productPrefix: java.lang.String = "A" + override def productElement(n: scala.Int): scala.Any = n match { + case _ => + throw new java.lang.IndexOutOfBoundsException(n.toString()) + } +} +object A extends scala.Function0[A] diff --git a/tests/pos/simpleCaseClass-1.scala b/tests/pos/simpleCaseClass-1.scala new file mode 100644 index 000000000000..29dfccec5b49 --- /dev/null +++ b/tests/pos/simpleCaseClass-1.scala @@ -0,0 +1 @@ +case class A() diff --git a/tests/pos/simpleCaseClass-2.decompiled b/tests/pos/simpleCaseClass-2.decompiled new file mode 100644 index 000000000000..9999e406ac6c --- /dev/null +++ b/tests/pos/simpleCaseClass-2.decompiled @@ -0,0 +1,25 @@ +/** Decompiled from out/posTestFromTasty/pos/simpleCaseClass-2/A.class */ +case class A(x: scala.Int) { + override def hashCode(): scala.Int = { + var acc: scala.Int = 65 + acc = scala.runtime.Statics.mix(acc, A.this.x) + scala.runtime.Statics.finalizeHash(acc, 1) + } + override def equals(x$0: scala.Any): scala.Boolean = this.eq(x$0.asInstanceOf[java.lang.Object]).||(x$0 match { + case x$0: A => + this.x.==(x$0.x) + case _ => + false + }) + override def toString(): java.lang.String = scala.runtime.ScalaRunTime._toString(this) + override def canEqual(that: scala.Any): scala.Boolean = that.isInstanceOf[A] + override def productArity: scala.Int = 1 + override def productPrefix: java.lang.String = "A" + override def productElement(n: scala.Int): scala.Any = n match { + case 0 => + this._1 + case _ => + throw new java.lang.IndexOutOfBoundsException(n.toString()) + } +} +object A extends scala.Function1[scala.Int, A] diff --git a/tests/pos/simpleCaseClass-2.scala b/tests/pos/simpleCaseClass-2.scala new file mode 100644 index 000000000000..9917b2d98745 --- /dev/null +++ b/tests/pos/simpleCaseClass-2.scala @@ -0,0 +1 @@ +case class A(x: Int) diff --git a/tests/pos/simpleCaseClass-3.decompiled b/tests/pos/simpleCaseClass-3.decompiled new file mode 100644 index 000000000000..44f388571512 --- /dev/null +++ b/tests/pos/simpleCaseClass-3.decompiled @@ -0,0 +1,25 @@ +/** Decompiled from out/posTestFromTasty/pos/simpleCaseClass-3/A.class */ +case class A[T](x: T) { + override def hashCode(): scala.Int = { + var acc: scala.Int = 65 + acc = scala.runtime.Statics.mix(acc, scala.runtime.Statics.anyHash(A.this.x)) + scala.runtime.Statics.finalizeHash(acc, 1) + } + override def equals(x$0: scala.Any): scala.Boolean = this.eq(x$0.asInstanceOf[java.lang.Object]).||(x$0 match { + case x$0: A[A.this.T] => + this.x.==(x$0.x) + case _ => + false + }) + override def toString(): java.lang.String = scala.runtime.ScalaRunTime._toString(this) + override def canEqual(that: scala.Any): scala.Boolean = that.isInstanceOf[A[A.this.T]] + override def productArity: scala.Int = 1 + override def productPrefix: java.lang.String = "A" + override def productElement(n: scala.Int): scala.Any = n match { + case 0 => + this._1 + case _ => + throw new java.lang.IndexOutOfBoundsException(n.toString()) + } +} +object A extends scala.AnyRef diff --git a/tests/pos/simpleCaseClass-3.scala b/tests/pos/simpleCaseClass-3.scala new file mode 100644 index 000000000000..e47cc6ccfd4f --- /dev/null +++ b/tests/pos/simpleCaseClass-3.scala @@ -0,0 +1 @@ +case class A[T](x: T)