### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.compiler.tool Index: src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerImpl.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.compiler.tool/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerImpl.java,v retrieving revision 1.10 diff -u -r1.10 EclipseCompilerImpl.java --- src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerImpl.java 28 Apr 2009 16:36:50 -0000 1.10 +++ src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerImpl.java 29 Sep 2009 18:33:15 -0000 @@ -215,6 +215,73 @@ } return super.createProblem(originatingFileName, problemId, problemArguments, messageArguments, severity, startPosition, endPosition, lineNumber, columnNumber); } + @Override + public CategorizedProblem createProblem( + final char[] originatingFileName, + final int problemId, + final String[] problemArguments, + final int elaborationID, + final String[] messageArguments, + final int severity, + final int startPosition, + final int endPosition, + final int lineNumber, + final int columnNumber) { + + DiagnosticListener diagListener = EclipseCompilerImpl.this.diagnosticListener; + if (diagListener != null) { + diagListener.report(new Diagnostic() { + public String getCode() { + return Integer.toString(problemId); + } + public long getColumnNumber() { + return columnNumber; + } + public long getEndPosition() { + return endPosition; + } + public Kind getKind() { + if ((severity & ProblemSeverities.Error) != 0) { + return Diagnostic.Kind.ERROR; + } + if ((severity & ProblemSeverities.Optional) != 0) { + return Diagnostic.Kind.WARNING; + } + if ((severity & ProblemSeverities.Warning) != 0) { + return Diagnostic.Kind.MANDATORY_WARNING; + } + return Diagnostic.Kind.OTHER; + } + public long getLineNumber() { + return lineNumber; + } + public String getMessage(Locale locale) { + setLocale(locale); + return getLocalizedMessage(problemId, problemArguments); + } + public long getPosition() { + return startPosition; + } + public JavaFileObject getSource() { + try { + if (EclipseCompilerImpl.this.fileManager.hasLocation(StandardLocation.SOURCE_PATH)) { + return EclipseCompilerImpl.this.fileManager.getJavaFileForInput( + StandardLocation.SOURCE_PATH, + new String(originatingFileName), + JavaFileObject.Kind.SOURCE); + } + } catch (IOException e) { + // ignore + } + return null; + } + public long getStartPosition() { + return startPosition; + } + }); + } + return super.createProblem(originatingFileName, problemId, problemArguments, elaborationID, messageArguments, severity, startPosition, endPosition, lineNumber, columnNumber); + } }; } #P org.eclipse.jdt.compiler.tool.tests Index: src/org/eclipse/jdt/compiler/tool/tests/AbstractCompilerToolTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.compiler.tool.tests/src/org/eclipse/jdt/compiler/tool/tests/AbstractCompilerToolTest.java,v retrieving revision 1.1 diff -u -r1.1 AbstractCompilerToolTest.java --- src/org/eclipse/jdt/compiler/tool/tests/AbstractCompilerToolTest.java 12 Jun 2008 09:17:22 -0000 1.1 +++ src/org/eclipse/jdt/compiler/tool/tests/AbstractCompilerToolTest.java 29 Sep 2009 18:33:16 -0000 @@ -53,14 +53,35 @@ } } static class CompilerInvocationDiagnosticListener implements DiagnosticListener { - PrintWriter err; + public static final int NONE = 0; + public static final int ERROR = 1; + public static final int INFO = 2; + public static final int WARNING = 4; + + private PrintWriter err; + public int kind; + public CompilerInvocationDiagnosticListener(PrintWriter err) { this.err = err; + this.kind = NONE; } @Override public void report(Diagnostic diagnostic) { - // TODO Auto-generated method stub - + err.println(diagnostic); + if (this.kind == NONE) { + switch(diagnostic.getKind()) { + case ERROR : + this.kind = ERROR; + break; + case WARNING : + case MANDATORY_WARNING : + this.kind = WARNING; + break; + case NOTE : + case OTHER : + this.kind = INFO; + } + } } } static EclipseCompiler COMPILER = new EclipseCompiler(); Index: src/org/eclipse/jdt/compiler/tool/tests/CompilerToolTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.compiler.tool.tests/src/org/eclipse/jdt/compiler/tool/tests/CompilerToolTests.java,v retrieving revision 1.18 diff -u -r1.18 CompilerToolTests.java --- src/org/eclipse/jdt/compiler/tool/tests/CompilerToolTests.java 6 May 2009 21:26:11 -0000 1.18 +++ src/org/eclipse/jdt/compiler/tool/tests/CompilerToolTests.java 29 Sep 2009 18:33:16 -0000 @@ -11,6 +11,7 @@ package org.eclipse.jdt.compiler.tool.tests; import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -28,7 +29,6 @@ import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.StandardLocation; -//import javax.tools.StandardLocation; import javax.tools.ToolProvider; import javax.tools.JavaCompiler.CompilationTask; import javax.tools.JavaFileObject.Kind; @@ -36,6 +36,7 @@ import junit.framework.TestCase; import junit.framework.TestSuite; +import org.eclipse.jdt.compiler.tool.tests.AbstractCompilerToolTest.CompilerInvocationDiagnosticListener; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; @@ -57,6 +58,7 @@ suite.addTest(new CompilerToolTests("testCompilerOneClassWithEclipseCompiler2")); suite.addTest(new CompilerToolTests("testCompilerOneClassWithEclipseCompiler3")); suite.addTest(new CompilerToolTests("testCompilerOneClassWithEclipseCompiler4")); + suite.addTest(new CompilerToolTests("testCompilerOneClassWithEclipseCompiler5")); suite.addTest(new CompilerToolTests("testCleanUp")); return suite; } @@ -618,15 +620,63 @@ List options = new ArrayList(); options.add("-d"); options.add(tmpFolder); - CompilationTask task = Compiler.getTask(null, null, null, options, null, units); - // check the classpath location + CompilationTask task = Compiler.getTask(null, null, null, options, null, units); + // check the classpath location Boolean result = task.call(); printWriter.flush(); printWriter.close(); - if (!result.booleanValue()) { - System.err.println("Compilation failed: " + stringWriter.getBuffer().toString()); - assertTrue("Compilation failed ", false); - } + if (!result.booleanValue()) { + System.err.println("Compilation failed: " + stringWriter.getBuffer().toString()); + assertTrue("Compilation failed ", false); + } + // check that the .class file exist for X + assertTrue("delete failed", inputFile.delete()); + } + + public void testCompilerOneClassWithEclipseCompiler5() { + String tmpFolder = System.getProperty("java.io.tmpdir"); + File inputFile = new File(tmpFolder, "X.java"); + BufferedWriter writer = null; + try { + writer = new BufferedWriter(new FileWriter(inputFile)); + writer.write( + "package p;\n" + + "public class X extends File {}"); + writer.flush(); + writer.close(); + } catch (IOException e) { + // ignore + } finally { + if (writer != null) { + try { + writer.close(); + } catch (IOException e) { + // ignore + } + } + } + // System compiler + StandardJavaFileManager manager = Compiler.getStandardFileManager(null, Locale.getDefault(), Charset.defaultCharset()); + List files = new ArrayList(); + files.add(inputFile); + Iterable units = manager.getJavaFileObjectsFromFiles(files); + + List options = new ArrayList(); + options.add("-d"); + options.add(tmpFolder); + ByteArrayOutputStream errBuffer = new ByteArrayOutputStream(); + PrintWriter err = new PrintWriter(errBuffer); + CompilerInvocationDiagnosticListener compilerInvocationDiagnosticListener = new CompilerInvocationDiagnosticListener(err); + CompilationTask task = Compiler.getTask(null, manager, compilerInvocationDiagnosticListener, options, null, units); + // check the classpath location + Boolean result = task.call(); + err.flush(); + err.close(); + assertFalse(errBuffer.toString().isEmpty()); + assertTrue(compilerInvocationDiagnosticListener.kind != CompilerInvocationDiagnosticListener.NONE); + if (!result.booleanValue()) { + assertFalse("Compilation did not fail", false); + } // check that the .class file exist for X assertTrue("delete failed", inputFile.delete()); }