[Compose] Account for additional inline frames

Bug: b/280564959
Change-Id: If8b4cf217b5213d2a9224e43986ada186e207d80
diff --git a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
index 8be5e9a..f45b126 100644
--- a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
+++ b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
@@ -645,7 +645,8 @@
                     existingClassBuilder,
                     existingMappedRanges,
                     mappedRange,
-                    computedOutlineInformation);
+                    computedOutlineInformation,
+                    !composedInlineFrames.isEmpty());
             composedInlineFrames = composeInlineFrames(newComposedRange, composedInlineFrames);
             if (!isInlineMappedRangeForComposition(newRangesToCompose, i)) {
               composedRanges.addAll(composedInlineFrames);
@@ -1082,7 +1083,8 @@
         ComposingClassBuilder existingClassBuilder,
         List<MappedRange> existingRanges,
         MappedRange newRange,
-        ComputedOutlineInformation computedOutlineInformation)
+        ComputedOutlineInformation computedOutlineInformation,
+        boolean isInlineFrame)
         throws MappingComposeException {
       assert newRange != null;
       // If there are no existing ranges, then just return the new range.
@@ -1161,7 +1163,8 @@
                 existingRangesForPosition,
                 computedOutlineInformation,
                 minifiedStart,
-                minifiedStart + span);
+                minifiedStart + span,
+                isInlineFrame);
             minifiedStart += span + 1;
           }
         }
@@ -1281,7 +1284,8 @@
         List<MappedRange> existingMappedRanges,
         ComputedOutlineInformation computedOutlineInformation,
         int lastStartingMinifiedFrom,
-        int lastEndingMinifiedTo)
+        int lastEndingMinifiedTo,
+        boolean isInlineFrame)
         throws MappingComposeException {
       Range existingRange = existingMappedRanges.get(0).minifiedRange;
       assert existingMappedRanges.stream().allMatch(x -> x.minifiedRange.equals(existingRange));
@@ -1289,18 +1293,18 @@
       for (MappedRange existingMappedRange : existingMappedRanges) {
         Range existingOriginalRange = existingMappedRange.getOriginalRangeOrIdentity();
         Range newOriginalRange;
-        if (canUseOriginalRange(
-            existingOriginalRange, newMappedRange.getOriginalRangeOrIdentity())) {
+        if (newMappedRange.minifiedRange.equals(newMinifiedRange)
+            && canUseOriginalRange(
+                existingOriginalRange, newMappedRange.getOriginalRangeOrIdentity())) {
           newOriginalRange = existingOriginalRange;
         } else {
           // Find the window that the new range points to into the original range.
           int existingMinifiedPos = newMappedRange.getOriginalLineNumber(lastStartingMinifiedFrom);
           int newOriginalStart = existingMappedRange.getOriginalLineNumber(existingMinifiedPos);
-          if (newMappedRange.getOriginalRangeOrIdentity().span() == 1) {
-            newOriginalRange =
-                newMappedRange.getOriginalRangeOrIdentity().isCardinal
-                    ? new Range(newOriginalStart)
-                    : new Range(newOriginalStart, newOriginalStart);
+          if (isInlineFrame || existingOriginalRange.isCardinal) {
+            newOriginalRange = new Range(newOriginalStart);
+          } else if (newMappedRange.getOriginalRangeOrIdentity().span() == 1) {
+            newOriginalRange = new Range(newOriginalStart, newOriginalStart);
           } else {
             assert newMinifiedRange.span() <= existingOriginalRange.span();
             newOriginalRange =
diff --git a/src/test/java/com/android/tools/r8/mappingcompose/ComposeInlineRangeOverlappingTest.java b/src/test/java/com/android/tools/r8/mappingcompose/ComposeInlineRangeOverlappingTest.java
index 7124fae..d966f3f 100644
--- a/src/test/java/com/android/tools/r8/mappingcompose/ComposeInlineRangeOverlappingTest.java
+++ b/src/test/java/com/android/tools/r8/mappingcompose/ComposeInlineRangeOverlappingTest.java
@@ -51,9 +51,8 @@
           "    147:147:com.android.InternalViewOptions "
               + "com.android.InternalViewOptions.parseFromJson(org.json.JSONObject):45:45 -> e",
           "    147:147:com.android.ViewOptions parseFromJson(org.json.JSONObject):97 -> e",
-          // TODO(b/280564959): We should not introduce ambiguous mapping.
           "    148:148:com.android.InternalViewOptions "
-              + "com.android.InternalViewOptions.parseFromJson(org.json.JSONObject):47:48 -> e",
+              + "com.android.InternalViewOptions.parseFromJson(org.json.JSONObject):47:47 -> e",
           "    148:148:com.android.ViewOptions parseFromJson(org.json.JSONObject):97 -> e");
 
   @Test