aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.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/skyframe/SkylarkImportLookupFunction.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/skyframe/SkylarkImportLookupFunction.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java45
1 files changed, 38 insertions, 7 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
index fb68cb2fe6..08c6cf5395 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
@@ -27,18 +27,21 @@ import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.events.Event;
+import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.StoredEventHandler;
import com.google.devtools.build.lib.packages.BuildFileNotFoundException;
import com.google.devtools.build.lib.packages.PackageFactory;
import com.google.devtools.build.lib.packages.RuleClassProvider;
-import com.google.devtools.build.lib.rules.SkylarkRuleClassFunctions;
+import com.google.devtools.build.lib.packages.SkylarkExportable;
import com.google.devtools.build.lib.skyframe.SkylarkImportLookupValue.SkylarkImportLookupKey;
+import com.google.devtools.build.lib.syntax.AssignmentStatement;
import com.google.devtools.build.lib.syntax.BuildFileAST;
import com.google.devtools.build.lib.syntax.Environment.Extension;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.LoadStatement;
import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.syntax.SkylarkImport;
+import com.google.devtools.build.lib.syntax.Statement;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.SkyFunction;
@@ -367,12 +370,7 @@ public class SkylarkImportLookupFunction implements SkyFunction {
.createSkylarkRuleClassEnvironment(
extensionLabel, mutability, eventHandler, ast.getContentHashCode(), importMap)
.setupOverride("native", packageFactory.getNativeModule(inWorkspace));
- ast.exec(extensionEnv, eventHandler);
- try {
- SkylarkRuleClassFunctions.exportRuleFunctionsAndAspects(extensionEnv, extensionLabel);
- } catch (EvalException e) {
- eventHandler.handle(Event.error(e.getLocation(), e.getMessage()));
- }
+ execAndExport(ast, extensionLabel, eventHandler, extensionEnv);
Event.replayEventsOn(env.getListener(), eventHandler.getEvents());
if (eventHandler.hasErrors()) {
@@ -382,6 +380,39 @@ public class SkylarkImportLookupFunction implements SkyFunction {
}
}
+ public static void execAndExport(BuildFileAST ast, Label extensionLabel,
+ EventHandler eventHandler,
+ com.google.devtools.build.lib.syntax.Environment extensionEnv) throws InterruptedException {
+ ImmutableList<Statement> statements = ast.getStatements();
+ for (Statement statement : statements) {
+ ast.execTopLevelStatement(statement, extensionEnv, eventHandler);
+ possiblyExport(statement, extensionLabel, eventHandler, extensionEnv);
+ }
+ }
+
+ private static void possiblyExport(Statement statement, Label extensionLabel,
+ EventHandler eventHandler,
+ com.google.devtools.build.lib.syntax.Environment extensionEnv) {
+ if (!(statement instanceof AssignmentStatement)) {
+ return;
+ }
+ AssignmentStatement assignmentStatement = (AssignmentStatement) statement;
+ ImmutableSet<String> boundNames = assignmentStatement.getLValue().boundNames();
+ for (String name : boundNames) {
+ Object lookup = extensionEnv.lookup(name);
+ if (lookup instanceof SkylarkExportable) {
+ try {
+ SkylarkExportable exportable = (SkylarkExportable) lookup;
+ if (!exportable.isExported()) {
+ exportable.export(extensionLabel, name);
+ }
+ } catch (EvalException e) {
+ eventHandler.handle(Event.error(e.getLocation(), e.getMessage()));
+ }
+ }
+ }
+ }
+
@Override
public String extractTag(SkyKey skyKey) {
return null;