diff options
author | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-02-19 17:51:12 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-17 12:56:00 +0100 |
commit | 3cde2496acc50e856c0f199f7966c79c96b17174 (patch) | |
tree | 45579cab1c43670902f2fbe26e03e6c970377d30 /src/dotty | |
parent | 9b01e150da8ee1f730a6c60ca7954c2ac57df7a0 (diff) | |
download | dotty-3cde2496acc50e856c0f199f7966c79c96b17174.tar.gz dotty-3cde2496acc50e856c0f199f7966c79c96b17174.tar.bz2 dotty-3cde2496acc50e856c0f199f7966c79c96b17174.zip |
YCheck now checks symbols for validity.
For now check if symbol was already defined and if classes have a valid superclass.
Diffstat (limited to 'src/dotty')
-rw-r--r-- | src/dotty/tools/dotc/transform/TreeChecker.scala | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala index a72c2f181..ce8f97254 100644 --- a/src/dotty/tools/dotc/transform/TreeChecker.scala +++ b/src/dotty/tools/dotc/transform/TreeChecker.scala @@ -35,10 +35,47 @@ import scala.util.control.NonFatal * - After typer, identifiers and select nodes refer to terms only (all types should be * represented as TypeTrees then). */ -class TreeChecker extends Phase { +class TreeChecker extends Phase with SymTransformer { import ast.tpd._ + private val seenClasses = collection.mutable.HashMap[String, Symbol]() + private val seenModuleVals = collection.mutable.HashMap[String, Symbol]() + + def printError(str: String) = { + println(Console.RED + "[error] " + Console.WHITE + str) + } + + val NoSuperClass = Trait | Package + + def testDuplicate(sym: Symbol, registry: mutable.Map[String, Symbol], typ: String)(implicit ctx: Context) = { + val name = sym.fullName.toString + if (registry.contains(name)) + if (this.flatClasses || !(sym.isAnonymousFunction || sym.isAnonymousClass || sym.isAnonymousModuleVal)) + printError(s"$typ defined twice $sym ${sym.id} ${registry(name).id}") + registry(name) = sym + } + + + def transformSym(symd: SymDenotation)(implicit ctx: Context): SymDenotation = { + val sym = symd.symbol + + if (sym.isClass) { + val validSuperclass = defn.ScalaValueClasses.contains(sym) || defn.syntheticCoreClasses.contains(sym) || + (sym eq defn.ObjectClass) || (sym is NoSuperClass) || (sym.asClass.superClass.exists) + if (!validSuperclass) + printError(s"$sym has no superclass set") + + testDuplicate(sym, seenClasses, "class") + + } else if (sym is ModuleVal) { + testDuplicate(sym, seenModuleVals, "module val") + } + + + symd + } + def phaseName: String = "Ycheck" def run(implicit ctx: Context): Unit = { |