aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2017-03-01 17:45:12 +0000
committerGravatar Yue Gan <yueg@google.com>2017-03-02 13:31:45 +0000
commit950310ff911da6c26339f4dc0b124487adc0cdbb (patch)
treef8cd128c2506b79ee39021db80cca2d838ad1919 /src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
parent30490512eb0e48a3774cc4e4ef78680e77dd4e47 (diff)
*** Reason for rollback *** Roll-forward of commit 01120026dc313ee7ad9ea95069a29252eb19173b with fix. *** Original change description *** Automated [] rollback of commit 01120026dc313ee7ad9ea95069a29252eb19173b. -- PiperOrigin-RevId: 148897534 MOS_MIGRATED_REVID=148897534
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java78
1 files changed, 27 insertions, 51 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
index b28b08e07c..4b8c90da63 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
@@ -19,7 +19,6 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.Attribute.AllowedValueSet;
import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
@@ -274,6 +273,18 @@ public final class SkylarkAttr {
"cfg must be either 'data', 'host', or 'target'.");
}
}
+
+ if (containsNonNoneKey(arguments, ASPECTS_ARG)) {
+ Object obj = arguments.get(ASPECTS_ARG);
+ SkylarkType.checkType(obj, SkylarkList.class, ASPECTS_ARG);
+
+ List<SkylarkAspect> aspects =
+ ((SkylarkList<?>) obj).getContents(SkylarkAspect.class, "aspects");
+ for (SkylarkAspect aspect : aspects) {
+ builder.aspect(aspect, ast.getLocation());
+ }
+ }
+
return builder;
}
@@ -630,12 +641,13 @@ public final class SkylarkAttr {
SINGLE_FILE_ARG,
singleFile,
CONFIGURATION_ARG,
- cfg),
+ cfg,
+ ASPECTS_ARG,
+ aspects
+ ),
ast,
env);
- ImmutableList<SkylarkAspect> skylarkAspects =
- ImmutableList.copyOf(aspects.getContents(SkylarkAspect.class, "aspects"));
- return new Descriptor(attribute, skylarkAspects);
+ return new Descriptor(attribute);
} catch (EvalException e) {
throw new EvalException(ast.getLocation(), e.getMessage(), e);
}
@@ -908,13 +920,14 @@ public final class SkylarkAttr {
ALLOW_EMPTY_ARG,
allowEmpty,
CONFIGURATION_ARG,
- cfg);
+ cfg,
+ ASPECTS_ARG,
+ aspects
+ );
try {
Attribute.Builder<?> attribute =
createAttribute(BuildType.LABEL_LIST, kwargs, ast, env);
- ImmutableList<SkylarkAspect> skylarkAspects =
- ImmutableList.copyOf(aspects.getContents(SkylarkAspect.class, "aspects"));
- return new Descriptor(attribute, skylarkAspects);
+ return new Descriptor(attribute);
} catch (EvalException e) {
throw new EvalException(ast.getLocation(), e.getMessage(), e);
}
@@ -1060,13 +1073,13 @@ public final class SkylarkAttr {
ALLOW_EMPTY_ARG,
allowEmpty,
CONFIGURATION_ARG,
- cfg);
+ cfg,
+ ASPECTS_ARG,
+ aspects);
try {
Attribute.Builder<?> attribute =
createAttribute(BuildType.LABEL_KEYED_STRING_DICT, kwargs, ast, env);
- ImmutableList<SkylarkAspect> skylarkAspects =
- ImmutableList.copyOf(aspects.getContents(SkylarkAspect.class, "aspects"));
- return new Descriptor(attribute, skylarkAspects);
+ return new Descriptor(attribute);
} catch (EvalException e) {
throw new EvalException(ast.getLocation(), e.getMessage(), e);
}
@@ -1425,33 +1438,17 @@ public final class SkylarkAttr {
)
public static final class Descriptor {
private final Attribute.Builder<?> attributeBuilder;
- private final ImmutableList<SkylarkAspect> aspects;
/**
* This lock guards {@code attributeBuilder} field.
*
* {@link Attribute.Builder} class is not thread-safe for concurrent modification.
- * This class, together with its enclosing {@link SkylarkAttr} class, do not let
- * anyone else access the {@code attributeBuilder}, however {@link #exportAspects(Location)}
- * method actually modifies the {@code attributeBuilder}. Therefore all read- and write-accesses
- * to {@code attributeBuilder} are protected with this lock.
- *
- * For example, {@link #hasDefault()} method only reads from {@link #attributeBuilder},
- * but we have no guarantee that it is safe to do so concurrently with adding aspects
- * in {@link #exportAspects(Location)}.
*/
private final Object lock = new Object();
- boolean exported;
-
- private Descriptor(Attribute.Builder<?> attributeBuilder) {
- this(attributeBuilder, ImmutableList.<SkylarkAspect>of());
- }
private Descriptor(
- Attribute.Builder<?> attributeBuilder, ImmutableList<SkylarkAspect> aspects) {
+ Attribute.Builder<?> attributeBuilder) {
this.attributeBuilder = attributeBuilder;
- this.aspects = aspects;
- exported = false;
}
public boolean hasDefault() {
@@ -1471,27 +1468,6 @@ public final class SkylarkAttr {
return attributeBuilder.build(name);
}
}
-
- public ImmutableList<SkylarkAspect> getAspects() {
- return aspects;
- }
-
- public void exportAspects(Location definitionLocation) throws EvalException {
- synchronized (lock) {
- if (exported) {
- // Only export an attribute definiton once.
- return;
- }
- for (SkylarkAspect skylarkAspect : getAspects()) {
- if (!skylarkAspect.isExported()) {
- throw new EvalException(definitionLocation,
- "All aspects applied to rule dependencies must be top-level values");
- }
- attributeBuilder.aspect(skylarkAspect, definitionLocation);
- }
- exported = true;
- }
- }
}
static {