From ac90ad939c03366948f435bb603b56c7ab6bc2ce Mon Sep 17 00:00:00 2001 From: Sean McDirmid Date: Wed, 18 Jan 2006 18:49:01 +0000 Subject: --- src/compiler/scala/tools/nsc/Global.scala | 25 +++--- .../scala/tools/nsc/symtab/SymbolLoaders.scala | 40 +++++----- src/compiler/scala/tools/nsc/util/ClassPath.scala | 93 +++++++++++----------- 3 files changed, 80 insertions(+), 78 deletions(-) (limited to 'src/compiler') diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index 30a1217945..cdf0b82e29 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -420,18 +420,21 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable } def compileLate(file: AbstractFile): unit = - if (fileset == null) - throw new FatalError("No class file for " + file + " was found\n(This file cannot be loaded as a source file)"); + if (fileset == null) { + val msg = "No class file for " + file + " was found\n(This file cannot be loaded as a source file)"; + System.err.println(msg); + throw new FatalError(msg); + } else if (!(fileset contains file)) { - val unit = new CompilationUnit(getSourceFile(file)); - addUnit(unit); - var localPhase = firstPhase.asInstanceOf[GlobalPhase]; - while ((localPhase.id < globalPhase.id || localPhase.id <= namerPhase.id) && - reporter.errors == 0) { - atPhase(localPhase)(localPhase.applyPhase(unit)); - localPhase = localPhase.next.asInstanceOf[GlobalPhase]; - } - refreshProgress; + val unit = new CompilationUnit(getSourceFile(file)); + addUnit(unit); + var localPhase = firstPhase.asInstanceOf[GlobalPhase]; + while ((localPhase.id < globalPhase.id || localPhase.id <= namerPhase.id) && + reporter.errors == 0) { + atPhase(localPhase)(localPhase.applyPhase(unit)); + localPhase = localPhase.next.asInstanceOf[GlobalPhase]; + } + refreshProgress; } def compileFiles(files: List[AbstractFile]): unit = diff --git a/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala b/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala index 0becbda8bd..db8fc433fe 100644 --- a/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala +++ b/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala @@ -103,19 +103,20 @@ abstract class SymbolLoaders { } def enterClassAndModule(str: String, completer: SymbolLoader): unit = { - val owner = if (root.isRoot) definitions.EmptyPackageClass else root; - val name = newTermName(str); + val owner = if (root.isRoot) definitions.EmptyPackageClass else root; + val name = newTermName(str); val clazz = owner.newClass(Position.NOPOS, name.toTypeName); val module = owner.newModule(Position.NOPOS, name); - if (completer.sourceFile != null) clazz.sourceFile = completer.sourceFile; - clazz.setInfo(completer); - module.setInfo(completer); - module.moduleClass.setInfo(moduleClassLoader); - owner.info.decls.enter(clazz); - owner.info.decls.enter(module); - assert(clazz.linkedModule == module, module); - assert(module.linkedClass == clazz, clazz); - } + if (completer.sourceFile != null) clazz.sourceFile = completer.sourceFile; + clazz.setInfo(completer); + module.setInfo(completer); + module.moduleClass.setInfo(moduleClassLoader); + owner.info.decls.enter(clazz); + owner.info.decls.enter(module); + assert(clazz.linkedModule == module, module); + assert(module.linkedClass == clazz, clazz); + } + val classes = new HashMap[String, ClassPath.Context]; val packages = new HashMap[String, ClassPath.Context]; for (val dir <- directory.entries) if (dir.location != null) { @@ -149,15 +150,16 @@ abstract class SymbolLoaders { // do classes first for (val Pair(name, file) <- classes.elements) { - val loader = if (!file.isSourceFile) { + val loader = if (!file.isSourceFile) { // System.err.println("CLASSFILE: " + file.file + " in " + file); - new ClassfileLoader(file.file, file.sourceFile, file.sourcePath); - } else { - assert(file.sourceFile != null); - //System.err.println("SOURCEFILE: " + file.sourceFile + " in " + file); - new SourcefileLoader(file.sourceFile); - } - enterClassAndModule(name, loader); + new ClassfileLoader(file.classFile, file.sourceFile, file.sourcePath); + } else { + assert(file.sourceFile != null); + //System.err.println("SOURCEFILE: " + file.sourceFile + " in " + file); + + new SourcefileLoader(file.sourceFile); + } + enterClassAndModule(name, loader); } for (val Pair(name, file) <- packages.elements) enterPackage(name, new PackageLoader(file)); } diff --git a/src/compiler/scala/tools/nsc/util/ClassPath.scala b/src/compiler/scala/tools/nsc/util/ClassPath.scala index 4658fac231..a676615ceb 100644 --- a/src/compiler/scala/tools/nsc/util/ClassPath.scala +++ b/src/compiler/scala/tools/nsc/util/ClassPath.scala @@ -46,37 +46,37 @@ object ClassPath { class Context(val entries : List[Entry]) { def find(name : String, isDir : boolean) : Context = if (isPackage) { def find0(entries : List[Entry]) : Context = { - if (entries.isEmpty) new Context(Nil); - else { - val ret = find0(entries.tail); - val head = entries.head; - - - val clazz = if (head.location == null) null; else - head.location.lookupPath(name + (if (!isDir) ".class" else ""), isDir); - - val source0 = if (head.source == null) null; else { - val source1 = head.source.location.lookupPath(name + (if (isDir) "" else ".scala"), isDir); - if (source1 == null && !isDir && clazz != null) head.source.location; - else source1; - } - if (clazz == null && source0 == null) ret; - else { - object entry extends Entry { - override def location = clazz; - override def source = - if (source0 == null) null; - else new Source(source0, head.source.compile); - }; - new Context(entry :: ret.entries); - } - } - } - val ret = find0(entries); + if (entries.isEmpty) new Context(Nil); + else { + val ret = find0(entries.tail); + val head = entries.head; + + + val clazz = if (head.location == null) null; else + head.location.lookupPath(name + (if (!isDir) ".class" else ""), isDir); + + val source0 = if (head.source == null) null; else { + val source1 = head.source.location.lookupPath(name + (if (isDir) "" else ".scala"), isDir); + if (source1 == null && !isDir && clazz != null) head.source.location; + else source1; + } + if (clazz == null && source0 == null) ret; + else { + object entry extends Entry { + override def location = clazz; + override def source = + if (source0 == null) null; + else new Source(source0, head.source.compile); + }; + new Context(entry :: ret.entries); + } + } + } + val ret = find0(entries); if (false && this.toString().indexOf("scala") != -1) - System.err.println("FIND " + name + " in " + this + " => " + ret); + System.err.println("FIND " + name + " in " + this + " => " + ret); ret; - } else null; + } else null; def isPackage = { @@ -107,27 +107,21 @@ object ClassPath { if (entries0.isEmpty) ""; else toString(entries0.head) + ":::" + toString(entries0.tail); - def isSourceFile = - (!isPackage && !entries.isEmpty && entries.head.source != null && - entries.head.source.location.getFile().isFile()); + def isSourceFile = { + def head = entries.head; + def clazz = head.location; + def source = if (head.source == null) null else head.source.location; + if (entries.isEmpty || entries.isEmpty || source == null || !head.source.compile || !source.getFile().isFile()) false; + else if (clazz == null) true; + else if (source.lastModified() > clazz.lastModified()) true; + else false; + } - def sourceFile = if (isSourceFile) entries.head.source.location else null; + def sourceFile = if ( isSourceFile) entries.head.source.location else null; + def classFile = if (!isSourceFile) entries.head .location else null; def sourcePath = if (!isSourceFile && entries.head.source != null) entries.head.source.location else null; - def file = { - if (entries.isEmpty) null; /* file not found */ - else if (isPackage) null; - else { - def clazz = entries.head.location; - def source = if (entries.head.source == null) null else entries.head.source.location; - assert(!(clazz == null && source == null)); - if (clazz == null) source; - else if (source == null) clazz; - else if (source.getFile().isFile() && source.lastModified() > clazz.lastModified()) source; - else clazz; - } - } def validPackage(name: String): Boolean = if (name.equals("META-INF")) false; else if (name.startsWith(".")) false; @@ -141,9 +135,12 @@ object ClassPath { def this(classpath : String, source : String, output : String, boot : String, extdirs : String) = { - this(); + this(); + //System.err.println("BOOT: " + boot); + //System.err.println("CLAS: " + classpath); addFilesInPath(boot); + addArchivesInExtDirPath(extdirs); val strtok = new StringTokenizer(source, File.pathSeparator); while (strtok.hasMoreTokens()) { @@ -153,7 +150,7 @@ object ClassPath { entries += output0; } addFilesInPath(classpath); - //System.err.println("CLASSPATH: " + root); + //System.err.println("CLASSPATH: " + root); } def library(classes : String, sources : String) = { assert(classes != null); -- cgit v1.2.3