Revert "Change the kotlin debug parser to use segment trees for results"

This reverts commit 6c15ec9c085131d7a75d638fe679f98feddb4923.

Reason for revert: Ruining the bots

Change-Id: Ie302dc9f2296269d8d9ebe437564127707e84ce5
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSourceDebugExtensionParser.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSourceDebugExtensionParser.java
index 8c6c2b8..a0d4df2 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSourceDebugExtensionParser.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSourceDebugExtensionParser.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.naming.Range;
-import com.android.tools.r8.utils.SegmentTree;
 import com.android.tools.r8.utils.ThrowingConsumer;
 import java.io.BufferedReader;
 import java.io.Closeable;
@@ -212,10 +211,9 @@
 
   private static void addDebugEntryToBuilder(String debugEntry, ResultBuilder builder)
       throws KotlinSourceDebugExtensionParserException {
-    // <from>#<file>,<size>:<debug-line-position>
+    // <from>#<file>,<to>:<debug-line-position>
     // or
     // <from>#<file>:<debug-line-position>
-    // All positions should define intervals for mappings.
     try {
       int targetSplit = debugEntry.indexOf(':');
       int target = Integer.parseInt(debugEntry.substring(targetSplit + 1));
@@ -225,7 +223,7 @@
       // The range may have a different end than start.
       String fileAndEndRange = original.substring(fileIndexSplit + 1);
       int endRangeCharPosition = fileAndEndRange.indexOf(',');
-      int size = 1;
+      int size = originalStart;
       if (endRangeCharPosition > -1) {
         // The file should be at least one number wide.
         assert endRangeCharPosition > 0;
@@ -235,13 +233,16 @@
       }
       int fileIndex = Integer.parseInt(fileAndEndRange.substring(0, endRangeCharPosition));
       Source thisFileSource = builder.files.get(fileIndex);
-      if (thisFileSource == null) {
-        throw new KotlinSourceDebugExtensionParserException(
-            "Could not find file with index " + fileIndex);
+      if (thisFileSource != null) {
+        Range range = new Range(originalStart, originalStart + size);
+        Position position = new Position(thisFileSource, range);
+        Position existingPosition = builder.positions.put(target, position);
+        assert existingPosition == null
+            : "Position index "
+                + target
+                + " was already mapped to an existing position: "
+                + position;
       }
-      Range range = new Range(originalStart, originalStart + (size - 1));
-      Position position = new Position(thisFileSource, range);
-      builder.segmentTree.add(target, target + (size - 1), position);
     } catch (NumberFormatException e) {
       throw new KotlinSourceDebugExtensionParserException("Could not convert position to number");
     }
@@ -249,28 +250,29 @@
 
   public static class Result {
 
-    private final SegmentTree<Position> segmentTree;
+    private final Map<Integer, Source> files;
+    private final Map<Integer, Position> positions;
 
-    public Result(SegmentTree<Position> segmentTree) {
-      this.segmentTree = segmentTree;
+    private Result(Map<Integer, Source> files, Map<Integer, Position> positions) {
+      this.files = files;
+      this.positions = positions;
     }
 
-    public Map.Entry<Integer, Position> lookup(int point) {
-      return segmentTree.findEntry(point);
+    public Map<Integer, Source> getFiles() {
+      return files;
     }
 
-    public int size() {
-      return segmentTree.size();
+    public Map<Integer, Position> getPositions() {
+      return positions;
     }
   }
 
   public static class ResultBuilder {
-
-    SegmentTree<Position> segmentTree = new SegmentTree<>(false);
-    Map<Integer, Source> files = new HashMap<>();
+    final Map<Integer, Source> files = new HashMap<>();
+    final Map<Integer, Position> positions = new HashMap<>();
 
     public Result build() {
-      return new Result(segmentTree);
+      return new Result(files, positions);
     }
   }
 
@@ -324,7 +326,6 @@
         sb.append(",");
         sb.append(range.to);
       }
-      sb.append(":");
       return sb.toString();
     }
   }
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinSourceDebugExtensionParserTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinSourceDebugExtensionParserTest.java
index d7ecc12..6ad7046 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinSourceDebugExtensionParserTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinSourceDebugExtensionParserTest.java
@@ -4,7 +4,9 @@
 
 package com.android.tools.r8.kotlin;
 
+import static junit.framework.TestCase.assertTrue;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 
@@ -13,7 +15,9 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.kotlin.KotlinSourceDebugExtensionParser.Position;
 import com.android.tools.r8.kotlin.KotlinSourceDebugExtensionParser.Result;
+import com.android.tools.r8.kotlin.KotlinSourceDebugExtensionParser.Source;
 import com.android.tools.r8.utils.StringUtils;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -35,6 +39,7 @@
   }
 
   @Test
+  @Ignore("b/145985445")
   public void testParsingNoInlineSources() {
     String annotationData =
         StringUtils.join(
@@ -51,16 +56,19 @@
             "*E");
     Result result = KotlinSourceDebugExtensionParser.parse(annotationData);
     assertNotNull(result);
-    assertEquals(1, result.size());
-    assertEquals(1, (int) result.lookup(1).getKey());
-    Position position = result.lookup(1).getValue();
-    assertEquals("EnumSwitch.kt", position.getSource().getFileName());
-    assertEquals("enumswitch/EnumSwitchKt", position.getSource().getPath());
+    assertEquals(1, result.getFiles().size());
+    Source source = result.getFiles().get(1);
+    assertEquals("EnumSwitch.kt", source.getFileName());
+    assertEquals("enumswitch/EnumSwitchKt", source.getPath());
+    assertTrue(result.getPositions().containsKey(1));
+    Position position = result.getPositions().get(1);
+    assertEquals(source, position.getSource());
     assertEquals(1, position.getRange().from);
     assertEquals(38, position.getRange().to);
   }
 
   @Test
+  @Ignore("b/145985445")
   public void testParsingSimpleStrata() {
     // Taken from src/test/examplesKotlin/retrace/mainKt
     String annotationData =
@@ -92,33 +100,32 @@
             "*E");
     Result result = KotlinSourceDebugExtensionParser.parse(annotationData);
     assertNotNull(result);
-    assertEquals(3, result.size());
-    assertEquals(1, (int) result.lookup(1).getKey());
-    assertEquals(23, (int) result.lookup(23).getKey());
-    assertEquals(24, (int) result.lookup(24).getKey());
-
+    assertEquals(3, result.getFiles().size());
     // Check that files are correctly parsed.
-    Position pos1 = result.lookup(1).getValue();
-    assertEquals("Main.kt", pos1.getSource().getFileName());
-    assertEquals("retrace/MainKt", pos1.getSource().getPath());
+    Source source1 = result.getFiles().get(1);
+    assertEquals("Main.kt", source1.getFileName());
+    assertEquals("retrace/MainKt", source1.getPath());
 
-    Position pos2 = result.lookup(23).getValue();
-    assertEquals("InlineFunction.kt", pos2.getSource().getFileName());
-    assertEquals("retrace/InlineFunctionKt", pos2.getSource().getPath());
+    Source source2 = result.getFiles().get(2);
+    assertEquals("InlineFunction.kt", source2.getFileName());
+    assertEquals("retrace/InlineFunctionKt", source2.getPath());
 
-    Position pos3 = result.lookup(24).getValue();
-    assertEquals("InlineFunction.kt", pos3.getSource().getFileName());
-    assertEquals("retrace/InlineFunction", pos3.getSource().getPath());
+    Source source3 = result.getFiles().get(3);
+    assertEquals("InlineFunction.kt", source3.getFileName());
+    assertEquals("retrace/InlineFunction", source3.getPath());
 
     // Check that the inline positions can be traced.
-    assertEquals(1, pos1.getRange().from);
-    assertEquals(22, pos1.getRange().to);
+    assertTrue(result.getPositions().containsKey(23));
+    Position position1 = result.getPositions().get(23);
+    assertEquals(source2, position1.getSource());
+    assertEquals(7, position1.getRange().from);
+    assertEquals(7, position1.getRange().to);
 
-    assertEquals(7, pos2.getRange().from);
-    assertEquals(7, pos2.getRange().to);
-
-    assertEquals(12, pos3.getRange().from);
-    assertEquals(12, pos3.getRange().to);
+    assertTrue(result.getPositions().containsKey(24));
+    Position position2 = result.getPositions().get(24);
+    assertEquals(source3, position2.getSource());
+    assertEquals(12, position2.getRange().from);
+    assertEquals(12, position2.getRange().to);
   }
 
   @Test
@@ -279,43 +286,12 @@
             "7#2:23",
             "12#4:24", // <-- non-existing file index
             "*E");
-    assertNull(KotlinSourceDebugExtensionParser.parse(annotationData));
-  }
-
-  @Test
-  public void testRanges() {
-    String annotationData =
-        StringUtils.join(
-            "\n",
-            "SMAP",
-            "Main.kt",
-            "Kotlin",
-            "*S Kotlin",
-            "*F",
-            "+ 1 Main.kt",
-            "retrace/MainKt",
-            "+ 2 InlineFunction.kt",
-            "retrace/InlineFunctionKt",
-            "+ 3 InlineFunction.kt",
-            "retrace/InlineFunction",
-            "*L",
-            "1#1,22:1",
-            "7#2,1:23",
-            "12#3,2:24",
-            "*E",
-            "*S KotlinDebug",
-            "*F",
-            "+ 1 Main.kt",
-            "retrace/MainKt",
-            "*L",
-            "12#1:23",
-            "18#1:24",
-            "*E");
     Result parsedResult = KotlinSourceDebugExtensionParser.parse(annotationData);
     assertNotNull(parsedResult);
-    assertEquals(24, (int) parsedResult.lookup(25).getKey());
-    Position value = parsedResult.lookup(25).getValue();
-    assertEquals(12, value.getRange().from);
-    assertEquals(13, value.getRange().to);
+
+    assertEquals(2, parsedResult.getPositions().size());
+    assertTrue(parsedResult.getPositions().containsKey(1));
+    assertTrue(parsedResult.getPositions().containsKey(23));
+    assertFalse(parsedResult.getPositions().containsKey(24));
   }
 }