[MappingCompose] Use original proguard map if map-version not supported

Change-Id: Ibc464813ad412856bea84286a8fbfcd7dabb20f9
diff --git a/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java
index b961f22..0181e06 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java
@@ -20,10 +20,13 @@
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.naming.MapVersion;
 import com.android.tools.r8.naming.MappingComposeException;
 import com.android.tools.r8.naming.MappingComposer;
 import com.android.tools.r8.naming.ProguardMapSupplier;
 import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapId;
+import com.android.tools.r8.naming.mappinginformation.MapVersionMappingInformation;
+import com.android.tools.r8.naming.mappinginformation.ResidualSignatureMappingInformation;
 import com.android.tools.r8.shaking.KeepInfoCollection;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.CfLineToMethodMapper;
@@ -44,6 +47,15 @@
       OriginalSourceFiles originalSourceFiles,
       DebugRepresentationPredicate representation) {
     assert appView.options().proguardMapConsumer != null;
+    if (shouldEmitOriginalMappingFile(appView)) {
+      appView.options().reporter.warning(new NotSupportedMapVersionForMappingComposeDiagnostic());
+      timing.begin("Write proguard map");
+      ProguardMapId proguardMapId =
+          ProguardMapSupplier.create(appView.appInfo().app().getProguardMap(), appView.options())
+              .writeProguardMap();
+      timing.end();
+      return proguardMapId;
+    }
     // When line number optimization is turned off the identity mapping for line numbers is
     // used. We still run the line number optimizer to collect line numbers and inline frame
     // information for the mapping file.
@@ -72,6 +84,21 @@
     return mapId;
   }
 
+  private static boolean shouldEmitOriginalMappingFile(AppView<?> appView) {
+    if (!appView.options().mappingComposeOptions().enableExperimentalMappingComposition
+        || appView.appInfo().app().getProguardMap() == null) {
+      return false;
+    }
+    MapVersionMappingInformation mapVersionInfo =
+        appView.appInfo().app().getProguardMap().getFirstMapVersionInformation();
+    if (mapVersionInfo == null) {
+      return true;
+    }
+    MapVersion newMapVersion = mapVersionInfo.getMapVersion();
+    return !ResidualSignatureMappingInformation.isSupported(newMapVersion)
+        || newMapVersion.isUnknown();
+  }
+
   public static ClassNameMapper run(
       AppView<?> appView,
       AndroidApp inputApp,
diff --git a/src/main/java/com/android/tools/r8/utils/positions/NotSupportedMapVersionForMappingComposeDiagnostic.java b/src/main/java/com/android/tools/r8/utils/positions/NotSupportedMapVersionForMappingComposeDiagnostic.java
new file mode 100644
index 0000000..285046c
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/positions/NotSupportedMapVersionForMappingComposeDiagnostic.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2023, 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.utils.positions;
+
+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;
+
+@Keep
+public class NotSupportedMapVersionForMappingComposeDiagnostic implements Diagnostic {
+
+  @Override
+  public Origin getOrigin() {
+    return Origin.unknown();
+  }
+
+  @Override
+  public Position getPosition() {
+    return Position.UNKNOWN;
+  }
+
+  @Override
+  public String getDiagnosticMessage() {
+    return "The input map file version is either unknown or less than version 2.2. For having line "
+        + "numbers optimized by D8 you would need to pass a mapping file of version 2.2. or later.";
+  }
+}