blob: baa2951a4bd76a9bd89f567328521dff4a1befaa [file] [log] [blame]
// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.naming;
import com.android.tools.r8.SourceFileEnvironment;
import com.android.tools.r8.SourceFileProvider;
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 {
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);
}
private static SourceFileProvider computeCompatProvider(InternalOptions options) {
// Compatibility mode will only apply -renamesourcefileattribute when minifying names.
if (options.isMinifying()) {
String renaming = getRenameSourceFileAttribute(options);
if (renaming != null) {
return rewriteTo(renaming, isDefault(renaming, options));
}
}
return null;
}
private static SourceFileProvider computeNonCompatProvider(InternalOptions options) {
String renaming = getRenameSourceFileAttribute(options);
if (renaming != null) {
return rewriteTo(renaming, isDefault(renaming, options));
}
if (options.isMinifying() || options.isOptimizing()) {
return rewriteToDefaultSourceFile(options.dexItemFactory());
}
return null;
}
private static String getRenameSourceFileAttribute(InternalOptions options) {
return options.getProguardConfiguration().getRenameSourceFileAttribute();
}
public static boolean isDefault(String sourceFile, InternalOptions options) {
return options.dexItemFactory().defaultSourceFileAttributeString.equals(sourceFile);
}
private static SourceFileProvider rewriteToDefaultSourceFile(DexItemFactory factory) {
return rewriteTo(factory.defaultSourceFileAttributeString, true);
}
private static SourceFileProvider rewriteTo(String renaming, boolean allowDiscard) {
return new SourceFileProvider() {
@Override
public String get(SourceFileEnvironment environment) {
return renaming;
}
@Override
public boolean allowDiscardingSourceFile() {
return allowDiscard;
}
};
}
}