scala-dev icon indicating copy to clipboard operation
scala-dev copied to clipboard

Avoid forcing full base type sequence to determine value-classity

Open retronym opened this issue 7 years ago • 0 comments

⚡ scalac $(f "class B; class C extends B { def m = 42 }"); rm B.class; scalac -Ydebug $(f "class Client { def c(c: C): C = c }")
[running phase parser on a.scala]
[running phase namer on a.scala]
[running phase packageobjects on a.scala]
[running phase typer on a.scala]
warning: !!! creating stub symbol to defer error: Symbol 'type <empty>.B' is missing from the classpath.
This symbol is required by 'class C'.
Make sure that type B is in your classpath and check for conflicting dependencies with `-Ylog-classpath`.
A full rebuild may help if 'C.class' was compiled against an incompatible version of <empty>.
[running phase patmat on a.scala]
[running phase superaccessors on a.scala]
[running phase extmethods on a.scala]
[running phase pickler on a.scala]
[running phase refchecks on a.scala]
[running phase uncurry on a.scala]
[running phase fields on a.scala]
[running phase tailcalls on a.scala]
[running phase specialize on a.scala]
[running phase explicitouter on a.scala]
[running phase erasure on a.scala]
/tmp/a.scala:1: error: Symbol 'type <empty>.B' is missing from the classpath.
This symbol is required by 'class C'.
Make sure that type B is in your classpath and check for conflicting dependencies with `-Ylog-classpath`.
A full rebuild may help if 'C.class' was compiled against an incompatible version of <empty>.
class Client { def c(c: C): C = c }
                            ^
java.lang.Throwable
	at scala.reflect.internal.Symbols$StubSymbol.fail(Symbols.scala:3490)
	at scala.reflect.internal.Symbols$StubSymbol.info(Symbols.scala:3501)
	at scala.reflect.internal.Symbols$StubSymbol.info$(Symbols.scala:3501)
	at scala.reflect.internal.Symbols$StubClassSymbol.info(Symbols.scala:3505)
	at scala.reflect.internal.Symbols$StubClassSymbol.info(Symbols.scala:3505)
	at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2300)
	at scala.reflect.internal.Types.computeBaseClasses(Types.scala:1448)
	at scala.reflect.internal.Types.computeBaseClasses$(Types.scala:1439)
	at scala.reflect.internal.SymbolTable.computeBaseClasses(SymbolTable.scala:16)
	at scala.reflect.internal.Types.$anonfun$defineBaseClassesOfCompoundType$2(Types.scala:1583)
	at scala.reflect.internal.Types$CompoundType.memo(Types.scala:1410)
	at scala.reflect.internal.Types.defineBaseClassesOfCompoundType(Types.scala:1583)
	at scala.reflect.internal.Types.define$1(Types.scala:1550)
	at scala.reflect.internal.Types.defineBaseClassesOfCompoundType(Types.scala:1551)
	at scala.reflect.internal.Types.defineBaseClassesOfCompoundType$(Types.scala:1549)
	at scala.reflect.internal.SymbolTable.defineBaseClassesOfCompoundType(SymbolTable.scala:16)
	at scala.reflect.internal.Types$CompoundType.baseClasses(Types.scala:1393)
	at scala.reflect.internal.Symbols$Symbol.ancestors(Symbols.scala:2151)
	at scala.reflect.internal.Symbols$Symbol.mixinClasses(Symbols.scala:2147)
	at scala.tools.nsc.transform.ExplicitOuter.transformInfo(ExplicitOuter.scala:178)
	at scala.tools.nsc.transform.InfoTransform$Phase$$anon$1.transform(InfoTransform.scala:38)
	at scala.reflect.internal.Symbols$Symbol.rawInfo(Symbols.scala:1624)
	at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1541)
	at scala.reflect.internal.Symbols$Symbol.isDerivedValueClass(Symbols.scala:826)
	at scala.reflect.internal.transform.Erasure$ErasureMap.apply(Erasure.scala:131)
	at scala.reflect.internal.transform.Erasure$ErasureMap.apply(Erasure.scala:101)
	at scala.reflect.internal.Symbols$Symbol.modifyInfo(Symbols.scala:1559)
	at scala.reflect.internal.Symbols.$anonfun$cloneSymbolsAndModify$1(Symbols.scala:3661)
	at scala.reflect.internal.Symbols.cloneSymbolsAndModify(Symbols.scala:3661)
	at scala.reflect.internal.Symbols.cloneSymbolsAndModify$(Symbols.scala:3660)
	at scala.reflect.internal.SymbolTable.cloneSymbolsAndModify(SymbolTable.scala:16)
	at scala.reflect.internal.transform.Erasure$ErasureMap.apply(Erasure.scala:140)
	at scala.reflect.internal.transform.Erasure.specialErasure(Erasure.scala:223)
	at scala.reflect.internal.transform.Erasure.specialErasure$(Erasure.scala:217)
	at scala.tools.nsc.transform.Erasure.specialErasure(Erasure.scala:15)
	at scala.reflect.internal.transform.Erasure.transformInfo(Erasure.scala:398)
	at scala.reflect.internal.transform.Erasure.transformInfo$(Erasure.scala:360)
	at scala.tools.nsc.transform.Erasure.transformInfo(Erasure.scala:15)
	at scala.tools.nsc.transform.InfoTransform$Phase$$anon$1.transform(InfoTransform.scala:38)
	at scala.reflect.internal.Symbols$Symbol.rawInfo(Symbols.scala:1624)
	at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1541)

javac does not require B.class to compile Client in equivalent Java code. We could make isDerivedValueClass asking if info.firstParent.typeSymbol == AnyValClass in an exitingTyper?

retronym avatar Aug 15 '17 05:08 retronym