| // 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.errors; |
| |
| import com.android.tools.r8.Diagnostic; |
| import com.android.tools.r8.Keep; |
| import com.android.tools.r8.graph.DexMethod; |
| import com.android.tools.r8.origin.Origin; |
| import com.android.tools.r8.position.Position; |
| import com.android.tools.r8.references.MethodReference; |
| import com.android.tools.r8.utils.MethodReferenceUtils; |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Set; |
| |
| @Keep |
| public class AssumeNoSideEffectsRuleForObjectMembersDiagnostic implements Diagnostic { |
| |
| private final List<MethodReference> methods; |
| private final Origin origin; |
| private final Position position; |
| |
| private AssumeNoSideEffectsRuleForObjectMembersDiagnostic( |
| List<MethodReference> methods, Origin origin, Position position) { |
| this.methods = methods; |
| this.origin = origin; |
| this.position = position; |
| } |
| |
| @Override |
| public Origin getOrigin() { |
| return origin; |
| } |
| |
| @Override |
| public Position getPosition() { |
| return position; |
| } |
| |
| @Override |
| public String getDiagnosticMessage() { |
| Iterator<MethodReference> iterator = methods.iterator(); |
| StringBuilder message = |
| new StringBuilder("The -assumenosideeffects rule matches the following method(s) ") |
| .append("on java.lang.Object: ") |
| .append(MethodReferenceUtils.toSourceStringWithoutHolderAndReturnType(iterator.next())); |
| while (iterator.hasNext()) { |
| MethodReference method = iterator.next(); |
| message |
| .append(iterator.hasNext() ? ", " : " and ") |
| .append(MethodReferenceUtils.toSourceStringWithoutHolderAndReturnType(method)); |
| } |
| return message |
| .append(". ") |
| .append("This is most likely not intended. ") |
| .append("Consider specifying the methods more precisely.") |
| .toString(); |
| } |
| |
| public static class Builder { |
| |
| private final List<MethodReference> methods = new ArrayList<>(); |
| private Origin origin; |
| private Position position; |
| |
| public Builder() {} |
| |
| public Builder addMatchedMethods(Set<DexMethod> methods) { |
| for (DexMethod method : methods) { |
| this.methods.add(method.asMethodReference()); |
| } |
| return this; |
| } |
| |
| public Builder setOrigin(Origin origin) { |
| this.origin = origin; |
| return this; |
| } |
| |
| public Builder setPosition(Position position) { |
| this.position = position; |
| return this; |
| } |
| |
| public AssumeNoSideEffectsRuleForObjectMembersDiagnostic build() { |
| return new AssumeNoSideEffectsRuleForObjectMembersDiagnostic(methods, origin, position); |
| } |
| } |
| } |