Skip to content

Commit f84d017

Browse files
committed
Fix case class decompilation
1 parent b3d3b33 commit f84d017

File tree

8 files changed

+94
-2
lines changed

8 files changed

+94
-2
lines changed

compiler/src/dotty/tools/dotc/tastyreflect/FlagSet.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class FlagSet(flags: Flags.FlagSet) extends scala.tasty.FlagSet {
4848
if (isInline) flags += "inline"
4949
if (isMacro) flags += "macro"
5050
if (isStatic) flags += "javaStatic"
51-
if (isObject) flags += "module"
51+
if (isObject) flags += "object"
5252
if (isTrait) flags += "trait"
5353
if (isLocal) flags += "local"
5454
if (isSynthetic) flags += "synthetic"

library/src/scala/tasty/util/ShowSourceCode.scala

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,24 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty
112112
}
113113
}
114114

115+
def keepDefinition(d: Definition): Boolean = {
116+
val flags = d.flags
117+
import flags._
118+
def isCaseUnOverridableMethod: Boolean = {
119+
d.flags.isSynthetic &&
120+
(d match {
121+
case DefDef("apply" | "unapply", _, _, _, _) if d.owner.flags.isObject => true
122+
case DefDef(n, _, _, _, _) if d.owner.flags.isCase =>
123+
n == "copy" ||
124+
n.matches("copy\\$default\\$[1-9][0-9]*") || // default parameters for the copy method
125+
n.matches("_[1-9][0-9]*") // Getters from Product
126+
case _ => false
127+
})
128+
}
129+
!isParam && !isParamAccessor && !isCaseUnOverridableMethod
130+
}
115131
val stats1 = stats.collect {
116-
case stat@Definition() if !stat.flags.isParam && !stat.flags.isParamAccessor => stat
132+
case stat@Definition() if keepDefinition(stat) => stat
117133
case stat@Import(_, _) => stat
118134
case stat@Term() => stat
119135
}
@@ -721,6 +737,10 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty
721737

722738
case Type.ThisType(tp) =>
723739
printType(tp)
740+
tp match {
741+
case Type.SymRef(cdef @ ClassDef(_, _, _, _, _), _) if !cdef.flags.isObject => this += ".this"
742+
case _ => this
743+
}
724744

725745
case _ =>
726746
throw new MatchError(tpe.show)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/** Decompiled from out/posTestFromTasty/pos/simpleCaseClass-1/A.class */
2+
case class A() {
3+
override def hashCode(): scala.Int = 1914112431
4+
override def equals(x$0: scala.Any): scala.Boolean = this.eq(x$0.asInstanceOf[java.lang.Object]).||(x$0 match {
5+
case x$0: A =>
6+
true
7+
case _ =>
8+
false
9+
})
10+
override def toString(): java.lang.String = scala.runtime.ScalaRunTime._toString(this)
11+
override def canEqual(that: scala.Any): scala.Boolean = that.isInstanceOf[A]
12+
override def productArity: scala.Int = 0
13+
override def productPrefix: java.lang.String = "A"
14+
override def productElement(n: scala.Int): scala.Any = n match {
15+
case _ =>
16+
throw new java.lang.IndexOutOfBoundsException(n.toString())
17+
}
18+
}
19+
object A extends scala.Function0[A]

tests/pos/simpleCaseClass-1.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
case class A()
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/** Decompiled from out/posTestFromTasty/pos/simpleCaseClass-2/A.class */
2+
case class A(x: scala.Int) {
3+
override def hashCode(): scala.Int = {
4+
var acc: scala.Int = 65
5+
acc = scala.runtime.Statics.mix(acc, A.this.x)
6+
scala.runtime.Statics.finalizeHash(acc, 1)
7+
}
8+
override def equals(x$0: scala.Any): scala.Boolean = this.eq(x$0.asInstanceOf[java.lang.Object]).||(x$0 match {
9+
case x$0: A =>
10+
this.x.==(x$0.x)
11+
case _ =>
12+
false
13+
})
14+
override def toString(): java.lang.String = scala.runtime.ScalaRunTime._toString(this)
15+
override def canEqual(that: scala.Any): scala.Boolean = that.isInstanceOf[A]
16+
override def productArity: scala.Int = 1
17+
override def productPrefix: java.lang.String = "A"
18+
override def productElement(n: scala.Int): scala.Any = n match {
19+
case 0 =>
20+
this._1
21+
case _ =>
22+
throw new java.lang.IndexOutOfBoundsException(n.toString())
23+
}
24+
}
25+
object A extends scala.Function1[scala.Int, A]

tests/pos/simpleCaseClass-2.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
case class A(x: Int)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/** Decompiled from out/posTestFromTasty/pos/simpleCaseClass-3/A.class */
2+
case class A[T](x: T) {
3+
override def hashCode(): scala.Int = {
4+
var acc: scala.Int = 65
5+
acc = scala.runtime.Statics.mix(acc, scala.runtime.Statics.anyHash(A.this.x))
6+
scala.runtime.Statics.finalizeHash(acc, 1)
7+
}
8+
override def equals(x$0: scala.Any): scala.Boolean = this.eq(x$0.asInstanceOf[java.lang.Object]).||(x$0 match {
9+
case x$0: A[A.this.T] =>
10+
this.x.==(x$0.x)
11+
case _ =>
12+
false
13+
})
14+
override def toString(): java.lang.String = scala.runtime.ScalaRunTime._toString(this)
15+
override def canEqual(that: scala.Any): scala.Boolean = that.isInstanceOf[A[A.this.T]]
16+
override def productArity: scala.Int = 1
17+
override def productPrefix: java.lang.String = "A"
18+
override def productElement(n: scala.Int): scala.Any = n match {
19+
case 0 =>
20+
this._1
21+
case _ =>
22+
throw new java.lang.IndexOutOfBoundsException(n.toString())
23+
}
24+
}
25+
object A extends scala.AnyRef

tests/pos/simpleCaseClass-3.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
case class A[T](x: T)

0 commit comments

Comments
 (0)