/* * Copyright 2012-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package com.facebook.buck.jvm.java; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.tools.Diagnostic; import javax.tools.JavaFileObject; public final class DiagnosticCleaner { private static final Set<String> RECOVERABLE_ERRORS = new HashSet<String>() { { add("compiler.err.cant.resolve.location"); add("compiler.err.doesnt.exist"); } }; private DiagnosticCleaner() {} public static List<Diagnostic<? extends JavaFileObject>> clean( List<Diagnostic<? extends JavaFileObject>> diagnostics) { List<Diagnostic<? extends JavaFileObject>> result = removeDuplicates(diagnostics); sortRecoverableErrorsLast(result); return result; } private static void sortRecoverableErrorsLast(List<Diagnostic<? extends JavaFileObject>> result) { result.sort( (o1, o2) -> { String code1 = o1.getCode(); String code2 = o2.getCode(); if (isRecoverableErrorCode(code1)) { if (isRecoverableErrorCode(code2)) { return 0; } return 1; } else if (isRecoverableErrorCode(code2)) { return -1; } return 0; }); } private static List<Diagnostic<? extends JavaFileObject>> removeDuplicates( List<Diagnostic<? extends JavaFileObject>> diagnostics) { Set<String> seenDiagnostics = new HashSet<>(); List<Diagnostic<? extends JavaFileObject>> result = new ArrayList<>(diagnostics.size()); for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics) { String diagnosticString = diagnosticToString(diagnostic); if (!seenDiagnostics.contains(diagnosticString)) { result.add(diagnostic); } seenDiagnostics.add(diagnosticString); } return result; } static String diagnosticToString(Diagnostic<? extends JavaFileObject> diagnostic) { return String.format( "%s %s %d %d %d %d %d %s", diagnostic.getKind(), diagnostic.getSource(), diagnostic.getPosition(), diagnostic.getStartPosition(), diagnostic.getEndPosition(), diagnostic.getLineNumber(), diagnostic.getColumnNumber(), diagnostic.getCode()); } private static boolean isRecoverableErrorCode(String code) { return RECOVERABLE_ERRORS.contains(code); } }