diff options
author | Damien Martin-Guillerez <dmarting@google.com> | 2016-01-22 11:03:23 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2016-01-22 15:56:17 +0000 |
commit | 4ecfe51f9de07d524f96cd5307663680ac5d344f (patch) | |
tree | c64f6e395b9cc9ba040538a763c7fa252b1e9c60 /src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java | |
parent | cc9e445cddf34c1ba1d8cef28aaf5600ba6177aa (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.java | 63 |
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; |