forked from scala/scala3
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
We introduce a new entry point for the compiler in `dotty.tools.dotc.Driver`: ``` def process(args: Array[String], simple: interfaces.SimpleReporter, callback: interfaces.CompilerCallback): interfaces.ReporterResult ``` Except for `args` which is just an array, the argument types and return type of this method are Java interfaces defined in a new package called `dotty-interfaces` which has a stable ABI. This means that you can programmatically run a compiler with a custom reporter and callbacks without having to recompile it against every version of dotty: you only need to have `dotty-interfaces` present at compile-time and call the `process` method using Java reflection. See `test/test/InterfaceEntryPointTest.scala` for a concrete example. This design is based on discussions with the IntelliJ IDEA Scala plugin team. Thanks to Nikolay Tropin for the discussions and his PR proposal (see scala#1011).
- Loading branch information
Showing
19 changed files
with
397 additions
and
71 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
24 changes: 24 additions & 0 deletions
24
interfaces/src/main/java/dotty/tools/dotc/interfaces/AbstractFile.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package dotty.tools.dotc.interfaces; | ||
|
||
import java.io.File; | ||
import java.util.Optional; | ||
|
||
/** An abstract file may either be a file on disk or a virtual file. | ||
* | ||
* Do not rely on the identity of instances of this class. | ||
* | ||
* User code should not implement this interface, but it may have to | ||
* manipulate objects of this type. | ||
*/ | ||
public interface AbstractFile { | ||
/** The name of this file, note that two files may have the same name. */ | ||
String name(); | ||
|
||
/** The path of this file, this might be a virtual path of an unspecified format. */ | ||
String path(); | ||
|
||
/** If this is a real file on disk, a `java.io.File` that corresponds to this file. | ||
* Otherwise, an empty `Optional`. | ||
*/ | ||
Optional<File> jfile(); | ||
} |
28 changes: 28 additions & 0 deletions
28
interfaces/src/main/java/dotty/tools/dotc/interfaces/CompilerCallback.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package dotty.tools.dotc.interfaces; | ||
|
||
/** Set of callbacks called in response to events during the compilation process. | ||
* | ||
* You should implement this interface if you want to react to one or more of | ||
* these events. | ||
* | ||
* @see the method `process` of `dotty.tools.dotc.Driver` for more information. | ||
*/ | ||
public interface CompilerCallback { | ||
/** Called when a class has been generated. | ||
* | ||
* @param source The source file corresponding to this class. | ||
* Example: ./src/library/scala/collection/Seq.scala | ||
* @param generatedClass The generated classfile for this class. | ||
* Example: ./scala/collection/Seq$.class | ||
* @param className The name of this class. | ||
* Example: scala.collection.Seq$ | ||
*/ | ||
default void onClassGenerated(SourceFile source, AbstractFile generatedClass, String className) {}; | ||
|
||
/** Called when every class for this file has been generated. | ||
* | ||
* @param source The source file. | ||
* Example: ./src/library/scala/collection/Seq.scala | ||
*/ | ||
default void onSourceCompiled(SourceFile source) {}; | ||
} |
26 changes: 26 additions & 0 deletions
26
interfaces/src/main/java/dotty/tools/dotc/interfaces/Diagnostic.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package dotty.tools.dotc.interfaces; | ||
|
||
import java.util.Optional; | ||
|
||
/** A diagnostic is a message emitted during the compilation process. | ||
* | ||
* It can either be an error, a warning or an information. | ||
* | ||
* User code should not implement this interface, but it may have to | ||
* manipulate objects of this type. | ||
*/ | ||
public interface Diagnostic { | ||
public static final int ERROR = 2; | ||
public static final int WARNING = 1; | ||
public static final int INFO = 0; | ||
|
||
/** The message to report */ | ||
String message(); | ||
|
||
/** Level of the diagnostic, can be either ERROR, WARNING or INFO */ | ||
int level(); | ||
|
||
/** The position in a source file of the code that caused this diagnostic | ||
* to be emitted. */ | ||
Optional<SourcePosition> position(); | ||
} |
18 changes: 18 additions & 0 deletions
18
interfaces/src/main/java/dotty/tools/dotc/interfaces/ReporterResult.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package dotty.tools.dotc.interfaces; | ||
|
||
/** Summary of the diagnostics emitted by a Reporter. | ||
* | ||
* User code should not implement this interface, but it may have to | ||
* manipulate objects of this type. | ||
*/ | ||
public interface ReporterResult { | ||
/** Have we emitted any error ? */ | ||
boolean hasErrors(); | ||
/** Number of errors that have been emitted */ | ||
int errorCount(); | ||
|
||
/** Have we emitted any warning ? */ | ||
boolean hasWarnings(); | ||
/** Number of warnings that have been emitted */ | ||
int warningCount(); | ||
} |
13 changes: 13 additions & 0 deletions
13
interfaces/src/main/java/dotty/tools/dotc/interfaces/SimpleReporter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package dotty.tools.dotc.interfaces; | ||
|
||
/** Report errors, warnings and info messages during the compilation process | ||
* | ||
* You should implement this interface if you want to handle the diagnostics | ||
* returned by the compiler yourself. | ||
* | ||
* @see the method `process` of `dotty.tools.dotc.Driver` for more information. | ||
*/ | ||
public interface SimpleReporter { | ||
/** Report a diagnostic. */ | ||
void report(Diagnostic diag); | ||
} |
13 changes: 13 additions & 0 deletions
13
interfaces/src/main/java/dotty/tools/dotc/interfaces/SourceFile.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package dotty.tools.dotc.interfaces; | ||
|
||
import java.io.File; | ||
|
||
/** A source file. | ||
* | ||
* User code should not implement this interface, but it may have to | ||
* manipulate objects of this type. | ||
*/ | ||
public interface SourceFile extends AbstractFile { | ||
/** The content of this file as seen by the compiler. */ | ||
char[] content(); | ||
} |
44 changes: 44 additions & 0 deletions
44
interfaces/src/main/java/dotty/tools/dotc/interfaces/SourcePosition.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
package dotty.tools.dotc.interfaces; | ||
|
||
/** A position in a source file. | ||
* | ||
* A position is a range between a start offset and an end offset, as well as a | ||
* point inside this range. | ||
* | ||
* As a convenience, we also provide methods that return the line and the column | ||
* corresponding to each offset. | ||
* | ||
* User code should not implement this interface, but it may have to | ||
* manipulate objects of this type. | ||
*/ | ||
public interface SourcePosition { | ||
/** Content of the line which contains the point */ | ||
String lineContent(); | ||
|
||
/** Offset to the point */ | ||
int point(); | ||
/** Line number of the point, starting at 0 */ | ||
int line(); | ||
/** Column number of the point, starting at 0 */ | ||
int column(); | ||
|
||
/** Offset to the range start */ | ||
int start(); | ||
/** Line number of the range start, starting at 0 */ | ||
int startLine(); | ||
/** Column number of the range start, starting at 0 */ | ||
int startColumn(); | ||
|
||
/** Offset to the range end */ | ||
int end(); | ||
/** Line number of the range end, starting at 0 */ | ||
int endLine(); | ||
/** Column number of the range end, starting at 0 */ | ||
int endColumn(); | ||
|
||
/** The source file corresponding to this position. | ||
* The values returned by `point()`, `start()` and `end()` | ||
* are indices in the array returned by `source().content()`. | ||
*/ | ||
SourceFile source(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.