aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Luis Fernando Pino Duque <lpino@google.com>2016-04-26 16:22:38 +0000
committerGravatar Yun Peng <pcloudy@google.com>2016-04-27 11:47:20 +0000
commite82713de767ea4f002f49ba75427698989c47edd (patch)
tree96ce693a26e062bda56e79435a655441569773fc /src/main/java/com/google/devtools/build/lib
parent8b999982958d9b63321e6295f5a66d0d2ce7c925 (diff)
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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-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();