public void report(Diagnostic<? extends JavaFileObject> diagnostic) { final CompilerMessage.Kind kind; switch (diagnostic.getKind()) { case ERROR: kind = BuildMessage.Kind.ERROR; myErrorCount++; break; case MANDATORY_WARNING: case WARNING: case NOTE: kind = BuildMessage.Kind.WARNING; myWarningCount++; break; default: kind = BuildMessage.Kind.INFO; } File sourceFile = null; try { // for eclipse compiler just an attempt to call getSource() may lead to an NPE, // so calling this method under try/catch to avoid induced compiler errors final JavaFileObject source = diagnostic.getSource(); sourceFile = source != null ? Utils.convertToFile(source.toUri()) : null; } catch (Exception e) { LOG.info(e); } final String srcPath = sourceFile != null ? FileUtil.toSystemIndependentName(sourceFile.getPath()) : null; String message = diagnostic.getMessage(Locale.US); if (Utils.IS_TEST_MODE) { LOG.info(message); } myContext.processMessage( new CompilerMessage( BUILDER_NAME, kind, message, srcPath, diagnostic.getStartPosition(), diagnostic.getEndPosition(), diagnostic.getPosition(), diagnostic.getLineNumber(), diagnostic.getColumnNumber())); }
public static void main(String... args) throws IOException, URISyntaxException { if (args.length != 1) throw new IllegalStateException("Must provide class name!"); String testContent = null; List<File> sourcePath = new ArrayList<>(); for (String sourcePaths : System.getProperty("test.src.path").split(":")) { sourcePath.add(new File(sourcePaths)); } JavacFileManager fm = JavacTool.create().getStandardFileManager(null, null, null); for (File sp : sourcePath) { File inp = new File(sp, args[0]); if (inp.canRead()) { testContent = fm.getRegularFile(inp.toPath()).getCharContent(true).toString(); } } if (testContent == null) throw new IllegalStateException(); final List<Diagnostic<?>> diagnostics = new ArrayList<>(); DiagnosticListener<JavaFileObject> collectDiagnostics = new DiagnosticListener<JavaFileObject>() { @Override public void report(Diagnostic<? extends JavaFileObject> diagnostic) { diagnostics.add(diagnostic); } }; JavaFileObject testFile = new TestFO(new URI("mem://" + args[0]), testContent); JavacTask task = JavacTool.create() .getTask( null, new TestFM(fm), collectDiagnostics, STANDARD_PARAMS, null, Arrays.asList(testFile)); final Trees trees = Trees.instance(task); final CompilationUnitTree cut = task.parse().iterator().next(); task.analyze(); final List<int[]> declarationSpans = new ArrayList<>(); new TreeScanner<Void, Void>() { @Override public Void visitClass(ClassTree node, Void p) { handleDeclaration(node); return super.visitClass(node, p); } @Override public Void visitMethod(MethodTree node, Void p) { handleDeclaration(node); return super.visitMethod(node, p); } @Override public Void visitVariable(VariableTree node, Void p) { handleDeclaration(node); return super.visitVariable(node, p); } @Override public Void visitNewClass(NewClassTree node, Void p) { if (node.getClassBody() != null) { scan(node.getClassBody().getMembers(), null); } return null; } private void handleDeclaration(Tree node) { int endPos = (int) trees.getSourcePositions().getEndPosition(cut, node); if (endPos == (-1)) { if (node.getKind() == Tree.Kind.METHOD && (((JCMethodDecl) node).getModifiers().flags & Flags.GENERATEDCONSTR) != 0) { return; } throw new IllegalStateException(); } declarationSpans.add( new int[] {(int) trees.getSourcePositions().getStartPosition(cut, node), endPos}); } }.scan(cut, null); for (final int[] declarationSpan : declarationSpans) { final String suppressWarnings = "@SuppressWarnings({\"deprecation\", \"unchecked\", \"serial\", \"divzero\"})"; final String updatedContent = testContent.substring(0, declarationSpan[0]) + suppressWarnings + testContent.substring(declarationSpan[0]); final List<Diagnostic<?>> foundErrors = new ArrayList<>(diagnostics); DiagnosticListener<JavaFileObject> verifyDiagnostics = new DiagnosticListener<JavaFileObject>() { @Override public void report(Diagnostic<? extends JavaFileObject> diagnostic) { long adjustedPos = diagnostic.getPosition(); if (adjustedPos >= declarationSpan[0]) adjustedPos -= suppressWarnings.length(); if (declarationSpan[0] <= adjustedPos && adjustedPos <= declarationSpan[1]) { throw new IllegalStateException("unsuppressed: " + diagnostic.getMessage(null)); } boolean found = false; for (Iterator<Diagnostic<?>> it = foundErrors.iterator(); it.hasNext(); ) { Diagnostic<?> d = it.next(); if (d.getPosition() == adjustedPos && d.getCode().equals(diagnostic.getCode())) { it.remove(); found = true; break; } } if (!found) { throw new IllegalStateException( "diagnostic not originally reported: " + diagnostic.getMessage(null)); } } }; JavaFileObject updatedFile = new TestFO(new URI("mem://" + args[0]), updatedContent); JavacTask testTask = JavacTool.create() .getTask( null, new TestFM(fm), verifyDiagnostics, STANDARD_PARAMS, null, Arrays.asList(updatedFile)); testTask.analyze(); for (Diagnostic<?> d : foundErrors) { if (d.getPosition() < declarationSpan[0] || declarationSpan[1] < d.getPosition()) { throw new IllegalStateException("missing: " + d.getMessage(null)); } } } }