diff options
author | Martin Odersky <odersky@gmail.com> | 2011-09-22 15:52:17 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2011-09-22 15:52:17 +0000 |
commit | 5e501977f8ef72efda884d6190eeb532703d4275 (patch) | |
tree | 9fe6076c1e4658f021ed52cebb7350e13d8049c4 | |
parent | b38f2a1df3ec5ae646575a5078aaeb649a18a413 (diff) | |
download | scala-5e501977f8ef72efda884d6190eeb532703d4275.tar.gz scala-5e501977f8ef72efda884d6190eeb532703d4275.tar.bz2 scala-5e501977f8ef72efda884d6190eeb532703d4275.zip |
more tweaks to symbol importing; not done yet
-rw-r--r-- | src/compiler/scala/reflect/internal/Importers.scala | 19 | ||||
-rw-r--r-- | test/disabled/pos/code.scala | 6 |
2 files changed, 17 insertions, 8 deletions
diff --git a/src/compiler/scala/reflect/internal/Importers.scala b/src/compiler/scala/reflect/internal/Importers.scala index 34c1cd6cf5..47a9a8f8a6 100644 --- a/src/compiler/scala/reflect/internal/Importers.scala +++ b/src/compiler/scala/reflect/internal/Importers.scala @@ -63,7 +63,7 @@ trait Importers { self: SymbolTable => new TypeSymbol(myowner, mypos, myname.toTypeName) } symMap(sym) = mysym - mysym setFlag sym.flags + mysym setFlag sym.flags | Flags.LOCKED mysym setInfo { val mytypeParams = sym.typeParams map importSymbol new LazyPolyType(mytypeParams) { @@ -77,9 +77,10 @@ trait Importers { self: SymbolTable => } } } + mysym resetFlag Flags.LOCKED } // end doImport - if (myowner.isClass && !myowner.isRefinementClass && sym.owner.info.decl(sym.name).exists) { + if (myowner.isClass && !myowner.isRefinementClass && !(myowner hasFlag Flags.LOCKED) && sym.owner.info.decl(sym.name).exists) { // symbol is in class scope, try to find equivalent one in local scope if (sym.isOverloaded) myowner.newOverloaded(myowner.thisType, sym.alternatives map importSymbol) @@ -93,18 +94,26 @@ trait Importers { self: SymbolTable => } else { existing filter (!_.isMethod) } - assert(!existing.isOverloaded) + assert(!existing.isOverloaded, + "import failure: cannot determine unique overloaded method alternative from\n "+ + (existing.alternatives map (_.defString) mkString "\n")+"\n that matches "+sym+":"+sym.tpe) } if (existing.exists) existing else { val mysym = doImport + assert(myowner.info.decls.lookup(myname) == NoSymbol, myname+" "+myowner.info.decl(myname).exists) myowner.info.decls enter mysym mysym } } - } else if (sym.isTypeParameter && sym.paramPos >= 0) + } else if (sym.isTypeParameter && sym.paramPos >= 0 && !(myowner hasFlag Flags.LOCKED)) { + assert(myowner.typeParams.length > sym.paramPos, + "import failure: cannot determine parameter "+sym+" (#"+sym.paramPos+") in "+ + myowner+typeParamsString(myowner.rawInfo)+"\n original symbol was: "+ + sym.owner+from.typeParamsString(sym.owner.info)) + println(myowner.rawInfo) myowner.typeParams(sym.paramPos) - else + } else doImport } symMap getOrElseUpdate (sym, importOrRelink) diff --git a/test/disabled/pos/code.scala b/test/disabled/pos/code.scala index 57292c32df..e9e458ac10 100644 --- a/test/disabled/pos/code.scala +++ b/test/disabled/pos/code.scala @@ -7,10 +7,10 @@ object Test extends App { fun } val code = foo(List(2)) - val tree = foo(List(2)code.tree.asInstanceOf[scala.reflect.runtime.Mirror.Tree] - val targetType = code.manifest.tpe + val tree = code.tree.asInstanceOf[scala.reflect.runtime.Mirror.Tree] + val targetType = code.manifest.tpe.asInstanceOf[scala.reflect.runtime.Mirror.Type] val reporter = new StoreReporter - val toolbox = new ToolBox(reporter) + val toolbox = new ToolBox(reporter, args mkString " ") val ttree = toolbox.typeCheck(tree, targetType) if (reporter.infos.nonEmpty) { reporter.infos foreach println |