summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scala/tools/scalac/typechecker/Analyzer.scala11
-rw-r--r--sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala4
-rw-r--r--sources/scalac/Global.java13
-rw-r--r--sources/scalac/symtab/SourceCompleter.java15
-rw-r--r--sources/scalac/typechecker/AnalyzerPhase.java2
5 files changed, 21 insertions, 24 deletions
diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala
index 14899ac096..419da47a53 100644
--- a/sources/scala/tools/scalac/typechecker/Analyzer.scala
+++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala
@@ -101,8 +101,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
this.context = null;
}
- def lateEnter(unit: Unit, sym: Symbol): unit = {
- //System.out.println("late enter: " + sym + " " + sym.isModule());//DEBUG
+ def lateEnter(unit: Unit): unit = {
enterUnit(unit);
descr.newSources.add(unit);
}
@@ -111,14 +110,12 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
assert(clasz.isClass() && !clasz.isModuleClass(), Debug.show(clasz));
if (clasz.isExternal()) {
try {
- val filename = SourceRepresentation.externalizeFileName(clasz, ".scala");
- val file = global.classPath.openFile(filename);
- if (!file.exists()) throw new java.io.FileNotFoundException(file.getPath());
- new SourceCompleter(global).complete(clasz);
+ global.compileLate(global.getSourceFile(clasz), true);
} catch {
case exception: java.io.IOException =>
if (global.debug) exception.printStackTrace();
- unit.error(pos, "source file for " + clasz + " not found; it is needed because class is used as a mixin");
+ unit.error(pos, exception.getMessage() + "; source file for "
+ + clasz + " is needed because it is used as a mixin");
}
}
}
diff --git a/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala b/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala
index efe2eb32d3..d0aaf2e09d 100644
--- a/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala
+++ b/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala
@@ -60,8 +60,8 @@ class AnalyzerPhase(global: scalac_Global, descriptor: PhaseDescriptor) extends
override def apply(units: Array[Unit]): unit =
new Analyzer(global, this).apply(units);
- override def lateEnter(global: scalac_Global, unit: Unit, symbol: Symbol): unit = {
- new Analyzer(global, this).lateEnter(unit, symbol);
+ override def lateEnter(unit: Unit): unit = {
+ new Analyzer(global, this).lateEnter(unit);
}
override def postCheckers(global: scalac_Global): Array[Checker] =
diff --git a/sources/scalac/Global.java b/sources/scalac/Global.java
index d83751926d..5ae1d874ba 100644
--- a/sources/scalac/Global.java
+++ b/sources/scalac/Global.java
@@ -384,6 +384,19 @@ public abstract class Global {
treePrinter.end();
}
+ /** Compiles an additional source file. */
+ public void compileLate(SourceFile source, boolean mixinOnly) {
+ Unit unit = new Unit(this, source, false, mixinOnly);
+ Phase backup = currentPhase;
+ // !!! add code to print/skip/graph as in compile
+ currentPhase = PHASE.PARSER.phase();
+ PHASE.PARSER.phase().apply(new Unit[] {unit});
+ currentPhase = PHASE.ANALYZER.phase();
+ ((AnalyzerPhase)PHASE.ANALYZER.phase()).lateEnter(unit);
+ // !!! add code for later phases?
+ currentPhase = backup;
+ }
+
private void print() {
if (currentPhase.id == PHASE.MAKEBOXINGEXPLICIT.id()) {
boolean html = args.printer.value.equals(PRINTER_HTML);
diff --git a/sources/scalac/symtab/SourceCompleter.java b/sources/scalac/symtab/SourceCompleter.java
index e70023c935..b9456a4b10 100644
--- a/sources/scalac/symtab/SourceCompleter.java
+++ b/sources/scalac/symtab/SourceCompleter.java
@@ -20,28 +20,15 @@ import java.io.*;
public class SourceCompleter extends SymbolLoader {
- private final boolean mixinOnly;
-
public SourceCompleter(Global global) {
- this(global, false);
- }
-
- public SourceCompleter(Global global, boolean mixinOnly) {
super(global);
- this.mixinOnly = mixinOnly;
}
/** complete class symbol c by loading the unit
*/
public String doComplete(Symbol clasz) throws IOException {
SourceFile source = global.getSourceFile(clasz);
- Unit unit = new Unit(global, source, false, mixinOnly);
- Phase phase = global.currentPhase;
- global.currentPhase = global.PHASE.PARSER.phase();
- global.PHASE.PARSER.phase().apply(new Unit[] {unit});
- global.currentPhase = global.PHASE.ANALYZER.phase();
- ((AnalyzerPhase)global.PHASE.ANALYZER.phase()).lateEnter(global, unit, clasz);
- global.currentPhase = phase;
+ global.compileLate(source, false);
return "source file '" + source + "'";
}
diff --git a/sources/scalac/typechecker/AnalyzerPhase.java b/sources/scalac/typechecker/AnalyzerPhase.java
index 34ff998cb3..1c972e6cab 100644
--- a/sources/scalac/typechecker/AnalyzerPhase.java
+++ b/sources/scalac/typechecker/AnalyzerPhase.java
@@ -29,6 +29,6 @@ public abstract class AnalyzerPhase extends Phase {
public abstract void addConsoleImport(Symbol module);
- public abstract void lateEnter(Global global, Unit unit, Symbol symbol);
+ public abstract void lateEnter(Unit unit);
}