aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/TypeApplications.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-06-07 13:28:55 +0200
committerMartin Odersky <odersky@gmail.com>2016-07-11 13:35:01 +0200
commit463e99a48996fbf7148aa62ec6d2f8b28000d2d4 (patch)
tree8e82c76c2de8b671dc3c2036a217a44d272c1a78 /src/dotty/tools/dotc/core/TypeApplications.scala
parent68e73e854e04f7bea20a8c95637729bf6889e17d (diff)
downloaddotty-463e99a48996fbf7148aa62ec6d2f8b28000d2d4.tar.gz
dotty-463e99a48996fbf7148aa62ec6d2f8b28000d2d4.tar.bz2
dotty-463e99a48996fbf7148aa62ec6d2f8b28000d2d4.zip
Optionally, check kinds match for & and |
Optionally, check kinds of operands of & and | match.
Diffstat (limited to 'src/dotty/tools/dotc/core/TypeApplications.scala')
-rw-r--r--src/dotty/tools/dotc/core/TypeApplications.scala30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/core/TypeApplications.scala b/src/dotty/tools/dotc/core/TypeApplications.scala
index 4f482f460..6fc1fb9dc 100644
--- a/src/dotty/tools/dotc/core/TypeApplications.scala
+++ b/src/dotty/tools/dotc/core/TypeApplications.scala
@@ -473,6 +473,31 @@ class TypeApplications(val self: Type) extends AnyVal {
case _ => false
}
+ /** Computes the kind of `self` without forcing anything.
+ * @return 1 if type is known to be higher-kinded
+ * -1 if type is known to be a * type
+ * 0 if kind of `self` is unknown (because symbols have not yet completed)
+ */
+ def knownHK(implicit ctx: Context): Int = self match {
+ case self: TypeRef =>
+ val tsym = self.symbol
+ if (tsym.isClass) -1
+ else tsym.infoOrCompleter match {
+ case completer: TypeParamsCompleter =>
+ if (completer.completerTypeParams(tsym).nonEmpty) 1 else -1
+ case _ =>
+ if (!tsym.isCompleting || tsym.isAliasType) tsym.info.knownHK
+ else 0
+ }
+ case self: RefinedType =>
+ if (self.isTypeParam) 1 else -1
+ case self: SingletonType => -1
+ case self: TypeVar => self.origin.knownHK
+ case self: WildcardType => self.optBounds.knownHK
+ case self: TypeProxy => self.underlying.knownHK
+ case _ => -1
+ }
+
/** is receiver of the form T#$Apply? */
def isHKApply(implicit ctx: Context): Boolean = self match {
case self @ RefinedType(_, name, _) => Config.newHK && name.isHkArgName && !self.isTypeParam
@@ -666,7 +691,10 @@ class TypeApplications(val self: Type) extends AnyVal {
res // without this line, typing 974.scala gives a stackoverflow in asSeenFrom.
}
else instTop(self)
- if (reduced ne self) hk.println(i"reduce $self --> $reduced")
+ if (reduced ne self) {
+ hk.println(i"reduce $self --> $reduced / ${inst.tyconIsHK}")
+ //hk.println(s"reduce $self --> $reduced")
+ }
reduced
case _ => self
}