diff options
author | Sean McDirmid <sean.mcdirmid@gmail.com> | 2007-10-04 12:24:50 +0000 |
---|---|---|
committer | Sean McDirmid <sean.mcdirmid@gmail.com> | 2007-10-04 12:24:50 +0000 |
commit | 2b040ce0fdd3359a3ab0f91a642ad78c6c87b94e (patch) | |
tree | 637f4b38cb6b56e021745454ae423d36b8dd2f5c | |
parent | 49592a353d8e4f962c3c7c31423a62e15a7c0fad (diff) | |
download | scala-2b040ce0fdd3359a3ab0f91a642ad78c6c87b94e.tar.gz scala-2b040ce0fdd3359a3ab0f91a642ad78c6c87b94e.tar.bz2 scala-2b040ce0fdd3359a3ab0f91a642ad78c6c87b94e.zip |
Fixing a bug with long lists in GenerateIDESyms...
Fixing a bug with long lists in GenerateIDESyms and a fresh name problem
in ETA expansion with respect to the IDE.
5 files changed, 14 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index fe6a0ddb07..4037a0a5c7 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -705,5 +705,8 @@ class Global(var settings: Settings, var reporter: Reporter) extends Trees def unpickleIDEHook : (( => Type) => Type) = unpickleIDEHook0 def doPickleHash = false /* hook for IDE to detect source from class dependencies */ - def attachSourceToClass(clazz : ClassSymbol, tpe : LazyType, sourceFile : AbstractFile) = clazz.sourceFile = sourceFile + def attachSourceToClass(clazz : Symbol, tpe : LazyType, sourceFile : AbstractFile) = clazz match { + case clazz : ClassSymbol => clazz.sourceFile = sourceFile + case _ => + } } diff --git a/src/compiler/scala/tools/nsc/symtab/GenerateIdeMaps.scala b/src/compiler/scala/tools/nsc/symtab/GenerateIdeMaps.scala index 09fbf6111a..a137ed7490 100644 --- a/src/compiler/scala/tools/nsc/symtab/GenerateIdeMaps.scala +++ b/src/compiler/scala/tools/nsc/symtab/GenerateIdeMaps.scala @@ -171,7 +171,9 @@ abstract class GenerateIdeMaps extends SubComponent { return null } def walk(sourceFile : SourceFile, tree: Tree, uses : scala.collection.mutable.Map[Position,Symbol], defs : LinkedHashMap[Symbol,Position]) : Unit = { + val visited = new LinkedHashSet[Tree] def f(t : Tree) : Unit = { + if (!visited.add(t)) return def fs(l : List[Tree]) : Unit = { val i = l.elements while (i.hasNext) f(i.next) diff --git a/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala b/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala index f341452095..0511870e76 100644 --- a/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala +++ b/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala @@ -286,6 +286,9 @@ abstract class SymbolLoaders { root match { case clazz : ClassSymbol => global.attachSourceToClass(clazz, this, if (sourceFile ne null) sourceFile else clazz.sourceFile) + case module : ModuleSymbol => + val clazz = module.moduleClass.asInstanceOf[ClassSymbol] + global.attachSourceToClass(module, this, if (sourceFile ne null) sourceFile else clazz.sourceFile) case _ => } if (root.sourceFile ne null) { diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index ec00809529..d9300c8a17 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -337,8 +337,10 @@ abstract class ClassfileParser { var sflags = transFlags(jflags) if ((sflags & DEFERRED) != 0) sflags = sflags & ~DEFERRED | ABSTRACT val c = pool.getClassSymbol(in.nextChar) - if (c != clazz) + if (c != clazz) { + assert(true) throw new IOException("class file '" + in.file + "' contains wrong " + c) + } val superType = if (isAnnotation) { in.nextChar; definitions.AnnotationClass.tpe } else pool.getSuperClass(in.nextChar).tpe val ifaceCount = in.nextChar diff --git a/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala b/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala index 23d67f3a38..52fac051bc 100644 --- a/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala +++ b/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala @@ -41,7 +41,8 @@ trait EtaExpansion { self: Analyzer => def freshName(pos : util.Position, n : Int) = { cnt += 1 if (pos == util.NoPosition) { - newTermName(unit.fresh.newName("eta$" + symbolHash + (cnt - 1))) + if (inIDE) newTermName( ("eta$" + symbolHash + (cnt - 1))) + else newTermName(unit.fresh.newName("eta$" + symbolHash + (cnt - 1))) } else if (n == 0) { newTermName(unit.fresh.newName(pos, "eta$" + symbolHash)) } else { |