diff options
author | Dmitry Lomov <dslomov@google.com> | 2015-09-22 16:18:36 +0000 |
---|---|---|
committer | Laszlo Csomor <laszlocsomor@google.com> | 2015-09-22 17:19:50 +0000 |
commit | 4671896be8bf0e37c85c3b740bb3621d2a9e1cc8 (patch) | |
tree | a8a3182e7e8b8503be572e70fcf3b58f4fa9cb79 /src | |
parent | 36c0fb7f48bd1548419a5f84897aadcfb79d46ee (diff) |
Refactor AndroidStudioInfoAspect.
--
MOS_MIGRATED_REVID=103652138
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java | 69 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java | 53 |
2 files changed, 82 insertions, 40 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java index ebf01e32ff..7237be676f 100644 --- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java @@ -51,7 +51,6 @@ import com.google.devtools.build.lib.rules.android.AndroidSdkProvider; import com.google.devtools.build.lib.rules.java.JavaExportsProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider; -import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.protobuf.MessageLite; @@ -95,12 +94,10 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory { AspectParameters parameters) { Aspect.Builder builder = new Builder(NAME); + AndroidStudioInfoFilesProvider.Builder providerBuilder = + new AndroidStudioInfoFilesProvider.Builder(); // Collect ide build files and calculate dependencies. - NestedSetBuilder<Label> transitiveDependenciesBuilder = NestedSetBuilder.stableOrder(); NestedSetBuilder<Label> dependenciesBuilder = NestedSetBuilder.stableOrder(); - NestedSetBuilder<SourceDirectory> transitiveResourcesBuilder = NestedSetBuilder.stableOrder(); - - NestedSetBuilder<Artifact> ideBuildFilesBuilder = NestedSetBuilder.stableOrder(); // todo(dslomov,tomlu): following current build info logic, this code enumerates dependencies // directly by iterating over deps attribute. The more robust way to do this might be @@ -109,9 +106,11 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory { Iterable<AndroidStudioInfoFilesProvider> androidStudioInfoFilesProviders = ruleContext.getPrerequisites("deps", Mode.TARGET, AndroidStudioInfoFilesProvider.class); for (AndroidStudioInfoFilesProvider depProvider : androidStudioInfoFilesProviders) { - ideBuildFilesBuilder.addTransitive(depProvider.getIdeBuildFiles()); - transitiveDependenciesBuilder.addTransitive(depProvider.getTransitiveDependencies()); - transitiveResourcesBuilder.addTransitive(depProvider.getTransitiveResources()); + providerBuilder.ideBuildFilesBuilder().addTransitive(depProvider.getIdeBuildFiles()); + providerBuilder.transitiveDependenciesBuilder().addTransitive( + depProvider.getTransitiveDependencies()); + providerBuilder.transitiveResourcesBuilder().addTransitive( + depProvider.getTransitiveResources()); } List<? extends TransitiveInfoCollection> deps = ruleContext.getPrerequisites("deps", Mode.TARGET); @@ -127,34 +126,29 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory { } NestedSet<Label> directDependencies = dependenciesBuilder.build(); - transitiveDependenciesBuilder.addTransitive(directDependencies); - NestedSet<Label> transitiveDependencies = transitiveDependenciesBuilder.build(); + providerBuilder.transitiveDependenciesBuilder().addTransitive(directDependencies); RuleIdeInfo.Kind ruleKind = getRuleKind(ruleContext.getRule(), base); - NestedSet<SourceDirectory> transitiveResources; + AndroidStudioInfoFilesProvider provider; if (ruleKind != RuleIdeInfo.Kind.UNRECOGNIZED) { - Pair<Artifact, NestedSet<SourceDirectory>> ideBuildFile = + provider = createIdeBuildArtifact( base, ruleContext, ruleKind, directDependencies, - transitiveDependencies, - transitiveResourcesBuilder); - ideBuildFilesBuilder.add(ideBuildFile.first); - transitiveResources = ideBuildFile.second; + providerBuilder); } else { - transitiveResources = transitiveResourcesBuilder.build(); + provider = providerBuilder.build(); } - NestedSet<Artifact> ideBuildFiles = ideBuildFilesBuilder.build(); + NestedSet<Artifact> ideBuildFiles = provider.getIdeBuildFiles(); builder .addOutputGroup(IDE_BUILD, ideBuildFiles) .addProvider( AndroidStudioInfoFilesProvider.class, - new AndroidStudioInfoFilesProvider( - ideBuildFiles, transitiveDependencies, transitiveResources)); + provider); return builder.build(); } @@ -175,19 +169,19 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory { return sdkInfoBuilder.build(); } - private Pair<Artifact, NestedSet<SourceDirectory>> createIdeBuildArtifact( + private AndroidStudioInfoFilesProvider createIdeBuildArtifact( ConfiguredTarget base, RuleContext ruleContext, Kind ruleKind, NestedSet<Label> directDependencies, - NestedSet<Label> transitiveDependencies, - NestedSetBuilder<SourceDirectory> transitiveResourcesBuilder) { + AndroidStudioInfoFilesProvider.Builder providerBuilder) { PathFragment ideBuildFilePath = getOutputFilePath(base, ruleContext); Root genfilesDirectory = ruleContext.getConfiguration().getGenfilesDirectory(); Artifact ideBuildFile = ruleContext .getAnalysisEnvironment() .getDerivedArtifact(ideBuildFilePath, genfilesDirectory); + providerBuilder.ideBuildFilesBuilder().add(ideBuildFile); RuleIdeInfo.Builder outputBuilder = RuleIdeInfo.newBuilder(); @@ -203,10 +197,7 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory { outputBuilder.setKind(ruleKind); - outputBuilder.addAllDependencies(transform(directDependencies, LABEL_TO_STRING)); - outputBuilder.addAllTransitiveDependencies(transform(transitiveDependencies, LABEL_TO_STRING)); - NestedSet<SourceDirectory> transitiveResources = null; if (ruleKind == Kind.JAVA_LIBRARY || ruleKind == Kind.JAVA_IMPORT || ruleKind == Kind.JAVA_TEST @@ -214,30 +205,30 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory { outputBuilder.setJavaRuleIdeInfo(makeJavaRuleIdeInfo(base)); } else if (ruleKind == Kind.ANDROID_LIBRARY || ruleKind == Kind.ANDROID_BINARY) { outputBuilder.setJavaRuleIdeInfo(makeJavaRuleIdeInfo(base)); - Pair<AndroidRuleIdeInfo, NestedSet<SourceDirectory>> androidRuleIdeInfo = - makeAndroidRuleIdeInfo(ruleContext, base, transitiveResourcesBuilder); - outputBuilder.setAndroidRuleIdeInfo(androidRuleIdeInfo.first); - transitiveResources = androidRuleIdeInfo.second; + outputBuilder.setAndroidRuleIdeInfo( + makeAndroidRuleIdeInfo(ruleContext, base, providerBuilder)); } else if (ruleKind == Kind.ANDROID_SDK) { outputBuilder.setAndroidSdkRuleInfo( makeAndroidSdkRuleInfo(ruleContext, base.getProvider(AndroidSdkProvider.class))); } - if (transitiveResources == null) { - transitiveResources = transitiveResourcesBuilder.build(); - } + AndroidStudioInfoFilesProvider provider = providerBuilder.build(); + + outputBuilder.addAllDependencies(transform(directDependencies, LABEL_TO_STRING)); + outputBuilder.addAllTransitiveDependencies( + transform(provider.getTransitiveDependencies(), LABEL_TO_STRING)); final RuleIdeInfo ruleIdeInfo = outputBuilder.build(); ruleContext.registerAction( makeProtoWriteAction(ruleContext.getActionOwner(), ruleIdeInfo, ideBuildFile)); - return Pair.of(ideBuildFile, transitiveResources); + return provider; } - private static Pair<AndroidRuleIdeInfo, NestedSet<SourceDirectory>> makeAndroidRuleIdeInfo( + private static AndroidRuleIdeInfo makeAndroidRuleIdeInfo( RuleContext ruleContext, ConfiguredTarget base, - NestedSetBuilder<SourceDirectory> transitiveResourcesBuilder) { + AndroidStudioInfoFilesProvider.Builder providerBuilder) { AndroidRuleIdeInfo.Builder builder = AndroidRuleIdeInfo.newBuilder(); AndroidIdeInfoProvider provider = base.getProvider(AndroidIdeInfoProvider.class); if (provider.getSignedApk() != null) { @@ -258,17 +249,17 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory { for (SourceDirectory resourceDir : provider.getResourceDirs()) { ArtifactLocation artifactLocation = makeArtifactLocation(resourceDir); builder.addResources(artifactLocation); - transitiveResourcesBuilder.add(resourceDir); + providerBuilder.transitiveResourcesBuilder().add(resourceDir); } builder.setJavaPackage(AndroidCommon.getJavaPackage(ruleContext)); - NestedSet<SourceDirectory> transitiveResources = transitiveResourcesBuilder.build(); + NestedSet<SourceDirectory> transitiveResources = providerBuilder.getTransitiveResources(); for (SourceDirectory transitiveResource : transitiveResources) { builder.addTransitiveResources(makeArtifactLocation(transitiveResource)); } - return Pair.of(builder.build(), transitiveResources); + return builder.build(); } private static BinaryFileWriteAction makeProtoWriteAction( diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java index 5d935310d1..6c833d1762 100644 --- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java +++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.android.AndroidIdeInfoProvider; import com.google.devtools.build.lib.rules.android.AndroidIdeInfoProvider.SourceDirectory; @@ -31,7 +32,57 @@ public final class AndroidStudioInfoFilesProvider implements TransitiveInfoProvi private final NestedSet<Label> transitiveDependencies; private final NestedSet<AndroidIdeInfoProvider.SourceDirectory> transitiveResources; - public AndroidStudioInfoFilesProvider( + /** + * Builder class for {@link AndroidStudioInfoFilesProvider} + */ + public static class Builder { + private final NestedSetBuilder<Artifact> ideBuildFilesBuilder; + private final NestedSetBuilder<Label> transitiveDependenciesBuilder; + private NestedSetBuilder<AndroidIdeInfoProvider.SourceDirectory> transitiveResourcesBuilder; + private NestedSet<AndroidIdeInfoProvider.SourceDirectory> transitiveResources; + + public Builder() { + ideBuildFilesBuilder = NestedSetBuilder.stableOrder(); + transitiveDependenciesBuilder = NestedSetBuilder.stableOrder(); + transitiveResourcesBuilder = NestedSetBuilder.stableOrder(); + transitiveResources = null; + } + + public NestedSetBuilder<Artifact> ideBuildFilesBuilder() { + return ideBuildFilesBuilder; + } + + public NestedSetBuilder<Label> transitiveDependenciesBuilder() { + return transitiveDependenciesBuilder; + } + + public NestedSetBuilder<SourceDirectory> transitiveResourcesBuilder() { + return transitiveResourcesBuilder; + } + + /** + * Returns a set of transitive resources. {@link Builder#transitiveResourcesBuilder} + * is unusable after this operation. + */ + public NestedSet<AndroidIdeInfoProvider.SourceDirectory> getTransitiveResources() { + if (transitiveResources != null) { + return transitiveResources; + } + transitiveResources = transitiveResourcesBuilder.build(); + transitiveResourcesBuilder = null; + return transitiveResources; + } + + public AndroidStudioInfoFilesProvider build() { + return new AndroidStudioInfoFilesProvider( + ideBuildFilesBuilder.build(), + transitiveDependenciesBuilder.build(), + getTransitiveResources() + ); + } + } + + private AndroidStudioInfoFilesProvider( NestedSet<Artifact> ideBuildFiles, NestedSet<Label> transitiveDependencies, NestedSet<SourceDirectory> transitiveResources) { |