Create the source file provider when initializing options.

Change-Id: If0d439a0d35986ffa0ec473903225368588f7862
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 1483137..72c0cbb 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -69,7 +69,6 @@
 import com.android.tools.r8.naming.ProguardMapMinifier;
 import com.android.tools.r8.naming.ProguardMapSupplier;
 import com.android.tools.r8.naming.RecordRewritingNamingLens;
-import com.android.tools.r8.naming.SourceFileRewriter;
 import com.android.tools.r8.naming.signature.GenericSignatureRewriter;
 import com.android.tools.r8.optimize.ClassAndMemberPublicizer;
 import com.android.tools.r8.optimize.MemberRebindingAnalysis;
@@ -796,11 +795,6 @@
           LineNumberOptimizer.run(appView, getDirectApp(appView), inputApp, namingLens);
       timing.end();
 
-      // Overwrite SourceFile if specified. This step should be done after IR conversion.
-      timing.begin("Rename SourceFile");
-      new SourceFileRewriter(appView).run();
-      timing.end();
-
       // If a method filter is present don't produce output since the application is likely partial.
       if (options.hasMethodsFilter()) {
         System.out.println("Finished compilation with method filter: ");
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 4923f93..cec2d83 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.inspector.Inspector;
 import com.android.tools.r8.inspector.internal.InspectorImpl;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfiguration;
+import com.android.tools.r8.naming.SourceFileRewriter;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.shaking.ProguardConfiguration;
@@ -868,9 +869,6 @@
       internal.enableVerticalClassMerging = false;
     }
 
-    internal.mapIdProvider = getMapIdProvider();
-    internal.sourceFileProvider = getSourceFileProvider();
-
     // Amend the proguard-map consumer with options from the proguard configuration.
     internal.proguardMapConsumer =
         wrapStringConsumer(
@@ -940,6 +938,13 @@
     internal.synthesizedClassPrefix = synthesizedClassPrefix;
     internal.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
 
+    // Set up the map and source file providers.
+    // Note that minify/optimize settings must be set on internal options before doing this.
+    internal.mapIdProvider = getMapIdProvider();
+    internal.sourceFileProvider =
+        SourceFileRewriter.computeSourceFileProvider(
+            getSourceFileProvider(), proguardConfiguration, internal);
+
     if (!DETERMINISTIC_DEBUGGING) {
       assert internal.threadCount == ThreadUtils.NOT_SPECIFIED;
       internal.threadCount = getThreadCount();
diff --git a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
index 13d7fc6..5302787 100644
--- a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
@@ -5,38 +5,31 @@
 
 import com.android.tools.r8.SourceFileEnvironment;
 import com.android.tools.r8.SourceFileProvider;
-import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.shaking.ProguardConfiguration;
+import com.android.tools.r8.utils.InternalOptions;
 
 /** Computes the source file provider based on the proguard configuration if none is set. */
 public class SourceFileRewriter {
 
-  private final AppView<?> appView;
-
-  public SourceFileRewriter(AppView<?> appView) {
-    this.appView = appView;
+  public static SourceFileProvider computeSourceFileProvider(
+      SourceFileProvider provider, ProguardConfiguration configuration, InternalOptions options) {
+    if (provider != null) {
+      return provider;
+    }
+    if (!configuration.getKeepAttributes().sourceFile) {
+      return rewriteToDefaultSourceFile(options.dexItemFactory());
+    }
+    if (options.forceProguardCompatibility) {
+      return computeCompatProvider(options);
+    }
+    return computeNonCompatProvider(options);
   }
 
-  public void run() {
-    if (appView.options().sourceFileProvider != null) {
-      return;
-    }
-    appView.options().sourceFileProvider = computeSourceFileProvider();
-  }
-
-  public SourceFileProvider computeSourceFileProvider() {
-    if (!appView.options().getProguardConfiguration().getKeepAttributes().sourceFile) {
-      return rewriteToDefaultSourceFile();
-    }
-    if (appView.options().forceProguardCompatibility) {
-      return computeCompatProvider();
-    }
-    return computeNonCompatProvider();
-  }
-
-  private SourceFileProvider computeCompatProvider() {
+  private static SourceFileProvider computeCompatProvider(InternalOptions options) {
     // Compatibility mode will only apply -renamesourcefileattribute when minifying names.
-    if (appView.options().isMinifying()) {
-      String renaming = getRenameSourceFileAttribute();
+    if (options.isMinifying()) {
+      String renaming = getRenameSourceFileAttribute(options);
       if (renaming != null) {
         return rewriteTo(renaming);
       }
@@ -44,26 +37,26 @@
     return null;
   }
 
-  private SourceFileProvider computeNonCompatProvider() {
-    String renaming = getRenameSourceFileAttribute();
+  private static SourceFileProvider computeNonCompatProvider(InternalOptions options) {
+    String renaming = getRenameSourceFileAttribute(options);
     if (renaming != null) {
       return rewriteTo(renaming);
     }
-    if (appView.options().isMinifying() || appView.options().isOptimizing()) {
-      return rewriteToDefaultSourceFile();
+    if (options.isMinifying() || options.isOptimizing()) {
+      return rewriteToDefaultSourceFile(options.dexItemFactory());
     }
     return null;
   }
 
-  private String getRenameSourceFileAttribute() {
-    return appView.options().getProguardConfiguration().getRenameSourceFileAttribute();
+  private static String getRenameSourceFileAttribute(InternalOptions options) {
+    return options.getProguardConfiguration().getRenameSourceFileAttribute();
   }
 
-  private SourceFileProvider rewriteToDefaultSourceFile() {
-    return rewriteTo(appView.dexItemFactory().defaultSourceFileAttributeString);
+  private static SourceFileProvider rewriteToDefaultSourceFile(DexItemFactory factory) {
+    return rewriteTo(factory.defaultSourceFileAttributeString);
   }
 
-  private SourceFileProvider rewriteTo(String renaming) {
+  private static SourceFileProvider rewriteTo(String renaming) {
     return new SourceFileProvider() {
       @Override
       public String get(SourceFileEnvironment environment) {