Provide Skylark imports, even if the package has some errors.
Since we evaluate the BUILD file despite errors (e.g. parse errors), we
should provide the .bzl dependencies to the BUILD file.
This change removes some confusing/irrelevant error messages.
--
PiperOrigin-RevId: 143696291
MOS_MIGRATED_REVID=143696291
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 4573a51..4514c8f 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
@@ -581,32 +581,6 @@
return buildFileValue;
}
- @Nullable
- private SkylarkImportResult discoverSkylarkImports(
- Path buildFilePath,
- PackageIdentifier packageId,
- AstAfterPreprocessing astAfterPreprocessing,
- Environment env)
- throws PackageFunctionException, InterruptedException {
- SkylarkImportResult importResult;
- if (astAfterPreprocessing.containsAstParsingErrors) {
- importResult =
- new SkylarkImportResult(
- ImmutableMap.<String, Extension>of(),
- ImmutableList.<Label>of());
- } else {
- importResult =
- fetchImportsFromBuildFile(
- buildFilePath,
- packageId,
- astAfterPreprocessing.ast,
- env,
- skylarkImportLookupFunctionForInlining);
- }
-
- return importResult;
- }
-
/**
* Fetch the skylark loads for this BUILD file. If any of them haven't been computed yet,
* returns null.
@@ -1210,11 +1184,13 @@
Set<SkyKey> globDepsRequestedDuringPreprocessing = astCacheEntry.globDepKeys;
SkylarkImportResult importResult;
try {
- importResult = discoverSkylarkImports(
- buildFilePath,
- packageId,
- astAfterPreprocessing,
- env);
+ importResult =
+ fetchImportsFromBuildFile(
+ buildFilePath,
+ packageId,
+ astAfterPreprocessing.ast,
+ env,
+ skylarkImportLookupFunctionForInlining);
} catch (PackageFunctionException | InterruptedException e) {
astCache.invalidate(packageId);
throw e;
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
index 9ebc6d5..e32fe2e 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
@@ -1209,6 +1209,26 @@
+ "(did you mean 'myvariable'?)");
}
+ @Test
+ public void testLoadSucceedsDespiteSyntaxError() throws Exception {
+ reporter.removeHandler(failFastHandler);
+ scratch.file(
+ "test/skylark/macro.bzl",
+ "x = 5");
+
+ scratch.file("test/skylark/BUILD",
+ "load('//test/skylark:macro.bzl', 'x')",
+ "if 0: pass", // syntax error
+ "print(1 / (5 - x)"); // division by 0
+
+ // Make sure that evaluation continues and load() succeeds, despite a syntax
+ // error in the file.
+ // We can get the division by 0 only if x was correctly loaded.
+ getConfiguredTarget("//test/skylark:a");
+ assertContainsEvent("syntax error at 'if'");
+ assertContainsEvent("integer division by zero");
+ }
+
/**
* Skylark integration test that forces inlining.
*/