Delete the interface NativeAspectFactory and make native aspects extend from NativeAspectClass.
This a large refactoring of the aspects, currently we have the following:
- AspectClasses: The interface AspectClass is a implemented by either
SkylarkAspectClass or NativeAspectClass<NativeAspectFactory>.
They are wrappers for the AspectFactories and they hold the information about
the Class<> of the factory.
- AspectFactories (FooAspect.java): Represented by the interfaces
ConfiguredAspectFactory and NativeAspectFactory, also by
the interface ConfiguredNativeAspectFactory which is the union of the two
aforementioned interfaces.
All aspects implement ConfiguredNativeAspectFactory except Skylark aspects
which implement only ConfiguredAspectFactory.
After this CL the distinction between NativeAspectFactories and NativeAspectClasses
dissappear, namely aspect that extends NativeAspectClass is considered native
and if it implements ConfiguredAspectFactory it is configured.
Therefore the interfaces NativeAspectFactory and ConfiguredNativeAspectFactory
both disappear.
With this refactoring the aspectFactoryMap in the ConfiguredRuleClassProvider
changes its type from (String -> Class<? extends NativeAspectClass>)
to (String -> NativeAspectClass) which means it is now able to have an instance
of the aspect instead of its Class only.
By doing this, it is now possible to pass parameters when creating an
aspect in the ConfiguredRuleClassProvider.
--
MOS_MIGRATED_REVID=120819647
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 1251fe1..c07d950 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 @@
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 @@
// 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 e315141..0000000
--- 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 e4a4a2c..bfc8b5b 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.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 @@
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 @@
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 @@
toolsRepository,
ImmutableMap.copyOf(ruleClassMap),
ImmutableMap.copyOf(ruleDefinitionMap),
- ImmutableMap.copyOf(aspectFactoryMap),
+ ImmutableMap.copyOf(nativeAspectClassMap),
defaultWorkspaceFilePrefix.toString(),
defaultWorkspaceFileSuffix.toString(),
ImmutableList.copyOf(buildInfoFactories),
@@ -344,7 +342,7 @@
/**
* 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 @@
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 @@
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 @@
}
@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 ef48488..cf66d51 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 @@
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 61d5224..3f7896b 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.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.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.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 @@
* 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 @@
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 @@
.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 @@
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 @@
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 @@
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 @@
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 4c71e4b..551a424 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 @@
* 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 @@
</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 fa83b28..39dfff6 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.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.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.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 @@
/**
* 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 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 @@
@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 cff38f9..dfd7e5c 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 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 be1bd0b..c9b8a3b 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.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 @@
* 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 aeac774..4b9f7fe 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.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 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 @@
// 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 @@
*/
SplitTransition<?> apply(Rule fromRule);
}
-
+
/**
* Implementation of {@link SplitTransitionProvider} that returns a single {@link SplitTransition}
* regardless of the originating rule.
@@ -827,32 +826,13 @@
}
/**
- * 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 @@
* 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 @@
}
/**
- * 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 febf653..905862a 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 @@
* <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();
+ return getClass().getSimpleName();
}
- public AspectDefinition getDefinition(AspectParameters aspectParameters) {
- return newInstance().getDefinition(aspectParameters);
- }
+ public abstract AspectDefinition getDefinition(AspectParameters aspectParameters);
- public T newInstance() {
- try {
- return nativeClass.newInstance();
- } catch (Exception e) {
- throw new IllegalStateException(e);
- }
- }
-
- @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);
- }
-
- /**
- * 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 7a3566a..f5cf092 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 @@
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 @@
/**
* 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 @@
* 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 6c295be..13686f8 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 @@
* 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 @@
.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 @@
.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 b0a3e0d..db87300 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 @@
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.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 @@
* <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 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 0cb5c90..b48e8b5 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 @@
* 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 @@
.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 09698cd..06698e1 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.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 @@
/**
* 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 @@
.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 cceff8a..7d15c27 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.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 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 @@
.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 c01fbda..f89ac4b 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.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.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 @@
* 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 @@
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 @@
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 @@
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 9f35a6a..cf94435 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.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 @@
* 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 @@
.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 3ff31cf..b8b941a 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.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.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 @@
/**
* 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 @@
*/
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 @@
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 cf102da..348ac6d 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 @@
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 f37e5e2..d201d88 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 @@
if (skylarkImportLookupValue == null) {
return null;
}
-
+
Object skylarkValue = skylarkImportLookupValue.getEnvironmentExtension()
.get(skylarkValueName);
if (!(skylarkValue instanceof SkylarkAspect)) {
@@ -123,10 +123,9 @@
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();