aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/SubTypers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-01-20 11:46:30 +0100
committerMartin Odersky <odersky@gmail.com>2013-01-20 11:46:30 +0100
commitf0006cf691aab04faf79fa00ba578634a5497892 (patch)
tree926679ec917aa8a3076cced4954e3a0fa2221fd9 /src/dotty/tools/dotc/core/SubTypers.scala
parent7ec55667d7d206cdf3de6d629cace47996a796bb (diff)
downloaddotty-f0006cf691aab04faf79fa00ba578634a5497892.tar.gz
dotty-f0006cf691aab04faf79fa00ba578634a5497892.tar.bz2
dotty-f0006cf691aab04faf79fa00ba578634a5497892.zip
Fleshed out Flags architecture and started work on Symbols.
Diffstat (limited to 'src/dotty/tools/dotc/core/SubTypers.scala')
-rw-r--r--src/dotty/tools/dotc/core/SubTypers.scala41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/core/SubTypers.scala b/src/dotty/tools/dotc/core/SubTypers.scala
index 602b380f4..29c7b7388 100644
--- a/src/dotty/tools/dotc/core/SubTypers.scala
+++ b/src/dotty/tools/dotc/core/SubTypers.scala
@@ -203,6 +203,47 @@ object SubTypers {
true
}
+ /** A function implementing `tp1` matches `tp2`. */
+ final def matchesType(tp1: Type, tp2: Type, alwaysMatchSimple: Boolean): Boolean = tp1 match {
+ case tp1: MethodType =>
+ tp2 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 _ =>
+ matchesType(tp1.resultType, tp2, alwaysMatchSimple)
+ }
+ case tp1: PolyType =>
+ tp2 match {
+ case tp2: PolyType =>
+ sameLength(tp1.paramNames, tp2.paramNames) &&
+ matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), alwaysMatchSimple)
+ case _ =>
+ false
+ }
+ case _ =>
+ tp2 match {
+ case _: MethodType | _: PolyType =>
+ false
+ case _ =>
+ alwaysMatchSimple || isSameType(tp1, tp2)
+ }
+ }
+
/** Are `syms1` and `syms2` parameter lists with pairwise equivalent types? */
private def matchingParams(formals1: List[Type], formals2: List[Type], isJava1: Boolean, isJava2: Boolean): Boolean = formals1 match {
case Nil =>