Add modeling of StringBuffer and StringBuilder constructors
Bug: 114002137
Change-Id: Id53fa5e8351e97d67edfbccd890ea818aeb74e40
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 0a19d27..b6f9f9c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -372,10 +372,11 @@
ImmutableSet.of(classMethods.getName, classMethods.getSimpleName, stringMethods.valueOf);
public Set<DexMethod> libraryMethodsWithoutSideEffects =
- ImmutableSet.of(
- objectMethods.constructor,
- stringBufferMethods.constructor,
- stringBuilderMethods.constructor);
+ ImmutableSet.<DexMethod>builder()
+ .add(objectMethods.constructor)
+ .addAll(stringBufferMethods.constructorMethods)
+ .addAll(stringBuilderMethods.constructorMethods)
+ .build();
public Set<DexType> libraryTypesAssumedToBePresent =
ImmutableSet.of(objectType, stringBufferType, stringBuilderType);
@@ -736,9 +737,13 @@
public final DexMethod appendObject;
public final DexMethod appendString;
public final DexMethod appendStringBuffer;
- public final DexMethod constructor;
+ public final DexMethod charSequenceConstructor;
+ public final DexMethod defaultConstructor;
+ public final DexMethod intConstructor;
+ public final DexMethod stringConstructor;
private final Set<DexMethod> appendMethods;
+ private final Set<DexMethod> constructorMethods;
private StringBuildingMethods(DexType receiver) {
DexType sbufType = createType(createString("Ljava/lang/StringBuffer;"));
@@ -759,7 +764,14 @@
appendObject = createMethod(receiver, createProto(receiver, objectType), append);
appendString = createMethod(receiver, createProto(receiver, stringType), append);
appendStringBuffer = createMethod(receiver, createProto(receiver, sbufType), append);
- constructor = createMethod(receiver, createProto(voidType), constructorMethodName);
+
+ charSequenceConstructor =
+ createMethod(receiver, createProto(voidType, charSequenceType), constructorMethodName);
+ defaultConstructor = createMethod(receiver, createProto(voidType), constructorMethodName);
+ intConstructor =
+ createMethod(receiver, createProto(voidType, intType), constructorMethodName);
+ stringConstructor =
+ createMethod(receiver, createProto(voidType, stringType), constructorMethodName);
appendMethods =
ImmutableSet.of(
@@ -776,6 +788,9 @@
appendObject,
appendString,
appendStringBuffer);
+ constructorMethods =
+ ImmutableSet.of(
+ charSequenceConstructor, defaultConstructor, intConstructor, stringConstructor);
}
public boolean isAppendMethod(DexMethod method) {
diff --git a/src/test/java/com/android/tools/r8/deadcode/RemoveDeadBuildersTest.java b/src/test/java/com/android/tools/r8/deadcode/RemoveDeadBuildersTest.java
index 11422fd..570c162 100644
--- a/src/test/java/com/android/tools/r8/deadcode/RemoveDeadBuildersTest.java
+++ b/src/test/java/com/android/tools/r8/deadcode/RemoveDeadBuildersTest.java
@@ -55,7 +55,13 @@
public static void main(String[] args) {
new StringBuffer();
+ new StringBuffer("Hello world!");
+ new StringBuffer((CharSequence) "Hello world!");
+ new StringBuffer(42);
new StringBuilder();
+ new StringBuilder("Hello world!");
+ new StringBuilder((CharSequence) "Hello world!");
+ new StringBuilder(42);
}
}
}
diff --git a/src/test/java/com/android/tools/r8/smali/OutlineTest.java b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
index 8111405..47e0cd0 100644
--- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java
+++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -1333,7 +1333,7 @@
dexItemFactory.libraryMethodsWithoutSideEffects =
new HashSet<>(dexItemFactory.libraryMethodsWithoutSideEffects);
dexItemFactory.libraryMethodsWithoutSideEffects.remove(
- dexItemFactory.stringBuilderMethods.constructor);
+ dexItemFactory.stringBuilderMethods.defaultConstructor);
});
AndroidApp originalApplication = buildApplicationWithAndroidJar(builder);