aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
diff options
context:
space:
mode:
authorGravatar Damien Martin-Guillerez <dmarting@google.com>2016-01-22 11:03:23 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-01-22 15:56:17 +0000
commit4ecfe51f9de07d524f96cd5307663680ac5d344f (patch)
treec64f6e395b9cc9ba040538a763c7fa252b1e9c60 /src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
parentcc9e445cddf34c1ba1d8cef28aaf5600ba6177aa (diff)
Extract parsing of the WORKSPACE file in two parts
The WORKSPACE file AST is now parsed as a separate SkyFunction and this will be used to have multiple SkyValue for the same WORKSPACE file, splitting the execution of the AST after load statements to enable load statement of external dependencies in the WORKSPACE file. -- MOS_MIGRATED_REVID=112768897
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java63
1 files changed, 11 insertions, 52 deletions
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 65060a29e1..dc2b0c2979 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
@@ -16,16 +16,14 @@ package com.google.devtools.build.lib.skyframe;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.packages.Package.LegacyBuilder;
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.skyframe.PackageFunction.PackageFunctionException;
+import com.google.devtools.build.lib.syntax.BuildFileAST;
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;
import com.google.devtools.build.lib.vfs.RootedPath;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -33,8 +31,6 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
-import java.io.IOException;
-
/**
* A SkyFunction to parse WORKSPACE files.
*/
@@ -56,11 +52,11 @@ public class WorkspaceFileFunction implements SkyFunction {
@Override
public SkyValue compute(SkyKey skyKey, Environment env) throws WorkspaceFileFunctionException,
InterruptedException {
- final Environment skyEnvironment = env;
RootedPath workspaceRoot = (RootedPath) skyKey.argument();
- FileValue workspaceFileValue = (FileValue) env.getValue(FileValue.key(workspaceRoot));
- if (workspaceFileValue == null) {
+ WorkspaceASTValue workspaceASTValue =
+ (WorkspaceASTValue) env.getValue(new SkyKey(SkyFunctions.WORKSPACE_AST, workspaceRoot));
+ if (workspaceASTValue == null) {
return null;
}
@@ -78,60 +74,23 @@ public class WorkspaceFileFunction implements SkyFunction {
directories.getEmbeddedBinariesRoot(),
directories.getWorkspace());
try {
- PathFragment pathFragment = new PathFragment("/DEFAULT.WORKSPACE");
- if (!parse(
- ParserInputSource.create(ruleClassProvider.getDefaultWorkspaceFile(), pathFragment),
- repoWorkspace, parser, skyEnvironment)) {
- return null;
- }
- if (!workspaceFileValue.exists()) {
- return new PackageValue(builder.build());
- }
-
- if (!parse(
- ParserInputSource.create(repoWorkspace), repoWorkspace, parser, skyEnvironment)) {
+ BuildFileAST ast = workspaceASTValue.getAST();
+ PackageFunction.SkylarkImportResult importResult =
+ PackageFunction.fetchImportsFromBuildFile(
+ repoWorkspace, Label.EXTERNAL_PACKAGE_IDENTIFIER, ast, env, null);
+ if (importResult != null) {
+ parser.execute(ast, importResult.importMap);
+ } else {
return null;
}
} catch (PackageFunctionException e) {
throw new WorkspaceFileFunctionException(e, Transience.PERSISTENT);
- } catch (IOException e) {
- for (Event event : parser.getEvents()) {
- env.getListener().handle(event);
- }
- throw new WorkspaceFileFunctionException(e, Transience.TRANSIENT);
}
}
return new PackageValue(builder.build());
}
- private boolean loadSkylarkImports(Path repoWorkspace, WorkspaceFactory parser,
- Environment skyEnvironment) throws PackageFunctionException, InterruptedException {
- // Load skylark imports
- PackageFunction.SkylarkImportResult importResult;
- importResult = PackageFunction.fetchImportsFromBuildFile(repoWorkspace,
- Label.EXTERNAL_PACKAGE_IDENTIFIER,
- parser.getBuildFileAST(),
- skyEnvironment,
- null);
- if (importResult == null) {
- return false;
- }
- parser.setImportedExtensions(importResult.importMap);
- return true;
- }
-
- private boolean parse(ParserInputSource source, Path repoWorkspace, WorkspaceFactory parser,
- Environment skyEnvironment)
- throws PackageFunctionException, InterruptedException, IOException {
- parser.parseWorkspaceFile(source);
- if (!loadSkylarkImports(repoWorkspace, parser, skyEnvironment)) {
- return false;
- }
- parser.execute();
- return true;
- }
-
@Override
public String extractTag(SkyKey skyKey) {
return null;