Use NestBasedAccessDesugaringDiagnosis
Bug: 132682295
Change-Id: I597dc10c9450ab09a6f779ba5d6e2b7480fb9e74
diff --git a/src/main/java/com/android/tools/r8/errors/IncompleteNestNestDesugarDiagnosic.java b/src/main/java/com/android/tools/r8/errors/IncompleteNestNestDesugarDiagnosic.java
new file mode 100644
index 0000000..c888069
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/errors/IncompleteNestNestDesugarDiagnosic.java
@@ -0,0 +1,17 @@
+// Copyright (c) 2019, 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.Keep;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+
+@Keep
+public class IncompleteNestNestDesugarDiagnosic extends NestDesugarDiagnostic {
+
+ public IncompleteNestNestDesugarDiagnosic(Origin origin, Position position, String message) {
+ super(origin, position, message);
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/errors/MissingNestHostNestDesugarDiagnostic.java b/src/main/java/com/android/tools/r8/errors/MissingNestHostNestDesugarDiagnostic.java
new file mode 100644
index 0000000..2b3cbab
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/errors/MissingNestHostNestDesugarDiagnostic.java
@@ -0,0 +1,17 @@
+// Copyright (c) 2019, 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.Keep;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+
+@Keep
+public class MissingNestHostNestDesugarDiagnostic extends NestDesugarDiagnostic {
+
+ public MissingNestHostNestDesugarDiagnostic(Origin origin, Position position, String message) {
+ super(origin, position, message);
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/errors/NestDesugarDiagnostic.java b/src/main/java/com/android/tools/r8/errors/NestDesugarDiagnostic.java
new file mode 100644
index 0000000..78f2f96
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/errors/NestDesugarDiagnostic.java
@@ -0,0 +1,38 @@
+// Copyright (c) 2019, 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.KeepForSubclassing;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+
+@KeepForSubclassing
+public class NestDesugarDiagnostic implements DesugarDiagnostic {
+
+ private final Origin origin;
+ private final Position position;
+ private final String message;
+
+ public NestDesugarDiagnostic(Origin origin, Position position, String message) {
+ this.origin = origin;
+ this.position = position;
+ this.message = message;
+ }
+
+ @Override
+ public Origin getOrigin() {
+ return origin;
+ }
+
+ @Override
+ public Position getPosition() {
+ return position;
+ }
+
+ @Override
+ public String getDiagnosticMessage() {
+ return message;
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
index 060cbce..8564183 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
@@ -6,6 +6,8 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.errors.IncompleteNestNestDesugarDiagnosic;
+import com.android.tools.r8.errors.MissingNestHostNestDesugarDiagnostic;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ClassAccessFlags;
@@ -24,9 +26,10 @@
import com.android.tools.r8.graph.NestMemberClassAttribute;
import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.ir.code.Invoke;
+import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.SynthesizedOrigin;
+import com.android.tools.r8.position.Position;
import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.StringDiagnostic;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -93,6 +96,8 @@
DexClass hostClass = clazz.isNestHost() ? clazz : definitionFor(clazz.getNestHost());
if (hostClass == null) {
reportMissingNestHost(clazz);
+ // Missing nest host means the class is considered as not being part of a nest.
+ clazz.clearNestHost();
return null;
}
List<DexType> classesInNest =
@@ -145,6 +150,7 @@
List<String> unavailableClasses = new ArrayList<>();
List<String> classPathClasses = new ArrayList<>();
List<String> libraryClasses = new ArrayList<>();
+ DexClass availableProgramClass = null;
for (DexType type : nest) {
DexClass clazz = definitionFor(type);
if (clazz == null) {
@@ -153,6 +159,7 @@
libraryClasses.add(type.getName());
} else if (clazz.isProgramClass()) {
programClassesFromNest.add(type.getName());
+ availableProgramClass = clazz;
} else {
assert clazz.isClasspathClass();
classPathClasses.add(type.getName());
@@ -178,8 +185,18 @@
if (!libraryClasses.isEmpty()) {
throw new CompilationError(stringBuilder.toString());
}
- // TODO (b/132676197): Use desugaring warning
- appView.options().reporter.warning(new StringDiagnostic(stringBuilder.toString()));
+ Origin origin;
+ if (availableProgramClass == null) {
+ origin = Origin.unknown();
+ } else {
+ origin = availableProgramClass.getOrigin();
+ }
+ appView
+ .options()
+ .reporter
+ .warning(
+ new IncompleteNestNestDesugarDiagnosic(
+ origin, Position.UNKNOWN, stringBuilder.toString()));
}
private void reportMissingNestHost(DexClass compiledClass) {
@@ -193,8 +210,12 @@
if (compiledClass.isLibraryClass()) {
throw new CompilationError(message);
}
- // TODO (b/132676197): Use desugaring warning
- appView.options().reporter.warning(new StringDiagnostic(message));
+ appView
+ .options()
+ .reporter
+ .warning(
+ new MissingNestHostNestDesugarDiagnostic(
+ compiledClass.getOrigin(), Position.UNKNOWN, message));
}
private DexProgramClass createNestAccessConstructor() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java
index b580102..4210ac2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java
@@ -120,4 +120,5 @@
protected boolean shouldProcessClassInNest(DexClass clazz, List<DexType> nest) {
return true;
}
+
}