aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/ast/tpd.scala8
-rw-r--r--src/dotty/tools/dotc/core/TypeApplications.scala2
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala41
-rw-r--r--src/dotty/tools/dotc/core/Types.scala16
-rw-r--r--src/dotty/tools/dotc/transform/OverridingPairs.scala7
-rw-r--r--src/dotty/tools/dotc/typer/EtaExpansion.scala7
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala11
7 files changed, 47 insertions, 45 deletions
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala
index 8fdc4a9db..77c607ca7 100644
--- a/src/dotty/tools/dotc/ast/tpd.scala
+++ b/src/dotty/tools/dotc/ast/tpd.scala
@@ -759,6 +759,14 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
Ident(defn.ScalaRuntimeModule.requiredMethod(name).termRef).appliedToArgs(args)
}
+ /** An extractor that pulls out type arguments */
+ object MaybePoly {
+ def unapply(tree: Tree): Option[(Tree, List[Tree])] = tree match {
+ case TypeApply(tree, targs) => Some(tree, targs)
+ case _ => Some(tree, Nil)
+ }
+ }
+
/** A traverser that passes the enlcosing class or method as an argumenr
* to the traverse method.
*/
diff --git a/src/dotty/tools/dotc/core/TypeApplications.scala b/src/dotty/tools/dotc/core/TypeApplications.scala
index 998b4f944..4a16ca45d 100644
--- a/src/dotty/tools/dotc/core/TypeApplications.scala
+++ b/src/dotty/tools/dotc/core/TypeApplications.scala
@@ -285,7 +285,7 @@ class TypeApplications(val self: Type) extends AnyVal {
*/
def underlyingIfRepeated(isJava: Boolean)(implicit ctx: Context): Type =
if (self.isRepeatedParam) {
- val seqClass = if(isJava) defn.ArrayClass else defn.SeqClass
+ val seqClass = if (isJava) defn.ArrayClass else defn.SeqClass
translateParameterized(defn.RepeatedParamClass, seqClass)
}
else self
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala
index b40baafdf..1687d6159 100644
--- a/src/dotty/tools/dotc/core/TypeComparer.scala
+++ b/src/dotty/tools/dotc/core/TypeComparer.scala
@@ -648,45 +648,34 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling wi
// Tests around `matches`
/** A function implementing `tp1` matches `tp2`. */
- final def matchesType(tp1: Type, tp2: Type, alwaysMatchSimple: Boolean): Boolean = tp1 match {
+ final def matchesType(tp1: Type, tp2: Type, relaxed: Boolean): Boolean = tp1.widen match {
case tp1: MethodType =>
- tp2 match {
+ tp2.widen match {
case tp2: MethodType =>
tp1.isImplicit == tp2.isImplicit &&
matchingParams(tp1.paramTypes, tp2.paramTypes, tp1.isJava, tp2.isJava) &&
- matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), alwaysMatchSimple)
- case tp2: ExprType =>
- tp1.paramNames.isEmpty &&
- matchesType(tp1.resultType, tp2.resultType, alwaysMatchSimple)
- case _ =>
- false
- }
- case tp1: ExprType =>
- tp2 match {
- case tp2: MethodType =>
- tp2.paramNames.isEmpty &&
- matchesType(tp1.resultType, tp2.resultType, alwaysMatchSimple)
- case tp2: ExprType =>
- matchesType(tp1.resultType, tp2.resultType, alwaysMatchSimple)
- case _ =>
- false // was: matchesType(tp1.resultType, tp2, alwaysMatchSimple)
+ matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), relaxed)
+ case tp2 =>
+ relaxed && tp1.paramNames.isEmpty &&
+ matchesType(tp1.resultType, tp2, relaxed)
}
case tp1: PolyType =>
- tp2 match {
+ tp2.widen match {
case tp2: PolyType =>
sameLength(tp1.paramNames, tp2.paramNames) &&
- matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), alwaysMatchSimple)
+ matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), relaxed)
case _ =>
false
}
case _ =>
- tp2 match {
- case _: MethodType | _: PolyType =>
+ tp2.widen match {
+ case _: PolyType =>
false
- case tp2: ExprType =>
- false // was: matchesType(tp1, tp2.resultType, alwaysMatchSimple)
- case _ =>
- alwaysMatchSimple || isSameType(tp1, tp2)
+ case tp2: MethodType =>
+ relaxed && tp2.paramNames.isEmpty &&
+ matchesType(tp1, tp2.resultType, relaxed)
+ case tp2 =>
+ relaxed || isSameType(tp1, tp2)
}
}
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala
index 6c87d44e6..e759c3ad3 100644
--- a/src/dotty/tools/dotc/core/Types.scala
+++ b/src/dotty/tools/dotc/core/Types.scala
@@ -598,17 +598,21 @@ object Types {
* - Either both types are polytypes with the same number of
* type parameters and their result types match after renaming
* corresponding type parameters
- * - Or both types are (possibly nullary) method types with equivalent parameter types
- * and matching result types
- * - Or both types are equivalent
- * - Or phase.erasedTypes is false and both types are neither method nor
- * poly types.
+ * - Or both types are method types with =:=-equivalent(*) parameter types
+ * and matching result types after renaming corresponding parameter types
+ * if the method types are dependent.
+ * - Or both types are =:=-equivalent
+ * - Or phase.erasedTypes is false, and neither type takes
+ * term or type parameters.
+ *
+ * (*) when matching with a Java method, we also regard Any and Object as equivalent
+ * parameter types.
*/
def matches(that: Type)(implicit ctx: Context): Boolean =
if (Config.newMatch) this.signature matches that.signature
else track("matches") {
ctx.typeComparer.matchesType(
- this, that, alwaysMatchSimple = !ctx.phase.erasedTypes)
+ this, that, relaxed = !ctx.phase.erasedTypes)
}
/** This is the same as `matches` except that it also matches => T with T and
diff --git a/src/dotty/tools/dotc/transform/OverridingPairs.scala b/src/dotty/tools/dotc/transform/OverridingPairs.scala
index f631dcf9a..650a03054 100644
--- a/src/dotty/tools/dotc/transform/OverridingPairs.scala
+++ b/src/dotty/tools/dotc/transform/OverridingPairs.scala
@@ -39,12 +39,7 @@ object OverridingPairs {
* relative to <base>.this do
*/
protected def matches(sym1: Symbol, sym2: Symbol): Boolean =
- sym1.isType || {
- val info1 = self.memberInfo(sym1)
- val info2 = self.memberInfo(sym2)
- // info1.signature == info2.signature && // TODO enable for speed
- info1 matches info2
- }
+ sym1.isType || self.memberInfo(sym1).matches(self.memberInfo(sym2))
/** The symbols that can take part in an overriding pair */
private val decls = {
diff --git a/src/dotty/tools/dotc/typer/EtaExpansion.scala b/src/dotty/tools/dotc/typer/EtaExpansion.scala
index 6ecd90c08..b59748247 100644
--- a/src/dotty/tools/dotc/typer/EtaExpansion.scala
+++ b/src/dotty/tools/dotc/typer/EtaExpansion.scala
@@ -34,8 +34,11 @@ object EtaExpansion {
* lhs += expr
*/
def liftAssigned(defs: mutable.ListBuffer[Tree], tree: Tree)(implicit ctx: Context): Tree = tree match {
- case Apply(fn @ Select(pre, name), args) =>
- cpy.Apply(tree)(cpy.Select(fn)(lift(defs, pre), name), liftArgs(defs, fn.tpe, args))
+ case Apply(MaybePoly(fn @ Select(pre, name), targs), args) =>
+ cpy.Apply(tree)(
+ cpy.Select(fn)(
+ lift(defs, pre), name).appliedToTypeTrees(targs),
+ liftArgs(defs, fn.tpe, args))
case Select(pre, name) =>
cpy.Select(tree)(lift(defs, pre), name)
case _ =>
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index ce07ba74c..59aba4723 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -400,10 +400,13 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
tree.lhs match {
case lhs @ Apply(fn, args) =>
typed(cpy.Apply(lhs)(untpd.Select(fn, nme.update), args :+ tree.rhs), pt)
- case untpd.TypedSplice(Apply(Select(fn, app), args)) if app == nme.apply =>
- typed(cpy.Apply(fn)(
- untpd.Select(untpd.TypedSplice(fn), nme.update),
- (args map untpd.TypedSplice) :+ tree.rhs), pt)
+ case untpd.TypedSplice(Apply(MaybePoly(Select(fn, app), targs), args)) if app == nme.apply =>
+ val rawUpdate: untpd.Tree = untpd.Select(untpd.TypedSplice(fn), nme.update)
+ val wrappedUpdate =
+ if (targs.isEmpty) rawUpdate
+ else untpd.TypeApply(rawUpdate, targs map untpd.TypedSplice)
+ val appliedUpdate = cpy.Apply(fn)(wrappedUpdate, (args map untpd.TypedSplice) :+ tree.rhs)
+ typed(appliedUpdate, pt)
case lhs =>
val lhsCore = typedUnadapted(lhs)
def lhs1 = typed(untpd.TypedSplice(lhsCore))