Remove all usages of SynthesizedCode in D8

Bug: 188074112
Change-Id: I8a82fffb56bfee47bc0461495d177f9d1a064557
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 66b7e4e..b824a77 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -48,7 +48,6 @@
 import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
 import com.android.tools.r8.ir.analysis.inlining.SimpleInliningConstraint;
 import com.android.tools.r8.ir.code.IRCode;
-import com.android.tools.r8.ir.code.Invoke;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.DexBuilder;
@@ -64,8 +63,6 @@
 import com.android.tools.r8.ir.optimize.inliner.WhyAreYouNotInliningReporter;
 import com.android.tools.r8.ir.regalloc.RegisterAllocator;
 import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder;
-import com.android.tools.r8.ir.synthetic.ForwardMethodSourceCode;
-import com.android.tools.r8.ir.synthetic.SynthesizedCode;
 import com.android.tools.r8.kotlin.KotlinMethodLevelInfo;
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
@@ -1303,20 +1300,17 @@
     // Some debuggers (like IntelliJ) automatically skip synthetic methods on single step.
     newFlags.setSynthetic();
     newFlags.unsetAbstract();
-    ForwardMethodSourceCode.Builder forwardSourceCodeBuilder =
-        ForwardMethodSourceCode.builder(newMethod);
-    forwardSourceCodeBuilder
-        .setReceiver(clazz.type)
-        .setTarget(forwardMethod)
-        .setInvokeType(Invoke.Type.STATIC)
-        .setIsInterface(false); // Holder is companion class, or retarget method, not an interface.
     return new DexEncodedMethod(
         newMethod,
         newFlags,
         MethodTypeSignature.noSignature(),
         DexAnnotationSet.empty(),
         ParameterAnnotationsList.empty(),
-        new SynthesizedCode(forwardSourceCodeBuilder::build),
+        ForwardMethodBuilder.builder(factory)
+            .setNonStaticSource(newMethod)
+            // Holder is companion class, or retarget method, not an interface.
+            .setStaticTarget(forwardMethod, false)
+            .build(),
         true);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
index 4c784f0..3381ece 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
@@ -4,9 +4,15 @@
 
 package com.android.tools.r8.ir.desugar.itf;
 
+import com.android.tools.r8.cf.code.CfInvoke;
+import com.android.tools.r8.cf.code.CfNew;
+import com.android.tools.r8.cf.code.CfStackInstruction;
+import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
+import com.android.tools.r8.cf.code.CfThrow;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.CfCode;
 import com.android.tools.r8.graph.DexAnnotationSet;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexClass;
@@ -24,10 +30,9 @@
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.ParameterAnnotationsList;
 import com.android.tools.r8.graph.ResolutionResult;
-import com.android.tools.r8.ir.synthetic.ExceptionThrowingSourceCode;
-import com.android.tools.r8.ir.synthetic.SynthesizedCode;
 import com.android.tools.r8.position.MethodPosition;
 import com.android.tools.r8.utils.BooleanBox;
+import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.IterableUtils;
 import com.android.tools.r8.utils.MethodSignatureEquivalence;
 import com.android.tools.r8.utils.WorkList;
@@ -756,21 +761,43 @@
     if (!clazz.isProgramClass()) {
       return;
     }
-    DexMethod newMethod = dexItemFactory.createMethod(clazz.type, method.proto, method.name);
+    MethodAccessFlags accessFlags = MethodAccessFlags.builder().setPublic().build();
+    DexMethod newMethod = method.withHolder(clazz.getType(), dexItemFactory);
     DexEncodedMethod newEncodedMethod =
         new DexEncodedMethod(
             newMethod,
-            MethodAccessFlags.fromCfAccessFlags(Opcodes.ACC_PUBLIC, false),
+            accessFlags,
             MethodTypeSignature.noSignature(),
             DexAnnotationSet.empty(),
             ParameterAnnotationsList.empty(),
-            new SynthesizedCode(
-                (ignored, callerPosition) ->
-                    new ExceptionThrowingSourceCode(clazz.type, method, callerPosition, errorType)),
+            createExceptionThrowingCfCode(newMethod, accessFlags, errorType, dexItemFactory),
             true);
     addSyntheticMethod(clazz.asProgramClass(), newEncodedMethod);
   }
 
+  private static CfCode createExceptionThrowingCfCode(
+      DexMethod method,
+      MethodAccessFlags accessFlags,
+      DexType exceptionType,
+      DexItemFactory dexItemFactory) {
+    DexMethod instanceInitializer =
+        dexItemFactory.createMethod(
+            exceptionType,
+            dexItemFactory.createProto(dexItemFactory.voidType),
+            dexItemFactory.constructorMethodName);
+    int maxStack = 2;
+    int maxLocals = method.getParameters().size() + BooleanUtils.intValue(!accessFlags.isStatic());
+    return new CfCode(
+        method.getHolderType(),
+        maxStack,
+        maxLocals,
+        ImmutableList.of(
+            new CfNew(exceptionType),
+            new CfStackInstruction(Opcode.Dup),
+            new CfInvoke(Opcodes.INVOKESPECIAL, instanceInitializer, false),
+            new CfThrow()));
+  }
+
   // Note: The parameter 'target' may be a public method on a class in case of desugared
   // library retargeting (See below target.isInterface check).
   private void addForwardingMethod(DexClassAndMethod target, DexClass clazz) {
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
index c89cb3e..eb56742 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
@@ -17,7 +17,7 @@
     this(sourceCodeProvider, SynthesizedCode::registerReachableDefinitionsDefault);
   }
 
-  public SynthesizedCode(SourceCodeProvider sourceCodeProvider, Consumer<UseRegistry> callback) {
+  private SynthesizedCode(SourceCodeProvider sourceCodeProvider, Consumer<UseRegistry> callback) {
     this.sourceCodeProvider = sourceCodeProvider;
     this.registryCallback = callback;
   }