|  | // Copyright (c) 2020, 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 com.android.tools.r8.origin.Origin; | 
|  | import com.android.tools.r8.position.Position; | 
|  | import com.android.tools.r8.utils.ExceptionDiagnostic; | 
|  | import org.hamcrest.CoreMatchers; | 
|  | import org.hamcrest.Description; | 
|  | import org.hamcrest.Matcher; | 
|  | import org.hamcrest.TypeSafeMatcher; | 
|  |  | 
|  | public abstract class DiagnosticsMatcher extends TypeSafeMatcher<Diagnostic> { | 
|  |  | 
|  | public static Matcher<Diagnostic> diagnosticMessage(Matcher<String> messageMatcher) { | 
|  | return new DiagnosticsMatcher() { | 
|  | @Override | 
|  | protected boolean eval(Diagnostic diagnostic) { | 
|  | return messageMatcher.matches(diagnostic.getDiagnosticMessage()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected void explain(Description description) { | 
|  | description.appendText("message with "); | 
|  | messageMatcher.describeTo(description); | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | public static Matcher<Diagnostic> diagnosticType(Class<? extends Diagnostic> type) { | 
|  | return new DiagnosticsMatcher() { | 
|  | @Override | 
|  | protected boolean eval(Diagnostic diagnostic) { | 
|  | return type.isInstance(diagnostic); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected void explain(Description description) { | 
|  | description.appendText("type ").appendText(type.getSimpleName()); | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | public static Matcher<Diagnostic> diagnosticException(Class<? extends Throwable> exception) { | 
|  | return new DiagnosticsMatcher() { | 
|  | @Override | 
|  | protected boolean eval(Diagnostic diagnostic) { | 
|  | return diagnostic instanceof ExceptionDiagnostic | 
|  | && exception.isInstance(((ExceptionDiagnostic) diagnostic).getCause()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected void explain(Description description) { | 
|  | description.appendText("exception type ").appendText(exception.getSimpleName()); | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | public static Matcher<Diagnostic> diagnosticOrigin(Origin origin) { | 
|  | return diagnosticOrigin(CoreMatchers.is(origin)); | 
|  | } | 
|  |  | 
|  | public static Matcher<Diagnostic> diagnosticOrigin(Matcher<Origin> originMatcher) { | 
|  | return new DiagnosticsMatcher() { | 
|  | @Override | 
|  | protected boolean eval(Diagnostic diagnostic) { | 
|  | return originMatcher.matches(diagnostic.getOrigin()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected void explain(Description description) { | 
|  | description.appendText("origin with "); | 
|  | originMatcher.describeTo(description); | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | public static Matcher<Diagnostic> diagnosticPosition(Position position) { | 
|  | return diagnosticPosition(CoreMatchers.equalTo(position)); | 
|  | } | 
|  |  | 
|  | public static Matcher<Diagnostic> diagnosticPosition(Matcher<Position> positionMatcher) { | 
|  | return new DiagnosticsMatcher() { | 
|  | @Override | 
|  | protected boolean eval(Diagnostic diagnostic) { | 
|  | return positionMatcher.matches(diagnostic.getPosition()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected void explain(Description description) { | 
|  | description.appendText("position "); | 
|  | positionMatcher.describeTo(description); | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected boolean matchesSafely(Diagnostic diagnostic) { | 
|  | return eval(diagnostic); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void describeTo(Description description) { | 
|  | explain(description.appendText("a diagnostic ")); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected void describeMismatchSafely(Diagnostic item, Description mismatchDescription) { | 
|  | mismatchDescription | 
|  | .appendText("was ") | 
|  | .appendText(item.getClass().getName()) | 
|  | .appendText(" with message(") | 
|  | .appendValue(item.getDiagnosticMessage()) | 
|  | .appendText(")"); | 
|  | } | 
|  |  | 
|  | protected abstract boolean eval(Diagnostic diagnostic); | 
|  |  | 
|  | protected abstract void explain(Description description); | 
|  | } |