aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/core/Flags.scala9
-rw-r--r--src/dotty/tools/dotc/core/SymDenotations.scala6
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 = {