diff --git a/tasty-query/shared/src/main/scala/tastyquery/Symbols.scala b/tasty-query/shared/src/main/scala/tastyquery/Symbols.scala index 839fe86c..4e8cca47 100644 --- a/tasty-query/shared/src/main/scala/tastyquery/Symbols.scala +++ b/tasty-query/shared/src/main/scala/tastyquery/Symbols.scala @@ -332,6 +332,8 @@ object Symbols { /** Is this symbol generated by the compiler? */ final def isSynthetic: Boolean = flags.is(Synthetic) + private[Symbols] def isCaseSynthetic: Boolean = flags.isAllOf(Case | Synthetic) + /** Does this symbol have the `infix` modifier? */ final def isInfix: Boolean = flags.is(Infix) @@ -1528,8 +1530,17 @@ object Symbols { case pre: ThisType if pre.cls == this => true case _ => false + // Workaround for https://github.com/lampepfl/dotty/issues/19307 + def isAnyValEqualsWorkaround(sym: Symbol): Boolean = sym match + case sym: TermSymbol if sym.owner.isClass && sym.owner.asClass.isDerivedValueClass => + pre match + case pre: TermRef => pre.prefix == NoPrefix && pre.symbol.isCaseSynthetic + case _ => false + case _ => + false + getDecl(name) match - case some @ Some(sym) if !sym.isPrivateParamAccessor || isOwnThis => + case some @ Some(sym) if !sym.isPrivateParamAccessor || isOwnThis || isAnyValEqualsWorkaround(sym) => some case _ => if name == nme.Constructor then None diff --git a/tasty-query/shared/src/main/scala/tastyquery/reader/tasties/TreeUnpickler.scala b/tasty-query/shared/src/main/scala/tastyquery/reader/tasties/TreeUnpickler.scala index 254ddb84..8374f8df 100644 --- a/tasty-query/shared/src/main/scala/tastyquery/reader/tasties/TreeUnpickler.scala +++ b/tasty-query/shared/src/main/scala/tastyquery/reader/tasties/TreeUnpickler.scala @@ -122,7 +122,7 @@ private[tasties] class TreeUnpickler private ( if tagFollowShared == TYPEBOUNDS then LocalTypeParamSymbol.create(toTypeName(name), owner) else TermSymbol.create(name, owner) caches.registerSym(start, sym) - sym.setFlags(Case) + readSymbolModifiers(sym, tag, end) // bind is never an owner reader.until(end)(createSymbols(owner)) case REFINEDtpt => @@ -185,6 +185,7 @@ private[tasties] class TreeUnpickler private ( private def normalizeFlags(sym: Symbol, tag: Int, givenFlags: FlagSet, rhsIsEmpty: Boolean): FlagSet = var flags = givenFlags if tag == DEFDEF then flags |= Method + else if tag == BIND then flags |= Case if rhsIsEmpty && (tag == VALDEF || tag == DEFDEF) then flags |= Abstract if givenFlags.is(Module) then flags |= (if tag == VALDEF then ModuleValCreationFlags else ModuleClassCreationFlags) if flags.is(Enum) && !flags.is(Method) && sym.isTerm then flags |= StableRealizable diff --git a/test-sources/src/main/scala/simple_trees/ValueClassNonVal.scala b/test-sources/src/main/scala/simple_trees/ValueClassNonVal.scala new file mode 100644 index 00000000..e5214f1b --- /dev/null +++ b/test-sources/src/main/scala/simple_trees/ValueClassNonVal.scala @@ -0,0 +1,7 @@ +package simple_trees + +class ValueClassNonVal(self: String) extends AnyVal: + def get: String = self + + def getThroughThis: String = this.self +end ValueClassNonVal