Discard synthetic positions when simulating code inlining

Change-Id: I08baf7a02ed6f32aaabfeb6fffc67bf389b37a45
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 5b71a42..169a880 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -898,7 +898,8 @@
   }
 
   @Override
-  public Code getCodeAsInlining(DexMethod caller, DexMethod callee, DexItemFactory factory) {
+  public Code getCodeAsInlining(
+      DexMethod caller, DexMethod callee, DexItemFactory factory, boolean isCalleeD8R8Synthesized) {
     Position callerPosition = SyntheticPosition.builder().setLine(0).setMethod(caller).build();
     List<CfInstruction> newInstructions = new ArrayList<>(instructions.size() + 2);
     CfLabel firstLabel;
@@ -916,15 +917,18 @@
         newInstructions.add(
             new CfPosition(
                 oldPosition.getLabel(),
-                oldPosition.getPosition().withOutermostCallerPosition(callerPosition)));
+                newInlineePosition(
+                    callerPosition, oldPosition.getPosition(), isCalleeD8R8Synthesized)));
       } else {
         if (!instruction.isLabel() && !seenPosition) {
           Position preamblePosition =
-              SyntheticPosition.builder()
-                  .setMethod(callee)
-                  .setCallerPosition(callerPosition)
-                  .setLine(0)
-                  .build();
+              isCalleeD8R8Synthesized
+                  ? callerPosition
+                  : SyntheticPosition.builder()
+                      .setMethod(callee)
+                      .setCallerPosition(callerPosition)
+                      .setLine(0)
+                      .build();
           newInstructions.add(new CfPosition(firstLabel, preamblePosition));
           seenPosition = true;
         }
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java
index d0417b4..0475e2c 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.NumberGenerator;
 import com.android.tools.r8.ir.code.Position;
+import com.android.tools.r8.ir.code.Position.PositionBuilder;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.RetracerForCodePrinting;
@@ -176,7 +177,35 @@
     return true;
   }
 
-  public Code getCodeAsInlining(DexMethod caller, DexMethod callee, DexItemFactory factory) {
+  public Code getCodeAsInlining(DexMethod caller, DexEncodedMethod callee, DexItemFactory factory) {
+    return getCodeAsInlining(caller, callee.getReference(), factory, callee.isD8R8Synthesized());
+  }
+
+  public Code getCodeAsInlining(
+      DexMethod caller, DexMethod callee, DexItemFactory factory, boolean isCalleeD8R8Synthesized) {
     throw new Unreachable();
   }
+
+  public Position newInlineePosition(
+      Position callerPosition, Position oldPosition, boolean isCalleeD8R8Synthesized) {
+    Position outermostCaller = oldPosition.getOutermostCaller();
+    if (!isCalleeD8R8Synthesized) {
+      return oldPosition.withOutermostCallerPosition(callerPosition);
+    }
+    // We can replace the position since the callee was synthesized by the compiler, however, if
+    // the position carries special information we need to copy it.
+    if (!outermostCaller.isOutline() && !outermostCaller.isRemoveInnerFramesIfThrowingNpe()) {
+      return oldPosition.replacePosition(outermostCaller, callerPosition);
+    }
+    assert !callerPosition.isOutline();
+    PositionBuilder<?, ?> positionBuilder =
+        outermostCaller
+            .builderWithCopy()
+            .setMethod(callerPosition.getMethod())
+            .setLine(callerPosition.getLine());
+    if (callerPosition.isRemoveInnerFramesIfThrowingNpe()) {
+      positionBuilder.setRemoveInnerFramesIfThrowingNpe(true);
+    }
+    return oldPosition.replacePosition(outermostCaller, positionBuilder.build());
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index 048e01d..81caca5 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -279,7 +279,8 @@
   }
 
   @Override
-  public Code getCodeAsInlining(DexMethod caller, DexMethod callee, DexItemFactory factory) {
+  public Code getCodeAsInlining(
+      DexMethod caller, DexMethod callee, DexItemFactory factory, boolean isCalleeD8R8Synthesized) {
     return new DexCode(
         registerSize,
         incomingRegisterSize,
@@ -287,11 +288,11 @@
         instructions,
         tries,
         handlers,
-        debugInfoAsInlining(caller, callee, factory));
+        debugInfoAsInlining(caller, callee, isCalleeD8R8Synthesized, factory));
   }
 
   private DexDebugInfo debugInfoAsInlining(
-      DexMethod caller, DexMethod callee, DexItemFactory factory) {
+      DexMethod caller, DexMethod callee, boolean isCalleeD8R8Synthesized, DexItemFactory factory) {
     Position callerPosition = SyntheticPosition.builder().setLine(0).setMethod(caller).build();
     EventBasedDebugInfo eventBasedInfo = DexDebugInfo.convertToEventBased(this, factory);
     if (eventBasedInfo == null) {
@@ -299,11 +300,13 @@
       // This is consistent with the building IR for inlining which will always ensure the method
       // has a position.
       Position preamblePosition =
-          SyntheticPosition.builder()
-              .setMethod(callee)
-              .setCallerPosition(callerPosition)
-              .setLine(0)
-              .build();
+          isCalleeD8R8Synthesized
+              ? callerPosition
+              : SyntheticPosition.builder()
+                  .setMethod(callee)
+                  .setCallerPosition(callerPosition)
+                  .setLine(0)
+                  .build();
       return new EventBasedDebugInfo(
           0,
           new DexString[callee.getArity()],
@@ -321,14 +324,17 @@
     int i = 0;
     newEvents[i++] =
         new SetPositionFrame(
-            frameBuilder.setMethod(callee).setCallerPosition(callerPosition).build());
+            isCalleeD8R8Synthesized
+                ? callerPosition
+                : frameBuilder.setMethod(callee).setCallerPosition(callerPosition).build());
     for (DexDebugEvent event : oldEvents) {
       if (event instanceof SetPositionFrame) {
         SetPositionFrame oldFrame = (SetPositionFrame) event;
         assert oldFrame.getPosition() != null;
         newEvents[i++] =
             new SetPositionFrame(
-                oldFrame.getPosition().withOutermostCallerPosition(callerPosition));
+                newInlineePosition(
+                    callerPosition, oldFrame.getPosition(), isCalleeD8R8Synthesized));
       } else {
         newEvents[i++] = event;
       }
diff --git a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
index 3abc2e4..d98d0ea 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
@@ -175,7 +175,7 @@
   }
 
   @Override
-  public Code getCodeAsInlining(DexMethod caller, DexMethod callee, DexItemFactory factory) {
+  public Code getCodeAsInlining(DexMethod caller, DexEncodedMethod callee, DexItemFactory factory) {
     return asCfCode().getCodeAsInlining(caller, callee, factory);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/Position.java b/src/main/java/com/android/tools/r8/ir/code/Position.java
index 653e20e..3662c28 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Position.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Position.java
@@ -46,10 +46,6 @@
     return false;
   }
 
-  public boolean isAdditionalMappingInfoPosition() {
-    return false;
-  }
-
   public boolean isRemoveInnerFramesIfThrowingNpe() {
     return removeInnerFramesIfThrowingNpe;
   }
@@ -201,7 +197,8 @@
     return HashCodeVisitor.run(this);
   }
 
-  private String toString(boolean forceMethod) {
+  @Override
+  public String toString() {
     if (isNone()) {
       return "--";
     }
@@ -210,7 +207,7 @@
       builder.append(getFile()).append(":");
     }
     builder.append("#").append(line);
-    if (method != null && (forceMethod || callerPosition != null)) {
+    if (method != null && callerPosition != null) {
       builder.append(":").append(method.name);
     }
     if (callerPosition != null) {
@@ -223,11 +220,6 @@
     return builder.toString();
   }
 
-  @Override
-  public String toString() {
-    return toString(false);
-  }
-
   public abstract PositionBuilder<?, ?> builderWithCopy();
 
   public abstract static class PositionBuilder<
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
index 8d2c8c6..adf23fa 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
@@ -210,7 +210,7 @@
         definition
             .getCode()
             .getCodeAsInlining(
-                companion.getReference(), method.getReference(), appView.dexItemFactory());
+                companion.getReference(), method.getDefinition(), appView.dexItemFactory());
     if (!definition.isStatic()) {
       DexEncodedMethod.setDebugInfoWithFakeThisParameter(
           code, companion.getReference().getArity(), appView);