Change CompilationError to not implement Diagnostics

Instances fo CompilationError previously reported as a Diagnostic is
not converted to a StringDiagnostic and that is reported instead.

Bug: 140073409
Change-Id: Iedd3668178fc6fa1132408e8fe4e64703205232c
diff --git a/src/main/java/com/android/tools/r8/BaseCommand.java b/src/main/java/com/android/tools/r8/BaseCommand.java
index 5eb8ce9..318305d 100644
--- a/src/main/java/com/android/tools/r8/BaseCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCommand.java
@@ -365,7 +365,7 @@
       try {
         action.run();
       } catch (CompilationError e) {
-        reporter.error(e);
+        reporter.error(e.toStringDiagnostic());
       } catch (AbortException e) {
         // Error was reported and exception will be thrown by build.
       }
diff --git a/src/main/java/com/android/tools/r8/errors/CompilationError.java b/src/main/java/com/android/tools/r8/errors/CompilationError.java
index 5429b08..d165596 100644
--- a/src/main/java/com/android/tools/r8/errors/CompilationError.java
+++ b/src/main/java/com/android/tools/r8/errors/CompilationError.java
@@ -4,9 +4,9 @@
 package com.android.tools.r8.errors;
 
 import com.android.tools.r8.Diagnostic;
-import com.android.tools.r8.Keep;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.position.Position;
+import com.android.tools.r8.utils.StringDiagnostic;
 
 /**
  * Exception to signal an compilation error.
@@ -14,8 +14,7 @@
  * <p>This is always an expected error and considered a user input issue. A user-understandable
  * message must be provided.
  */
-@Keep
-public class CompilationError extends RuntimeException implements Diagnostic {
+public class CompilationError extends RuntimeException {
 
   private final Origin origin;
   private final Position position;
@@ -41,18 +40,19 @@
     this.position = position;
   }
 
-  @Override
-  public Origin getOrigin() {
-    return origin;
+  public CompilationError withAdditionalOriginAndPositionInfo(Origin origin, Position position) {
+    if (this.origin == Origin.unknown() || this.position == Position.UNKNOWN) {
+      return new CompilationError(
+          getMessage(),
+          this,
+          this.origin != Origin.unknown() ? this.origin : origin,
+          this.position != Position.UNKNOWN ? this.position : position);
+    } else {
+      return this;
+    }
   }
 
-  @Override
-  public Position getPosition() {
-    return position;
-  }
-
-  @Override
-  public String getDiagnosticMessage() {
-    return getMessage();
+  public Diagnostic toStringDiagnostic() {
+    return new StringDiagnostic(getMessage(), origin, position);
   }
 }
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 2132dc7..6228ab1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -79,7 +79,6 @@
 import com.android.tools.r8.naming.IdentifierNameStringMarker;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.position.MethodPosition;
-import com.android.tools.r8.position.Position;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.LibraryMethodOverrideAnalysis;
 import com.android.tools.r8.shaking.MainDexClasses;
@@ -963,16 +962,7 @@
           method, feedback, isProcessedConcurrently, callSiteInformation, outlineHandler, origin);
     } catch (CompilationError e) {
       // If rewriting throws a compilation error, attach the origin and method if missing.
-      Origin errorOrigin = e.getOrigin();
-      Position errorPosition = e.getPosition();
-      if (errorOrigin == Origin.unknown() || errorPosition == Position.UNKNOWN) {
-        throw new CompilationError(
-            e.getMessage(),
-            e,
-            errorOrigin != Origin.unknown() ? errorOrigin : origin,
-            errorPosition != Position.UNKNOWN ? errorPosition : new MethodPosition(method.method));
-      }
-      throw e;
+      throw e.withAdditionalOriginAndPositionInfo(origin, new MethodPosition(method.method));
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java b/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
index 65bc602..dc01215 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
@@ -59,16 +59,18 @@
         if (signature.isQualified()) {
           qualifiedMethodMembers.computeIfAbsent(signature, k -> new ArrayList<>(2)).add(entry);
         } else if (methodMembers.put(signature, entry) != null) {
+          // TODO(b/140075815): Turn ApplyMappingError into a Diagnostic.
           reporter.error(
               ProguardMapError.duplicateSourceMember(
-                  signature.toString(), this.originalName, entry.position));
+                  signature.toString(), this.originalName, entry.position).toStringDiagnostic());
         }
       } else {
         FieldSignature signature = (FieldSignature) entry.getOriginalSignature();
         if (!signature.isQualified() && fieldMembers.put(signature, entry) != null) {
+          // TODO(b/140075815): Turn ApplyMappingError into a Diagnostic.
           reporter.error(
               ProguardMapError.duplicateSourceMember(
-                  signature.toString(), this.originalName, entry.position));
+                  signature.toString(), this.originalName, entry.position).toStringDiagnostic());
         }
       }
       return this;
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
index 49b58eb..0435887 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -306,9 +306,10 @@
       appView
           .options()
           .reporter
+          // TODO(b/140075815): Turn ApplyMappingError into a Diagnostic.
           .error(
               ApplyMappingError.mapToExistingClass(
-                  type.toString(), mappedName.toString(), position));
+                  type.toString(), mappedName.toString(), position).toStringDiagnostic());
     } else {
       mappedNames.put(type, mappedName);
     }
diff --git a/src/main/java/com/android/tools/r8/naming/SeedMapper.java b/src/main/java/com/android/tools/r8/naming/SeedMapper.java
index d7f36da..a90566f 100644
--- a/src/main/java/com/android/tools/r8/naming/SeedMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/SeedMapper.java
@@ -51,7 +51,8 @@
           ClassNamingForMapApplier.builder(
               javaTypeToDescriptor(renamedName), originalDescriptor, position, reporter);
       if (map.put(originalDescriptor, classNamingBuilder) != null) {
-        reporter.error(ProguardMapError.duplicateSourceClass(originalName, position));
+        // TODO(b/140075815): Turn ProguardMapError into a Diagnostic.
+        reporter.error(ProguardMapError.duplicateSourceClass(originalName, position).toStringDiagnostic());
       }
       return classNamingBuilder;
     }
@@ -100,12 +101,13 @@
       ClassNamingForMapApplier classNaming = mappings.get(key);
       String existing = seenMappings.put(classNaming.renamedName, key);
       if (existing != null) {
+        // TODO(b/140075815): Turn ApplyMappingError into a Diagnostic.
         reporter.error(
             ProguardMapError.duplicateTargetClass(
                 descriptorToJavaType(key),
                 descriptorToJavaType(existing),
                 descriptorToInternalName(classNaming.renamedName),
-                classNaming.position));
+                classNaming.position).toStringDiagnostic());
       }
       // TODO(b/136694827) Enable when we have proper support
       // Map<Signature, MemberNaming> seenMembers = new HashMap<>();
diff --git a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
index c63ef8b..16bde83 100644
--- a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
@@ -66,7 +66,7 @@
       } catch (IOException e) {
         throw reporter.fatalError(new ExceptionDiagnostic(e, extractIOExceptionOrigin(e)));
       } catch (CompilationError e) {
-        throw reporter.fatalError(e);
+        throw reporter.fatalError(e.toStringDiagnostic());
       } catch (ResourceException e) {
         throw reporter.fatalError(new ExceptionDiagnostic(e, e.getOrigin()));
       } catch (AssertionError e) {
diff --git a/src/main/java/com/android/tools/r8/utils/Reporter.java b/src/main/java/com/android/tools/r8/utils/Reporter.java
index 928058e..2541f47 100644
--- a/src/main/java/com/android/tools/r8/utils/Reporter.java
+++ b/src/main/java/com/android/tools/r8/utils/Reporter.java
@@ -116,7 +116,7 @@
     try {
       action.run();
     } catch (CompilationError e) {
-      error(e);
+      error(e.toStringDiagnostic());
       throw addSuppressedExceptions(new CompilationFailedException());
     } catch (AbortException e) {
       throw new CompilationFailedException(e);