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;
   }
+
 }