diff --git a/src/main/java/org/mdkt/compiler/CompileException.java b/src/main/java/org/mdkt/compiler/CompileException.java new file mode 100644 index 0000000..a7268e8 --- /dev/null +++ b/src/main/java/org/mdkt/compiler/CompileException.java @@ -0,0 +1,10 @@ +package org.mdkt.compiler; + +/** + * Created by PKeidel on 13.10.15. + */ +public class CompileException extends Exception { + public CompileException(String msg) { + super(msg); + } +} diff --git a/src/main/java/org/mdkt/compiler/InMemoryJavaCompiler.java b/src/main/java/org/mdkt/compiler/InMemoryJavaCompiler.java index 865fd4a..f6162e7 100644 --- a/src/main/java/org/mdkt/compiler/InMemoryJavaCompiler.java +++ b/src/main/java/org/mdkt/compiler/InMemoryJavaCompiler.java @@ -1,24 +1,39 @@ package org.mdkt.compiler; -import javax.tools.JavaCompiler; -import javax.tools.JavaFileObject; -import javax.tools.ToolProvider; +import javax.tools.*; +import java.io.IOException; import java.util.Arrays; +import java.util.Collections; +import java.util.List; /** * Created by trung on 5/3/15. + * Changed by PKeidel on 13.10.15. */ public class InMemoryJavaCompiler { static JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); public static Class compile(String className, String sourceCodeInText) throws Exception { + final DiagnosticCollector diagnosticsCollector = new DiagnosticCollector<>(); SourceCode sourceCode = new SourceCode(className, sourceCodeInText); CompiledCode compiledCode = new CompiledCode(className); - Iterable compilationUnits = Arrays.asList(sourceCode); + Iterable compilationUnits = Collections.singletonList(sourceCode); DynamicClassLoader cl = new DynamicClassLoader(ClassLoader.getSystemClassLoader()); - ExtendedStandardJavaFileManager fileManager = new ExtendedStandardJavaFileManager(javac.getStandardFileManager(null, null, null), compiledCode, cl); - JavaCompiler.CompilationTask task = javac.getTask(null, fileManager, null, null, null, compilationUnits); + ExtendedStandardJavaFileManager fileManager = new ExtendedStandardJavaFileManager(javac.getStandardFileManager(diagnosticsCollector, null, null), compiledCode, cl); + JavaCompiler.CompilationTask task = javac.getTask(null, fileManager, diagnosticsCollector, null, null, compilationUnits); boolean result = task.call(); + fileManager.close(); + + if (!result) { + StringBuilder sb = new StringBuilder(); + List> diagnostics = diagnosticsCollector.getDiagnostics(); + for (Diagnostic diagnostic : diagnostics) { + // read error dertails from the diagnostic object + sb.append("=> ").append(diagnostic.getMessage(null)).append("\n"); + } + throw new CompileException(sb.toString()); + } + return cl.loadClass(className); } }