Guard emitting of nest attributes in writer

Change-Id: I17e597319af02cb1bc858208578a3aa892d0c62f
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index d4f1195..3e59e50 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -727,16 +727,18 @@
               options.itemFactory));
     }
 
-    if (clazz.isNestHost()) {
-      annotations.add(
-          DexAnnotation.createNestMembersAnnotation(
-              clazz.getNestMembersClassAttributes(), options.itemFactory));
-    }
+    if (options.emitNestAnnotationsInDex) {
+      if (clazz.isNestHost()) {
+        annotations.add(
+            DexAnnotation.createNestMembersAnnotation(
+                clazz.getNestMembersClassAttributes(), options.itemFactory));
+      }
 
-    if (clazz.isNestMember()) {
-      annotations.add(
-          DexAnnotation.createNestHostAnnotation(
-              clazz.getNestHostClassAttribute(), options.itemFactory));
+      if (clazz.isNestMember()) {
+        annotations.add(
+            DexAnnotation.createNestHostAnnotation(
+                clazz.getNestHostClassAttribute(), options.itemFactory));
+      }
     }
 
     if (clazz.hasPermittedSubclassAttributes() && options.canUseSealedClasses()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
index ee5b716..3580546 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
@@ -37,6 +37,9 @@
   }
 
   public void reportDesugarDependencies() {
+    if (appView.options().desugarGraphConsumer == null) {
+      return;
+    }
     forEachNest(
         nest -> {
           if (nest.hasMissingMembers()) {
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDex.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
similarity index 83%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDex.java
rename to src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
index 8c5cdd0..b5ad377 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDex.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.desugar.nestaccesscontrol;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
@@ -11,17 +12,19 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDex.Host.Member1;
-import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDex.Host.Member2;
+import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDexTest.Host.Member1;
+import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDexTest.Host.Member2;
 import com.android.tools.r8.transformers.ClassFileTransformer;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.TypeSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -33,7 +36,7 @@
 import org.objectweb.asm.Opcodes;
 
 @RunWith(Parameterized.class)
-public class NestAttributesInDex extends TestBase {
+public class NestAttributesInDexTest extends TestBase {
 
   @Parameter() public TestParameters parameters;
 
@@ -62,15 +65,18 @@
         .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 
-  private void inspect(CodeInspector inspector) {
+  private void inspect(CodeInspector inspector, boolean emitNestAnnotationsInDex) {
     ClassSubject host = inspector.clazz(Host.class);
     ClassSubject member1 = inspector.clazz(Member1.class);
     ClassSubject member2 = inspector.clazz(Member2.class);
     assertEquals(
-        ImmutableList.of(member1.asTypeSubject(), member2.asTypeSubject()),
+        emitNestAnnotationsInDex
+            ? ImmutableList.of(member1.asTypeSubject(), member2.asTypeSubject())
+            : Collections.emptyList(),
         host.getFinalNestMembersAttribute());
-    assertEquals(host.asTypeSubject(), member1.getFinalNestHostAttribute());
-    assertEquals(host.asTypeSubject(), member2.getFinalNestHostAttribute());
+    TypeSubject expectedNestHostAttribute = emitNestAnnotationsInDex ? host.asTypeSubject() : null;
+    assertEquals(expectedNestHostAttribute, member1.getFinalNestHostAttribute());
+    assertEquals(expectedNestHostAttribute, member2.getFinalNestHostAttribute());
     ClassSubject otherHost = inspector.clazz(OtherHost.class);
     assertNull(otherHost.getFinalNestHostAttribute());
     assertEquals(0, otherHost.getFinalNestMembersAttribute().size());
@@ -83,17 +89,29 @@
         .addProgramClassFileData(getTransformedClasses())
         .addProgramClasses(OtherHost.class)
         .setMinApi(parameters.getApiLevel())
-        .addOptionsModification(
-            options -> {
-              options.emitNestAnnotationsInDex = true;
-            })
+        .addOptionsModification(options -> options.emitNestAnnotationsInDex = true)
         .compile()
-        .inspect(this::inspect)
+        .inspect(inspector -> inspect(inspector, true))
         .run(parameters.getRuntime(), TestClass.class)
         // No Art versions have support for nest attributes yet.
         .assertFailureWithErrorThatThrows(NoSuchMethodError.class);
   }
 
+  @Test
+  public void testD8NoDesugar() throws Exception {
+    assumeTrue(parameters.isDexRuntime());
+    testForD8(parameters.getBackend())
+        .addProgramClassFileData(getTransformedClasses())
+        .addProgramClasses(OtherHost.class)
+        .disableDesugaring()
+        .setMinApi(parameters.getApiLevel())
+        .addOptionsModification(options -> assertFalse(options.emitNestAnnotationsInDex))
+        .compile()
+        .inspect(inspector -> inspect(inspector, false))
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertFailureWithErrorThatThrows(NoSuchMethodError.class);
+  }
+
   public Collection<byte[]> getTransformedClasses() throws Exception {
     ClassFileTransformer transformer =
         transformer(TestClass.class)