aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/TreeChecker.scala
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2015-02-19 17:51:12 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-17 12:56:00 +0100
commit3cde2496acc50e856c0f199f7966c79c96b17174 (patch)
tree45579cab1c43670902f2fbe26e03e6c970377d30 /src/dotty/tools/dotc/transform/TreeChecker.scala
parent9b01e150da8ee1f730a6c60ca7954c2ac57df7a0 (diff)
downloaddotty-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/tools/dotc/transform/TreeChecker.scala')
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala39
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 = {