aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/TreeChecker.scala
diff options
context:
space:
mode:
authorodersky <odersky@gmail.com>2015-08-04 11:18:41 -0700
committerodersky <odersky@gmail.com>2015-08-04 11:18:41 -0700
commit07e24e8640acf19a6bcedd1b68acbd7c8d8bf29b (patch)
treecc81897dd66a0353587ff83e297bfff3bac7c7d5 /src/dotty/tools/dotc/transform/TreeChecker.scala
parent056e1246c9dc365bd37627923b999a80a57ca0f9 (diff)
parentd5280358d12c43c3268653c95c7edf3dcc7d60bf (diff)
downloaddotty-07e24e8640acf19a6bcedd1b68acbd7c8d8bf29b.tar.gz
dotty-07e24e8640acf19a6bcedd1b68acbd7c8d8bf29b.tar.bz2
dotty-07e24e8640acf19a6bcedd1b68acbd7c8d8bf29b.zip
Merge pull request #735 from dotty-staging/ycheck-methods
Ycheck that methods defined in ClassInfo exist in tree.
Diffstat (limited to 'src/dotty/tools/dotc/transform/TreeChecker.scala')
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala
index b76f04b58..a1847e456 100644
--- a/src/dotty/tools/dotc/transform/TreeChecker.scala
+++ b/src/dotty/tools/dotc/transform/TreeChecker.scala
@@ -2,6 +2,7 @@ package dotty.tools.dotc
package transform
import TreeTransforms._
+import core.Names.Name
import core.DenotTransformers._
import core.Denotations._
import core.SymDenotations._
@@ -42,6 +43,12 @@ class TreeChecker extends Phase with SymTransformer {
private val seenClasses = collection.mutable.HashMap[String, Symbol]()
private val seenModuleVals = collection.mutable.HashMap[String, Symbol]()
+ def isValidJVMName(name: Name) =
+ !name.exists(c => c == '.' || c == ';' || c =='[' || c == '/')
+
+ def isValidJVMMethodName(name: Name) =
+ !name.exists(c => c == '.' || c == ';' || c =='[' || c == '/' || c == '<' || c == '>')
+
def printError(str: String)(implicit ctx: Context) = {
ctx.println(Console.RED + "[error] " + Console.WHITE + str)
}
@@ -130,6 +137,7 @@ class TreeChecker extends Phase with SymTransformer {
def withDefinedSym[T](tree: untpd.Tree)(op: => T)(implicit ctx: Context): T = tree match {
case tree: DefTree =>
val sym = tree.symbol
+ assert(isValidJVMName(sym.name), s"${sym.fullName} name is invalid on jvm")
everDefinedSyms.get(sym) match {
case Some(t) =>
if (t ne tree)
@@ -257,12 +265,24 @@ class TreeChecker extends Phase with SymTransformer {
assert(cls.primaryConstructor == constr.symbol, i"mismatch, primary constructor ${cls.primaryConstructor}, in tree = ${constr.symbol}")
checkOwner(impl)
checkOwner(impl.constr)
+
+ def isNonMagicalMethod(x: Symbol) =
+ x.is(Method) &&
+ !x.isCompanionMethod &&
+ !x.isValueClassConvertMethod &&
+ x != defn.newRefArrayMethod
+
+ val symbolsNotDefined = cls.classInfo.decls.toSet.filter(isNonMagicalMethod) -- impl.body.map(_.symbol) - constr.symbol
+
+ assert(symbolsNotDefined.isEmpty, i" $cls tree does not define methods: $symbolsNotDefined")
+
super.typedClassDef(cdef, cls)
}
override def typedDefDef(ddef: untpd.DefDef, sym: Symbol)(implicit ctx: Context) =
withDefinedSyms(ddef.tparams) {
withDefinedSymss(ddef.vparamss) {
+ if (!sym.isClassConstructor) assert(isValidJVMMethodName(sym.name), s"${sym.fullName} name is invalid on jvm")
super.typedDefDef(ddef, sym)
}
}