diff options
-rw-r--r-- | src/dotty/tools/dotc/core/Flags.scala | 9 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/SymDenotations.scala | 6 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/core/Flags.scala b/src/dotty/tools/dotc/core/Flags.scala index 68125f73e..9f87120f8 100644 --- a/src/dotty/tools/dotc/core/Flags.scala +++ b/src/dotty/tools/dotc/core/Flags.scala @@ -470,6 +470,15 @@ object Flags { /** Labeled `private` or `protected[local]` */ final val PrivateOrLocal = Private | Local + /** Either a module or a final class */ + final val ModuleOrFinal = ModuleClass | Final + + /** Either mutable or lazy */ + final val MutableOrLazy = Mutable | Lazy + + /** Labeled `private` or `final` */ + final val PrivateOrFinal = Private | Final + /** A type parameter with synthesized name */ final val ExpandedTypeParam = allOf(ExpandedName, TypeParam) diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala index dc76999f6..9cf06ec47 100644 --- a/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/src/dotty/tools/dotc/core/SymDenotations.scala @@ -586,6 +586,12 @@ object SymDenotations { final def enclosingClass(implicit ctx: Context): Symbol = if (isClass || !exists) symbol else owner.enclosingClass + final def isEffectivelyFinal(implicit ctx: Context): Boolean = { + (this.flags is Flags.PrivateOrFinal) || (!this.owner.isClass) || + ((this.owner.flags is (Flags.ModuleOrFinal)) && (!this.flags.is(Flags.MutableOrLazy))) || + (this.owner.isAnonymousClass) + } + /** The class containing this denotation which has the given effective name. */ final def enclosingClassNamed(name: Name)(implicit ctx: Context): Symbol = { |