Remove Location and use only Origin

Because:
- Location has added no simplification in using the API, the change to
PathOrigin was in fact the helping point.
- API user needs to instanceof PathOrigin and TextRangeXxxx anyway so
TextRange can just be an Origin with no change to Origin API.
- In the end, as it was, Location was adding supplementary code and
instances for no benefit.
- Location vs Origin was not very simple API to understand because the
concept were too close.
Change-Id: I1a5af41893a9b2687f71ec02ed6831cfd59c0167
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index c35871f..33f9aeb 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -89,8 +89,7 @@
         // options consumer will not be visible to the sink.
         return FileSystemOutputSink.create(outputPath, getInternalOptions());
       } catch (IOException e) {
-        throw reporter.fatalError(
-            new IOExceptionDiagnostic(e, new Location(new PathOrigin(outputPath))));
+        throw reporter.fatalError(new IOExceptionDiagnostic(e, new PathOrigin(outputPath)));
       }
     }
   }
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 17d7724..7d37f43 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -112,7 +112,7 @@
 
   private static void run(String[] args)
       throws IOException, CompilationException, CompilationFailedException {
-    D8Command.Builder builder = D8Command.parse(args, new Location(CommandLineOrigin.INSTANCE));
+    D8Command.Builder builder = D8Command.parse(args, CommandLineOrigin.INSTANCE);
     if (builder.getOutputPath() == null) {
       builder.setOutputPath(Paths.get("."));
     }
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 31d1ad9..b922bbf 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -5,6 +5,7 @@
 
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OutputMode;
@@ -149,7 +150,7 @@
     return new Builder(app);
   }
 
-  static Builder parse(String[] args, Location location) {
+  static Builder parse(String[] args, Origin origin) {
     CompilationMode modeSet = null;
     Path outputPath = null;
     Builder builder = builder();
@@ -166,7 +167,7 @@
           if (modeSet == CompilationMode.RELEASE) {
             builder.getReporter().error(new StringDiagnostic(
                 "Cannot compile in both --debug and --release mode.",
-                location));
+                origin));
             continue;
           }
           builder.setMode(CompilationMode.DEBUG);
@@ -175,7 +176,7 @@
           if (modeSet == CompilationMode.DEBUG) {
             builder.getReporter().error(new StringDiagnostic(
                 "Cannot compile in both --debug and --release mode.",
-                location));
+                origin));
             continue;
           }
           builder.setMode(CompilationMode.RELEASE);
@@ -187,7 +188,7 @@
           if (outputPath != null) {
             builder.getReporter().error(new StringDiagnostic(
                 "Cannot output both to '" + outputPath.toString() + "' and '" + output + "'",
-                location));
+                origin));
             continue;
           }
           outputPath = Paths.get(output);
@@ -204,7 +205,7 @@
         } else {
           if (arg.startsWith("--")) {
             builder.getReporter().error(new StringDiagnostic("Unknown option: " + arg,
-                location));
+                origin));
             continue;
           }
           builder.addProgramFiles(Paths.get(arg));
diff --git a/src/main/java/com/android/tools/r8/DexSegments.java b/src/main/java/com/android/tools/r8/DexSegments.java
index 54f5e1c..be50c0e 100644
--- a/src/main/java/com/android/tools/r8/DexSegments.java
+++ b/src/main/java/com/android/tools/r8/DexSegments.java
@@ -64,7 +64,7 @@
         } else {
           if (arg.startsWith("--")) {
             builder.getReporter().error(new StringDiagnostic("Unknown option: " + arg,
-                new Location(CommandLineOrigin.INSTANCE)));
+                CommandLineOrigin.INSTANCE));
           }
           builder.addProgramFiles(Paths.get(arg));
         }
diff --git a/src/main/java/com/android/tools/r8/Diagnostic.java b/src/main/java/com/android/tools/r8/Diagnostic.java
index 78f21f8..b0868cc 100644
--- a/src/main/java/com/android/tools/r8/Diagnostic.java
+++ b/src/main/java/com/android/tools/r8/Diagnostic.java
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
+import com.android.tools.r8.origin.Origin;
+
 /**
  * Interface for all diagnostic message produced by D8 and R8.
  */
 public interface Diagnostic {
-  Location getLocation();
+  Origin getOrigin();
 
   String getDiagnosticMessage();
 }
diff --git a/src/main/java/com/android/tools/r8/DiagnosticsHandler.java b/src/main/java/com/android/tools/r8/DiagnosticsHandler.java
index 31c9da0..8212835 100644
--- a/src/main/java/com/android/tools/r8/DiagnosticsHandler.java
+++ b/src/main/java/com/android/tools/r8/DiagnosticsHandler.java
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
+import com.android.tools.r8.origin.Origin;
+
 /**
  * A DiagnosticsHandler can be provided to customize handling of diagnostics information.
  *
@@ -16,8 +18,8 @@
    * @param error Diagnostic containing error information.
    */
   default void error(Diagnostic error) {
-    if (error.getLocation() != Location.UNKNOWN) {
-      System.err.print("Error in " + error.getLocation() + ":\n  ");
+    if (error.getOrigin() != Origin.unknown()) {
+      System.err.print("Error in " + error.getOrigin() + ":\n  ");
     } else {
       System.err.print("Error: ");
     }
@@ -30,8 +32,8 @@
    * @param warning Diagnostic containing warning information.
    */
   default void warning(Diagnostic warning) {
-    if (warning.getLocation() != Location.UNKNOWN) {
-      System.err.print("Warning in " + warning.getLocation() + ":\n  ");
+    if (warning.getOrigin() != Origin.unknown()) {
+      System.err.print("Warning in " + warning.getOrigin() + ":\n  ");
     } else {
       System.err.print("Warning: ");
     }
@@ -44,8 +46,8 @@
    * @param info Diagnostic containing the information.
    */
   default void info(Diagnostic info) {
-    if (info.getLocation() != Location.UNKNOWN) {
-      System.out.print("In " + info.getLocation() + ":\n  ");
+    if (info.getOrigin() != Origin.unknown()) {
+      System.out.print("In " + info.getOrigin() + ":\n  ");
     }
     System.out.println(info.getDiagnosticMessage());
   }
diff --git a/src/main/java/com/android/tools/r8/Disassemble.java b/src/main/java/com/android/tools/r8/Disassemble.java
index dfeb3ac..8f3efac 100644
--- a/src/main/java/com/android/tools/r8/Disassemble.java
+++ b/src/main/java/com/android/tools/r8/Disassemble.java
@@ -111,7 +111,7 @@
         } else {
           if (arg.startsWith("--")) {
             builder.getReporter().error(new StringDiagnostic("Unknown option: " + arg,
-                new Location(CommandLineOrigin.INSTANCE)));;
+                CommandLineOrigin.INSTANCE));
           }
           builder.addProgramFiles(Paths.get(arg));
         }
diff --git a/src/main/java/com/android/tools/r8/Location.java b/src/main/java/com/android/tools/r8/Location.java
deleted file mode 100644
index 1d1e763..0000000
--- a/src/main/java/com/android/tools/r8/Location.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2017, 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;
-
-import com.android.tools.r8.origin.Origin;
-
-/**
- * Describe the location of an event.
- */
-public class Location {
-
-  /**
-   * Location is unknown or event is not location related.
-   */
-  public static final Location UNKNOWN = new Location(Origin.unknown());
-
-  private final Origin origin;
-
-  public Location(Origin origin) {
-    assert origin != null;
-    this.origin = origin;
-  }
-
-  /**
-   * Returns the {@link Origin} of the resource concerned by this {@link Location}
-   */
-  public Origin getOrigin() {
-    return origin;
-  }
-
-  /**
-   * Returns a basic textual description of this {@link Location}.
-   */
-  public String getDescription() {
-    if (origin == Origin.unknown()) {
-      return "<Unknown>";
-    }
-    return origin.toString();
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index c424047..627f3f7 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -500,7 +500,7 @@
 
   private static void run(String[] args)
       throws IOException, CompilationException, CompilationFailedException {
-    R8Command.Builder builder = R8Command.parse(args, new Location(CommandLineOrigin.INSTANCE));
+    R8Command.Builder builder = R8Command.parse(args, CommandLineOrigin.INSTANCE);
     if (builder.getOutputPath() == null) {
       builder.setOutputPath(Paths.get("."));
     }
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 15cb593..cbb5f22 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -344,13 +344,13 @@
     return new Builder(app, diagnosticsHandler);
   }
 
-  public static Builder parse(String[] args, Location argsLocation) {
+  public static Builder parse(String[] args, Origin argsOrigin) {
     Builder builder = builder();
-    parse(args, argsLocation, builder, new ParseState());
+    parse(args, argsOrigin, builder, new ParseState());
     return builder;
   }
 
-  private static ParseState parse(String[] args, Location argsLocation, Builder builder,
+  private static ParseState parse(String[] args, Origin argsOrigin, Builder builder,
       ParseState state) {
     for (int i = 0; i < args.length; i++) {
       String arg = args[i].trim();
@@ -363,14 +363,14 @@
       } else if (arg.equals("--debug")) {
         if (state.mode == CompilationMode.RELEASE) {
           builder.getReporter().error(new StringDiagnostic(
-              "Cannot compile in both --debug and --release mode.", argsLocation));
+              "Cannot compile in both --debug and --release mode.", argsOrigin));
         }
         state.mode = CompilationMode.DEBUG;
         builder.setMode(state.mode);
       } else if (arg.equals("--release")) {
         if (state.mode == CompilationMode.DEBUG) {
           builder.getReporter().error(new StringDiagnostic(
-              "Cannot compile in both --debug and --release mode.", argsLocation));
+              "Cannot compile in both --debug and --release mode.", argsOrigin));
         }
         state.mode = CompilationMode.RELEASE;
         builder.setMode(state.mode);
@@ -383,7 +383,7 @@
                   + "' and '"
                   + outputPath
                   + "'",
-              argsLocation));
+              argsOrigin));
         }
         builder.setOutputPath(Paths.get(outputPath));
       } else if (arg.equals("--lib")) {
@@ -411,7 +411,7 @@
       } else if (arg.startsWith("@")) {
         // TODO(zerny): Replace this with pipe reading.
         Path argsFile = Paths.get(arg.substring(1));
-        Location argsFileLocation = new Location(new PathOrigin(argsFile));
+        Origin argsFileOrigin = new PathOrigin(argsFile);
         try {
           List<String> linesInFile = FileUtils.readTextFile(argsFile);
           List<String> argsInFile = new ArrayList<>();
@@ -425,15 +425,15 @@
           }
           // TODO(zerny): We need to define what CWD should be for files referenced in an args file.
           state = parse(argsInFile.toArray(new String[argsInFile.size()]),
-              argsFileLocation, builder, state);
+              argsFileOrigin, builder, state);
         } catch (IOException e) {
           builder.getReporter().error(new StringDiagnostic(
               "Failed to read arguments from file " + argsFile + ": " + e.getMessage(),
-              argsFileLocation));
+              argsFileOrigin));
         }
       } else {
         if (arg.startsWith("--")) {
-          builder.getReporter().error(new StringDiagnostic("Unknown option: " + arg, argsLocation));
+          builder.getReporter().error(new StringDiagnostic("Unknown option: " + arg, argsOrigin));
         }
         builder.addProgramFiles(Paths.get(arg));
       }
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 9305bb6..5c3220d 100644
--- a/src/main/java/com/android/tools/r8/errors/CompilationError.java
+++ b/src/main/java/com/android/tools/r8/errors/CompilationError.java
@@ -4,7 +4,6 @@
 package com.android.tools.r8.errors;
 
 import com.android.tools.r8.Diagnostic;
-import com.android.tools.r8.Location;
 import com.android.tools.r8.origin.Origin;
 
 /**
@@ -15,31 +14,27 @@
  */
 public class CompilationError extends RuntimeException implements Diagnostic {
 
-  private final Location location;
+  private final Origin origin;
   public CompilationError(String message) {
-    this(message, Location.UNKNOWN);
+    this(message, Origin.unknown());
   }
 
   public CompilationError(String message, Throwable cause) {
-    this(message, cause, Location.UNKNOWN);
-  }
-
-  public CompilationError(String message, Location location) {
-    this(message, null, location);
+    this(message, cause, Origin.unknown());
   }
 
   public CompilationError(String message, Origin origin) {
-    this(message, new Location(origin));
+    this(message, null, origin);
   }
 
-  public CompilationError(String message, Throwable cause, Location location) {
+  public CompilationError(String message, Throwable cause, Origin location) {
     super(message, cause);
-    this.location = location;
+    this.origin = location;
   }
 
   @Override
-  public Location getLocation() {
-    return location;
+  public Origin getOrigin() {
+    return origin;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/naming/DictionaryReader.java b/src/main/java/com/android/tools/r8/naming/DictionaryReader.java
index f184aef..1f15a48 100644
--- a/src/main/java/com/android/tools/r8/naming/DictionaryReader.java
+++ b/src/main/java/com/android/tools/r8/naming/DictionaryReader.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming;
 
-import com.android.tools.r8.Location;
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
@@ -67,7 +66,7 @@
       } catch (IOException e) {
         reporter.error(new StringDiagnostic(
             "Unable to create dictionary from file " + path.toString(),
-            new Location(new PathOrigin(path))));
+            new PathOrigin(path)));
       }
       return namesBuilder.build();
     } else {
diff --git a/src/main/java/com/android/tools/r8/TextRangeLocation.java b/src/main/java/com/android/tools/r8/origin/TextRangeOrigin.java
similarity index 75%
rename from src/main/java/com/android/tools/r8/TextRangeLocation.java
rename to src/main/java/com/android/tools/r8/origin/TextRangeOrigin.java
index 23cd3d6..4df5540 100644
--- a/src/main/java/com/android/tools/r8/TextRangeLocation.java
+++ b/src/main/java/com/android/tools/r8/origin/TextRangeOrigin.java
@@ -2,14 +2,12 @@
 // 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;
-
-import com.android.tools.r8.origin.Origin;
+package com.android.tools.r8.origin;
 
 /**
- * A location with a position in a text file.
+ * An {@link Origin} with a position in a text file.
  */
-public class TextRangeLocation extends Location {
+public class TextRangeOrigin extends Origin {
 
   /**
    * A position in a text file determined by line and column.
@@ -70,14 +68,14 @@
   private final TextPosition start;
   private final TextPosition end;
 
-  public static Location get(Origin origin, int startLine, int startColumn) {
-    return get(origin, startLine, startColumn, startLine, startColumn);
+  public static Origin get(Origin fileOrigin, int startLine, int startColumn) {
+    return get(fileOrigin, startLine, startColumn, startLine, startColumn);
   }
 
-  public static Location get(Origin origin, int startLine, int startColumn, int endLine,
+  public static Origin get(Origin fileOrigin, int startLine, int startColumn, int endLine,
       int endColumn) {
-    if (origin == Origin.unknown()) {
-      return Location.UNKNOWN;
+    if (fileOrigin == Origin.unknown()) {
+      return Origin.unknown();
     } else {
       assert startLine > 0
           && endLine >= startLine
@@ -90,12 +88,12 @@
       } else {
         end = new TextPosition(endLine, endColumn);
       }
-      return new TextRangeLocation(origin, start, end);
+      return new TextRangeOrigin(fileOrigin, start, end);
     }
   }
 
-  private TextRangeLocation(Origin origin, TextPosition start, TextPosition end) {
-    super(origin);
+  private TextRangeOrigin(Origin fileOrigin, TextPosition start, TextPosition end) {
+    super(fileOrigin);
     this.start = start;
     this.end = end;
   }
@@ -115,7 +113,7 @@
   }
 
   @Override
-  public String getDescription() {
-    return super.getDescription() + " line " + getStart().getLine();
+  public String part() {
+    return " line " + getStart().getLine();
   }
 }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
index a775ab8..631fbc0 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking;
 
-import com.android.tools.r8.Location;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.naming.DictionaryReader;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.InternalOptions.PackageObfuscationMode;
 import com.android.tools.r8.utils.Reporter;
 import com.google.common.collect.ImmutableList;
@@ -45,7 +45,7 @@
     private Path packageObfuscationDictionary;
     private boolean useUniqueClassMemberNames;
     private boolean keepParameterNames;
-    private Location keepParameterNamesOptionLocation;
+    private Origin keepParameterNamesOptionOrigin;
     private ProguardClassFilter.Builder adaptClassStrings = ProguardClassFilter.builder();
     private boolean forceProguardCompatibility = false;
     private boolean overloadAggressively;
@@ -169,18 +169,18 @@
       return useUniqueClassMemberNames;
     }
 
-    public void setKeepParameterNames(boolean keepParameterNames, Location optionLocation) {
-      assert optionLocation != null || !keepParameterNames;
+    public void setKeepParameterNames(boolean keepParameterNames, Origin optionOrigin) {
+      assert optionOrigin != null || !keepParameterNames;
       this.keepParameterNames = keepParameterNames;
-      this.keepParameterNamesOptionLocation = optionLocation;
+      this.keepParameterNamesOptionOrigin = optionOrigin;
     }
 
     boolean isKeepParameterNames() {
       return keepParameterNames;
     }
 
-    Location getKeepParameterNamesOptionLocation() {
-      return keepParameterNamesOptionLocation;
+    Origin getKeepParameterNamesOptionOrigin() {
+      return keepParameterNamesOptionOrigin;
     }
 
     public void addAdaptClassStringsPattern(ProguardClassNameList pattern) {
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index fe9d4e1..9c5fc27 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking;
 
-import com.android.tools.r8.Location;
-import com.android.tools.r8.TextRangeLocation;
+import com.android.tools.r8.origin.TextRangeOrigin;
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -91,7 +90,7 @@
       // are not.
       reporter.fatalError(new StringDiagnostic(
           "-keepparameternames is not supported",
-          configurationBuilder.getKeepParameterNamesOptionLocation()));
+          configurationBuilder.getKeepParameterNamesOptionOrigin()));
     }
   }
 
@@ -185,7 +184,7 @@
           (option = Iterables.find(UNSUPPORTED_FLAG_OPTIONS, this::skipFlag, null)) != null) {
         reporter.error(new StringDiagnostic(
             "Unsupported option: -" + option,
-            getLocation(optionLine, optionColumn)));
+            getOrigin(optionLine, optionColumn)));
       } else if (acceptString("renamesourcefileattribute")) {
         skipWhitespace();
         if (isOptionalArgumentGiven()) {
@@ -200,7 +199,7 @@
         configurationBuilder.addRule(rule);
       } else if (acceptString("keepparameternames")) {
         configurationBuilder.setKeepParameterNames(true,
-            getLocation(optionLine, optionColumn));
+            getOrigin(optionLine, optionColumn));
       } else if (acceptString("checkdiscard")) {
         ProguardCheckDiscardRule rule = parseCheckDiscardRule();
         configurationBuilder.addRule(rule);
@@ -218,7 +217,7 @@
         if (expectedOptimizationPasses == null) {
           throw reporter.fatalError(new StringDiagnostic(
               "Missing n of \"-optimizationpasses n\"",
-              getLocation(optionLine, optionColumn)));
+              getOrigin(optionLine, optionColumn)));
         }
         warnIgnoringOptions("optimizationpasses", optionLine, optionColumn);
       } else if (acceptString("dontobfuscate")) {
@@ -330,7 +329,7 @@
       } else {
         String unknownOption = acceptString();
         reporter.error(new StringDiagnostic("Unknown option \"-" + unknownOption + "\"",
-            getLocation(optionLine, optionColumn)));
+            getOrigin(optionLine, optionColumn)));
       }
       return true;
     }
@@ -541,7 +540,7 @@
           String unknownOption = acceptString();
           throw reporter.fatalError(new StringDiagnostic(
               "Unknown option \"-" + unknownOption + "\"",
-              getLocation(startLine, startColumn)));
+              getOrigin(startLine, startColumn)));
         }
       } else {
         builder.setType(ProguardKeepRuleType.KEEP);
@@ -631,7 +630,7 @@
         return ProguardClassType.ENUM;
       } else {
         throw reporter.fatalError(new StringDiagnostic("Expected interface|class|enum",
-            getLocation(startLine, startColumn)));
+            getOrigin(startLine, startColumn)));
       }
     }
 
@@ -1168,43 +1167,43 @@
     }
 
     private ProguardRuleParserException parseError(String message) {
-      return new ProguardRuleParserException(message, snippetForPosition(), getLocation());
+      return new ProguardRuleParserException(message, snippetForPosition(), getOrigin());
     }
 
     private ProguardRuleParserException parseError(String message, Throwable cause) {
-      return new ProguardRuleParserException(message, snippetForPosition(), getLocation(), cause);
+      return new ProguardRuleParserException(message, snippetForPosition(), getOrigin(), cause);
     }
 
     private ProguardRuleParserException parseError(String message, int startLine, int startColumn,
         Throwable cause) {
       return new ProguardRuleParserException(message, snippetForPosition(startLine, startColumn),
-          getLocation(startLine, startColumn), cause);
+          getOrigin(startLine, startColumn), cause);
     }
 
     private ProguardRuleParserException parseError(String message, int startLine, int startColumn) {
       return new ProguardRuleParserException(message, snippetForPosition(startLine, startColumn),
-          getLocation(startLine, startColumn));
+          getOrigin(startLine, startColumn));
     }
 
     private void warnIgnoringOptions(String optionName, int startLine, int startColumn) {
       reporter.warning(new StringDiagnostic(
           "Ignoring option: -" + optionName,
-          getLocation(startLine, startColumn)));
+          getOrigin(startLine, startColumn)));
     }
 
     private void warnOverridingOptions(String optionName, String victim, int optionLine,
         int optionColumn) {
       reporter.warning(
           new StringDiagnostic("Option -" + optionName + " overrides -" + victim,
-              getLocation(optionLine, optionColumn)));
+              getOrigin(optionLine, optionColumn)));
     }
 
-    private Location getLocation(int startLine, int startColumn) {
-      return TextRangeLocation.get(origin, startLine, startColumn, line, getColumn());
+    private Origin getOrigin(int startLine, int startColumn) {
+      return TextRangeOrigin.get(origin, startLine, startColumn, line, getColumn());
     }
 
-    private Location getLocation() {
-      return TextRangeLocation.get(origin, line, getColumn());
+    private Origin getOrigin() {
+      return TextRangeOrigin.get(origin, line, getColumn());
     }
 
     private int getColumn() {
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardRuleParserException.java b/src/main/java/com/android/tools/r8/shaking/ProguardRuleParserException.java
index 01396c8..4b9308c 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardRuleParserException.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardRuleParserException.java
@@ -4,29 +4,29 @@
 package com.android.tools.r8.shaking;
 
 import com.android.tools.r8.Diagnostic;
-import com.android.tools.r8.Location;
+import com.android.tools.r8.origin.Origin;
 
 public class ProguardRuleParserException extends Exception implements Diagnostic {
 
   private final String message;
   private final String snippet;
-  private final Location location;
+  private final Origin origin;
 
-  public ProguardRuleParserException(String message, String snippet, Location location) {
+  public ProguardRuleParserException(String message, String snippet, Origin origin) {
     this.message = message;
     this.snippet = snippet;
-    this.location = location;
+    this.origin = origin;
   }
 
-  public ProguardRuleParserException(String message, String snippet, Location location,
+  public ProguardRuleParserException(String message, String snippet, Origin origin,
       Throwable cause) {
-    this(message, snippet,location);
+    this(message, snippet,origin);
     initCause(cause);
   }
 
   @Override
-  public Location getLocation() {
-    return location;
+  public Origin getOrigin() {
+    return origin;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApp.java b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
index 566bdb4..4b7b6d4 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -10,7 +10,6 @@
 
 import com.android.tools.r8.ArchiveClassFileProvider;
 import com.android.tools.r8.ClassFileResourceProvider;
-import com.android.tools.r8.Location;
 import com.android.tools.r8.Resource;
 import com.android.tools.r8.dex.VDexFile;
 import com.android.tools.r8.dex.VDexFileReader;
@@ -755,8 +754,7 @@
         programFileArchiveReaders
             .add(new ProgramFileArchiveReader(filteredClassPath, ignoreDexInArchive));
       } else {
-        throw new CompilationError("Unsupported source file type",
-            new Location(new PathOrigin(file)));
+        throw new CompilationError("Unsupported source file type", new PathOrigin(file));
       }
     }
 
@@ -785,8 +783,7 @@
         assert classPath.isUnfiltered();
         providerList.add(DirectoryClassFileProvider.fromDirectory(file));
       } else {
-        throw new CompilationError("Unsupported source file type",
-            new Location(new PathOrigin(file)));
+        throw new CompilationError("Unsupported source file type", new PathOrigin(file));
       }
     }
   }
diff --git a/src/main/java/com/android/tools/r8/utils/IOExceptionDiagnostic.java b/src/main/java/com/android/tools/r8/utils/IOExceptionDiagnostic.java
index f4ae918..8856f26 100644
--- a/src/main/java/com/android/tools/r8/utils/IOExceptionDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/utils/IOExceptionDiagnostic.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.utils;
 
-import com.android.tools.r8.Location;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -15,18 +15,18 @@
 
 public class IOExceptionDiagnostic extends DiagnosticWithThrowable {
 
-  private final Location location;
+  private final Origin origin;
   private final String message;
 
   public IOExceptionDiagnostic(IOException e) {
     super(e);
-    location = extractLocation(e);
+    origin = extractOrigin(e);
     message = extractMessage(e);
   }
 
-  public IOExceptionDiagnostic(IOException e, Location location) {
+  public IOExceptionDiagnostic(IOException e, Origin origin) {
     super(e);
-    this.location = location;
+    this.origin = origin;
     message = extractMessage(e);
   }
 
@@ -42,21 +42,21 @@
     return message;
   }
 
-  private Location extractLocation(IOException e) {
-    Location location = Location.UNKNOWN;
+  private Origin extractOrigin(IOException e) {
+    Origin origin = Origin.unknown();
 
     if (e instanceof FileSystemException) {
       FileSystemException fse = (FileSystemException) e;
       if (fse.getFile() != null && !fse.getFile().isEmpty()) {
-        location = new Location(new PathOrigin(Paths.get(fse.getFile())));
+        origin = new PathOrigin(Paths.get(fse.getFile()));
       }
     }
-    return location;
+    return origin;
   }
 
   @Override
-  public Location getLocation() {
-    return location;
+  public Origin getOrigin() {
+    return origin;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/utils/StringDiagnostic.java b/src/main/java/com/android/tools/r8/utils/StringDiagnostic.java
index 3e46816..cd5bbcd 100644
--- a/src/main/java/com/android/tools/r8/utils/StringDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/utils/StringDiagnostic.java
@@ -4,30 +4,25 @@
 package com.android.tools.r8.utils;
 
 import com.android.tools.r8.Diagnostic;
-import com.android.tools.r8.Location;
 import com.android.tools.r8.origin.Origin;
 
 public class StringDiagnostic implements Diagnostic {
 
-  private final Location location;
+  private final Origin origin;
   private final String message;
 
   public StringDiagnostic(String message) {
-    this(message, Location.UNKNOWN);
+    this(message, Origin.unknown());
   }
 
   public StringDiagnostic(String message, Origin origin) {
-    this(message, new Location(origin));
-  }
-
-  public StringDiagnostic(String message, Location location) {
-    this.location = location;
+    this.origin = origin;
     this.message = message;
   }
 
   @Override
-  public Location getLocation() {
-    return location;
+  public Origin getOrigin() {
+    return origin;
   }
 
   @Override
diff --git a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8DiagnosticsHandler.java b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8DiagnosticsHandler.java
index 87c738c..3dca445 100644
--- a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8DiagnosticsHandler.java
+++ b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8DiagnosticsHandler.java
@@ -6,11 +6,10 @@
 
 import com.android.tools.r8.Diagnostic;
 import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.Location;
-import com.android.tools.r8.TextRangeLocation;
 import com.android.tools.r8.origin.ArchiveEntryOrigin;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
+import com.android.tools.r8.origin.TextRangeOrigin;
 import java.nio.file.Files;
 import java.nio.file.Path;
 
@@ -45,19 +44,19 @@
   protected void convertToMessage(Diagnostic diagnostic) {
     String textMessage = diagnostic.getDiagnosticMessage();
 
-    Location location = diagnostic.getLocation();
+    Origin origin = diagnostic.getOrigin();
     String position;
-    if (location instanceof TextRangeLocation && location.getOrigin() instanceof PathOrigin) {
-      TextRangeLocation textRange = (TextRangeLocation) location;
-      position = ((PathOrigin) location.getOrigin()).getPath().toFile() + ": "
+    if (origin instanceof TextRangeOrigin && origin.parent() instanceof PathOrigin) {
+      TextRangeOrigin textRange = (TextRangeOrigin) origin;
+      position = ((PathOrigin) origin.parent()).getPath().toFile() + ": "
           + textRange.getStart().getLine() + "," + textRange.getStart().getColumn()
           + " - " + textRange.getEnd().getLine() + "," + textRange.getEnd().getColumn();
-    } else if (location.getOrigin() instanceof PathOrigin) {
-      position = ((PathOrigin) location.getOrigin()).getPath().toFile().toString();
+    } else if (origin.parent() instanceof PathOrigin) {
+      position = ((PathOrigin) origin.parent()).getPath().toFile().toString();
     } else {
       position = "UNKNOWN";
-      if (location != Location.UNKNOWN) {
-        textMessage = location.getDescription() + ": " + textMessage;
+      if (origin != Origin.unknown()) {
+        textMessage = origin.toString() + ": " + textMessage;
       }
     }
 
diff --git a/src/test/java/com/android/tools/r8/D8CommandTest.java b/src/test/java/com/android/tools/r8/D8CommandTest.java
index 2244d29..c9db878 100644
--- a/src/test/java/com/android/tools/r8/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/D8CommandTest.java
@@ -253,6 +253,6 @@
 
   private D8Command parse(String... args)
       throws CompilationFailedException {
-    return D8Command.parse(args, new Location(EmbeddedOrigin.INSTANCE)).build();
+    return D8Command.parse(args, EmbeddedOrigin.INSTANCE).build();
   }
 }
diff --git a/src/test/java/com/android/tools/r8/R8CommandTest.java b/src/test/java/com/android/tools/r8/R8CommandTest.java
index 699b87d..9f838a4 100644
--- a/src/test/java/com/android/tools/r8/R8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/R8CommandTest.java
@@ -251,6 +251,6 @@
   private R8Command parse(String... args)
       throws CompilationException, ProguardRuleParserException, IOException,
       CompilationFailedException {
-    return R8Command.parse(args, new Location(EmbeddedOrigin.INSTANCE)).build();
+    return R8Command.parse(args, EmbeddedOrigin.INSTANCE).build();
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index ca3c9d0..7f39d8e 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -14,7 +14,7 @@
 import com.android.tools.r8.Diagnostic;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TextRangeLocation;
+import com.android.tools.r8.origin.TextRangeOrigin;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.ClassAccessFlags;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -22,7 +22,6 @@
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.utils.AbortException;
-import com.android.tools.r8.utils.DefaultDiagnosticsHandler;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions.PackageObfuscationMode;
 import com.android.tools.r8.utils.Reporter;
@@ -981,9 +980,9 @@
       int columnStart, String... messageParts) {
     assertEquals(1, diagnostics.size());
     Diagnostic diagnostic = diagnostics.get(0);
-    assertEquals(path, ((PathOrigin) diagnostic.getLocation().getOrigin()).getPath());
-    assertEquals(new TextRangeLocation.TextPosition(lineStart, columnStart),
-        ((TextRangeLocation) diagnostic.getLocation()).getStart());
+    assertEquals(path, ((PathOrigin) diagnostic.getOrigin().parent()).getPath());
+    assertEquals(new TextRangeOrigin.TextPosition(lineStart, columnStart),
+        ((TextRangeOrigin) diagnostic.getOrigin()).getStart());
     for (String part:messageParts) {
       assertTrue(diagnostic.getDiagnosticMessage()+ "doesn't contain \"" + part + "\"",
           diagnostic.getDiagnosticMessage().contains(part));
diff --git a/tests/api_usage_sample.jar b/tests/api_usage_sample.jar
index aa67d74..69af652 100644
--- a/tests/api_usage_sample.jar
+++ b/tests/api_usage_sample.jar
Binary files differ