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);