@@ -17,6 +17,7 @@ import scala.util.{Try, Success, Failure}
17
17
import config .{ScalaVersion , NoScalaVersion }
18
18
import typer .ErrorReporting ._
19
19
import DenotTransformers ._
20
+ import ValueClasses .isDerivedValueClass
20
21
21
22
object RefChecks {
22
23
import tpd ._
@@ -296,7 +297,7 @@ object RefChecks {
296
297
printMixinOverrideErrors()
297
298
298
299
// Verifying a concrete class has nothing unimplemented.
299
- if (! clazz.is(Abstract )) {
300
+ if (! clazz.is(AbstractOrTrait )) {
300
301
val abstractErrors = new mutable.ListBuffer [String ]
301
302
def abstractErrorMessage =
302
303
// a little formatting polish
@@ -348,8 +349,8 @@ object RefChecks {
348
349
349
350
val missingMethods = grouped.toList flatMap {
350
351
case (name, syms) =>
351
- if (syms exists (_.symbol.isSetter)) syms filterNot (_.symbol.isGetter )
352
- else syms
352
+ val withoutSetters = syms filterNot (_.symbol.isSetter )
353
+ if (withoutSetters.nonEmpty) withoutSetters else syms
353
354
}
354
355
355
356
def stubImplementations : List [String ] = {
@@ -461,7 +462,7 @@ object RefChecks {
461
462
def checkNoAbstractDecls (bc : Symbol ): Unit = {
462
463
for (decl <- bc.info.decls) {
463
464
if (decl.is(Deferred ) && ! ignoreDeferred(decl)) {
464
- val impl = decl.matchingSymbol(bc, clazz.thisType)
465
+ val impl = decl.matchingMember( clazz.thisType)
465
466
if (impl == NoSymbol || (decl.owner isSubClass impl.owner)) {
466
467
abstractClassError(false , " there is a deferred declaration of " + infoString(decl) +
467
468
" which is not implemented in a subclass" + err.abstractVarMessage(decl))
@@ -485,7 +486,7 @@ object RefChecks {
485
486
// Have to use matchingSymbol, not a method involving overridden symbols,
486
487
// because the scala type system understands that an abstract method here does not
487
488
// override a concrete method in Object. The jvm, however, does not.
488
- val overridden = decl.matchingSymbol (defn.ObjectClass , defn.ObjectType )
489
+ val overridden = decl.matchingDecl (defn.ObjectClass , defn.ObjectType )
489
490
if (overridden.is(Final ))
490
491
ctx.error(" trait cannot redefine final method from class AnyRef" , decl.pos)
491
492
}
@@ -605,7 +606,7 @@ object RefChecks {
605
606
606
607
/** Verify classes extending AnyVal meet the requirements */
607
608
private def checkAnyValSubclass (clazz : Symbol )(implicit ctx : Context ) =
608
- if (clazz. isDerivedValueClass) {
609
+ if (isDerivedValueClass(clazz) ) {
609
610
if (clazz.is(Trait ))
610
611
ctx.error(" Only classes (not traits) are allowed to extend AnyVal" , clazz.pos)
611
612
else if (clazz.is(Abstract ))
@@ -632,7 +633,7 @@ object RefChecks {
632
633
var refSym : Symbol = _
633
634
634
635
override def enterReference (sym : Symbol , pos : Position ): Unit =
635
- if (sym.owner.isTerm)
636
+ if (sym.exists && sym. owner.isTerm)
636
637
levelAndIndex.get(sym) match {
637
638
case Some ((level, idx)) if (level.maxIndex < idx) =>
638
639
level.maxIndex = idx
@@ -676,7 +677,7 @@ class RefChecks extends MiniPhase with IdentityDenotTransformer { thisTransforme
676
677
class Transform (currentLevel : RefChecks .OptLevelInfo = RefChecks .NoLevelInfo ) extends TreeTransform {
677
678
def phase = thisTransformer
678
679
override def prepareForStats (trees : List [Tree ])(implicit ctx : Context ) = {
679
- println(i " preparing for $trees%; %, owner = ${ctx.owner}" )
680
+ // println(i"preparing for $trees%; %, owner = ${ctx.owner}")
680
681
if (ctx.owner.isTerm) new Transform (new LevelInfo (currentLevel.levelAndIndex, trees))
681
682
else this
682
683
}
@@ -706,7 +707,7 @@ class RefChecks extends MiniPhase with IdentityDenotTransformer { thisTransforme
706
707
checkOverloadedRestrictions(cls)
707
708
checkAllOverrides(cls)
708
709
checkAnyValSubclass(cls)
709
- if (cls. isDerivedValueClass)
710
+ if (isDerivedValueClass(cls) )
710
711
cls.primaryConstructor.makeNotPrivateAfter(NoSymbol , thisTransformer) // SI-6601, must be done *after* pickler!
711
712
tree
712
713
}
@@ -721,7 +722,6 @@ class RefChecks extends MiniPhase with IdentityDenotTransformer { thisTransforme
721
722
}
722
723
723
724
override def transformIdent (tree : Ident )(implicit ctx : Context , info : TransformerInfo ) = {
724
- assert(ctx.phase.exists)
725
725
checkUndesiredProperties(tree.symbol, tree.pos)
726
726
currentLevel.enterReference(tree.symbol, tree.pos)
727
727
tree
0 commit comments