diff options
author | Martin Odersky <odersky@gmail.com> | 2013-01-20 11:46:30 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-01-20 11:46:30 +0100 |
commit | f0006cf691aab04faf79fa00ba578634a5497892 (patch) | |
tree | 926679ec917aa8a3076cced4954e3a0fa2221fd9 /src/dotty/tools/dotc/core/SubTypers.scala | |
parent | 7ec55667d7d206cdf3de6d629cace47996a796bb (diff) | |
download | dotty-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.scala | 41 |
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 => |