Minor fixes

* add origin information to more diagnostics
* allow DEX input from files not just archives
* allow the empty string as true for system properties

Change-Id: I73c496f37b85460c0dbfb41f2d60ccb941071a02
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 47298f9..89a0826 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -165,7 +165,7 @@
 
     private final ProguardConfigurationParserOptions.Builder parserOptionsBuilder =
         ProguardConfigurationParserOptions.builder().readEnvironment();
-    private final boolean allowDexInArchive =
+    private final boolean allowDexInputToR8 =
         System.getProperty("com.android.tools.r8.allowDexInputToR8") != null;
 
     // TODO(zerny): Consider refactoring CompatProguardCommandBuilder to avoid subclassing.
@@ -175,17 +175,17 @@
 
     Builder(DiagnosticsHandler diagnosticsHandler) {
       super(diagnosticsHandler);
-      setIgnoreDexInArchive(!allowDexInArchive);
+      setIgnoreDexInArchive(!allowDexInputToR8);
     }
 
     private Builder(AndroidApp app) {
       super(app);
-      setIgnoreDexInArchive(!allowDexInArchive);
+      setIgnoreDexInArchive(!allowDexInputToR8);
     }
 
     private Builder(AndroidApp app, DiagnosticsHandler diagnosticsHandler) {
       super(app, diagnosticsHandler);
-      setIgnoreDexInArchive(!allowDexInArchive);
+      setIgnoreDexInArchive(!allowDexInputToR8);
     }
 
     // Internal
@@ -754,7 +754,7 @@
       }
 
       for (Path file : programFiles) {
-        if (FileUtils.isDexFile(file)) {
+        if (FileUtils.isDexFile(file) && !allowDexInputToR8) {
           reporter.error(new StringDiagnostic(
               "R8 does not support compiling DEX inputs", new PathOrigin(file)));
         }
diff --git a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
index 2e5c1d4..5328880 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
@@ -232,7 +232,7 @@
       Function<DexType, DexClass> getExisting,
       InternalOptions options) {
     if (classCollection != null) {
-      Set<DexType> javaLibraryOverride = Sets.newIdentityHashSet();
+      Set<DexClass> javaLibraryOverride = Sets.newIdentityHashSet();
       ImmutableMap.Builder<DexType, T> builder = ImmutableMap.builder();
       classCollection.forEach(
           (type, clazz) -> {
@@ -241,7 +241,7 @@
               builder.put(type, clazz);
             } else if (type.getPackageName().startsWith("java.")
                 && (clazz.isLibraryClass() || other.isLibraryClass())) {
-              javaLibraryOverride.add(type);
+              javaLibraryOverride.add(clazz.isLibraryClass() ? other : clazz);
             }
           });
       if (!javaLibraryOverride.isEmpty()) {
@@ -254,17 +254,17 @@
   }
 
   private static void warnJavaLibraryOverride(
-      InternalOptions options, Set<DexType> javaLibraryOverride) {
+      InternalOptions options, Set<DexClass> javaLibraryOverride) {
     if (options.ignoreJavaLibraryOverride) {
       return;
     }
     String joined =
         javaLibraryOverride.stream()
             .sorted()
-            .map(DexType::toString)
+            .map(clazz -> clazz.toSourceString() + " (origin: " + clazz.getOrigin() + ")")
             .collect(Collectors.joining(", "));
     String message =
-        "The following library types, prefixed by java.,"
+        "The following library types, prefixed by 'java.',"
             + " are present both as library and non library classes: "
             + joined
             + ". Library classes will be ignored.";
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 6244efe..4d0f480 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2748,7 +2748,10 @@
                   + context.type.toSourceString()
                   + (clazz.isInterface() ? " implements " : " extends ")
                   + "program class "
-                  + type.toSourceString());
+                  + type.toSourceString()
+                  + " (origin: "
+                  + clazz.getOrigin()
+                  + ")");
       if (forceProguardCompatibility
           || options.getTestingOptions().allowLibraryExtendsProgramInFullMode) {
         options.reporter.warning(message);
diff --git a/src/main/java/com/android/tools/r8/utils/StringUtils.java b/src/main/java/com/android/tools/r8/utils/StringUtils.java
index e657762..43a8d07 100644
--- a/src/main/java/com/android/tools/r8/utils/StringUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/StringUtils.java
@@ -399,7 +399,7 @@
   }
 
   public static boolean isTruthy(String string) {
-    return string.equals("1") || StringUtils.toLowerCase(string).equals("true");
+    return string.isEmpty() || string.equals("1") || StringUtils.toLowerCase(string).equals("true");
   }
 
   public static boolean isWhitespace(int codePoint) {