| // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| package com.android.tools.r8; | |
| import static org.junit.Assert.assertEquals; | |
| import static org.junit.Assert.assertSame; | |
| import static org.junit.Assert.assertTrue; | |
| import static org.junit.Assert.fail; | |
| import com.android.tools.r8.origin.Origin; | |
| import com.android.tools.r8.origin.PathOrigin; | |
| import com.android.tools.r8.position.Position; | |
| import com.android.tools.r8.position.TextPosition; | |
| import com.android.tools.r8.position.TextRange; | |
| import com.android.tools.r8.utils.ListUtils; | |
| import com.google.common.collect.ImmutableList; | |
| import java.nio.file.Path; | |
| import java.util.ArrayList; | |
| import java.util.Collection; | |
| import java.util.List; | |
| import java.util.function.Consumer; | |
| // Helper to check that a particular error occurred. | |
| // TODO(b/186505526): Prefer TestDiagnosticMessages. | |
| @Deprecated | |
| public class DiagnosticsChecker implements DiagnosticsHandler { | |
| public List<Diagnostic> errors = new ArrayList<>(); | |
| public List<Diagnostic> warnings = new ArrayList<>(); | |
| public List<Diagnostic> infos = new ArrayList<>(); | |
| @Override | |
| public void error(Diagnostic error) { | |
| errors.add(error); | |
| } | |
| @Override | |
| public void warning(Diagnostic warning) { | |
| warnings.add(warning); | |
| } | |
| @Override | |
| public void info(Diagnostic info) { | |
| infos.add(info); | |
| } | |
| public interface FailingRunner { | |
| void run(DiagnosticsHandler handler) throws CompilationFailedException; | |
| } | |
| private static void checkContains(String snippet, List<Diagnostic> diagnostics) { | |
| List<String> messages = ListUtils.map(diagnostics, Diagnostic::getDiagnosticMessage); | |
| System.out.println("Expecting match for '" + snippet + "'"); | |
| System.out.println("Diagnostics messages:\n" + messages); | |
| assertTrue( | |
| "Expected to find snippet '" | |
| + snippet | |
| + "' in error messages:\n" | |
| + String.join("\n", messages), | |
| diagnostics.stream().anyMatch(d -> d.getDiagnosticMessage().contains(snippet))); | |
| } | |
| public static void checkContains(Collection<String> snippets, List<Diagnostic> diagnostics) { | |
| snippets.forEach(snippet -> checkContains(snippet, diagnostics)); | |
| } | |
| public void checkErrorsContains(String snippet) { | |
| checkContains(snippet, errors); | |
| } | |
| public void checkWarningsContains(String snippet) { | |
| checkContains(snippet, warnings); | |
| } | |
| public void checkInfosContains(String snippet) { | |
| checkContains(snippet, infos); | |
| } | |
| public static void checkErrorsContains(String snippet, FailingRunner runner) | |
| throws CompilationFailedException { | |
| checkErrorsContains(ImmutableList.of(snippet), runner); | |
| } | |
| public static void checkErrorsContains(Collection<String> snippets, FailingRunner runner) | |
| throws CompilationFailedException { | |
| DiagnosticsChecker handler = new DiagnosticsChecker(); | |
| try { | |
| runner.run(handler); | |
| fail("Failure expected"); | |
| } catch (CompilationFailedException e) { | |
| checkContains(snippets, handler.errors); | |
| throw e; | |
| } | |
| } | |
| public static void checkDiagnostics(Consumer<DiagnosticsChecker> checker, FailingRunner runner) | |
| throws CompilationFailedException { | |
| DiagnosticsChecker handler = new DiagnosticsChecker(); | |
| runner.run(handler); | |
| checker.accept(handler); | |
| } | |
| public static void checkWarningsContains(String snippet, FailingRunner runner) | |
| throws CompilationFailedException { | |
| DiagnosticsChecker handler = new DiagnosticsChecker(); | |
| runner.run(handler); | |
| checkContains(snippet, handler.warnings); | |
| } | |
| public static void checkInfosContains(String snippet, FailingRunner runner) | |
| throws CompilationFailedException { | |
| DiagnosticsChecker handler = new DiagnosticsChecker(); | |
| runner.run(handler); | |
| checkContains(snippet, handler.infos); | |
| } | |
| public static Diagnostic checkDiagnostic(Diagnostic diagnostic, Consumer<Origin> originChecker, | |
| int lineStart, int columnStart, String... messageParts) { | |
| if (originChecker != null) { | |
| originChecker.accept(diagnostic.getOrigin()); | |
| } | |
| TextPosition position; | |
| if (diagnostic.getPosition() instanceof TextRange) { | |
| position = ((TextRange) diagnostic.getPosition()).getStart(); | |
| } else { | |
| position = ((TextPosition) diagnostic.getPosition()); | |
| } | |
| if (lineStart > 0) { | |
| assertEquals(lineStart, position.getLine()); | |
| } | |
| if (columnStart > 0) { | |
| assertEquals(columnStart, position.getColumn()); | |
| } | |
| for (String part : messageParts) { | |
| assertTrue(diagnostic.getDiagnosticMessage() + " doesn't contain \"" + part + "\"", | |
| diagnostic.getDiagnosticMessage().contains(part)); | |
| } | |
| return diagnostic; | |
| } | |
| public static Diagnostic checkDiagnostic(Diagnostic diagnostic, Consumer<Origin> originChecker, | |
| String... messageParts) { | |
| if (originChecker != null) { | |
| originChecker.accept(diagnostic.getOrigin()); | |
| } | |
| assertEquals(diagnostic.getPosition(), Position.UNKNOWN); | |
| for (String part : messageParts) { | |
| assertTrue(diagnostic.getDiagnosticMessage() + " doesn't contain \"" + part + "\"", | |
| diagnostic.getDiagnosticMessage().contains(part)); | |
| } | |
| return diagnostic; | |
| } | |
| static class PathOriginChecker implements Consumer<Origin> { | |
| private final Path path; | |
| PathOriginChecker(Path path) { | |
| this.path = path; | |
| } | |
| public void accept(Origin origin) { | |
| if (path != null) { | |
| assertEquals(path, ((PathOrigin) origin).getPath()); | |
| } else { | |
| assertSame(Origin.unknown(), origin); | |
| } | |
| } | |
| } | |
| public static Diagnostic checkDiagnostic(Diagnostic diagnostic, Path path, | |
| int lineStart, int columnStart, String... messageParts) { | |
| return checkDiagnostic(diagnostic, new PathOriginChecker(path), lineStart, columnStart, | |
| messageParts); | |
| } | |
| public static Diagnostic checkDiagnostics(List<Diagnostic> diagnostics, int index, Path path, | |
| int lineStart, int columnStart, String... messageParts) { | |
| return checkDiagnostic(diagnostics.get(index), path, lineStart, columnStart, messageParts); | |
| } | |
| public static Diagnostic checkDiagnostics(List<Diagnostic> diagnostics, Path path, | |
| int lineStart, int columnStart, String... messageParts) { | |
| assertEquals(1, diagnostics.size()); | |
| return checkDiagnostics(diagnostics, 0, path, lineStart, columnStart, messageParts); | |
| } | |
| } |