diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
22 files changed, 186 insertions, 195 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java index 1251fe1ceb..c07d950969 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java @@ -457,9 +457,8 @@ public class BuildView { skylarkFunctionName)); } } else { - final Class<? extends ConfiguredNativeAspectFactory> aspectFactoryClass = - ruleClassProvider.getAspectFactoryMap().get(aspect) - .asSubclass(ConfiguredNativeAspectFactory.class); + final NativeAspectClass aspectFactoryClass = + ruleClassProvider.getNativeAspectClassMap().get(aspect); if (aspectFactoryClass != null) { for (ConfiguredTargetKey targetSpec : targetSpecs) { aspectKeys.add( @@ -469,7 +468,7 @@ public class BuildView { // aspect and the base target while the top-level configuration is untrimmed. targetSpec.getConfiguration(), targetSpec.getConfiguration(), - new NativeAspectClass<ConfiguredNativeAspectFactory>(aspectFactoryClass))); + aspectFactoryClass)); } } else { throw new ViewCreationFailedException("Aspect '" + aspect + "' is unknown"); diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredNativeAspectFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredNativeAspectFactory.java deleted file mode 100644 index e315141029..0000000000 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredNativeAspectFactory.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2015 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.devtools.build.lib.analysis; - -import com.google.devtools.build.lib.packages.NativeAspectClass; - -/** - * A union of {@link ConfiguredAspectFactory} and - * {@link com.google.devtools.build.lib.packages.NativeAspectClass.NativeAspectFactory} - * All native aspect classes should implement this interface. - * - */ -public interface ConfiguredNativeAspectFactory - extends ConfiguredAspectFactory, NativeAspectClass.NativeAspectFactory { - -} diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java index e4a4a2c9dc..bfc8b5bc2e 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java @@ -36,7 +36,7 @@ import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.graph.Digraph; import com.google.devtools.build.lib.graph.Node; import com.google.devtools.build.lib.packages.Attribute; -import com.google.devtools.build.lib.packages.NativeAspectClass.NativeAspectFactory; +import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClassProvider; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; @@ -93,7 +93,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { private final Map<String, RuleClass> ruleClassMap = new HashMap<>(); private final Map<String, RuleDefinition> ruleDefinitionMap = new HashMap<>(); - private final Map<String, Class<? extends NativeAspectFactory>> aspectFactoryMap = + private final Map<String, NativeAspectClass> nativeAspectClassMap = new HashMap<>(); private final Map<Class<? extends RuleDefinition>, RuleClass> ruleMap = new HashMap<>(); private final Digraph<Class<? extends RuleDefinition>> dependencyGraph = @@ -161,10 +161,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { return this; } - public Builder addAspectFactory( - String name, Class<? extends ConfiguredNativeAspectFactory> configuredAspectFactoryClass) { - aspectFactoryMap.put(name, configuredAspectFactoryClass); - + public Builder addNativeAspectClass(NativeAspectClass aspectFactoryClass) { + nativeAspectClassMap.put(aspectFactoryClass.getName(), aspectFactoryClass); return this; } @@ -264,7 +262,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { toolsRepository, ImmutableMap.copyOf(ruleClassMap), ImmutableMap.copyOf(ruleDefinitionMap), - ImmutableMap.copyOf(aspectFactoryMap), + ImmutableMap.copyOf(nativeAspectClassMap), defaultWorkspaceFilePrefix.toString(), defaultWorkspaceFileSuffix.toString(), ImmutableList.copyOf(buildInfoFactories), @@ -344,7 +342,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { /** * Maps aspect name to the aspect factory meta class. */ - private final ImmutableMap<String, Class<? extends NativeAspectFactory>> aspectFactoryMap; + private final ImmutableMap<String, NativeAspectClass> nativeAspectClassMap; /** * The configuration options that affect the behavior of the rules. @@ -381,7 +379,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { String toolsRepository, ImmutableMap<String, RuleClass> ruleClassMap, ImmutableMap<String, RuleDefinition> ruleDefinitionMap, - ImmutableMap<String, Class<? extends NativeAspectFactory>> aspectFactoryMap, + ImmutableMap<String, NativeAspectClass> nativeAspectClassMap, String defaultWorkspaceFilePrefix, String defaultWorkspaceFileSuffix, ImmutableList<BuildInfoFactory> buildInfoFactories, @@ -398,7 +396,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { this.toolsRepository = toolsRepository; this.ruleClassMap = ruleClassMap; this.ruleDefinitionMap = ruleDefinitionMap; - this.aspectFactoryMap = aspectFactoryMap; + this.nativeAspectClassMap = nativeAspectClassMap; this.defaultWorkspaceFilePrefix = defaultWorkspaceFilePrefix; this.defaultWorkspaceFileSuffix = defaultWorkspaceFileSuffix; this.buildInfoFactories = buildInfoFactories; @@ -436,8 +434,13 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { } @Override - public Map<String, Class<? extends NativeAspectFactory>> getAspectFactoryMap() { - return aspectFactoryMap; + public Map<String, NativeAspectClass> getNativeAspectClassMap() { + return nativeAspectClassMap; + } + + @Override + public NativeAspectClass getNativeAspectClass(String key) { + return nativeAspectClassMap.get(key); } /** diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java index ef48488e4f..cf66d51a75 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java @@ -484,9 +484,9 @@ public abstract class DependencyResolver { aspect.getDefinition().getAttributeAspects().get(attribute.getName())) { if (aspectClass.equals(aspect.getAspectClass())) { aspectCandidates.add(aspect); - } else if (aspectClass instanceof NativeAspectClass<?>) { + } else if (aspectClass instanceof NativeAspectClass) { aspectCandidates.add( - Aspect.forNative((NativeAspectClass<?>) aspectClass, aspect.getParameters())); + Aspect.forNative((NativeAspectClass) aspectClass, aspect.getParameters())); } else { // If we ever want to support this specifying arbitrary aspects for Skylark aspects, // we will need to do a Skyframe call here to load an up-to-date definition. diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index 61d5224b73..3f7896bbde 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -76,8 +76,11 @@ import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.rules.android.AndroidBinaryOnlyRule; import com.google.devtools.build.lib.rules.android.AndroidConfiguration; import com.google.devtools.build.lib.rules.android.AndroidLibraryBaseRule; +import com.google.devtools.build.lib.rules.android.AndroidNeverlinkAspect; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses; import com.google.devtools.build.lib.rules.android.AndroidSkylarkCommon; +import com.google.devtools.build.lib.rules.android.DexArchiveAspect; +import com.google.devtools.build.lib.rules.android.JackAspect; import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.AppleToolchain; @@ -101,6 +104,7 @@ import com.google.devtools.build.lib.rules.java.ProguardLibraryRule; import com.google.devtools.build.lib.rules.objc.AppleSkylarkCommon; import com.google.devtools.build.lib.rules.objc.AppleWatch1ExtensionRule; import com.google.devtools.build.lib.rules.objc.AppleWatchExtensionBinaryRule; +import com.google.devtools.build.lib.rules.objc.BazelJ2ObjcProtoAspect; import com.google.devtools.build.lib.rules.objc.ExperimentalObjcLibraryRule; import com.google.devtools.build.lib.rules.objc.IosApplicationRule; import com.google.devtools.build.lib.rules.objc.IosDeviceRule; @@ -109,6 +113,7 @@ import com.google.devtools.build.lib.rules.objc.IosExtensionRule; import com.google.devtools.build.lib.rules.objc.IosFrameworkBinaryRule; import com.google.devtools.build.lib.rules.objc.IosFrameworkRule; import com.google.devtools.build.lib.rules.objc.IosTestRule; +import com.google.devtools.build.lib.rules.objc.J2ObjcAspect; import com.google.devtools.build.lib.rules.objc.J2ObjcCommandLineOptions; import com.google.devtools.build.lib.rules.objc.J2ObjcConfiguration; import com.google.devtools.build.lib.rules.objc.J2ObjcLibraryBaseRule; @@ -139,6 +144,8 @@ import java.io.IOException; * A rule class provider implementing the rules Bazel knows. */ public class BazelRuleClassProvider { + public static final String TOOLS_REPOSITORY = "@bazel_tools"; + /** * Used by the build encyclopedia generator. */ @@ -236,7 +243,7 @@ public class BazelRuleClassProvider { ImmutableMap.of( "android_common", new AndroidSkylarkCommon(), "apple_common", new AppleSkylarkCommon()); - + public static void setup(ConfiguredRuleClassProvider.Builder builder) { builder .addBuildInfoFactory(new BazelJavaBuildInfoFactory()) @@ -245,7 +252,7 @@ public class BazelRuleClassProvider { .setConfigurationCollectionFactory(new BazelConfigurationCollection()) .setPrelude("//tools/build_rules:prelude_bazel") .setRunfilesPrefix("") - .setToolsRepository("@bazel_tools") + .setToolsRepository(TOOLS_REPOSITORY) .setPrerequisiteValidator(new BazelPrerequisiteValidator()) .setSkylarkAccessibleTopLevels(skylarkBuiltinJavaObects); @@ -255,6 +262,20 @@ public class BazelRuleClassProvider { builder.addConfigurationOptions(fragmentOptions); } + AndroidNeverlinkAspect androidNeverlinkAspect = new AndroidNeverlinkAspect(); + DexArchiveAspect dexArchiveAspect = new DexArchiveAspect(TOOLS_REPOSITORY); + JackAspect jackAspect = new JackAspect(); + BazelJ2ObjcProtoAspect bazelJ2ObjcProtoAspect = new BazelJ2ObjcProtoAspect(TOOLS_REPOSITORY); + J2ObjcAspect j2ObjcAspect = new J2ObjcAspect(TOOLS_REPOSITORY, bazelJ2ObjcProtoAspect); + AndroidStudioInfoAspect androidStudioInfoAspect = new AndroidStudioInfoAspect(TOOLS_REPOSITORY); + + builder.addNativeAspectClass(androidNeverlinkAspect); + builder.addNativeAspectClass(dexArchiveAspect); + builder.addNativeAspectClass(jackAspect); + builder.addNativeAspectClass(bazelJ2ObjcProtoAspect); + builder.addNativeAspectClass(j2ObjcAspect); + builder.addNativeAspectClass(androidStudioInfoAspect); + builder.addRuleDefinition(new WorkspaceBaseRule()); builder.addRuleDefinition(new BaseRuleClasses.BaseRule()); @@ -331,9 +352,10 @@ public class BazelRuleClassProvider { builder.addRuleDefinition(new AndroidRuleClasses.AndroidBaseRule()); builder.addRuleDefinition(new AndroidRuleClasses.AndroidAaptBaseRule()); builder.addRuleDefinition(new AndroidRuleClasses.AndroidResourceSupportRule()); - builder.addRuleDefinition(new AndroidRuleClasses.AndroidBinaryBaseRule()); + builder.addRuleDefinition(new AndroidRuleClasses.AndroidBinaryBaseRule( + androidNeverlinkAspect, dexArchiveAspect, jackAspect)); builder.addRuleDefinition(new AndroidBinaryOnlyRule()); - builder.addRuleDefinition(new AndroidLibraryBaseRule()); + builder.addRuleDefinition(new AndroidLibraryBaseRule(androidNeverlinkAspect, jackAspect)); builder.addRuleDefinition(new BazelAndroidLibraryRule()); builder.addRuleDefinition(new BazelAndroidBinaryRule()); @@ -377,7 +399,7 @@ public class BazelRuleClassProvider { builder.addRuleDefinition(new XcodeVersionRule()); builder.addRuleDefinition(new XcodeConfigRule()); builder.addRuleDefinition(new J2ObjcLibraryBaseRule()); - builder.addRuleDefinition(new BazelJ2ObjcLibraryRule()); + builder.addRuleDefinition(new BazelJ2ObjcLibraryRule(j2ObjcAspect)); builder.addRuleDefinition(new BazelExtraActionRule()); builder.addRuleDefinition(new BazelActionListenerRule()); @@ -396,8 +418,6 @@ public class BazelRuleClassProvider { builder.addRuleDefinition(new AndroidSdkRepositoryRule()); builder.addRuleDefinition(new AndroidNdkRepositoryRule()); - builder.addAspectFactory(AndroidStudioInfoAspect.NAME, AndroidStudioInfoAspect.class); - builder.addConfigurationFragment(new BazelConfiguration.Loader()); builder.addConfigurationFragment(new CppConfigurationLoader( Functions.<String>identity())); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java index 4c71e4ba4a..551a4243e1 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java @@ -32,6 +32,11 @@ import com.google.devtools.build.lib.rules.objc.ObjcConfiguration; * Concrete implementation of J2ObjCLibraryBaseRule. */ public class BazelJ2ObjcLibraryRule implements RuleDefinition { + private final J2ObjcAspect j2ObjcAspect; + + public BazelJ2ObjcLibraryRule(J2ObjcAspect j2ObjcAspect) { + this.j2ObjcAspect = j2ObjcAspect; + } @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { @@ -62,7 +67,7 @@ public class BazelJ2ObjcLibraryRule implements RuleDefinition { </p> <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/ .add(attr("deps", LABEL_LIST) - .aspect(J2ObjcAspect.class) + .aspect(j2ObjcAspect) .direct_compile_time_input() .allowedRuleClasses("j2objc_library", "java_library", "java_import") .allowedFileTypes()) 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 fa83b2878b..39dfff6ffc 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 @@ -26,7 +26,6 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.io.ByteSource; -import com.google.devtools.build.lib.Constants; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.ActionOwner; import com.google.devtools.build.lib.actions.Artifact; @@ -35,7 +34,7 @@ import com.google.devtools.build.lib.actions.Root; import com.google.devtools.build.lib.analysis.AnalysisUtils; import com.google.devtools.build.lib.analysis.ConfiguredAspect; import com.google.devtools.build.lib.analysis.ConfiguredAspect.Builder; -import com.google.devtools.build.lib.analysis.ConfiguredNativeAspectFactory; +import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; @@ -59,6 +58,7 @@ import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo. import com.google.devtools.build.lib.packages.AspectDefinition; import com.google.devtools.build.lib.packages.AspectParameters; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.rules.android.AndroidIdeInfoProvider; @@ -86,7 +86,7 @@ import javax.annotation.Nullable; /** * Generates ide-build information for Android Studio. */ -public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { +public class AndroidStudioInfoAspect extends NativeAspectClass implements ConfiguredAspectFactory { public static final String NAME = "AndroidStudioInfoAspect"; // Output groups. @@ -94,6 +94,11 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { public static final String IDE_INFO = "ide-info"; public static final String IDE_INFO_TEXT = "ide-info-text"; public static final String IDE_RESOLVE = "ide-resolve"; + private final String toolsRepository; + + public AndroidStudioInfoAspect(String toolsRepository) { + this.toolsRepository = toolsRepository; + } private static class PrerequisiteAttr { public final String name; @@ -129,14 +134,14 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { @Override public AspectDefinition getDefinition(AspectParameters aspectParameters) { AspectDefinition.Builder builder = new AspectDefinition.Builder(NAME) - .attributeAspect("runtime_deps", AndroidStudioInfoAspect.class) - .attributeAspect("resources", AndroidStudioInfoAspect.class) + .attributeAspect("runtime_deps", this) + .attributeAspect("resources", this) .add(attr("$packageParser", LABEL).cfg(HOST).exec() .value(Label.parseAbsoluteUnchecked( - Constants.TOOLS_REPOSITORY + "//tools/android:PackageParser"))); + toolsRepository + "//tools/android:PackageParser"))); for (PrerequisiteAttr prerequisiteAttr : PREREQUISITE_ATTRS) { - builder.attributeAspect(prerequisiteAttr.name, AndroidStudioInfoAspect.class); + builder.attributeAspect(prerequisiteAttr.name, this); } return builder.build(); diff --git a/src/main/java/com/google/devtools/build/lib/packages/Aspect.java b/src/main/java/com/google/devtools/build/lib/packages/Aspect.java index cff38f925e..dfd7e5c35d 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Aspect.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Aspect.java @@ -43,11 +43,11 @@ public final class Aspect implements DependencyFilter.AttributeInfoProvider { } public static Aspect forNative( - NativeAspectClass<?> nativeAspectClass, AspectParameters parameters) { + NativeAspectClass nativeAspectClass, AspectParameters parameters) { return new Aspect(nativeAspectClass, nativeAspectClass.getDefinition(parameters), parameters); } - public static Aspect forNative(NativeAspectClass<?> nativeAspectClass) { + public static Aspect forNative(NativeAspectClass nativeAspectClass) { return forNative(nativeAspectClass, AspectParameters.EMPTY); } diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java index be1bd0bb6f..c9b8a3b3a8 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java +++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java @@ -23,7 +23,6 @@ import com.google.common.collect.Multimap; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy; -import com.google.devtools.build.lib.packages.NativeAspectClass.NativeAspectFactory; import com.google.devtools.build.lib.util.Preconditions; import java.util.Collection; @@ -249,13 +248,10 @@ public final class AspectDefinition { * but we cannot reference that interface here. */ @SafeVarargs - public final Builder attributeAspect( - String attribute, Class<? extends NativeAspectFactory>... aspectFactories) { + public final Builder attributeAspect(String attribute, NativeAspectClass... aspectClasses) { Preconditions.checkNotNull(attribute); - for (Class<? extends NativeAspectFactory> aspectFactory : aspectFactories) { - this - .attributeAspect( - attribute, new NativeAspectClass<>(Preconditions.checkNotNull(aspectFactory))); + for (NativeAspectClass aspectClass : aspectClasses) { + this.attributeAspect(attribute, Preconditions.checkNotNull(aspectClass)); } return this; } diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java index aeac774c66..4b9f7fe32e 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java @@ -23,7 +23,6 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.google.devtools.build.lib.cmdline.Label; -import com.google.devtools.build.lib.packages.NativeAspectClass.NativeAspectFactory; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.syntax.ClassObject; import com.google.devtools.build.lib.syntax.ClassObject.SkylarkClassObject; @@ -73,8 +72,8 @@ public final class Attribute implements Comparable<Attribute> { public abstract Aspect getAspect(Rule rule); } - private static class NativeRuleAspect extends RuleAspect<NativeAspectClass<?>> { - public NativeRuleAspect(NativeAspectClass<?> aspectClass, + private static class NativeRuleAspect extends RuleAspect<NativeAspectClass> { + public NativeRuleAspect(NativeAspectClass aspectClass, Function<Rule, AspectParameters> parametersExtractor) { super(aspectClass, parametersExtractor); } @@ -151,7 +150,7 @@ public final class Attribute implements Comparable<Attribute> { // TODO(bazel-team): Move this elsewhere. DATA, - /** + /** * Transition to one or more configurations. To obtain the actual child configurations, * invoke {@link Attribute#getSplitTransition(Rule)}. See {@link SplitTransition}. **/ @@ -297,7 +296,7 @@ public final class Attribute implements Comparable<Attribute> { */ SplitTransition<?> apply(Rule fromRule); } - + /** * Implementation of {@link SplitTransitionProvider} that returns a single {@link SplitTransition} * regardless of the originating rule. @@ -827,32 +826,13 @@ public final class Attribute implements Comparable<Attribute> { } /** - * Asserts that a particular aspect probably needs to be computed for all direct dependencies - * through this attribute. - */ - public <T extends NativeAspectFactory> Builder<TYPE> aspect(Class<T> aspect) { - return this.aspect(aspect, NO_PARAMETERS); - } - - /** - * Asserts that a particular parameterized aspect probably needs to be computed for all direct - * dependencies through this attribute. - * - * @param evaluator function that extracts aspect parameters from rule. - */ - public <T extends NativeAspectFactory> Builder<TYPE> aspect( - Class<T> aspect, Function<Rule, AspectParameters> evaluator) { - return this.aspect(new NativeAspectClass<T>(aspect), evaluator); - } - - /** * Asserts that a particular parameterized aspect probably needs to be computed for all direct * dependencies through this attribute. * * @param evaluator function that extracts aspect parameters from rule. */ public Builder<TYPE> aspect( - NativeAspectClass<?> aspect, Function<Rule, AspectParameters> evaluator) { + NativeAspectClass aspect, Function<Rule, AspectParameters> evaluator) { this.aspects.add(new NativeRuleAspect(aspect, evaluator)); return this; } @@ -861,7 +841,7 @@ public final class Attribute implements Comparable<Attribute> { * Asserts that a particular parameterized aspect probably needs to be computed for all direct * dependencies through this attribute. */ - public Builder<TYPE> aspect(NativeAspectClass<?> aspect) { + public Builder<TYPE> aspect(NativeAspectClass aspect) { Function<Rule, AspectParameters> noParameters = new Function<Rule, AspectParameters>() { @Override @@ -1407,10 +1387,10 @@ public final class Attribute implements Comparable<Attribute> { } /** - * Returns the split configuration transition for this attribute. - * + * Returns the split configuration transition for this attribute. + * * @param rule the originating {@link Rule} which owns this attribute - * @throws IllegalStateException if {@link #hasSplitConfigurationTransition} is not true + * @throws IllegalStateException if {@link #hasSplitConfigurationTransition} is not true */ public SplitTransition<?> getSplitTransition(Rule rule) { Preconditions.checkState(hasSplitConfigurationTransition()); diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java b/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java index febf653e2b..905862a8d7 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java @@ -20,51 +20,13 @@ package com.google.devtools.build.lib.packages; * <p>This class just wraps a {@link java.lang.Class} implementing the * aspect factory. All wrappers of the same class are equal. */ -public final class NativeAspectClass<T extends NativeAspectClass.NativeAspectFactory> - implements AspectClass { - private final Class<? extends T> nativeClass; - - public NativeAspectClass(Class<? extends T> nativeClass) { - this.nativeClass = nativeClass; - } +public abstract class NativeAspectClass implements AspectClass { @Override public String getName() { - return nativeClass.getSimpleName(); - } - - public AspectDefinition getDefinition(AspectParameters aspectParameters) { - return newInstance().getDefinition(aspectParameters); - } - - public T newInstance() { - try { - return nativeClass.newInstance(); - } catch (Exception e) { - throw new IllegalStateException(e); - } + return getClass().getSimpleName(); } - @Override - public int hashCode() { - return nativeClass.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof NativeAspectClass)) { - return false; - } - return nativeClass.equals(((NativeAspectClass<?>) obj).nativeClass); - } + public abstract AspectDefinition getDefinition(AspectParameters aspectParameters); - /** - * Every native aspect should implement this interface. - */ - public interface NativeAspectFactory { - /** - * Returns the definition of the aspect. - */ - AspectDefinition getDefinition(AspectParameters aspectParameters); - } } diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java index 7a3566a5eb..f5cf092fc4 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java @@ -16,7 +16,6 @@ package com.google.devtools.build.lib.packages; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.events.EventHandler; -import com.google.devtools.build.lib.packages.NativeAspectClass.NativeAspectFactory; import com.google.devtools.build.lib.syntax.Environment; import com.google.devtools.build.lib.syntax.Environment.Extension; import com.google.devtools.build.lib.syntax.Mutability; @@ -66,7 +65,7 @@ public interface RuleClassProvider { /** * Returns a map from aspect names to aspect factory objects. */ - Map<String, Class<? extends NativeAspectFactory>> getAspectFactoryMap(); + Map<String, NativeAspectClass> getNativeAspectClassMap(); /** * Returns the default content that should be added at the beginning of the WORKSPACE file. @@ -88,4 +87,9 @@ public interface RuleClassProvider { * Returns the path to the tools repository */ String getToolsRepository(); + + /** + * Retrieves an aspect from the aspect factory map using the key provided + */ + NativeAspectClass getNativeAspectClass(String key); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java index 6c295bebf6..13686f8dac 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java @@ -35,6 +35,15 @@ import com.google.devtools.build.lib.rules.java.ProguardLibraryRule; * Rule definition for the android_library rule. */ public final class AndroidLibraryBaseRule implements RuleDefinition { + private final AndroidNeverlinkAspect androidNeverlinkAspect; + private final JackAspect jackAspect; + + public AndroidLibraryBaseRule(AndroidNeverlinkAspect androidNeverlinkAspect, + JackAspect jackAspect) { + this.androidNeverlinkAspect = androidNeverlinkAspect; + this.jackAspect = jackAspect; + } + @Override public RuleClass build(RuleClass.Builder builder, final RuleDefinitionEnvironment env) { return builder @@ -73,8 +82,8 @@ public final class AndroidLibraryBaseRule implements RuleDefinition { .override(builder.copy("deps") .allowedRuleClasses(AndroidRuleClasses.ALLOWED_DEPENDENCIES) .allowedFileTypes() - .aspect(JackAspect.class) - .aspect(AndroidNeverlinkAspect.class)) + .aspect(jackAspect) + .aspect(androidNeverlinkAspect)) /* <!-- #BLAZE_RULE(android_library).ATTRIBUTE(exports) --> The closure of all rules reached via <code>exports</code> attributes are considered direct dependencies of any rule that directly depends on the @@ -84,8 +93,8 @@ public final class AndroidLibraryBaseRule implements RuleDefinition { .add(attr("exports", LABEL_LIST) .allowedRuleClasses(AndroidRuleClasses.ALLOWED_DEPENDENCIES) .allowedFileTypes(/*May not have files in exports!*/) - .aspect(JackAspect.class) - .aspect(AndroidNeverlinkAspect.class)) + .aspect(jackAspect) + .aspect(androidNeverlinkAspect)) .add(attr("alwayslink", BOOLEAN).undocumented("purely informational for now")) /* <!-- #BLAZE_RULE(android_library).ATTRIBUTE(neverlink) --> Only use this library for compilation and not at runtime. diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java index b0a3e0d914..db8730062c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java @@ -15,7 +15,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.ConfiguredAspect; -import com.google.devtools.build.lib.analysis.ConfiguredNativeAspectFactory; +import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.packages.AspectDefinition; import com.google.devtools.build.lib.packages.AspectParameters; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; import com.google.devtools.build.lib.rules.java.JavaRuntimeJarProvider; @@ -38,7 +39,7 @@ import java.util.List; * <p>One would think that using the compile time classpath would be enough, but alas, those are * ijars, */ -public class AndroidNeverlinkAspect implements ConfiguredNativeAspectFactory { +public class AndroidNeverlinkAspect extends NativeAspectClass implements ConfiguredAspectFactory { public static final String NAME = "AndroidNeverlinkAspect"; private static final ImmutableList<String> ATTRIBUTES = ImmutableList.of( @@ -80,7 +81,7 @@ public class AndroidNeverlinkAspect implements ConfiguredNativeAspectFactory { public AspectDefinition getDefinition(AspectParameters aspectParameters) { AspectDefinition.Builder builder = new AspectDefinition.Builder("AndroidNeverlinkAspect"); for (String attribute : ATTRIBUTES) { - builder.attributeAspect(attribute, AndroidNeverlinkAspect.class); + builder.attributeAspect(attribute, this); } return builder diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java index 0cb5c907fc..b48e8b5559 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java @@ -543,6 +543,19 @@ public final class AndroidRuleClasses { * Base class for Android rule definitions that produce binaries. */ public static final class AndroidBinaryBaseRule implements RuleDefinition { + + private final AndroidNeverlinkAspect androidNeverlinkAspect; + private final DexArchiveAspect dexArchiveAspect; + private final JackAspect jackAspect; + + public AndroidBinaryBaseRule(AndroidNeverlinkAspect androidNeverlinkAspect, + DexArchiveAspect dexArchiveAspect, + JackAspect jackAspect) { + this.androidNeverlinkAspect = androidNeverlinkAspect; + this.dexArchiveAspect = dexArchiveAspect; + this.jackAspect = jackAspect; + } + @Override public RuleClass build(RuleClass.Builder builder, final RuleDefinitionEnvironment env) { return builder @@ -575,9 +588,9 @@ public final class AndroidRuleClasses { .cfg(ANDROID_SPLIT_TRANSITION) .allowedRuleClasses(ALLOWED_DEPENDENCIES) .allowedFileTypes() - .aspect(AndroidNeverlinkAspect.class) - .aspect(DexArchiveAspect.class) - .aspect(JackAspect.class)) + .aspect(androidNeverlinkAspect) + .aspect(dexArchiveAspect) + .aspect(jackAspect)) // Proguard rule specifying master list of classes to keep during legacy multidexing. .add(attr("$build_incremental_dexmanifest", LABEL).cfg(HOST).exec() .value(env.getToolsLabel(BUILD_INCREMENTAL_DEXMANIFEST_LABEL))) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java index 09698cd9cd..06698e10ef 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java @@ -14,7 +14,6 @@ package com.google.devtools.build.lib.rules.android; import static com.google.common.base.Preconditions.checkState; -import static com.google.devtools.build.lib.Constants.TOOLS_REPOSITORY; import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.HOST; import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; @@ -35,7 +34,7 @@ import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.AspectDefinition; import com.google.devtools.build.lib.packages.AspectParameters; -import com.google.devtools.build.lib.packages.NativeAspectClass.NativeAspectFactory; +import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; import com.google.devtools.build.lib.rules.java.JavaRuntimeJarProvider; @@ -43,11 +42,16 @@ import com.google.devtools.build.lib.rules.java.JavaRuntimeJarProvider; /** * Aspect to {@link DexArchiveProvider build .dex Archives} from Jars. */ -public final class DexArchiveAspect implements NativeAspectFactory, ConfiguredAspectFactory { - private static final String NAME = "DexArchiveAspect"; +public final class DexArchiveAspect extends NativeAspectClass implements ConfiguredAspectFactory { + public static final String NAME = "DexArchiveAspect"; private static final String ASPECT_DEXBUILDER_PREREQ = "$dex_archive_dexbuilder"; private static final ImmutableList<String> TRANSITIVE_ATTRIBUTES = ImmutableList.of("deps", "exports", "runtime_deps"); + private final String toolsRepository; + + public DexArchiveAspect(String toolsRepository) { + this.toolsRepository = toolsRepository; + } @Override public AspectDefinition getDefinition(AspectParameters params) { @@ -56,10 +60,10 @@ public final class DexArchiveAspect implements NativeAspectFactory, ConfiguredAs .requireProvider(JavaCompilationArgsProvider.class) .add(attr(ASPECT_DEXBUILDER_PREREQ, LABEL).cfg(HOST).exec() // Parse label here since we don't have RuleDefinitionEnvironment.getLabel like in a rule - .value(Label.parseAbsoluteUnchecked(TOOLS_REPOSITORY + "//tools/android:dexbuilder"))) + .value(Label.parseAbsoluteUnchecked(toolsRepository + "//tools/android:dexbuilder"))) .requiresConfigurationFragments(AndroidConfiguration.class); for (String attr : TRANSITIVE_ATTRIBUTES) { - result.attributeAspect(attr, DexArchiveAspect.class); + result.attributeAspect(attr, this); } return result.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java index cceff8a5ba..7d15c27e4e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java @@ -31,7 +31,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.packages.AspectDefinition; import com.google.devtools.build.lib.packages.AspectParameters; -import com.google.devtools.build.lib.packages.NativeAspectClass.NativeAspectFactory; +import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidSdkLabel; import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider; @@ -39,7 +39,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; import java.util.List; /** Aspect to provide Jack support to rules which have java sources. */ -public final class JackAspect implements NativeAspectFactory, ConfiguredAspectFactory { +public final class JackAspect extends NativeAspectClass implements ConfiguredAspectFactory { public static final String NAME = "JackAspect"; @Override @@ -56,9 +56,9 @@ public final class JackAspect implements NativeAspectFactory, ConfiguredAspectFa .add(attr(":android_sdk", LABEL) .allowedRuleClasses("android_sdk") .value(new AndroidSdkLabel(androidSdk))) - .attributeAspect("deps", JackAspect.class) - .attributeAspect("exports", JackAspect.class) - .attributeAspect("runtime_deps", JackAspect.class) + .attributeAspect("deps", this) + .attributeAspect("exports", this) + .attributeAspect("runtime_deps", this) .requiresConfigurationFragments(AndroidConfiguration.class) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java index c01fbda176..f89ac4bc69 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java @@ -20,10 +20,9 @@ import static com.google.devtools.build.lib.packages.BuildType.LABEL; import static com.google.devtools.build.lib.rules.objc.J2ObjcSource.SourceType; import com.google.common.collect.ImmutableList; -import com.google.devtools.build.lib.Constants; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredAspect; -import com.google.devtools.build.lib.analysis.ConfiguredNativeAspectFactory; +import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; @@ -32,6 +31,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.AspectDefinition; import com.google.devtools.build.lib.packages.AspectParameters; +import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.proto.ProtoCommon; @@ -55,12 +55,19 @@ import com.google.devtools.build.lib.vfs.PathFragment; * by this class and provided by proto_library will be exported all the way to objc_binary for ObjC * compilation and linking into the final application bundle. */ -public abstract class AbstractJ2ObjcProtoAspect implements ConfiguredNativeAspectFactory { - public static final String NAME = "J2ObjcProtoAspect"; +public abstract class AbstractJ2ObjcProtoAspect extends NativeAspectClass + implements ConfiguredAspectFactory { + private static final Iterable<Attribute> DEPENDENT_ATTRIBUTES = ImmutableList.of( new Attribute("$protobuf_lib", Mode.TARGET), new Attribute("deps", Mode.TARGET)); + protected final String toolsRepository; + + public AbstractJ2ObjcProtoAspect(String toolsRepository) { + this.toolsRepository = toolsRepository; + } + @Override public AspectDefinition getDefinition(AspectParameters aspectParameters) { AspectDefinition.Builder builder = new AspectDefinition.Builder("J2ObjcProtoAspect") @@ -70,14 +77,14 @@ public abstract class AbstractJ2ObjcProtoAspect implements ConfiguredNativeAspec J2ObjcConfiguration.class, ObjcConfiguration.class, ProtoConfiguration.class) - .attributeAspect("deps", getClass()) - .attributeAspect("exports", getClass()) - .attributeAspect("runtime_deps", getClass()) + .attributeAspect("deps", this) + .attributeAspect("exports", this) + .attributeAspect("runtime_deps", this) .add(attr("$protobuf_lib", LABEL) .value(Label.parseAbsoluteUnchecked("//third_party/java/j2objc:proto_runtime"))) .add(attr("$xcrunwrapper", LABEL).cfg(HOST).exec() .value(Label.parseAbsoluteUnchecked( - Constants.TOOLS_REPOSITORY + "//tools/objc:xcrunwrapper"))) + toolsRepository + "//tools/objc:xcrunwrapper"))) .add(attr(":xcode_config", LABEL) .allowedRuleClasses("xcode_config") .checkConstraints() @@ -97,7 +104,7 @@ public abstract class AbstractJ2ObjcProtoAspect implements ConfiguredNativeAspec ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) throws InterruptedException { if (!checkShouldCreateAspect(ruleContext)) { - return new ConfiguredAspect.Builder(NAME, ruleContext).build(); + return new ConfiguredAspect.Builder(getName(), ruleContext).build(); } ProtoSourcesProvider protoSourcesProvider = base.getProvider(ProtoSourcesProvider.class); @@ -154,7 +161,7 @@ public abstract class AbstractJ2ObjcProtoAspect implements ConfiguredNativeAspec NestedSet<Artifact> j2ObjcTransitiveClassMappingFiles = j2ObjcTransitiveClassMappingFiles( ruleContext, classMappingFiles); - return new ConfiguredAspect.Builder(NAME, ruleContext) + return new ConfiguredAspect.Builder(getName(), ruleContext) .addProvider( J2ObjcMappingFileProvider.class, new J2ObjcMappingFileProvider( diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcProtoAspect.java index 9f35a6a6e6..cf94435eac 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcProtoAspect.java @@ -19,7 +19,6 @@ import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; import com.google.common.collect.ImmutableMap; -import com.google.devtools.build.lib.Constants; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; @@ -38,6 +37,11 @@ import com.google.devtools.build.lib.vfs.PathFragment; * have not yet been released into open-source. */ public class BazelJ2ObjcProtoAspect extends AbstractJ2ObjcProtoAspect { + public static final String NAME = "BazelJ2ObjcProtoAspect"; + + public BazelJ2ObjcProtoAspect(String toolsRepository) { + super(toolsRepository); + } @Override protected AspectDefinition.Builder addAdditionalAttributes(AspectDefinition.Builder builder) { @@ -46,17 +50,17 @@ public class BazelJ2ObjcProtoAspect extends AbstractJ2ObjcProtoAspect { .cfg(HOST) .exec() .value(Label.parseAbsoluteUnchecked( - Constants.TOOLS_REPOSITORY + "//tools/objc:compile_protos"))) + toolsRepository + "//tools/objc:compile_protos"))) .add(attr("$protoc_support_darwin", LABEL) .cfg(HOST) .exec() .value(Label.parseAbsoluteUnchecked( - Constants.TOOLS_REPOSITORY + "//tools/objc:proto_support"))) + toolsRepository + "//tools/objc:proto_support"))) .add(attr("$j2objc_plugin", LABEL) .cfg(HOST) .exec() .value(Label.parseAbsoluteUnchecked( - Constants.TOOLS_REPOSITORY + "//third_party/java/j2objc:proto_plugin"))); + toolsRepository + "//third_party/java/j2objc:proto_plugin"))); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java index 3ff31cfe0e..b8b941a93a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java @@ -24,11 +24,10 @@ import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import com.google.devtools.build.lib.Constants; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ParameterFile; import com.google.devtools.build.lib.analysis.ConfiguredAspect; -import com.google.devtools.build.lib.analysis.ConfiguredNativeAspectFactory; +import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; @@ -42,6 +41,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.AspectDefinition; import com.google.devtools.build.lib.packages.AspectParameters; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; @@ -57,8 +57,15 @@ import java.util.List; /** * J2ObjC transpilation aspect for Java rules. */ -public class J2ObjcAspect implements ConfiguredNativeAspectFactory { +public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectFactory { public static final String NAME = "J2ObjcAspect"; + private final String toolsRepository; + private final BazelJ2ObjcProtoAspect bazelJ2ObjcProtoAspect; + + public J2ObjcAspect(String toolsRepository, BazelJ2ObjcProtoAspect bazelJ2ObjcProtoAspect) { + this.toolsRepository = toolsRepository; + this.bazelJ2ObjcProtoAspect = bazelJ2ObjcProtoAspect; + } private static final Iterable<Attribute> DEPENDENT_ATTRIBUTES = ImmutableList.of( new Attribute("$jre_emul_lib", Mode.TARGET), @@ -71,9 +78,9 @@ public class J2ObjcAspect implements ConfiguredNativeAspectFactory { */ protected AspectDefinition.Builder addAdditionalAttributes( AspectDefinition.Builder builder) { - return builder.attributeAspect("deps", J2ObjcAspect.class, BazelJ2ObjcProtoAspect.class) - .attributeAspect("exports", J2ObjcAspect.class, BazelJ2ObjcProtoAspect.class) - .attributeAspect("runtime_deps", J2ObjcAspect.class, BazelJ2ObjcProtoAspect.class); + return builder.attributeAspect("deps", this, bazelJ2ObjcProtoAspect) + .attributeAspect("exports", this, bazelJ2ObjcProtoAspect) + .attributeAspect("runtime_deps", this, bazelJ2ObjcProtoAspect); } @Override @@ -87,22 +94,22 @@ public class J2ObjcAspect implements ConfiguredNativeAspectFactory { ObjcConfiguration.class) .add(attr("$j2objc", LABEL).cfg(HOST).exec() .value(Label.parseAbsoluteUnchecked( - Constants.TOOLS_REPOSITORY + "//tools/j2objc:j2objc_deploy.jar"))) + toolsRepository + "//tools/j2objc:j2objc_deploy.jar"))) .add(attr("$j2objc_wrapper", LABEL) .allowedFileTypes(FileType.of(".py")) .cfg(HOST) .exec() .singleArtifact() .value(Label.parseAbsoluteUnchecked( - Constants.TOOLS_REPOSITORY + "//tools/j2objc:j2objc_wrapper"))) + toolsRepository + "//tools/j2objc:j2objc_wrapper"))) .add(attr("$jre_emul_jar", LABEL).cfg(HOST) .value(Label.parseAbsoluteUnchecked( - Constants.TOOLS_REPOSITORY + "//third_party/java/j2objc:jre_emul.jar"))) + toolsRepository + "//third_party/java/j2objc:jre_emul.jar"))) .add(attr("$jre_emul_lib", LABEL) .value(Label.parseAbsoluteUnchecked("//third_party/java/j2objc:jre_emul_lib"))) .add(attr("$xcrunwrapper", LABEL).cfg(HOST).exec() .value(Label.parseAbsoluteUnchecked( - Constants.TOOLS_REPOSITORY + "//tools/objc:xcrunwrapper"))) + toolsRepository + "//tools/objc:xcrunwrapper"))) .add(attr(":xcode_config", LABEL) .allowedRuleClasses("xcode_config") .checkConstraints() diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java index cf102da124..348ac6db5a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java @@ -17,26 +17,27 @@ package com.google.devtools.build.lib.rules.objc; import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; import com.google.devtools.build.lib.analysis.ConfiguredAspect; -import com.google.devtools.build.lib.analysis.ConfiguredNativeAspectFactory; +import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.PrerequisiteArtifacts; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.packages.AspectDefinition; import com.google.devtools.build.lib.packages.AspectParameters; +import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider; /** * Aspect that gathers the proto dependencies of the attached rule target, and propagates the proto * values of its dependencies through the ObjcProtoProvider. */ -public class ObjcProtoAspect implements ConfiguredNativeAspectFactory { +public class ObjcProtoAspect extends NativeAspectClass implements ConfiguredAspectFactory { public static final String NAME = "ObjcProtoAspect"; @Override public AspectDefinition getDefinition(AspectParameters aspectParameters) { return new AspectDefinition.Builder(NAME) - .attributeAspect("deps", ObjcProtoAspect.class) + .attributeAspect("deps", this) .requiresConfigurationFragments(ObjcConfiguration.class) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java index f37e5e2963..d201d880cd 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java @@ -99,7 +99,7 @@ public final class AspectFunction implements SkyFunction { if (skylarkImportLookupValue == null) { return null; } - + Object skylarkValue = skylarkImportLookupValue.getEnvironmentExtension() .get(skylarkValueName); if (!(skylarkValue instanceof SkylarkAspect)) { @@ -123,10 +123,9 @@ public final class AspectFunction implements SkyFunction { AspectKey key = (AspectKey) skyKey.argument(); ConfiguredAspectFactory aspectFactory; Aspect aspect; - if (key.getAspectClass() instanceof NativeAspectClass<?>) { - NativeAspectClass<?> nativeAspectClass = (NativeAspectClass<?>) key.getAspectClass(); - aspectFactory = - (ConfiguredAspectFactory) nativeAspectClass.newInstance(); + if (key.getAspectClass() instanceof NativeAspectClass) { + NativeAspectClass nativeAspectClass = (NativeAspectClass) key.getAspectClass(); + aspectFactory = (ConfiguredAspectFactory) nativeAspectClass; aspect = Aspect.forNative(nativeAspectClass, key.getParameters()); } else if (key.getAspectClass() instanceof SkylarkAspectClass) { SkylarkAspectClass skylarkAspectClass = (SkylarkAspectClass) key.getAspectClass(); |