aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/SymDenotations.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/dotty/tools/dotc/core/SymDenotations.scala')
-rw-r--r--src/dotty/tools/dotc/core/SymDenotations.scala12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala
index 9299e7e63..e179a11a7 100644
--- a/src/dotty/tools/dotc/core/SymDenotations.scala
+++ b/src/dotty/tools/dotc/core/SymDenotations.scala
@@ -255,9 +255,12 @@ object SymDenotations {
isModuleClass && linkedClass.isNonBottomSubClass(base)
/** Is this symbol a class that does not extend `AnyVal`? */
- def isNonValueClass(implicit ctx: Context): Boolean =
+ final def isNonValueClass(implicit ctx: Context): Boolean =
isClass && !isSubClass(defn.AnyValClass)
+ /** Are the contents of this denotation invariant under the type map `f`? */
+ def isInvariantUnder(f: Type => Type)(implicit ctx: Context) = info eq f(info)
+
/** Is this definition accessible whenever `that` symbol is accessible?
* Does not take into account status of protected members.
*/
@@ -497,7 +500,7 @@ object SymDenotations {
override protected def newLikeThis(s: Symbol, i: Type): SingleDenotation = new UniqueRefDenotation(s, i, validFor)
/** Copy this denotation, overriding selective fields */
- def copy(
+ def copySym(
sym: Symbol,
owner: Symbol = this.owner,
name: Name = this.name,
@@ -798,6 +801,11 @@ object SymDenotations {
decls.denotsNamed(cname).first.symbol
}
+ override def isInvariantUnder(f: Type => Type)(implicit ctx: Context) =
+ (parents.mapConserve(f) eq parents) &&
+ (f(selfType) eq selfType) &&
+ (decls forall (_.isInvariantUnder(f)))
+
def copyClass(
sym: ClassSymbol,
owner: Symbol = this.owner,