aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java40
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java50
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java30
5 files changed, 84 insertions, 58 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
index 2b339046e0..fe44617e02 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
@@ -20,6 +20,9 @@ import com.google.devtools.build.lib.packages.CachingPackageLocator;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
import com.google.devtools.build.lib.syntax.BuildFileAST;
+import com.google.devtools.build.lib.syntax.Mutability;
+import com.google.devtools.build.lib.syntax.Runtime;
+import com.google.devtools.build.lib.syntax.ValidationEnvironment;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.vfs.RootedPath;
@@ -113,26 +116,33 @@ public class ASTFileLookupFunction implements SkyFunction {
if (lookupResult == null) {
return null;
}
-
- BuildFileAST ast = null;
if (!lookupResult.lookupSuccessful()) {
return ASTFileLookupValue.noFile();
- } else {
- Path path = lookupResult.rootedPath().asPath();
- // Skylark files end with bzl.
- boolean parseAsSkylark = astFilePathFragment.getPathString().endsWith(".bzl");
- try {
- ast = parseAsSkylark
- ? BuildFileAST.parseSkylarkFile(path, env.getListener(),
- packageManager, ruleClassProvider.getSkylarkValidationEnvironment().clone())
- : BuildFileAST.parseBuildFile(path, env.getListener(),
- packageManager, false);
- } catch (IOException e) {
+ }
+ BuildFileAST ast = null;
+ Path path = lookupResult.rootedPath().asPath();
+ // Skylark files end with bzl.
+ boolean parseAsSkylark = astFilePathFragment.getPathString().endsWith(".bzl");
+ try {
+ if (parseAsSkylark) {
+ try (Mutability mutability = Mutability.create("validate")) {
+ ast = BuildFileAST.parseSkylarkFile(path, env.getListener(),
+ packageManager, new ValidationEnvironment(
+ ruleClassProvider.createSkylarkRuleClassEnvironment(
+ mutability,
+ env.getListener(),
+ // the two below don't matter for extracting the ValidationEnvironment:
+ /*astFileContentHashCode=*/null,
+ /*importMap=*/null)
+ .setupDynamic(Runtime.PKG_NAME, Runtime.NONE)));
+ }
+ } else {
+ ast = BuildFileAST.parseBuildFile(path, env.getListener(), packageManager, false);
+ }
+ } catch (IOException e) {
throw new ASTLookupFunctionException(new ErrorReadingSkylarkExtensionException(
e.getMessage()), Transience.TRANSIENT);
- }
}
-
return ASTFileLookupValue.withFile(ast);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 9e3b8d516b..ac3a6e9cbc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -49,7 +49,6 @@ import com.google.devtools.build.lib.syntax.BuildFileAST;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.lib.syntax.ParserInputSource;
-import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
import com.google.devtools.build.lib.syntax.Statement;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.vfs.Path;
@@ -553,7 +552,8 @@ public class PackageFunction implements SkyFunction {
if (eventHandler.hasErrors()) {
importResult =
new SkylarkImportResult(
- ImmutableMap.<PathFragment, SkylarkEnvironment>of(), ImmutableList.<Label>of());
+ ImmutableMap.<PathFragment, com.google.devtools.build.lib.syntax.Environment>of(),
+ ImmutableList.<Label>of());
includeRepositoriesFetched = true;
} else {
importResult =
@@ -581,7 +581,7 @@ public class PackageFunction implements SkyFunction {
Environment env)
throws PackageFunctionException {
ImmutableMap<Location, PathFragment> imports = buildFileAST.getImports();
- Map<PathFragment, SkylarkEnvironment> importMap = new HashMap<>();
+ Map<PathFragment, com.google.devtools.build.lib.syntax.Environment> importMap = new HashMap<>();
ImmutableList.Builder<SkylarkFileDependency> fileDependencies = ImmutableList.builder();
try {
for (Map.Entry<Location, PathFragment> entry : imports.entrySet()) {
@@ -884,9 +884,11 @@ public class PackageFunction implements SkyFunction {
/** A simple value class to store the result of the Skylark imports.*/
private static final class SkylarkImportResult {
- private final Map<PathFragment, SkylarkEnvironment> importMap;
+ private final Map<PathFragment, com.google.devtools.build.lib.syntax.Environment> importMap;
private final ImmutableList<Label> fileDependencies;
- private SkylarkImportResult(Map<PathFragment, SkylarkEnvironment> importMap,
+ private SkylarkImportResult(
+ Map<PathFragment,
+ com.google.devtools.build.lib.syntax.Environment> importMap,
ImmutableList<Label> fileDependencies) {
this.importMap = importMap;
this.fileDependencies = fileDependencies;
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 0bd16ae90a..b3eb957019 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,7 +27,7 @@ import com.google.devtools.build.lib.skyframe.ASTFileLookupValue.ASTLookupInputE
import com.google.devtools.build.lib.syntax.BuildFileAST;
import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.lib.syntax.Label.SyntaxException;
-import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
+import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -76,7 +76,7 @@ public class SkylarkImportLookupFunction implements SkyFunction {
throw new SkylarkImportLookupFunctionException(SkylarkImportFailedException.noFile(file));
}
- Map<PathFragment, SkylarkEnvironment> importMap = new HashMap<>();
+ Map<PathFragment, com.google.devtools.build.lib.syntax.Environment> importMap = new HashMap<>();
ImmutableList.Builder<SkylarkFileDependency> fileDependencies = ImmutableList.builder();
BuildFileAST ast = astLookupValue.getAST();
// TODO(bazel-team): Refactor this code and PackageFunction to reduce code duplications.
@@ -114,10 +114,11 @@ public class SkylarkImportLookupFunction implements SkyFunction {
file));
}
- SkylarkEnvironment extensionEnv = createEnv(ast, file, importMap, env);
- // Skylark UserDefinedFunctions are sharing function definition Environments, so it's extremely
- // important not to modify them from this point. Ideally they should be only used to import
- // symbols and serve as global Environments of UserDefinedFunctions.
+ // Skylark UserDefinedFunction-s in that file will share this function definition Environment,
+ // which will be frozen by the time it is returned by createEnv.
+ com.google.devtools.build.lib.syntax.Environment extensionEnv =
+ createEnv(ast, file, importMap, env);
+
return new SkylarkImportLookupValue(
extensionEnv, new SkylarkFileDependency(label, fileDependencies.build()));
}
@@ -164,29 +165,34 @@ public class SkylarkImportLookupFunction implements SkyFunction {
}
/**
- * Creates the SkylarkEnvironment to be imported. After it's returned, the Environment
- * must not be modified.
+ * Creates the Environment to be imported.
+ * After it's returned, the Environment must not be modified.
*/
- private SkylarkEnvironment createEnv(BuildFileAST ast, PathFragment file,
- Map<PathFragment, SkylarkEnvironment> importMap, Environment env)
+ private com.google.devtools.build.lib.syntax.Environment createEnv(
+ BuildFileAST ast,
+ PathFragment file,
+ Map<PathFragment, com.google.devtools.build.lib.syntax.Environment> importMap,
+ Environment env)
throws InterruptedException, SkylarkImportLookupFunctionException {
StoredEventHandler eventHandler = new StoredEventHandler();
// TODO(bazel-team): this method overestimates the changes which can affect the
// Skylark RuleClass. For example changes to comments or unused functions can modify the hash.
// A more accurate - however much more complicated - way would be to calculate a hash based on
// the transitive closure of the accessible AST nodes.
- SkylarkEnvironment extensionEnv = ruleClassProvider
- .createSkylarkRuleClassEnvironment(eventHandler, ast.getContentHashCode());
- extensionEnv.update("native", packageFactory.getNativeModule());
- extensionEnv.setImportedExtensions(importMap);
- ast.exec(extensionEnv, eventHandler);
- SkylarkRuleClassFunctions.exportRuleFunctions(extensionEnv, file);
-
- Event.replayEventsOn(env.getListener(), eventHandler.getEvents());
- if (eventHandler.hasErrors()) {
- throw new SkylarkImportLookupFunctionException(SkylarkImportFailedException.errors(file));
- }
- return extensionEnv;
+ try (Mutability mutability = Mutability.create("importing %s", file)) {
+ com.google.devtools.build.lib.syntax.Environment extensionEnv =
+ ruleClassProvider.createSkylarkRuleClassEnvironment(
+ mutability, eventHandler, ast.getContentHashCode(), importMap)
+ .setupOverride("native", packageFactory.getNativeModule());
+ ast.exec(extensionEnv, eventHandler);
+ SkylarkRuleClassFunctions.exportRuleFunctions(extensionEnv, file);
+
+ Event.replayEventsOn(env.getListener(), eventHandler.getEvents());
+ if (eventHandler.hasErrors()) {
+ throw new SkylarkImportLookupFunctionException(SkylarkImportFailedException.errors(file));
+ }
+ return extensionEnv;
+ }
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java
index 020a426367..86db05497d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java
@@ -18,8 +18,8 @@ import com.google.common.base.Preconditions;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
import com.google.devtools.build.lib.skyframe.ASTFileLookupValue.ASTLookupInputException;
+import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.LoadStatement;
-import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
@@ -30,7 +30,7 @@ import com.google.devtools.build.skyframe.SkyValue;
*/
public class SkylarkImportLookupValue implements SkyValue {
- private final SkylarkEnvironment importedEnvironment;
+ private final Environment importedEnvironment;
/**
* The immediate Skylark file dependency descriptor class corresponding to this value.
* Using this reference it's possible to reach the transitive closure of Skylark files
@@ -39,15 +39,15 @@ public class SkylarkImportLookupValue implements SkyValue {
private final SkylarkFileDependency dependency;
public SkylarkImportLookupValue(
- SkylarkEnvironment importedEnvironment, SkylarkFileDependency dependency) {
+ Environment importedEnvironment, SkylarkFileDependency dependency) {
this.importedEnvironment = Preconditions.checkNotNull(importedEnvironment);
this.dependency = Preconditions.checkNotNull(dependency);
}
/**
- * Returns the imported SkylarkEnvironment.
+ * Returns the imported Environment.
*/
- public SkylarkEnvironment getImportedEnvironment() {
+ public Environment getImportedEnvironment() {
return importedEnvironment;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
index 30f0c6a027..ce45ca2155 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
@@ -20,6 +20,7 @@ import com.google.devtools.build.lib.packages.PackageFactory;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.WorkspaceFactory;
import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.syntax.ParserInputSource;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -62,18 +63,25 @@ public class WorkspaceFileFunction implements SkyFunction {
Path repoWorkspace = workspaceRoot.getRoot().getRelative(workspaceRoot.getRelativePath());
Builder builder = new Builder(repoWorkspace,
packageFactory.getRuleClassProvider().getRunfilesPrefix());
- WorkspaceFactory parser = new WorkspaceFactory(
- builder, packageFactory.getRuleClassProvider(), installDir.getPathString());
- parser.parse(ParserInputSource.create(
- ruleClassProvider.getDefaultWorkspaceFile(), new PathFragment("DEFAULT.WORKSPACE")));
- if (!workspaceFileValue.exists()) {
- return new PackageValue(builder.build());
- }
+ try (Mutability mutability = Mutability.create("workspace %s", repoWorkspace)) {
+ WorkspaceFactory parser =
+ new WorkspaceFactory(
+ builder,
+ packageFactory.getRuleClassProvider(),
+ mutability,
+ installDir.getPathString());
+ parser.parse(
+ ParserInputSource.create(
+ ruleClassProvider.getDefaultWorkspaceFile(), new PathFragment("DEFAULT.WORKSPACE")));
+ if (!workspaceFileValue.exists()) {
+ return new PackageValue(builder.build());
+ }
- try {
- parser.parse(ParserInputSource.create(repoWorkspace));
- } catch (IOException e) {
- throw new WorkspaceFileFunctionException(e, Transience.TRANSIENT);
+ try {
+ parser.parse(ParserInputSource.create(repoWorkspace));
+ } catch (IOException e) {
+ throw new WorkspaceFileFunctionException(e, Transience.TRANSIENT);
+ }
}
return new PackageValue(builder.build());