Merge "Build and archive compatproguard.jar"
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index e6f099e..314c388 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -170,6 +170,7 @@
       return enableDesugaring;
     }
 
+    @Override
     protected void validate() throws CompilationException {
       super.validate();
       if (getAppBuilder().hasMainDexList() && outputMode == OutputMode.FilePerInputClass) {
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 3ce1ea1..b96dfb7 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -74,6 +74,7 @@
       return this;
     }
 
+    @Override
     protected void validate() throws CompilationException {
       super.validate();
       if (getAppBuilder().hasMainDexList() && intermediate) {
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index d8a5be5..0af7f92 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -179,6 +179,7 @@
       return self();
     }
 
+    @Override
     protected void validate() throws CompilationException {
       super.validate();
       if (mainDexListOutput != null && mainDexRules.isEmpty() && !getAppBuilder()
diff --git a/src/main/java/com/android/tools/r8/compatdx/CompatDx.java b/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
index c0d4bbb..905b356 100644
--- a/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
+++ b/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
@@ -18,7 +18,6 @@
 import com.android.tools.r8.Resource;
 import com.android.tools.r8.compatdx.CompatDx.DxCompatOptions.DxUsageMessage;
 import com.android.tools.r8.compatdx.CompatDx.DxCompatOptions.PositionInfo;
-import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.logging.Log;
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index cc75fd0..d389a8c 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -106,7 +106,7 @@
     return computedMinApiLevel;
   }
 
-  private void readProguardMap(DexApplication.Builder builder, ExecutorService executorService,
+  private void readProguardMap(DexApplication.Builder<?> builder, ExecutorService executorService,
       List<Future<?>> futures) {
     // Read the Proguard mapping file in parallel with DexCode and DexProgramClass items.
     if (inputApp.hasProguardMap()) {
diff --git a/src/main/java/com/android/tools/r8/dex/DexFile.java b/src/main/java/com/android/tools/r8/dex/DexFile.java
index d2db9d6..7501528 100644
--- a/src/main/java/com/android/tools/r8/dex/DexFile.java
+++ b/src/main/java/com/android/tools/r8/dex/DexFile.java
@@ -76,6 +76,7 @@
     return version;
   }
 
+  @Override
   void setByteOrder() {
     // Make sure we set the right endian for reading.
     buffer.order(ByteOrder.LITTLE_ENDIAN);
diff --git a/src/main/java/com/android/tools/r8/dex/DexFileReader.java b/src/main/java/com/android/tools/r8/dex/DexFileReader.java
index 7bf5e8c..f3542be 100644
--- a/src/main/java/com/android/tools/r8/dex/DexFileReader.java
+++ b/src/main/java/com/android/tools/r8/dex/DexFileReader.java
@@ -662,7 +662,7 @@
       }
       clazz = classKind.create(
           type,
-          Resource.Kind.DEX, 
+          Resource.Kind.DEX,
           flags,
           superclass,
           typeListAt(interfacesOffsets[i]),
@@ -918,7 +918,7 @@
     MethodHandleType type = MethodHandleType.getKind(file.getUshort());
     file.getUshort(); // unused
     int indexFieldOrMethod = file.getUshort();
-    Descriptor<? extends DexItem, ? extends Descriptor> fieldOrMethod;
+    Descriptor<? extends DexItem, ? extends Descriptor<?,?>> fieldOrMethod;
     switch (type) {
       case INSTANCE_GET:
       case INSTANCE_PUT:
diff --git a/src/main/java/com/android/tools/r8/dex/VDexFile.java b/src/main/java/com/android/tools/r8/dex/VDexFile.java
index 990b3f6..4f936a5 100644
--- a/src/main/java/com/android/tools/r8/dex/VDexFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VDexFile.java
@@ -69,6 +69,7 @@
         + numberOfDexFiles * Constants.VDEX_DEX_CHECKSUM_SIZE;
   }
 
+  @Override
   void setByteOrder() {
     // Make sure we set the right endian for reading.
     buffer.order(ByteOrder.LITTLE_ENDIAN);
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 0ae2cbc..47bf267 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -19,6 +19,7 @@
 
   public abstract void registerReachableDefinitions(UseRegistry registry);
 
+  @Override
   public abstract String toString();
 
   public abstract String toString(DexEncodedMethod method, ClassNameMapper naming);
diff --git a/src/main/java/com/android/tools/r8/graph/DexApplication.java b/src/main/java/com/android/tools/r8/graph/DexApplication.java
index a84c90b..242add5 100644
--- a/src/main/java/com/android/tools/r8/graph/DexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DexApplication.java
@@ -84,13 +84,14 @@
     return clazz == null ? null : clazz.asProgramClass();
   }
 
+  @Override
   public abstract String toString();
 
   public ClassNameMapper getProguardMap() {
     return proguardMap;
   }
 
-  public abstract static class Builder<T extends Builder> {
+  public abstract static class Builder<T extends Builder<T>> {
     // We handle program class collection separately from classpath
     // and library class collections. Since while we assume program
     // class collection should always be fully loaded and thus fully
@@ -189,7 +190,7 @@
       return mainDexList;
     }
 
-    public Builder addToMainDexList(Collection<DexType> mainDexList) {
+    public Builder<T> addToMainDexList(Collection<DexType> mainDexList) {
       this.mainDexList.addAll(mainDexList);
       return this;
     }
diff --git a/src/main/java/com/android/tools/r8/graph/DexCallSite.java b/src/main/java/com/android/tools/r8/graph/DexCallSite.java
index 1d5720d..b228098 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCallSite.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCallSite.java
@@ -40,6 +40,7 @@
     this.bootstrapArgs = bootstrapArgs;
   }
 
+  @Override
   public int computeHashCode() {
     return methodName.hashCode()
         + methodProto.hashCode() * 7
@@ -47,6 +48,7 @@
         + bootstrapArgs.hashCode() * 101;
   }
 
+  @Override
   public boolean computeEquals(Object other) {
     // Call sites are equal only when this == other, which was already computed by the caller of
     // computeEquals. Do not share call site entries, each invoke-custom must have its own
@@ -54,6 +56,7 @@
     return false;
   }
 
+  @Override
   public String toString() {
     StringBuilder builder =
         new StringBuilder("CallSite: { Name: ").append(methodName.toSourceString())
@@ -91,6 +94,7 @@
   }
 
   // TODO(mikaelpeltier): Adapt syntax when invoke-custom will be available into smali.
+  @Override
   public String toSmaliString() {
     return toString();
   }
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 8da2178..9267f7d 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -183,10 +183,12 @@
     }
   }
 
+  @Override
   public String toString() {
     return toString(null, null);
   }
 
+  @Override
   public String toString(DexEncodedMethod method, ClassNameMapper naming) {
     StringBuilder builder = new StringBuilder();
     if (method != null) {
@@ -313,6 +315,7 @@
     return builder.toString();
   }
 
+  @Override
   public void collectIndexedItems(IndexedItemCollection indexedItems) {
     for (Instruction insn : instructions) {
       insn.collectIndexedItems(indexedItems);
@@ -360,10 +363,12 @@
       handlerIndex = map.get(handlerOffset);
     }
 
+    @Override
     public int hashCode() {
       return startAddress * 2 + instructionCount * 3 + handlerIndex * 5;
     }
 
+    @Override
     public boolean equals(Object other) {
       if (this == other) {
         return true;
@@ -381,6 +386,7 @@
       return false;
     }
 
+    @Override
     public String toString() {
       return "["
           + StringUtils.hexString(startAddress, 2)
@@ -415,10 +421,12 @@
       this.catchAllAddr = catchAllAddr;
     }
 
+    @Override
     public int hashCode() {
       return catchAllAddr + Arrays.hashCode(pairs) * 7;
     }
 
+    @Override
     public boolean equals(Object other) {
       if (this == other) {
         return true;
@@ -433,6 +441,7 @@
       return false;
     }
 
+    @Override
     public void collectIndexedItems(IndexedItemCollection indexedItems) {
       collectAll(indexedItems, pairs);
     }
@@ -443,6 +452,7 @@
       assert false;
     }
 
+    @Override
     public String toString() {
       StringBuilder builder = new StringBuilder();
       builder.append("[\n");
@@ -472,6 +482,7 @@
         this.addr = addr;
       }
 
+      @Override
       public void collectIndexedItems(IndexedItemCollection indexedItems) {
         type.collectIndexedItems(indexedItems);
       }
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index b7e41fe..2f80250 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -377,7 +377,8 @@
   }
 
   public DexMethodHandle createMethodHandle(
-      MethodHandleType type, Descriptor<? extends DexItem, ? extends Descriptor> fieldOrMethod) {
+      MethodHandleType type,
+      Descriptor<? extends DexItem, ? extends Descriptor<?, ?>> fieldOrMethod) {
     assert !sorted;
     DexMethodHandle methodHandle = new DexMethodHandle(type, fieldOrMethod);
     return canonicalize(methodHandles, methodHandle);
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java b/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java
index d64a893..12ea053 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java
@@ -125,18 +125,21 @@
   }
 
   public MethodHandleType type;
-  public Descriptor<? extends DexItem, ? extends Descriptor> fieldOrMethod;
+  public Descriptor<? extends DexItem, ? extends Descriptor<?,?>> fieldOrMethod;
 
   public DexMethodHandle(
-      MethodHandleType type, Descriptor<? extends DexItem, ? extends Descriptor> fieldOrMethod) {
+      MethodHandleType type,
+      Descriptor<? extends DexItem, ? extends Descriptor<?,?>> fieldOrMethod) {
     this.type = type;
     this.fieldOrMethod = fieldOrMethod;
   }
 
+  @Override
   public int computeHashCode() {
     return type.hashCode() + fieldOrMethod.computeHashCode() * 7;
   }
 
+  @Override
   public boolean computeEquals(Object other) {
     if (other instanceof DexMethodHandle) {
       DexMethodHandle o = (DexMethodHandle) other;
@@ -145,6 +148,7 @@
     return false;
   }
 
+  @Override
   public String toString() {
     StringBuilder builder = new StringBuilder("MethodHandle: {")
             .append(type)
@@ -167,6 +171,7 @@
   }
 
   // TODO(mikaelpeltier): Adapt syntax when invoke-custom will be available into smali.
+  @Override
   public String toSmaliString() {
     return toString();
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
index b68b1d4..f67e808 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -60,6 +60,7 @@
     return this;
   }
 
+  @Override
   public String toString() {
     return "DexApplication (direct)";
   }
diff --git a/src/main/java/com/android/tools/r8/graph/IndexedDexItem.java b/src/main/java/com/android/tools/r8/graph/IndexedDexItem.java
index 5c8f439..7cc5738 100644
--- a/src/main/java/com/android/tools/r8/graph/IndexedDexItem.java
+++ b/src/main/java/com/android/tools/r8/graph/IndexedDexItem.java
@@ -36,6 +36,7 @@
    */
   private int[] virtualFileIndexes;
 
+  @Override
   public abstract void collectIndexedItems(IndexedItemCollection indexedItems);
 
   @Override
@@ -132,22 +133,26 @@
 
   // Partial implementation of PresortedComparable.
 
+  @Override
   final public void setSortedIndex(int sortedIndex) {
     assert sortedIndex > SORTED_INDEX_UNKNOWN;
     assert this.sortedIndex == SORTED_INDEX_UNKNOWN;
     this.sortedIndex = sortedIndex;
   }
 
+  @Override
   final public int getSortedIndex() {
     return sortedIndex;
   }
 
+  @Override
   final public int sortedCompareTo(int other) {
     assert sortedIndex > SORTED_INDEX_UNKNOWN;
     assert other > SORTED_INDEX_UNKNOWN;
     return Integer.compare(sortedIndex, other);
   }
 
+  @Override
   public void flushCachedValues() {
     super.flushCachedValues();
     resetSortedIndex();
diff --git a/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java b/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
index e03b392..757ae71 100644
--- a/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
@@ -93,7 +93,8 @@
   }
 
   public DexMethodHandle getMethodHandle(
-      MethodHandleType type, Descriptor<? extends DexItem, ? extends Descriptor> fieldOrMethod) {
+      MethodHandleType type,
+      Descriptor<? extends DexItem, ? extends Descriptor<?, ?>> fieldOrMethod) {
     return options.itemFactory.createMethodHandle(type, fieldOrMethod);
   }
 
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 bd7b266..c35b10e 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
@@ -95,6 +95,7 @@
       this.libraryClasses = application.libraryClasses;
     }
 
+    @Override
     Builder self() {
       return this;
     }
@@ -109,6 +110,7 @@
       return this;
     }
 
+    @Override
     public LazyLoadedDexApplication build() {
       return new LazyLoadedDexApplication(proguardMap,
           ProgramClassCollection.create(programClasses),
@@ -127,6 +129,7 @@
     return new DirectMappedDexApplication.Builder(this).build().asDirect();
   }
 
+  @Override
   public String toString() {
     return "Application (" + programClasses + "; " + classpathClasses + "; " + libraryClasses
         + ")";
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
index 0473cbc..7f640c3 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
@@ -782,11 +782,11 @@
     }
   }
 
-  private int[] getSwitchTargets(LabelNode dflt, List labels) {
+  private int[] getSwitchTargets(LabelNode dflt, List<LabelNode> labels) {
     int[] targets = new int[1 + labels.size()];
     targets[0] = getOffset(dflt);
     for (int i = 1; i < targets.length; i++) {
-      targets[i] = getOffset((LabelNode) labels.get(i - 1));
+      targets[i] = getOffset(labels.get(i - 1));
     }
     return targets;
   }
@@ -2654,7 +2654,7 @@
 
   private DexMethodHandle getMethodHandle(JarApplicationReader application, Handle handle) {
     MethodHandleType methodHandleType = getMethodHandleType(handle);
-    Descriptor<? extends DexItem, ? extends Descriptor> descriptor =
+    Descriptor<? extends DexItem, ? extends Descriptor<?,?>> descriptor =
         methodHandleType.isFieldType()
             ? application.getField(handle.getOwner(), handle.getName(), handle.getDesc())
             : application.getMethod(handle.getOwner(), handle.getName(), handle.getDesc());