aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BuildView.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredNativeAspectFactory.java28
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java34
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Aspect.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Attribute.java38
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java44
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcProtoAspect.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java9
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();