bazel: rename imports of lib.syntax to java.starlark.net
This change was produced mechanically by running the
script added in CL 322652849.
PiperOrigin-RevId: 331611185
diff --git a/src/test/java/com/google/devtools/build/docgen/BUILD b/src/test/java/com/google/devtools/build/docgen/BUILD
index 7396bfc..3c6add9 100644
--- a/src/test/java/com/google/devtools/build/docgen/BUILD
+++ b/src/test/java/com/google/devtools/build/docgen/BUILD
@@ -49,8 +49,9 @@
],
deps = [
"//src/main/java/com/google/devtools/build/docgen:docgen_javalib",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/net/starlark/java/annot",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/starlark/util",
"//src/test/java/com/google/devtools/build/lib/syntax/util",
"//third_party:guava",
@@ -72,13 +73,14 @@
deps = [
":testutil",
"//src/main/java/com/google/devtools/build/docgen:docgen_javalib",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/packages",
"//src/main/java/com/google/devtools/build/lib/rules/cpp",
"//src/main/java/com/google/devtools/build/lib/util:classpath",
"//src/main/java/net/starlark/java/annot",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/starlark/util",
"//src/test/java/com/google/devtools/build/lib/syntax/util",
"//src/test/java/com/google/devtools/build/lib/testutil",
diff --git a/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationFailuresTest.java b/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationFailuresTest.java
index d7932f6..4a6ac0a 100644
--- a/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationFailuresTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationFailuresTest.java
@@ -17,9 +17,9 @@
import static org.junit.Assert.assertThrows;
import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
import net.starlark.java.annot.StarlarkBuiltin;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java b/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java
index f50eae4..3bc3c3c 100644
--- a/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java
@@ -24,11 +24,6 @@
import com.google.devtools.build.lib.analysis.starlark.StarlarkModules;
import com.google.devtools.build.lib.analysis.starlark.StarlarkRuleContext;
import com.google.devtools.build.lib.collect.nestedset.Depset;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-import com.google.devtools.build.lib.syntax.Tuple;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -41,6 +36,11 @@
import net.starlark.java.annot.StarlarkConstructor;
import net.starlark.java.annot.StarlarkGlobalLibrary;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Tuple;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index 97538f6..5d25f45 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -97,8 +97,8 @@
":AllTests",
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/cmdline:LabelValidator",
- "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+ "//src/main/java/net/starlark/java/eval",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
"//src/test/java/com/google/devtools/build/lib/testutil:TestUtils",
@@ -171,10 +171,10 @@
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization:constants",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
- "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
"//src/main/java/com/google/devtools/build/lib/util",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+ "//src/main/java/net/starlark/java/eval",
"//src/test/java/com/google/devtools/build/lib/syntax/util",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
@@ -232,7 +232,7 @@
"//src/main/java/com/google/devtools/build/lib/events",
"//src/main/java/com/google/devtools/build/lib/graph",
"//src/main/java/com/google/devtools/build/lib/packages",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/events:testutil",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//src/test/java/com/google/devtools/build/lib/vfs/util",
@@ -275,7 +275,6 @@
"//src/main/java/com/google/devtools/build/lib/skyframe:target_pattern_phase_value",
"//src/main/java/com/google/devtools/build/lib/skyframe:transitive_target_key",
"//src/main/java/com/google/devtools/build/lib/skyframe:transitive_target_value",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/util",
"//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
"//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
@@ -288,6 +287,7 @@
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/com/google/devtools/common/options",
"//src/main/java/com/google/devtools/common/options:invocation_policy",
+ "//src/main/java/net/starlark/java/syntax",
"//src/main/protobuf:failure_details_java_proto",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/analysis/util:test-build-options",
@@ -411,7 +411,6 @@
"//src/main/java/com/google/devtools/build/lib/sandbox",
"//src/main/java/com/google/devtools/build/lib/skyframe:loading_phase_started_event",
"//src/main/java/com/google/devtools/build/lib/skyframe:package_progress_receiver",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/unix",
"//src/main/java/com/google/devtools/build/lib/util",
"//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
@@ -426,6 +425,7 @@
"//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
"//src/main/java/com/google/devtools/common/options",
"//src/main/java/com/google/devtools/common/options:invocation_policy",
+ "//src/main/java/net/starlark/java/syntax",
"//src/main/protobuf:command_line_java_proto",
"//src/main/protobuf:failure_details_java_proto",
"//src/main/protobuf:invocation_policy_java_proto",
@@ -513,7 +513,6 @@
test_class = "com.google.devtools.build.lib.AllTests",
deps = [
":AllTests",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:file_metadata",
"//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
@@ -534,6 +533,8 @@
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/skyframe:testutil",
"//third_party:auto_value",
diff --git a/src/test/java/com/google/devtools/build/lib/actions/BUILD b/src/test/java/com/google/devtools/build/lib/actions/BUILD
index 88b89d8..0c7deb6 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/actions/BUILD
@@ -50,7 +50,6 @@
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils:depsutils",
- "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
"//src/main/java/com/google/devtools/build/lib/util",
"//src/main/java/com/google/devtools/build/lib/util:filetype",
"//src/main/java/com/google/devtools/build/lib/util:string",
@@ -59,6 +58,7 @@
"//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/eval",
"//src/main/protobuf:action_cache_java_proto",
"//src/test/java/com/google/devtools/build/lib/actions/util",
"//src/test/java/com/google/devtools/build/lib/events:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
index 9a32d38..d962300 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
@@ -30,7 +30,6 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.util.Fingerprint;
import com.google.devtools.build.lib.util.LazyString;
@@ -39,6 +38,7 @@
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
+import net.starlark.java.eval.EvalException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java b/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
index bd566ad..7d24bb8 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
@@ -76,7 +76,6 @@
import com.google.devtools.build.lib.skyframe.ActionTemplateExpansionValue.ActionTemplateExpansionKey;
import com.google.devtools.build.lib.skyframe.TreeArtifactValue;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationConstant;
-import com.google.devtools.build.lib.syntax.Location;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.util.Fingerprint;
import com.google.devtools.build.lib.util.ResourceUsage;
@@ -114,6 +113,7 @@
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
/** A bunch of utilities that are useful for tests concerning actions, artifacts, etc. */
public final class ActionsTestUtil {
diff --git a/src/test/java/com/google/devtools/build/lib/actions/util/BUILD b/src/test/java/com/google/devtools/build/lib/actions/util/BUILD
index f888b58..ddf19c5 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/actions/util/BUILD
@@ -35,7 +35,6 @@
"//src/main/java/com/google/devtools/build/lib/skyframe:tree_artifact_value",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:serialization-constant",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/util",
"//src/main/java/com/google/devtools/build/lib/util:crash_failure_details",
"//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
@@ -48,6 +47,7 @@
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/syntax",
"//src/main/protobuf:action_cache_java_proto",
"//third_party:guava",
"//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
index 095935c..a97272c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
@@ -34,7 +34,6 @@
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.rules.java.JavaInfo;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
import com.google.devtools.build.lib.testutil.Suite;
import com.google.devtools.build.lib.testutil.TestConstants.InternalTestExecutionMode;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
@@ -48,6 +47,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
index 416141c..2c33266 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
@@ -34,9 +34,9 @@
import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy;
import com.google.devtools.build.lib.packages.NativeAspectClass;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
import com.google.devtools.build.lib.util.FileTypeSet;
import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/BUILD
index 3489510..0517a88 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BUILD
@@ -36,7 +36,6 @@
],
),
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
@@ -149,6 +148,8 @@
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/com/google/devtools/common/options",
"//src/main/java/net/starlark/java/annot",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/main/protobuf:extra_actions_base_java_proto",
"//src/test/java/com/google/devtools/build/lib/actions/util",
"//src/test/java/com/google/devtools/build/lib/analysis/testing",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
index 01788db..d59e41b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
@@ -39,13 +39,13 @@
import com.google.devtools.build.lib.packages.StructImpl;
import com.google.devtools.build.lib.packages.util.BazelMockAndroidSupport;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Starlark;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Starlark;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationStarlarkTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationStarlarkTest.java
index da1939f..0388980 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationStarlarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationStarlarkTest.java
@@ -22,7 +22,7 @@
import com.google.devtools.build.lib.packages.Provider;
import com.google.devtools.build.lib.packages.StarlarkProvider;
import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.syntax.Dict;
+import net.starlark.java.eval.Dict;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD
index 84e1d13..83220dd 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD
@@ -29,8 +29,8 @@
"//src/main/java/com/google/devtools/build/lib/analysis/platform:utils",
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/remote/options",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/exec/util",
"//third_party:guava",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfoTest.java b/src/test/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfoTest.java
index a3d3509..4f5de13 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfoTest.java
@@ -20,7 +20,7 @@
import com.google.common.testing.EqualsTester;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/starlark/ArgsParamFileTest.java b/src/test/java/com/google/devtools/build/lib/analysis/starlark/ArgsParamFileTest.java
index 6aa8688..8074f98 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/starlark/ArgsParamFileTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/starlark/ArgsParamFileTest.java
@@ -23,15 +23,15 @@
import com.google.devtools.build.lib.actions.ParamFileInfo;
import com.google.devtools.build.lib.actions.ParameterFile;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
import com.google.devtools.build.lib.util.ShellEscaper;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkThread;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/starlark/FlagPerLineTest.java b/src/test/java/com/google/devtools/build/lib/analysis/starlark/FlagPerLineTest.java
index 8f6742c..6c73e19 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/starlark/FlagPerLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/starlark/FlagPerLineTest.java
@@ -21,13 +21,13 @@
import com.google.common.io.CharStreams;
import com.google.devtools.build.lib.actions.ParameterFile;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkThread;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLineTest.java b/src/test/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLineTest.java
index 93b1557..a307d86 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLineTest.java
@@ -33,14 +33,14 @@
import com.google.devtools.build.lib.actions.HasDigest;
import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
import com.google.devtools.build.lib.analysis.starlark.StarlarkCustomCommandLine.VectorArg;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.Tuple;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.util.Fingerprint;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.io.IOException;
import java.util.Collection;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.Tuple;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/test/TrimTestConfigurationTest.java b/src/test/java/com/google/devtools/build/lib/analysis/test/TrimTestConfigurationTest.java
index b79f4ce..f0d281b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/test/TrimTestConfigurationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/test/TrimTestConfigurationTest.java
@@ -45,13 +45,13 @@
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.skyframe.SkyKey;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/testing/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/testing/BUILD
index 556cdff..c2018de 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/testing/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/testing/BUILD
@@ -28,7 +28,7 @@
"//src/main/java/com/google/devtools/build/lib/analysis/platform",
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/cmdline:cmdline-primitives",
- "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+ "//src/main/java/net/starlark/java/eval",
"//third_party:guava",
"//third_party:truth",
],
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/testing/ToolchainInfoSubject.java b/src/test/java/com/google/devtools/build/lib/analysis/testing/ToolchainInfoSubject.java
index d7ee1e8..8258fd9 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/testing/ToolchainInfoSubject.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/testing/ToolchainInfoSubject.java
@@ -18,7 +18,7 @@
import com.google.common.truth.FailureMetadata;
import com.google.common.truth.Subject;
import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
/** A Truth {@link Subject} for {@link ToolchainInfo}. */
public class ToolchainInfoSubject extends Subject {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
index 61acc6f..fb9f0a9 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
@@ -49,7 +49,6 @@
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.events.ExtendedEventHandler;
import com.google.devtools.build.lib.shell.Command;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.util.CrashFailureDetails;
import com.google.devtools.build.lib.util.Fingerprint;
@@ -68,6 +67,7 @@
import java.util.Set;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
/**
* Utilities for analysis phase tests.
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
index dc8f9df..39bc267 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
@@ -36,7 +36,6 @@
"//src/main/java/com/google/devtools/build/lib:build-request-options",
"//src/main/java/com/google/devtools/build/lib:keep-going-option",
"//src/main/java/com/google/devtools/build/lib:loading-phase-threads-option",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
"//src/main/java/com/google/devtools/build/lib/actions:artifact_owner",
@@ -121,6 +120,8 @@
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/actions/util",
"//src/test/java/com/google/devtools/build/lib/packages:testutil",
"//src/test/java/com/google/devtools/build/lib/skyframe:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
index b6c1809..59bc10e 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
@@ -89,7 +89,6 @@
import com.google.devtools.build.lib.skyframe.ToolchainContextKey;
import com.google.devtools.build.lib.skyframe.ToolchainException;
import com.google.devtools.build.lib.skyframe.UnloadedToolchainContext;
-import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.util.OrderedSetMultimap;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.ValueOrException;
@@ -103,6 +102,7 @@
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
/**
* A util class that contains all the helper stuff previously in BuildView that only exists to give
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index ec66bc3..41e6074 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -152,7 +152,6 @@
import com.google.devtools.build.lib.skyframe.SkyFunctions;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
import com.google.devtools.build.lib.skyframe.TargetPatternPhaseValue;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.BlazeTestUtils;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.testutil.SkyframeExecutorTestHelper;
@@ -190,6 +189,7 @@
import java.util.UUID;
import java.util.function.Predicate;
import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
/**
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD
index 6f17138..87a03e9 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD
@@ -18,7 +18,7 @@
deps = [
"//src/main/java/com/google/devtools/build/lib/bazel/debug:workspace-rule-event",
"//src/main/java/com/google/devtools/build/lib/bazel/debug:workspace_log_java_proto",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+ "//src/main/java/net/starlark/java/syntax",
"//third_party:guava",
"//third_party:junit4",
"//third_party:truth",
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEventTest.java b/src/test/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEventTest.java
index bce7f9c..1f8e753 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEventTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEventTest.java
@@ -18,11 +18,11 @@
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.bazel.debug.proto.WorkspaceLogProtos;
-import com.google.devtools.build.lib.syntax.Location;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import net.starlark.java.syntax.Location;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
index 3160d54..f004b46 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
@@ -18,7 +18,6 @@
srcs = glob(["*.java"]),
deps = [
"//src/main/java/com/google/devtools/build/lib:runtime",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
"//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
"//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
@@ -39,6 +38,8 @@
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//third_party:guava",
@@ -79,12 +80,12 @@
"//src/main/java/com/google/devtools/build/lib/skyframe:sky_functions",
"//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
"//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository",
- "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//third_party:guava",
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java
index d044d76..c5b9b38 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java
@@ -41,18 +41,6 @@
import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor;
import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor.ExecutionResult;
import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -66,6 +54,18 @@
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.Location;
+import net.starlark.java.syntax.ParserInput;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
index 1d90761..6b105f6 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
@@ -18,11 +18,11 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.testing.EqualsTester;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.TestUtils;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.regex.Pattern;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java b/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java
index 735cd0e..d2fd290 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java
@@ -21,14 +21,14 @@
import com.google.devtools.build.lib.collect.nestedset.Depset.ElementType;
import com.google.devtools.build.lib.packages.StarlarkLibrary;
import com.google.devtools.build.lib.packages.StructProvider;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkIterable;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-import com.google.devtools.build.lib.syntax.Tuple;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkIterable;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Tuple;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/events/BUILD b/src/test/java/com/google/devtools/build/lib/events/BUILD
index 42539b3..21b39c3 100644
--- a/src/test/java/com/google/devtools/build/lib/events/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/events/BUILD
@@ -17,9 +17,9 @@
srcs = glob(["*.java"]),
deps = [
"//src/main/java/com/google/devtools/build/lib/events",
- "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/util/io",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
"//third_party:guava",
@@ -46,8 +46,8 @@
srcs = glob(["util/*.java"]) + ["EventTestTemplate.java"],
deps = [
"//src/main/java/com/google/devtools/build/lib/events",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/util/io:out-err",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
"//third_party:guava",
"//third_party:junit4",
diff --git a/src/test/java/com/google/devtools/build/lib/events/EventTest.java b/src/test/java/com/google/devtools/build/lib/events/EventTest.java
index 4bf68b3..4da3d9c 100644
--- a/src/test/java/com/google/devtools/build/lib/events/EventTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/EventTest.java
@@ -21,13 +21,13 @@
import com.google.common.collect.ImmutableList;
import com.google.common.testing.EqualsTester;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkThread.PrintHandler;
-import com.google.devtools.build.lib.syntax.SyntaxError;
import com.google.devtools.build.lib.testutil.TestFileOutErr;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkThread.PrintHandler;
+import net.starlark.java.syntax.Location;
+import net.starlark.java.syntax.SyntaxError;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/events/EventTestTemplate.java b/src/test/java/com/google/devtools/build/lib/events/EventTestTemplate.java
index 3aeac4d..9624398 100644
--- a/src/test/java/com/google/devtools/build/lib/events/EventTestTemplate.java
+++ b/src/test/java/com/google/devtools/build/lib/events/EventTestTemplate.java
@@ -13,7 +13,7 @@
// limitations under the License.
package com.google.devtools.build.lib.events;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
import org.junit.Before;
// Without 'public', tests fail in the guts of junit reflection.
diff --git a/src/test/java/com/google/devtools/build/lib/exec/util/BUILD b/src/test/java/com/google/devtools/build/lib/exec/util/BUILD
index a23b3b8..ccbbcc5 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/exec/util/BUILD
@@ -43,10 +43,10 @@
"//src/main/java/com/google/devtools/build/lib/exec:spawn_strategy_registry",
"//src/main/java/com/google/devtools/build/lib/exec:spawn_strategy_resolver",
"//src/main/java/com/google/devtools/build/lib/exec:symlink_tree_strategy",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
"//third_party:guava",
"//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/exec/util/FakeOwner.java b/src/test/java/com/google/devtools/build/lib/exec/util/FakeOwner.java
index 31b036a..bee5b03 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/util/FakeOwner.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/util/FakeOwner.java
@@ -34,8 +34,8 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.syntax.Location;
import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
/** Fake implementation of {@link ActionExecutionMetadata} for testing. */
public class FakeOwner implements ActionExecutionMetadata {
diff --git a/src/test/java/com/google/devtools/build/lib/graph/DigraphTest.java b/src/test/java/com/google/devtools/build/lib/graph/DigraphTest.java
index 5acb64d..057983c 100644
--- a/src/test/java/com/google/devtools/build/lib/graph/DigraphTest.java
+++ b/src/test/java/com/google/devtools/build/lib/graph/DigraphTest.java
@@ -26,10 +26,10 @@
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleVisibility;
import com.google.devtools.build.lib.packages.Target;
-import com.google.devtools.build.lib.syntax.Location;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
+import net.starlark.java.syntax.Location;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/AttributeValueSourceTest.java b/src/test/java/com/google/devtools/build/lib/packages/AttributeValueSourceTest.java
index b5ab6e2..731691e 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/AttributeValueSourceTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/AttributeValueSourceTest.java
@@ -20,7 +20,7 @@
import com.google.devtools.build.lib.packages.Attribute.ComputedDefault;
import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BUILD b/src/test/java/com/google/devtools/build/lib/packages/BUILD
index ae38003..7392c35 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/packages/BUILD
@@ -20,10 +20,11 @@
name = "PackageTestsUtil",
srcs = ["WorkspaceFactoryTestHelper.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/events",
"//src/main/java/com/google/devtools/build/lib/packages",
"//src/main/java/com/google/devtools/build/lib/vfs",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//third_party:guava",
"//third_party:junit4",
@@ -49,7 +50,6 @@
deps = [
":PackageTestsUtil",
":testutil",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
"//src/main/java/com/google/devtools/build/lib/analysis:config/build_options",
@@ -75,6 +75,8 @@
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/net/starlark/java/annot",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/events:testutil",
"//src/test/java/com/google/devtools/build/lib/testutil",
@@ -120,7 +122,6 @@
deps = [
"//src/main/java/com/google/devtools/build/docgen:docgen_javalib",
"//src/main/java/com/google/devtools/build/lib:runtime",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
@@ -148,6 +149,8 @@
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util:test-build-options",
"//src/test/java/com/google/devtools/build/lib/events:testutil",
"//src/test/java/com/google/devtools/build/lib/testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java b/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java
index db3814d..f99bc65 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java
@@ -22,11 +22,11 @@
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.analysis.util.MockRule;
import com.google.devtools.build.lib.packages.PackageFactory.InjectionException;
-import com.google.devtools.build.lib.syntax.ClassObject;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
+import net.starlark.java.eval.ClassObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java b/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
index 21f8ce7..bcfc51e 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
@@ -26,12 +26,12 @@
import com.google.devtools.build.lib.packages.BuildType.LabelConversionContext;
import com.google.devtools.build.lib.packages.BuildType.Selector;
import com.google.devtools.build.lib.packages.Type.ConversionException;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java b/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
index ad89e6f..55dee16 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
@@ -23,8 +23,8 @@
import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
index d8ce7dc..568b24d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
@@ -27,9 +27,6 @@
import com.google.devtools.build.lib.events.StoredEventHandler;
import com.google.devtools.build.lib.packages.PackageValidator.InvalidPackageException;
import com.google.devtools.build.lib.packages.util.PackageFactoryTestBase;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.vfs.RootedPath;
@@ -39,6 +36,9 @@
import java.util.HashMap;
import java.util.List;
import java.util.Set;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.StarlarkFile;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java b/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
index ae7d3dd..f53be61 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
@@ -20,7 +20,7 @@
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
index 6d08e04..3332e68 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
@@ -55,10 +55,6 @@
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory;
import com.google.devtools.build.lib.packages.RuleFactory.BuildLangTypedAttributeValuesMap;
import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.RootedPath;
import java.util.ArrayList;
@@ -72,6 +68,10 @@
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
index 3fb204c..dcfc31d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
@@ -29,14 +29,14 @@
import com.google.devtools.build.lib.events.Reporter;
import com.google.devtools.build.lib.packages.RuleFactory.BuildLangTypedAttributeValuesMap;
import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.RootedPath;
import java.util.HashMap;
import java.util.Map;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java b/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java
index 615680c..418b75a 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java
@@ -17,16 +17,16 @@
import static org.junit.Assert.assertThrows;
import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
import java.util.List;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.SyntaxError;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/StarlarkInfoTest.java b/src/test/java/com/google/devtools/build/lib/packages/StarlarkInfoTest.java
index 62cb665..d3595bd 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/StarlarkInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/StarlarkInfoTest.java
@@ -19,16 +19,16 @@
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-import com.google.devtools.build.lib.syntax.TokenKind;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.syntax.Location;
+import net.starlark.java.syntax.TokenKind;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java b/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java
index f44f6a7..4f28957 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java
@@ -21,10 +21,10 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.testing.EqualsTester;
import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java b/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
index bfc69cf..36af363 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
@@ -18,10 +18,10 @@
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Starlark;
import java.util.Map;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java b/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
index 00a9c26..85563aa 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
@@ -28,13 +28,13 @@
import com.google.devtools.build.lib.pkgcache.LoadingOptions;
import com.google.devtools.build.lib.pkgcache.TestFilter;
import com.google.devtools.build.lib.skyframe.TestsForTargetPatternValue;
-import com.google.devtools.build.lib.syntax.Location;
import com.google.devtools.build.skyframe.EvaluationContext;
import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.SkyKey;
import java.util.Collection;
import java.util.EnumSet;
import java.util.function.Predicate;
+import net.starlark.java.syntax.Location;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java b/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java
index 014ae54..7265c0d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java
@@ -24,12 +24,12 @@
import com.google.devtools.build.lib.collect.nestedset.Depset;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.Tuple;
import com.google.devtools.build.lib.testutil.MoreAsserts;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.Tuple;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
index 5a862d6..31d98d0 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
@@ -22,15 +22,15 @@
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.packages.Package.Builder.DefaultPackageSettings;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.Root;
import com.google.devtools.build.lib.vfs.RootedPath;
import java.util.List;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.StarlarkFile;
/** Parses a WORKSPACE file with the given content. */
// TODO(adonovan): delete this junk class.
diff --git a/src/test/java/com/google/devtools/build/lib/packages/metrics/BUILD b/src/test/java/com/google/devtools/build/lib/packages/metrics/BUILD
index d84b27c..2fa85d9 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/metrics/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/packages/metrics/BUILD
@@ -19,12 +19,13 @@
size = "small",
srcs = ["PackageMetricsPackageLoadingListenerTest.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/collect",
"//src/main/java/com/google/devtools/build/lib/packages",
"//src/main/java/com/google/devtools/build/lib/packages/metrics",
"//src/main/java/com/google/devtools/build/lib/packages/metrics:package_metrics_java_proto",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//third_party:guava",
"//third_party:junit4",
"//third_party:mockito",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListenerTest.java b/src/test/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListenerTest.java
index e66c5d9..24f5f32 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListenerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListenerTest.java
@@ -24,10 +24,10 @@
import com.google.devtools.build.lib.collect.ImmutableSortedKeyMap;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Target;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.protobuf.util.Durations;
import java.util.List;
import java.util.Map;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/semantics/BUILD b/src/test/java/com/google/devtools/build/lib/packages/semantics/BUILD
index 66b88a1..a2dc388 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/semantics/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/packages/semantics/BUILD
@@ -23,11 +23,12 @@
"//src/test/java/com/google/devtools/build/lib:test_runner",
],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/packages/semantics",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//third_party:guava",
"//third_party:junit4",
"//third_party:mockito",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/semantics/ConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/semantics/ConsistencyTest.java
index b773a92..3927bbe 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/semantics/ConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/semantics/ConsistencyTest.java
@@ -23,11 +23,11 @@
import com.google.devtools.build.lib.skyframe.serialization.DynamicCodec;
import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.testutils.TestUtils;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.common.options.Options;
import com.google.devtools.common.options.OptionsParser;
import java.util.Arrays;
import java.util.Random;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
index 2e51915c..191ab93 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
@@ -32,9 +32,6 @@
import com.google.devtools.build.lib.packages.PackageValidator;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.lib.testutil.TestUtils;
import com.google.devtools.build.lib.util.Pair;
@@ -43,6 +40,9 @@
import com.google.devtools.build.lib.vfs.RootedPath;
import com.google.devtools.common.options.OptionsParser;
import java.io.IOException;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.StarlarkFile;
/**
* An apparatus that creates / maintains a {@link PackageFactory}.
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
index 45b61ae..66d2c17 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
@@ -30,7 +30,6 @@
import com.google.devtools.build.lib.packages.PackageValidator;
import com.google.devtools.build.lib.packages.RawAttributeMapper;
import com.google.devtools.build.lib.packages.Rule;
-import com.google.devtools.build.lib.syntax.Starlark;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.testutil.TestUtils;
import com.google.devtools.build.lib.util.Pair;
@@ -47,6 +46,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import net.starlark.java.eval.Starlark;
import org.junit.Before;
/** Base class for PackageFactory tests. */
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageLoadingTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageLoadingTest.java
index b3bb2bf..bf0c97c 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageLoadingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageLoadingTest.java
@@ -41,7 +41,6 @@
import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants;
import com.google.devtools.build.lib.skyframe.PrecomputedValue;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.testutil.MoreAsserts;
import com.google.devtools.build.lib.testutil.SkyframeExecutorTestHelper;
@@ -54,6 +53,7 @@
import java.io.IOException;
import java.util.Optional;
import java.util.UUID;
+import net.starlark.java.syntax.StarlarkFile;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java b/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
index 1f6e09a..7991337 100644
--- a/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
@@ -22,19 +22,6 @@
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleFunction;
import com.google.devtools.build.lib.profiler.memory.AllocationTracker.RuleBytes;
-import com.google.devtools.build.lib.syntax.Debug;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.HasBinary;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
-import com.google.devtools.build.lib.syntax.TokenKind;
import com.google.perftools.profiles.ProfileProto.Function;
import com.google.perftools.profiles.ProfileProto.Profile;
import com.google.perftools.profiles.ProfileProto.Sample;
@@ -43,6 +30,19 @@
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.HasBinary;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.SyntaxError;
+import net.starlark.java.syntax.TokenKind;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/src/test/java/com/google/devtools/build/lib/profiler/memory/BUILD b/src/test/java/com/google/devtools/build/lib/profiler/memory/BUILD
index e4129a3..afc9fdd 100644
--- a/src/test/java/com/google/devtools/build/lib/profiler/memory/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/profiler/memory/BUILD
@@ -12,12 +12,13 @@
name = "AllocationTrackerTest",
srcs = ["AllocationTrackerTest.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/events",
"//src/main/java/com/google/devtools/build/lib/packages",
"//src/main/java/com/google/devtools/build/lib/profiler/memory:allocationtracker",
"//src/main/java/com/google/devtools/build/lib/profiler/memory:current_rule_tracker",
"//src/main/java/com/google/devtools/build/lib/vfs",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//third_party:guava",
"//third_party:junit4",
"//third_party:mockito",
diff --git a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java
index cfdd012..fa505cc 100644
--- a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java
@@ -53,7 +53,6 @@
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
import com.google.devtools.build.lib.skyframe.WorkspaceASTFunction;
import com.google.devtools.build.lib.skyframe.WorkspaceFileFunction;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.Root;
@@ -79,6 +78,7 @@
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java
index a272958..1fb0c26 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java
@@ -24,9 +24,9 @@
import com.google.devtools.build.lib.packages.StarlarkProvider;
import com.google.devtools.build.lib.packages.StructImpl;
import com.google.devtools.build.lib.packages.util.BazelMockAndroidSupport;
-import com.google.devtools.build.lib.syntax.Starlark;
import java.util.List;
import java.util.Map;
+import net.starlark.java.eval.Starlark;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
index e735d04..4b5ea27 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
@@ -36,10 +36,11 @@
name = "AndroidStarlarkTest",
srcs = ["AndroidStarlarkTest.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/packages",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/packages:testutil",
"//third_party:guava",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/apple/AppleRulesTest.java b/src/test/java/com/google/devtools/build/lib/rules/apple/AppleRulesTest.java
index e77bf68..0003a05 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/apple/AppleRulesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/apple/AppleRulesTest.java
@@ -28,7 +28,7 @@
import com.google.devtools.build.lib.packages.StarlarkProvider;
import com.google.devtools.build.lib.packages.StructImpl;
import com.google.devtools.build.lib.packages.util.MockObjcSupport;
-import com.google.devtools.build.lib.syntax.Sequence;
+import net.starlark.java.eval.Sequence;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/apple/BUILD b/src/test/java/com/google/devtools/build/lib/rules/apple/BUILD
index d1b4c4d..02ca84f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/apple/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/apple/BUILD
@@ -16,7 +16,6 @@
name = "AppleRulesTests_lib",
srcs = glob(["*.java"]),
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:execution_requirements",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
@@ -26,6 +25,8 @@
"//src/main/java/com/google/devtools/build/lib/packages",
"//src/main/java/com/google/devtools/build/lib/rules/apple",
"//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_and_data",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/main/protobuf:xcode_java_proto",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/packages:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD b/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD
index f05b42f..5fab1a8 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD
@@ -39,7 +39,6 @@
":CcImportBaseConfiguredTargetTest",
":StarlarkCcCommonTestHelper",
":util",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
"//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity",
@@ -69,6 +68,8 @@
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/main/protobuf:crosstool_config_java_proto",
"//src/main/protobuf:extra_actions_base_java_proto",
"//src/test/java/com/google/devtools/build/lib/actions/util",
@@ -144,7 +145,8 @@
name = "CppConfigurationStarlarkTest",
srcs = ["CppConfigurationStarlarkTest.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//third_party:junit4",
"//third_party:truth",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeaturesTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeaturesTest.java
index e8581ca..1469035 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeaturesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeaturesTest.java
@@ -43,7 +43,6 @@
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
import com.google.devtools.build.lib.skyframe.serialization.testutils.TestUtils;
-import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
@@ -54,6 +53,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import net.starlark.java.eval.EvalException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java
index ce1c63f..6ea5447 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java
@@ -16,9 +16,9 @@
import static com.google.common.truth.Truth.assertThat;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
import java.io.IOException;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
index 2893977..ecc04db 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
@@ -50,7 +50,6 @@
import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.TestUtils;
import com.google.devtools.build.lib.util.OS;
import com.google.devtools.build.lib.util.Pair;
@@ -63,6 +62,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
index 93b8e9d..089d523 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
@@ -54,10 +54,6 @@
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.VariableWithValue;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.WithFeatureSet;
import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.StringValueParser;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.util.Pair;
@@ -71,6 +67,10 @@
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java
index 167106a..2b6d281 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java
@@ -14,11 +14,11 @@
package com.google.devtools.build.lib.rules.cpp;
import com.google.devtools.build.lib.packages.util.ResourceLoader;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.StarlarkList;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
import com.google.devtools.build.lib.testutil.TestConstants;
import java.io.IOException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.StarlarkList;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/BUILD b/src/test/java/com/google/devtools/build/lib/rules/java/BUILD
index 9458d2a..9ccdfbb 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/BUILD
@@ -58,7 +58,6 @@
name = "JavaStarlarkApiTest",
srcs = ["JavaStarlarkApiTest.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
@@ -69,6 +68,8 @@
"//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
"//src/main/java/com/google/devtools/build/lib/rules/java:java-rules",
"//src/main/java/com/google/devtools/build/lib/util:filetype",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/actions/util",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
index 564c2d3..6de78c7 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
@@ -32,13 +32,13 @@
import com.google.devtools.build.lib.packages.StarlarkProvider;
import com.google.devtools.build.lib.packages.StructImpl;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar;
-import com.google.devtools.build.lib.syntax.Sequence;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.util.FileType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
+import net.starlark.java.eval.Sequence;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
index 412cd0a..28849bf 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
@@ -44,7 +44,6 @@
import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
import com.google.devtools.build.lib.rules.objc.AppleBinary.BinaryType;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
-import com.google.devtools.build.lib.syntax.Dict;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -54,6 +53,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import net.starlark.java.eval.Dict;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/BUILD b/src/test/java/com/google/devtools/build/lib/rules/objc/BUILD
index e3703b6..6e41834 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/BUILD
@@ -66,7 +66,6 @@
],
),
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
"//src/main/java/com/google/devtools/build/lib/actions:execution_requirements",
@@ -90,6 +89,8 @@
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/actions/util",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/packages:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
index 1607015..e943411 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
@@ -26,12 +26,12 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.vfs.DigestHashFunction;
import com.google.devtools.build.lib.vfs.Root;
import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD b/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
index e78ed8c..957de50 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
@@ -21,12 +21,13 @@
exclude = TESTUTIL_SRCS,
),
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
"//src/main/java/com/google/devtools/build/lib/analysis/platform",
"//src/main/java/com/google/devtools/build/lib/analysis/platform:utils",
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/packages",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//third_party:guava",
"//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintCollectionApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintCollectionApiTest.java
index 0b53f8b..d392b15 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintCollectionApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintCollectionApiTest.java
@@ -25,11 +25,11 @@
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.StarlarkProvider;
import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.syntax.Sequence;
import java.util.Collection;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
+import net.starlark.java.eval.Sequence;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java b/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java
index 05c6d0d..b5caa7a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java
@@ -25,7 +25,7 @@
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.StarlarkProvider;
import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.syntax.Starlark;
+import net.starlark.java.eval.Starlark;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/proto/BUILD b/src/test/java/com/google/devtools/build/lib/rules/proto/BUILD
index 62ced21..69cbfea 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/proto/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/proto/BUILD
@@ -23,10 +23,10 @@
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/rules/proto",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/util",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/actions/util",
"//third_party:guava",
"//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilderTest.java b/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilderTest.java
index 4f5acb1..3585ac9 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilderTest.java
@@ -36,13 +36,13 @@
import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.Exports;
import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.Services;
import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.ToolchainInvocation;
-import com.google.devtools.build.lib.syntax.Location;
import com.google.devtools.build.lib.util.LazyString;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.vfs.DigestHashFunction;
import com.google.devtools.build.lib.vfs.Root;
import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/BUILD b/src/test/java/com/google/devtools/build/lib/rules/python/BUILD
index 0493376..7090e31 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/BUILD
@@ -177,8 +177,9 @@
name = "PythonToolchainTest",
srcs = ["PythonToolchainTest.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/analysis/platform",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
"//third_party:junit4",
@@ -190,9 +191,10 @@
name = "PyProviderUtilsTest",
srcs = ["PyProviderUtilsTest.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
"//src/main/java/com/google/devtools/build/lib/rules/python",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//third_party:junit4",
"//third_party:truth",
@@ -203,12 +205,13 @@
name = "PyStructUtilsTest",
srcs = ["PyStructUtilsTest.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/packages",
"//src/main/java/com/google/devtools/build/lib/rules/python",
"//src/main/java/com/google/devtools/build/lib/vfs",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/actions/util",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//third_party:guava",
@@ -225,7 +228,7 @@
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/rules/python",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/starlark/util",
"//src/test/java/com/google/devtools/build/lib/syntax/util",
@@ -241,8 +244,8 @@
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/rules/python",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/starlark/util",
"//src/test/java/com/google/devtools/build/lib/syntax/util",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java
index c635d7e..b8ec1c1 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java
@@ -22,8 +22,8 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.starlark.util.BazelEvaluationTestCase;
-import com.google.devtools.build.lib.syntax.Location;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
+import net.starlark.java.syntax.Location;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PyProviderUtilsTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PyProviderUtilsTest.java
index 1b433bc..b005a7a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PyProviderUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PyProviderUtilsTest.java
@@ -19,7 +19,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
import org.junit.Test;
import org.junit.function.ThrowingRunnable;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java
index 9e47561..db6dbbc 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java
@@ -22,9 +22,9 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.starlark.util.BazelEvaluationTestCase;
-import com.google.devtools.build.lib.syntax.Location;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
import com.google.devtools.build.lib.vfs.PathFragment;
+import net.starlark.java.syntax.Location;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PyStructUtilsTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PyStructUtilsTest.java
index f9ade69..7e50d69 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PyStructUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PyStructUtilsTest.java
@@ -28,11 +28,11 @@
import com.google.devtools.build.lib.packages.StarlarkInfo;
import com.google.devtools.build.lib.packages.StructImpl;
import com.google.devtools.build.lib.packages.StructProvider;
-import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.vfs.Root;
import java.util.LinkedHashMap;
import java.util.Map;
+import net.starlark.java.eval.EvalException;
import org.junit.Before;
import org.junit.Test;
import org.junit.function.ThrowingRunnable;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PythonToolchainTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PythonToolchainTest.java
index 4883a0c..3ab1455 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PythonToolchainTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PythonToolchainTest.java
@@ -15,7 +15,7 @@
package com.google.devtools.build.lib.rules.python;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.devtools.build.lib.syntax.Starlark.NONE;
+import static net.starlark.java.eval.Starlark.NONE;
import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD b/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
index 3b6a052..2d72bff 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
@@ -16,7 +16,6 @@
name = "RepositoryTests_lib",
srcs = glob(["*.java"]),
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions:file_metadata",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
"//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
@@ -46,6 +45,8 @@
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
index aadc37d..b6c45cc 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
@@ -60,7 +60,6 @@
import com.google.devtools.build.lib.skyframe.WorkspaceASTFunction;
import com.google.devtools.build.lib.skyframe.WorkspaceFileFunction;
import com.google.devtools.build.lib.starlarkbuildapi.repository.RepositoryBootstrap;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.testutil.ManualClock;
import com.google.devtools.build.lib.testutil.TestConstants;
@@ -89,6 +88,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/LocationPrinterTest.java b/src/test/java/com/google/devtools/build/lib/runtime/LocationPrinterTest.java
index 017409d..d4c8bb4 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/LocationPrinterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/LocationPrinterTest.java
@@ -16,12 +16,12 @@
import static com.google.common.truth.Truth.assertThat;
import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.Location;
import com.google.devtools.build.lib.vfs.DigestHashFunction;
import com.google.devtools.build.lib.vfs.FileSystem;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.vfs.Root;
import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
+import net.starlark.java.syntax.Location;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/UiStateTrackerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/UiStateTrackerTest.java
index 1f37b99..b26e040 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/UiStateTrackerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/UiStateTrackerTest.java
@@ -51,7 +51,6 @@
import com.google.devtools.build.lib.runtime.UiStateTracker.StrategyIds;
import com.google.devtools.build.lib.skyframe.LoadingPhaseStartedEvent;
import com.google.devtools.build.lib.skyframe.PackageProgressReceiver;
-import com.google.devtools.build.lib.syntax.Location;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.testutil.ManualClock;
import com.google.devtools.build.lib.util.DetailedExitCode;
@@ -67,6 +66,7 @@
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
+import net.starlark.java.syntax.Location;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
index f0ede9b..e879ff6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
@@ -22,9 +22,6 @@
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.LoadStatement;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.Statement;
import com.google.devtools.build.lib.vfs.DigestHashFunction;
import com.google.devtools.build.lib.vfs.FileStatus;
import com.google.devtools.build.lib.vfs.FileSystem;
@@ -37,6 +34,9 @@
import com.google.devtools.build.skyframe.SkyKey;
import java.io.IOException;
import java.util.List;
+import net.starlark.java.syntax.LoadStatement;
+import net.starlark.java.syntax.StarlarkFile;
+import net.starlark.java.syntax.Statement;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
index 8a0a15f..15b8bff 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -105,7 +105,8 @@
"//src/main/java/com/google/devtools/build/lib:build-request-options",
"//src/main/java/com/google/devtools/build/lib:keep-going-option",
"//src/main/java/com/google/devtools/build/lib:runtime",
- "//src/main/java/com/google/devtools/build/lib:syntax",
+ "//src/main/java/net/starlark/java/syntax",
+ "//src/main/java/net/starlark/java/eval",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
index 36a3dad..8004833 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
@@ -40,7 +40,6 @@
import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
import com.google.devtools.build.lib.skyframe.PackageLookupValue.ErrorReason;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -61,6 +60,7 @@
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
index ae9168d..c4d7532 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
@@ -51,7 +51,6 @@
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
import com.google.devtools.build.lib.skyframe.serialization.testutils.FsUtils;
import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.ManualClock;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.testutil.TestPackageFactoryBuilderFactory;
@@ -93,6 +92,7 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
index 89523b3..728fe1d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
@@ -42,7 +42,6 @@
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.util.Fingerprint;
@@ -71,6 +70,7 @@
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
index 3f99311..0c4a432 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
@@ -39,7 +39,6 @@
import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
import com.google.devtools.build.lib.skyframe.GlobValue.InvalidGlobPatternException;
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.ManualClock;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
@@ -72,6 +71,7 @@
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
index f87dbda..b54321e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
@@ -32,7 +32,6 @@
import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -55,6 +54,7 @@
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index c0837cb..5725a7e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -48,7 +48,6 @@
import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
import com.google.devtools.build.lib.server.FailureDetails.PackageLoading;
import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.Module;
import com.google.devtools.build.lib.testutil.ManualClock;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.lib.util.DetailedExitCode;
@@ -85,6 +84,7 @@
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.Nullable;
+import net.starlark.java.eval.Module;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
index 034194f..e9f60b5 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
@@ -43,7 +43,6 @@
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
import com.google.devtools.build.lib.skyframe.PackageLookupValue.ErrorReason;
import com.google.devtools.build.lib.skyframe.PackageLookupValue.IncorrectRepositoryReferencePackageLookupValue;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -70,6 +69,7 @@
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
index 2b23594..261384d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
@@ -57,7 +57,6 @@
import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalFunction.RecursiveFilesystemTraversalException;
import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFile;
import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.TraversalRequest;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.testutil.TimestampGranularityUtils;
import com.google.devtools.build.lib.util.io.OutErr;
@@ -96,6 +95,7 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Supplier;
import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
index cdf5f95..5c41342 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
@@ -116,9 +116,6 @@
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.testutil.MoreAsserts;
import com.google.devtools.build.lib.testutil.TestUtils;
import com.google.devtools.build.lib.util.CrashFailureDetails;
@@ -161,6 +158,9 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java
index b2114a3..c653e4b 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java
@@ -30,11 +30,11 @@
import com.google.devtools.build.lib.packages.Provider;
import com.google.devtools.build.lib.rules.platform.ToolchainTestCase;
import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.SkyKey;
import javax.annotation.Nullable;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java
index 063276d..62044a3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java
@@ -23,10 +23,10 @@
import com.google.devtools.build.lib.analysis.util.MockRule;
import com.google.devtools.build.lib.skyframe.StarlarkBuiltinsFunction.BuiltinsFailedException;
import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.ClassObject;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.SkyKey;
+import net.starlark.java.eval.ClassObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java
index d1edec5..effc2e3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java
@@ -25,7 +25,6 @@
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Package.Builder.DefaultPackageSettings;
import com.google.devtools.build.lib.skyframe.TransitiveBaseTraversalFunction.TargetAndErrorIfAnyImpl;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.util.GroupedList;
import com.google.devtools.build.lib.util.GroupedList.GroupedListHelper;
import com.google.devtools.build.lib.vfs.Path;
@@ -35,6 +34,7 @@
import com.google.devtools.build.skyframe.ValueOrException2;
import com.google.devtools.build.skyframe.ValueOrUntypedException;
import java.util.concurrent.atomic.AtomicBoolean;
+import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java
index 5425ebe..b1c3a47 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java
@@ -22,7 +22,6 @@
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.skyframe.WorkspaceFileFunctionTest.SkyKeyMatchers;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -33,6 +32,7 @@
import java.io.IOException;
import java.util.List;
import java.util.Optional;
+import net.starlark.java.syntax.StarlarkFile;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
index 712930b..fb83b8a 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
@@ -35,7 +35,6 @@
import com.google.devtools.build.lib.rules.repository.ManagedDirectoriesKnowledgeImpl;
import com.google.devtools.build.lib.rules.repository.ManagedDirectoriesKnowledgeImpl.ManagedDirectoriesListener;
import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.vfs.ModifiedFileSet;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -50,6 +49,7 @@
import java.util.Objects;
import java.util.Set;
import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.junit.Test;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/BUILD
index e71f75d..b1689d0 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/BUILD
@@ -18,7 +18,6 @@
srcs = ["TrimmableTestConfigurationFragments.java"],
visibility = ["//src/test:__subpackages__"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
@@ -46,6 +45,8 @@
"//src/main/java/com/google/devtools/build/lib/util:filetype",
"//src/main/java/com/google/devtools/common/options",
"//src/main/java/net/starlark/java/annot",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//third_party:guava",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
index c1669ee..2aae7d1 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
@@ -61,9 +61,6 @@
import com.google.devtools.build.lib.rules.core.CoreRules;
import com.google.devtools.build.lib.rules.repository.BindRule;
import com.google.devtools.build.lib.rules.repository.WorkspaceBaseRule;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.util.FileTypeSet;
import com.google.devtools.common.options.Option;
@@ -76,6 +73,9 @@
import java.util.function.Function;
import javax.annotation.Nullable;
import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkValue;
/** Set of trimmable fragments for testing automatic trimming. */
public final class TrimmableTestConfigurationFragments {
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/BUILD b/src/test/java/com/google/devtools/build/lib/starlark/BUILD
index 41be72b..b9153c5 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/starlark/BUILD
@@ -25,7 +25,6 @@
],
deps = [
"//src/main/java/com/google/devtools/build/lib:runtime",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
@@ -66,6 +65,8 @@
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/common/options",
"//src/main/java/net/starlark/java/annot",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/actions/util",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/packages:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkActionProviderTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkActionProviderTest.java
index 15f6f76..93eb891 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkActionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkActionProviderTest.java
@@ -27,11 +27,11 @@
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.StarlarkProvider;
import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Sequence;
import java.util.List;
import java.util.stream.Collectors;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Sequence;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java
index b63e271..875a953 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java
@@ -47,8 +47,8 @@
import com.google.devtools.build.lib.rules.java.JavaConfiguration;
import com.google.devtools.build.lib.rules.objc.ObjcProtoProvider;
import com.google.devtools.build.lib.skyframe.AspectValueKey.AspectKey;
-import com.google.devtools.build.lib.syntax.Sequence;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
+import net.starlark.java.eval.Sequence;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
index 3de30c9..d349411 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
@@ -53,13 +53,13 @@
import com.google.devtools.build.lib.packages.Type;
import com.google.devtools.build.lib.rules.objc.ObjcProvider;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import java.io.IOException;
import java.util.List;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
index 83f8d05..199521f 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
@@ -52,21 +52,21 @@
import com.google.devtools.build.lib.packages.Type;
import com.google.devtools.build.lib.skyframe.BzlLoadFunction;
import com.google.devtools.build.lib.starlark.util.BazelEvaluationTestCase;
-import com.google.devtools.build.lib.syntax.ClassObject;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Program;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.Tuple;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
import com.google.devtools.build.lib.testutil.MoreAsserts;
import com.google.devtools.build.lib.util.FileTypeSet;
import javax.annotation.Nullable;
+import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.Tuple;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.Program;
+import net.starlark.java.syntax.StarlarkFile;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java
index 7143370..380feae 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java
@@ -52,12 +52,6 @@
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.python.PyProviderUtils;
import com.google.devtools.build.lib.starlark.util.BazelEvaluationTestCase;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.lib.util.FileTypeSet;
@@ -66,6 +60,12 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
index cd853e1..e53481e 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
@@ -57,12 +57,6 @@
import com.google.devtools.build.lib.packages.StarlarkProvider;
import com.google.devtools.build.lib.packages.StructImpl;
import com.google.devtools.build.lib.starlark.util.BazelEvaluationTestCase;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
import com.google.devtools.build.lib.testutil.MoreAsserts;
import com.google.devtools.build.lib.util.Fingerprint;
import com.google.devtools.build.lib.util.OsUtils;
@@ -77,6 +71,12 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkGlobalLibrary;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkThread;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -802,8 +802,8 @@
* parameter of the template_action function contains a hack that assumes its input is a UTF-8
* encoded string which has been ingested as Latin 1. The hack converts the string to its
* "correct" UTF-8 value. Once Blaze starts calling {@link
- * com.google.devtools.build.lib.syntax.ParserInput#fromUTF8} instead of {@code fromLatin1} and
- * the hack for the substituations parameter is removed, this test will fail.
+ * net.starlark.java.syntax.ParserInput#fromUTF8} instead of {@code fromLatin1} and the hack for
+ * the substituations parameter is removed, this test will fail.
*/
@Test
public void testCreateTemplateActionWithWrongEncoding() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/util/BUILD b/src/test/java/com/google/devtools/build/lib/starlark/util/BUILD
index f475852..3f8eed9 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/starlark/util/BUILD
@@ -18,7 +18,6 @@
deps = [
"//src/main/java/com/google/devtools/build/lib:keep-going-option",
"//src/main/java/com/google/devtools/build/lib:runtime",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/events",
@@ -28,6 +27,8 @@
"//src/main/java/com/google/devtools/build/lib/rules/platform",
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/syntax/util",
"//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java
index 5c4ac84..25825a4 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java
@@ -21,10 +21,10 @@
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.devtools.build.lib.rules.platform.PlatformCommon;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
import com.google.devtools.build.lib.testutil.TestConstants;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
/**
* BazelEvaluationTestCase is a subclass of EvaluationTestCase that defines various Bazel built-ins
diff --git a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD
index 8d015bc..12e91d7 100644
--- a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD
@@ -28,10 +28,11 @@
srcs = ["StarlarkDebugServerTest.java"],
deps = [
":utils",
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/events",
"//src/main/java/com/google/devtools/build/lib/starlarkdebug/proto:starlark_debugging_java_proto",
"//src/main/java/com/google/devtools/build/lib/starlarkdebug/server",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/events:testutil",
"//third_party:guava",
"//third_party:jsr305",
@@ -57,11 +58,12 @@
name = "DebuggerSerializationTest",
srcs = ["DebuggerSerializationTest.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/starlarkdebug/proto:starlark_debugging_java_proto",
"//src/main/java/com/google/devtools/build/lib/starlarkdebug/server",
"//src/main/java/net/starlark/java/annot",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//third_party:guava",
"//third_party:junit4",
"//third_party:truth",
diff --git a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerializationTest.java b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerializationTest.java
index 33d6435..459a7ef 100644
--- a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerializationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerializationTest.java
@@ -23,14 +23,14 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.Value;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkValue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
index 05a39a8..4b80fae 100644
--- a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
@@ -38,17 +38,6 @@
import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.StartDebuggingResponse;
import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.Stepping;
import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.Value;
-import com.google.devtools.build.lib.syntax.Debug;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
@@ -62,6 +51,17 @@
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.SyntaxError;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -162,8 +162,7 @@
Location expectedLocation =
DebugEventHelper.getLocationProto(
- com.google.devtools.build.lib.syntax.Location.fromFileLineColumn(
- "/a/build/file/BUILD", 1, 1));
+ net.starlark.java.syntax.Location.fromFileLineColumn("/a/build/file/BUILD", 1, 1));
assertThat(event)
.isEqualTo(
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BUILD b/src/test/java/com/google/devtools/build/lib/syntax/BUILD
index f8bb8c9..13241e1 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/syntax/BUILD
@@ -1,93 +1,21 @@
-load("@rules_java//java:defs.bzl", "java_test")
-
-package(
- default_testonly = 1,
- default_visibility = ["//src:__subpackages__"],
-)
+licenses(["notice"])
filegroup(
name = "srcs",
testonly = 0,
- srcs = glob(["**"]) + [
+ srcs = [
+ "BUILD",
"//src/test/java/com/google/devtools/build/lib/syntax/util:srcs",
],
-)
-
-# frontend_test tests the Starlark parser/resolver.
-java_test(
- name = "frontend_test",
- srcs = [
- "FileLocationsTest.java",
- "LValueBoundNamesTest.java",
- "LexerTest.java",
- "LocationTest.java",
- "NodePrinterTest.java",
- "NodeVisitorTest.java",
- "ParserInputTest.java",
- "ParserTest.java",
- "ResolverTest.java",
- "StarlarkFileTest.java",
- ],
- test_class = "com.google.devtools.build.lib.AllTests",
- runtime_deps = [
- "//src/test/java/com/google/devtools/build/lib:test_runner",
- ],
- deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
- "//third_party:guava",
- "//third_party:jsr305",
- "//third_party:junit4",
- "//third_party:truth",
- ],
-)
-
-# evaluator_test tests the Starlark interpreter.
-java_test(
- name = "evaluator_test",
- srcs = [
- # CpuProfilerTest.java doesn't run under OSS Bazel
- "EvalUtilsTest.java",
- "EvaluationTest.java",
- "EvaluationTestCase.java",
- "Examples.java",
- "FunctionTest.java",
- "MethodLibraryTest.java",
- "MutabilityTest.java",
- "PrinterTest.java",
- "StarlarkEvaluationTest.java",
- "StarlarkFlagGuardingTest.java",
- "StarlarkInterfaceUtilsTest.java",
- "StarlarkListTest.java",
- "StarlarkMutableTest.java",
- "StarlarkThreadDebuggingTest.java",
- "StarlarkThreadTest.java",
- "StringModuleTest.java",
- ],
- test_class = "com.google.devtools.build.lib.AllTests",
- runtime_deps = [
- "//src/test/java/com/google/devtools/build/lib:test_runner",
- ],
- deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
- "//src/main/java/net/starlark/java/annot",
- "//third_party:guava",
- "//third_party:jsr305",
- "//third_party:junit4",
- "//third_party:truth",
- ],
+ visibility = ["//visibility:public"],
)
test_suite(
name = "windows_tests",
- tags = [
- "-no_windows",
- "-slow",
- ],
-)
+ tags = [],
+) # unneeded?
test_suite(
name = "all_windows_tests",
- tests = [
- ":windows_tests",
- ],
+ tests = [],
)
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/CpuProfilerTest.java b/src/test/java/com/google/devtools/build/lib/syntax/CpuProfilerTest.java
deleted file mode 100644
index c3781a6..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/CpuProfilerTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2020 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import com.google.common.io.ByteStreams;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.time.Duration;
-
-/**
- * CpuProfilerTest is a simple integration test that the Starlark CPU profiler emits minimally
- * plausible pprof-compatible output.
- *
- * <p>It runs under Blaze only, because it requires a pprof executable.
- */
-public final class CpuProfilerTest {
-
- private CpuProfilerTest() {} // uninstantiable
-
- public static void main(String[] args) throws Exception {
- String pprofCmd = args.length == 0 ? "/bin/pprof" : args[0];
- if (!new File(pprofCmd).exists()) {
- throw new AssertionError("no pprof command: " + pprofCmd);
- }
-
- // This test will fail during profiling of the Java tests
- // because a process (the JVM) can have only one profiler.
- // That's ok; just ignore it.
-
- // Start writing profile to temporary file.
- File profile = java.io.File.createTempFile("pprof", ".gz", null);
- OutputStream prof = new FileOutputStream(profile);
- Starlark.startCpuProfile(prof, Duration.ofMillis(10));
-
- // This program consumes about 3s of CPU.
- ParserInput input =
- ParserInput.fromLines(
- "x = [0]", //
- "",
- "def f():",
- " for i in range(10000):",
- " g()",
- "",
- "def g():",
- " list(range(10000))",
- " int(3)",
- " sorted(range(10000))",
- "",
- "f()");
-
- // Execute the workload.
- Module module = Module.create();
- try (Mutability mu = Mutability.create("test")) {
- StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
- Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
- }
-
- Starlark.stopCpuProfile();
-
- // Run pprof -top. Typical output (may vary by pprof release):
- //
- // Type: CPU
- // Time: Jan 21, 2020 at 11:08am (PST)
- // Duration: 3.26s, Total samples = 2640ms (80.97%)
- // Showing nodes accounting for 2640ms, 100% of 2640ms total
- // flat flat% sum% cum cum%
- // 1390ms 52.65% 52.65% 1390ms 52.65% sorted
- // 960ms 36.36% 89.02% 960ms 36.36% list
- // 220ms 8.33% 97.35% 220ms 8.33% range
- // 70ms 2.65% 100% 70ms 2.65% int
- // 0 0% 100% 2640ms 100% <unknown>
- // 0 0% 100% 2640ms 100% f
- // 0 0% 100% 2640ms 100% g
-
- // Runtime.exec is deprecated at Google but its open-source replacement is not yet available.
- @SuppressWarnings("RuntimeExec")
- Process pprof =
- Runtime.getRuntime()
- .exec(pprofCmd + " -top " + profile, /*envp=*/ new String[0], /*dir=*/ null);
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- ByteStreams.copy(pprof.getInputStream(), out);
- String got = out.toString(); // encoding undefined but unimportant---result is ASCII
-
- // We'll assert that a few key substrings are present.
- boolean ok = true;
- for (String want : new String[] {"flat%", "sorted", "range"}) {
- if (!got.contains(want)) {
- System.err.println("pprof output does not contain substring: " + got);
- ok = false;
- }
- }
- if (!ok) {
- System.err.println("pprof output:\n" + out);
- System.exit(1);
- }
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
deleted file mode 100644
index ebe1fe6..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.devtools.build.lib.syntax.EvalUtils.ComparisonException;
-import javax.annotation.Nullable;
-import net.starlark.java.annot.StarlarkBuiltin;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Test properties of the evaluator's datatypes and utility functions without actually creating any
- * parse trees.
- */
-@RunWith(JUnit4.class)
-public final class EvalUtilsTest {
-
- private static StarlarkList<Object> makeList(@Nullable Mutability mu) {
- return StarlarkList.of(mu, 1, 2, 3);
- }
-
- private static Dict<Object, Object> makeDict(@Nullable Mutability mu) {
- return Dict.of(mu, 1, 1, 2, 2);
- }
-
- /** MockClassA */
- @StarlarkBuiltin(name = "MockClassA", doc = "MockClassA")
- public static class MockClassA implements StarlarkValue {}
-
- /** MockClassB */
- public static class MockClassB extends MockClassA {
- }
-
- @Test
- public void testDataTypeNames() throws Exception {
- assertThat(Starlark.type("foo")).isEqualTo("string");
- assertThat(Starlark.type(3)).isEqualTo("int");
- assertThat(Starlark.type(Tuple.of(1, 2, 3))).isEqualTo("tuple");
- assertThat(Starlark.type(makeList(null))).isEqualTo("list");
- assertThat(Starlark.type(makeDict(null))).isEqualTo("dict");
- assertThat(Starlark.type(Starlark.NONE)).isEqualTo("NoneType");
- assertThat(Starlark.type(new MockClassA())).isEqualTo("MockClassA");
- assertThat(Starlark.type(new MockClassB())).isEqualTo("MockClassA");
- }
-
- @Test
- public void testDatatypeMutabilityPrimitive() throws Exception {
- assertThat(Starlark.isImmutable("foo")).isTrue();
- assertThat(Starlark.isImmutable(3)).isTrue();
- }
-
- @Test
- public void testDatatypeMutabilityShallow() throws Exception {
- assertThat(Starlark.isImmutable(Tuple.of(1, 2, 3))).isTrue();
-
- assertThat(Starlark.isImmutable(makeList(null))).isTrue();
- assertThat(Starlark.isImmutable(makeDict(null))).isTrue();
-
- Mutability mu = Mutability.create("test");
- assertThat(Starlark.isImmutable(makeList(mu))).isFalse();
- assertThat(Starlark.isImmutable(makeDict(mu))).isFalse();
- }
-
- @Test
- public void testDatatypeMutabilityDeep() throws Exception {
- Mutability mu = Mutability.create("test");
- assertThat(Starlark.isImmutable(Tuple.of(makeList(null)))).isTrue();
- assertThat(Starlark.isImmutable(Tuple.of(makeList(mu)))).isFalse();
- }
-
- @Test
- public void testComparatorWithDifferentTypes() throws Exception {
- Mutability mu = Mutability.create("test");
-
- StarlarkValue myValue = new StarlarkValue() {};
-
- Object[] objects = {
- "1",
- 2,
- true,
- Starlark.NONE,
- Tuple.of(1, 2, 3),
- Tuple.of("1", "2", "3"),
- StarlarkList.of(mu, 1, 2, 3),
- StarlarkList.of(mu, "1", "2", "3"),
- Dict.of(mu, "key", 123),
- Dict.of(mu, 123, "value"),
- myValue,
- };
-
- for (int i = 0; i < objects.length; ++i) {
- for (int j = 0; j < objects.length; ++j) {
- if (i != j) {
- Object first = objects[i];
- Object second = objects[j];
- assertThrows(
- ComparisonException.class,
- () -> EvalUtils.STARLARK_COMPARATOR.compare(first, second));
- }
- }
- }
- }
-
- @Test
- public void testComparatorWithNones() throws Exception {
- assertThrows(
- ComparisonException.class,
- () -> EvalUtils.STARLARK_COMPARATOR.compare(Starlark.NONE, Starlark.NONE));
- }
-
- @Test
- public void testLen() {
- assertThat(Starlark.len("abc")).isEqualTo(3);
- assertThat(Starlark.len(Tuple.of(1, 2, 3))).isEqualTo(3);
- assertThat(Starlark.len(StarlarkList.of(null, 1, 2, 3))).isEqualTo(3);
- assertThat(Starlark.len(Dict.of(null, "one", 1, "two", 2))).isEqualTo(2);
- assertThat(Starlark.len(true)).isEqualTo(-1);
- assertThrows(IllegalArgumentException.class, () -> Starlark.len(this));
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
deleted file mode 100644
index 8d9c0d4..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ /dev/null
@@ -1,915 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableMap;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Test of evaluation behavior. (Implicitly uses lexer + parser.) */
-// TODO(adonovan): separate tests of parser, resolver, Starlark core evaluator,
-// and BUILD and .bzl features.
-@RunWith(JUnit4.class)
-public final class EvaluationTest {
-
- private final EvaluationTestCase ev = new EvaluationTestCase();
-
- @Test
- public void testExecutionStopsAtFirstError() throws Exception {
- List<String> printEvents = new ArrayList<>();
- ParserInput input = ParserInput.fromLines("print('hello'); x = 1//0; print('goodbye')");
- InterruptFunction interrupt = new InterruptFunction();
- assertThrows(EvalException.class, () -> execWithInterrupt(input, interrupt, printEvents));
-
- // Only expect hello, should have been an error before goodbye.
- assertThat(printEvents.toString()).isEqualTo("[hello]");
- }
-
- @Test
- public void testExecutionNotStartedOnInterrupt() throws Exception {
- ParserInput input = ParserInput.fromLines("print('hello')");
- List<String> printEvents = new ArrayList<>();
- Thread.currentThread().interrupt();
- InterruptFunction interrupt = new InterruptFunction();
- assertThrows(
- InterruptedException.class, () -> execWithInterrupt(input, interrupt, printEvents));
-
- // Execution didn't reach print.
- assertThat(printEvents).isEmpty();
- }
-
- @Test
- public void testForLoopAbortedOnInterrupt() throws Exception {
- ParserInput input =
- ParserInput.fromLines(
- "def f():", //
- " for i in range(100):",
- " interrupt(i == 5)",
- "f()");
- InterruptFunction interrupt = new InterruptFunction();
- assertThrows(
- InterruptedException.class, () -> execWithInterrupt(input, interrupt, new ArrayList<>()));
-
- assertThat(interrupt.callCount).isEqualTo(6);
- }
-
- @Test
- public void testForComprehensionAbortedOnInterrupt() throws Exception {
- ParserInput input = ParserInput.fromLines("[interrupt(i == 5) for i in range(100)]");
- InterruptFunction interrupt = new InterruptFunction();
- assertThrows(
- InterruptedException.class, () -> execWithInterrupt(input, interrupt, new ArrayList<>()));
-
- assertThat(interrupt.callCount).isEqualTo(6);
- }
-
- @Test
- public void testFunctionCallsNotStartedOnInterrupt() throws Exception {
- ParserInput input =
- ParserInput.fromLines("interrupt(False); interrupt(True); interrupt(False);");
- InterruptFunction interrupt = new InterruptFunction();
- assertThrows(
- InterruptedException.class, () -> execWithInterrupt(input, interrupt, new ArrayList<>()));
-
- // Third call shouldn't happen.
- assertThat(interrupt.callCount).isEqualTo(2);
- }
-
- private static class InterruptFunction implements StarlarkCallable {
-
- private int callCount = 0;
-
- @Override
- public String getName() {
- return "interrupt";
- }
-
- @Override
- public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
- callCount++;
- if (positional.length > 0 && Starlark.truth(positional[0])) {
- Thread.currentThread().interrupt();
- }
- return Starlark.NONE;
- }
- }
-
- // Executes input, with the specified 'interrupt' predeclared built-in, gather print events in
- // printEvents.
- private static void execWithInterrupt(
- ParserInput input, InterruptFunction interrupt, List<String> printEvents) throws Exception {
- Module module =
- Module.withPredeclared(StarlarkSemantics.DEFAULT, ImmutableMap.of("interrupt", interrupt));
- try (Mutability mu = Mutability.create("test")) {
- StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
- thread.setPrintHandler((_thread, msg) -> printEvents.add(msg));
- Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
- } finally {
- // Reset interrupt bit in case the test failed to do so.
- Thread.interrupted();
- }
- }
-
- @Test
- public void testExecutionSteps() throws Exception {
- Mutability mu = Mutability.create("test");
- StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
- ParserInput input = ParserInput.fromLines("squares = [x*x for x in range(n)]");
-
- class C {
- long run(int n) throws SyntaxError.Exception, EvalException, InterruptedException {
- Module module = Module.withPredeclared(StarlarkSemantics.DEFAULT, ImmutableMap.of("n", n));
- long steps0 = thread.getExecutedSteps();
- Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
- return thread.getExecutedSteps() - steps0;
- }
- }
-
- // A thread records the number of computation steps.
- long steps1000 = new C().run(1000);
- long steps10000 = new C().run(10000);
- double ratio = (double) steps10000 / (double) steps1000;
- if (ratio < 9.9 || ratio > 10.1) {
- throw new AssertionError(
- String.format(
- "computation steps did not increase linearly: f(1000)=%d, f(10000)=%d, ratio=%g, want"
- + " ~10",
- steps1000, steps10000, ratio));
- }
-
- // Exceeding the limit causes cancellation.
- thread.setMaxExecutionSteps(1000);
- EvalException ex = assertThrows(EvalException.class, () -> new C().run(1000));
- assertThat(ex).hasMessageThat().contains("Starlark computation cancelled: too many steps");
- }
-
- @Test
- public void testExprs() throws Exception {
- ev.new Scenario()
- .testExpression("'%sx' % 'foo' + 'bar1'", "fooxbar1")
- .testExpression("('%sx' % 'foo') + 'bar2'", "fooxbar2")
- .testExpression("'%sx' % ('foo' + 'bar3')", "foobar3x")
- .testExpression("123 + 456", 579)
- .testExpression("456 - 123", 333)
- .testExpression("8 % 3", 2)
- .testIfErrorContains("unsupported binary operation: int % string", "3 % 'foo'")
- .testExpression("-5", -5)
- .testIfErrorContains("unsupported unary operation: -string", "-'foo'");
- }
-
- @Test
- public void testListExprs() throws Exception {
- ev.new Scenario().testExactOrder("[1, 2, 3]", 1, 2, 3).testExactOrder("(1, 2, 3)", 1, 2, 3);
- }
-
- @Test
- public void testStringFormatMultipleArgs() throws Exception {
- ev.new Scenario().testExpression("'%sY%s' % ('X', 'Z')", "XYZ");
- }
-
- @Test
- public void testConditionalExpressions() throws Exception {
- ev.new Scenario()
- .testExpression("1 if True else 2", 1)
- .testExpression("1 if False else 2", 2)
- .testExpression("1 + 2 if 3 + 4 else 5 + 6", 3);
- }
-
- @Test
- public void testListComparison() throws Exception {
- ev.new Scenario()
- .testExpression("[] < [1]", true)
- .testExpression("[1] < [1, 1]", true)
- .testExpression("[1, 1] < [1, 2]", true)
- .testExpression("[1, 2] < [1, 2, 3]", true)
- .testExpression("[1, 2, 3] <= [1, 2, 3]", true)
- .testExpression("['a', 'b'] > ['a']", true)
- .testExpression("['a', 'b'] >= ['a']", true)
- .testExpression("['a', 'b'] < ['a']", false)
- .testExpression("['a', 'b'] <= ['a']", false)
- .testExpression("('a', 'b') > ('a', 'b')", false)
- .testExpression("('a', 'b') >= ('a', 'b')", true)
- .testExpression("('a', 'b') < ('a', 'b')", false)
- .testExpression("('a', 'b') <= ('a', 'b')", true)
- .testExpression("[[1, 1]] > [[1, 1], []]", false)
- .testExpression("[[1, 1]] < [[1, 1], []]", true);
- }
-
- @Test
- public void testSumFunction() throws Exception {
- StarlarkCallable sum =
- new StarlarkCallable() {
- @Override
- public String getName() {
- return "sum";
- }
-
- @Override
- public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
- int sum = 0;
- for (Object arg : positional) {
- sum += (Integer) arg;
- }
- return sum;
- }
- };
-
- ev.new Scenario()
- .update(sum.getName(), sum)
- .testExpression("sum(1, 2, 3, 4, 5, 6)", 21)
- .testExpression("sum", sum)
- .testExpression("sum(a=1, b=2)", 0);
- }
-
- @Test
- public void testNotCallInt() throws Exception {
- ev.new Scenario()
- .setUp("sum = 123456")
- .testLookup("sum", 123456)
- .testIfExactError("'int' object is not callable", "sum(1, 2, 3, 4, 5, 6)")
- .testExpression("sum", 123456);
- }
-
- @Test
- public void testComplexFunctionCall() throws Exception {
- ev.new Scenario()
- .setUp("functions = [min, max]", "l = [1,2]")
- .testEval("(functions[0](l), functions[1](l))", "(1, 2)");
- }
-
- @Test
- public void testKeywordArgs() throws Exception {
- // This function returns the map of keyword arguments passed to it.
- StarlarkCallable kwargs =
- new StarlarkCallable() {
- @Override
- public String getName() {
- return "kwargs";
- }
-
- @Override
- public Object call(
- StarlarkThread thread,
- Tuple<Object> args,
- Dict<String, Object> kwargs) {
- return kwargs;
- }
- };
-
- ev.new Scenario()
- .update(kwargs.getName(), kwargs)
- .testEval(
- "kwargs(foo=1, bar='bar', wiz=[1,2,3]).items()",
- "[('foo', 1), ('bar', 'bar'), ('wiz', [1, 2, 3])]")
- .testEval(
- "kwargs(wiz=[1,2,3], bar='bar', foo=1).items()",
- "[('wiz', [1, 2, 3]), ('bar', 'bar'), ('foo', 1)]");
- }
-
- @Test
- public void testModulo() throws Exception {
- ev.new Scenario()
- .testExpression("6 % 2", 0)
- .testExpression("6 % 4", 2)
- .testExpression("3 % 6", 3)
- .testExpression("7 % -4", -1)
- .testExpression("-7 % 4", 1)
- .testExpression("-7 % -4", -3)
- .testIfExactError("integer modulo by zero", "5 % 0");
- }
-
- @Test
- public void testMult() throws Exception {
- ev.new Scenario()
- .testExpression("6 * 7", 42)
- .testExpression("3 * 'ab'", "ababab")
- .testExpression("0 * 'ab'", "")
- .testExpression("'1' + '0' * 5", "100000")
- .testExpression("'ab' * -4", "")
- .testExpression("-1 * ''", "");
- }
-
- @Test
- public void testSlashOperatorIsForbidden() throws Exception {
- ev.new Scenario().testIfErrorContains("The `/` operator is not allowed.", "5 / 2");
- }
-
- @Test
- public void testFloorDivision() throws Exception {
- ev.new Scenario()
- .testExpression("6 // 2", 3)
- .testExpression("6 // 4", 1)
- .testExpression("3 // 6", 0)
- .testExpression("7 // -2", -4)
- .testExpression("-7 // 2", -4)
- .testExpression("-7 // -2", 3)
- .testExpression("2147483647 // 2", 1073741823)
- .testIfErrorContains("unsupported binary operation: string // int", "'str' // 2")
- .testIfExactError("integer division by zero", "5 // 0");
- }
-
- @Test
- public void testCheckedArithmetic() throws Exception {
- ev.new Scenario()
- .testIfErrorContains("integer overflow", "2000000000 + 2000000000")
- .testIfErrorContains("integer overflow", "1234567890 * 987654321")
- .testIfErrorContains("integer overflow", "- 2000000000 - 2000000000")
-
- // literal 2147483648 is not allowed, so we compute it
- .setUp("minint = - 2147483647 - 1")
- .testIfErrorContains("integer overflow", "-minint");
- }
-
- @Test
- public void testOperatorPrecedence() throws Exception {
- ev.new Scenario()
- .testExpression("2 + 3 * 4", 14)
- .testExpression("2 + 3 // 4", 2)
- .testExpression("2 * 3 + 4 // -2", 4);
- }
-
- @Test
- public void testConcatStrings() throws Exception {
- ev.new Scenario().testExpression("'foo' + 'bar'", "foobar");
- }
-
- @Test
- public void testConcatLists() throws Exception {
- ev.new Scenario()
- .testExactOrder("[1,2] + [3,4]", 1, 2, 3, 4)
- .testExactOrder("(1,2)", 1, 2)
- .testExactOrder("(1,2) + (3,4)", 1, 2, 3, 4);
-
- // TODO(fwe): cannot be handled by current testing suite
- // list
- Object x = ev.eval("[1,2] + [3,4]");
- assertThat((Iterable<?>) x).containsExactly(1, 2, 3, 4).inOrder();
- assertThat(x).isInstanceOf(StarlarkList.class);
- assertThat(Starlark.isImmutable(x)).isFalse();
-
- // tuple
- x = ev.eval("(1,2) + (3,4)");
- assertThat((Iterable<?>) x).containsExactly(1, 2, 3, 4).inOrder();
- assertThat(x).isInstanceOf(Tuple.class);
- assertThat(x).isEqualTo(Tuple.of(1, 2, 3, 4));
- assertThat(Starlark.isImmutable(x)).isTrue();
-
- ev.checkEvalError("unsupported binary operation: tuple + list", "(1,2) + [3,4]");
- }
-
- @Test
- public void testListComprehensions() throws Exception {
- ev.new Scenario()
- .testExactOrder("['foo/%s.java' % x for x in []]")
- .testExactOrder(
- "['foo/%s.java' % y for y in ['bar', 'wiz', 'quux']]",
- "foo/bar.java", "foo/wiz.java", "foo/quux.java")
- .testExactOrder(
- "['%s/%s.java' % (z, t) for z in ['foo', 'bar'] " + "for t in ['baz', 'wiz', 'quux']]",
- "foo/baz.java",
- "foo/wiz.java",
- "foo/quux.java",
- "bar/baz.java",
- "bar/wiz.java",
- "bar/quux.java")
- .testExactOrder(
- "['%s/%s.java' % (b, b) for a in ['foo', 'bar'] " + "for b in ['baz', 'wiz', 'quux']]",
- "baz/baz.java",
- "wiz/wiz.java",
- "quux/quux.java",
- "baz/baz.java",
- "wiz/wiz.java",
- "quux/quux.java")
- .testExactOrder(
- "['%s/%s.%s' % (c, d, e) for c in ['foo', 'bar'] "
- + "for d in ['baz', 'wiz', 'quux'] for e in ['java', 'cc']]",
- "foo/baz.java",
- "foo/baz.cc",
- "foo/wiz.java",
- "foo/wiz.cc",
- "foo/quux.java",
- "foo/quux.cc",
- "bar/baz.java",
- "bar/baz.cc",
- "bar/wiz.java",
- "bar/wiz.cc",
- "bar/quux.java",
- "bar/quux.cc")
- .testExactOrder("[i for i in (1, 2)]", 1, 2)
- .testExactOrder("[i for i in [2, 3] or [1, 2]]", 2, 3);
- }
-
- @Test
- public void testNestedListComprehensions() throws Exception {
- ev.new Scenario()
- .setUp("li = [[1, 2], [3, 4]]")
- .testExactOrder("[j for i in li for j in i]", 1, 2, 3, 4);
- ev.new Scenario()
- .setUp("input = [['abc'], ['def', 'ghi']]\n")
- .testExactOrder(
- "['%s %s' % (b, c) for a in input for b in a for c in b.elems()]",
- "abc a", "abc b", "abc c", "def d", "def e", "def f", "ghi g", "ghi h", "ghi i");
- }
-
- @Test
- public void testListComprehensionsMultipleVariables() throws Exception {
- ev.new Scenario()
- .testEval("[x + y for x, y in [(1, 2), (3, 4)]]", "[3, 7]")
- .testEval("[z + t for (z, t) in [[1, 2], [3, 4]]]", "[3, 7]");
- }
-
- @Test
- public void testSequenceAssignment() throws Exception {
- // Assignment to empty list/tuple is permitted.
- // See https://github.com/bazelbuild/starlark/issues/93 for discussion.
- ev.exec("() = ()");
- ev.exec("[] = ()");
-
- // RHS not iterable
- ev.checkEvalError(
- "got 'int' in sequence assignment", //
- "x, y = 1");
- ev.checkEvalError(
- "got 'int' in sequence assignment", //
- "(x,) = 1");
- ev.checkEvalError(
- "got 'int' in sequence assignment", //
- "[x] = 1");
-
- // too few
- ev.checkEvalError(
- "too few values to unpack (got 0, want 2)", //
- "x, y = ()");
- ev.checkEvalError(
- "too few values to unpack (got 0, want 2)", //
- "[x, y] = ()");
-
- // just right
- ev.exec("x, y = 1, 2");
- ev.exec("[x, y] = 1, 2");
- ev.exec("(x,) = [1]");
-
- // too many
- ev.checkEvalError(
- "got 'int' in sequence assignment", //
- "() = 1");
- ev.checkEvalError(
- "too many values to unpack (got 1, want 0)", //
- "() = (1,)");
- ev.checkEvalError(
- "too many values to unpack (got 3, want 2)", //
- "x, y = 1, 2, 3");
- ev.checkEvalError(
- "too many values to unpack (got 3, want 2)", //
- "[x, y] = 1, 2, 3");
- }
-
- @Test
- public void testListComprehensionsMultipleVariablesFail() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "too few values to unpack (got 2, want 3)", //
- "[x + y for x, y, z in [(1, 2), (3, 4)]]")
- .testIfExactError(
- "got 'int' in sequence assignment", //
- "[x + y for x, y in (1, 2)]");
-
- ev.new Scenario()
- .testIfErrorContains(
- "too few values to unpack (got 2, want 3)", //
- "def foo (): return [x + y for x, y, z in [(1, 2), (3, 4)]]",
- "foo()");
-
- ev.new Scenario()
- .testIfErrorContains(
- "got 'int' in sequence assignment", //
- "def bar (): return [x + y for x, y in (1, 2)]",
- "bar()");
-
- ev.new Scenario()
- .testIfErrorContains(
- "too few values to unpack (got 2, want 3)", //
- "[x + y for x, y, z in [(1, 2), (3, 4)]]");
-
- ev.new Scenario()
- .testIfErrorContains(
- "got 'int' in sequence assignment", //
- "[x2 + y2 for x2, y2 in (1, 2)]");
-
- // Assignment to empty tuple is permitted.
- // See https://github.com/bazelbuild/starlark/issues/93 for discussion.
- ev.new Scenario().testEval("[1 for [] in [(), []]]", "[1, 1]");
- }
-
- @Test
- public void testListComprehensionsWithFiltering() throws Exception {
- ev.new Scenario()
- .setUp("range3 = [0, 1, 2]")
- .testEval("[a for a in (4, None, 2, None, 1) if a != None]", "[4, 2, 1]")
- .testEval("[b+c for b in [0, 1, 2] for c in [0, 1, 2] if b + c > 2]", "[3, 3, 4]")
- .testEval("[d+e for d in range3 if d % 2 == 1 for e in range3]", "[1, 2, 3]")
- .testEval(
- "[[f,g] for f in [0, 1, 2, 3, 4] if f for g in [5, 6, 7, 8] if f * g % 12 == 0 ]",
- "[[2, 6], [3, 8], [4, 6]]")
- .testEval("[h for h in [4, 2, 0, 1] if h]", "[4, 2, 1]");
- }
-
- @Test
- public void testListComprehensionDefinitionOrder() throws Exception {
- // This exercises the .bzl file behavior. This is a dynamic error.
- // (The error message for BUILD files is slightly different (no "local")
- // because it doesn't record the scope in the syntax tree.)
- ev.new Scenario()
- .testIfErrorContains(
- "local variable 'y' is referenced before assignment", //
- "[x for x in (1, 2) if y for y in (3, 4)]");
-
- // This is the corresponding test for BUILD files.
- EvalException ex =
- assertThrows(
- EvalException.class, () -> execBUILD("[x for x in (1, 2) if y for y in (3, 4)]"));
- assertThat(ex).hasMessageThat().isEqualTo("variable 'y' is referenced before assignment");
- }
-
- private static void execBUILD(String... lines)
- throws SyntaxError.Exception, EvalException, InterruptedException {
- ParserInput input = ParserInput.fromLines(lines);
- FileOptions options = FileOptions.builder().recordScope(false).build();
- try (Mutability mu = Mutability.create("test")) {
- StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
- Starlark.execFile(input, options, Module.create(), thread);
- }
- }
-
- @Test
- public void testTupleDestructuring() throws Exception {
- ev.new Scenario()
- .setUp("a, b = 1, 2")
- .testLookup("a", 1)
- .testLookup("b", 2)
- .setUp("c, d = {'key1':2, 'key2':3}")
- .testLookup("c", "key1")
- .testLookup("d", "key2");
- }
-
- @Test
- public void testSingleTuple() throws Exception {
- ev.new Scenario().setUp("(a,) = [1]").testLookup("a", 1);
- }
-
- @Test
- public void testHeterogeneousDict() throws Exception {
- ev.new Scenario()
- .setUp("d = {'str': 1, 2: 3}", "a = d['str']", "b = d[2]")
- .testLookup("a", 1)
- .testLookup("b", 3);
- }
-
- @Test
- public void testAccessDictWithATupleKey() throws Exception {
- ev.new Scenario().setUp("x = {(1, 2): 3}[1, 2]").testLookup("x", 3);
- }
-
- @Test
- public void testDictWithDuplicatedKey() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "Duplicated key \"str\" when creating dictionary", "{'str': 1, 'x': 2, 'str': 3}");
- }
-
- @Test
- public void testRecursiveTupleDestructuring() throws Exception {
- ev.new Scenario()
- .setUp("((a, b), (c, d)) = [(1, 2), (3, 4)]")
- .testLookup("a", 1)
- .testLookup("b", 2)
- .testLookup("c", 3)
- .testLookup("d", 4);
- }
-
- @Test
- public void testListComprehensionAtTopLevel() throws Exception {
- // It is allowed to have a loop variable with the same name as a global variable.
- ev.new Scenario()
- .update("x", 42)
- .setUp("y = [x + 1 for x in [1,2,3]]")
- .testExactOrder("y", 2, 3, 4);
- }
-
- @Test
- public void testDictComprehensions() throws Exception {
- ev.new Scenario()
- .testExpression("{a : a for a in []}", Collections.emptyMap())
- .testExpression("{b : b for b in [1, 2]}", ImmutableMap.of(1, 1, 2, 2))
- .testExpression(
- "{c : 'v_' + c for c in ['a', 'b']}", ImmutableMap.of("a", "v_a", "b", "v_b"))
- .testExpression(
- "{'k_' + d : d for d in ['a', 'b']}", ImmutableMap.of("k_a", "a", "k_b", "b"))
- .testExpression(
- "{'k_' + e : 'v_' + e for e in ['a', 'b']}",
- ImmutableMap.of("k_a", "v_a", "k_b", "v_b"))
- .testExpression("{x+y : x*y for x, y in [[2, 3]]}", ImmutableMap.of(5, 6));
- }
-
- @Test
- public void testDictComprehensionOnNonIterable() throws Exception {
- ev.new Scenario().testIfExactError("type 'int' is not iterable", "{k : k for k in 3}");
- }
-
- @Test
- public void testDictComprehension_manyClauses() throws Exception {
- ev.new Scenario()
- .testExpression(
- "{x : x * y for x in range(1, 10) if x % 2 == 0 for y in range(1, 10) if y == x}",
- ImmutableMap.of(2, 4, 4, 16, 6, 36, 8, 64));
- }
-
- @Test
- public void testDictComprehensions_multipleKey() throws Exception {
- ev.new Scenario()
- .testExpression("{x : x for x in [1, 2, 1]}", ImmutableMap.of(1, 1, 2, 2))
- .testExpression(
- "{y : y for y in ['ab', 'c', 'a' + 'b']}", ImmutableMap.of("ab", "ab", "c", "c"));
- }
-
- @Test
- public void testListConcatenation() throws Exception {
- ev.new Scenario()
- .testExpression("[1, 2] + [3, 4]", StarlarkList.of(null, 1, 2, 3, 4))
- .testExpression("(1, 2) + (3, 4)", Tuple.of(1, 2, 3, 4))
- .testIfExactError("unsupported binary operation: list + tuple", "[1, 2] + (3, 4)")
- .testIfExactError("unsupported binary operation: tuple + list", "(1, 2) + [3, 4]");
- }
-
- @Test
- public void testListMultiply() throws Exception {
- Mutability mu = Mutability.create("test");
- ev.new Scenario()
- .testExpression("[1, 2, 3] * 1", StarlarkList.of(mu, 1, 2, 3))
- .testExpression("[1, 2] * 2", StarlarkList.of(mu, 1, 2, 1, 2))
- .testExpression("[1, 2] * 3", StarlarkList.of(mu, 1, 2, 1, 2, 1, 2))
- .testExpression("[1, 2] * 4", StarlarkList.of(mu, 1, 2, 1, 2, 1, 2, 1, 2))
- .testExpression("[8] * 5", StarlarkList.of(mu, 8, 8, 8, 8, 8))
- .testExpression("[ ] * 10", StarlarkList.empty())
- .testExpression("[1, 2] * 0", StarlarkList.empty())
- .testExpression("[1, 2] * -4", StarlarkList.empty())
- .testExpression("2 * [1, 2]", StarlarkList.of(mu, 1, 2, 1, 2))
- .testExpression("10 * []", StarlarkList.empty())
- .testExpression("0 * [1, 2]", StarlarkList.empty())
- .testExpression("-4 * [1, 2]", StarlarkList.empty());
- }
-
- @Test
- public void testTupleMultiply() throws Exception {
- ev.new Scenario()
- .testExpression("(1, 2, 3) * 1", Tuple.of(1, 2, 3))
- .testExpression("(1, 2) * 2", Tuple.of(1, 2, 1, 2))
- .testExpression("(1, 2) * 3", Tuple.of(1, 2, 1, 2, 1, 2))
- .testExpression("(1, 2) * 4", Tuple.of(1, 2, 1, 2, 1, 2, 1, 2))
- .testExpression("(8,) * 5", Tuple.of(8, 8, 8, 8, 8))
- .testExpression("( ) * 10", Tuple.empty())
- .testExpression("(1, 2) * 0", Tuple.empty())
- .testExpression("(1, 2) * -4", Tuple.empty())
- .testExpression("2 * (1, 2)", Tuple.of(1, 2, 1, 2))
- .testExpression("10 * ()", Tuple.empty())
- .testExpression("0 * (1, 2)", Tuple.empty())
- .testExpression("-4 * (1, 2)", Tuple.empty());
- }
-
- @Test
- public void testListComprehensionFailsOnNonSequence() throws Exception {
- ev.new Scenario().testIfErrorContains("type 'int' is not iterable", "[x + 1 for x in 123]");
- }
-
- @Test
- public void testListComprehensionOnStringIsForbidden() throws Exception {
- ev.new Scenario().testIfErrorContains("type 'string' is not iterable", "[x for x in 'abc']");
- }
-
- @Test
- public void testInvalidAssignment() throws Exception {
- ev.new Scenario().testIfErrorContains("cannot assign to 'x + 1'", "x + 1 = 2");
- }
-
- @Test
- public void testListComprehensionOnDictionary() throws Exception {
- ev.new Scenario().testExactOrder("['var_' + n for n in {'a':1,'b':2}]", "var_a", "var_b");
- }
-
- @Test
- public void testListComprehensionOnDictionaryCompositeExpression() throws Exception {
- ev.new Scenario()
- .setUp("d = {1:'a',2:'b'}", "l = [d[x] for x in d]")
- .testLookup("l", StarlarkList.of(null, "a", "b"));
- }
-
- @Test
- public void testListComprehensionUpdate() throws Exception {
- ev.new Scenario()
- .setUp("xs = [1, 2, 3]")
- .testIfErrorContains(
- "list value is temporarily immutable due to active for-loop iteration",
- "[xs.append(4) for x in xs]");
- }
-
- @Test
- public void testNestedListComprehensionUpdate() throws Exception {
- ev.new Scenario()
- .setUp("xs = [1, 2, 3]")
- .testIfErrorContains(
- "list value is temporarily immutable due to active for-loop iteration",
- "[xs.append(4) for x in xs for y in xs]");
- }
-
- @Test
- public void testListComprehensionUpdateInClause() throws Exception {
- ev.new Scenario()
- .setUp("xs = [1, 2, 3]")
- .testIfErrorContains(
- "list value is temporarily immutable due to active for-loop iteration",
- // Use short-circuiting to produce valid output in the event
- // the exception is not raised.
- "[y for x in xs for y in (xs.append(4) or xs)]");
- }
-
- @Test
- public void testDictComprehensionUpdate() throws Exception {
- ev.new Scenario()
- .setUp("xs = {1:1, 2:2, 3:3}")
- .testIfErrorContains(
- "dict value is temporarily immutable due to active for-loop iteration",
- "[xs.popitem() for x in xs]");
- }
-
- @Test
- public void testListComprehensionScope() throws Exception {
- // Test list comprehension creates a scope, so outer variables kept unchanged
- ev.new Scenario()
- .setUp("x = 1", "l = [x * 3 for x in [2]]", "y = x")
- .testEval("y", "1")
- .testEval("l", "[6]");
- }
-
- @Test
- public void testInOperator() throws Exception {
- ev.new Scenario()
- .testExpression("'b' in ['a', 'b']", Boolean.TRUE)
- .testExpression("'c' in ['a', 'b']", Boolean.FALSE)
- .testExpression("'b' in ('a', 'b')", Boolean.TRUE)
- .testExpression("'c' in ('a', 'b')", Boolean.FALSE)
- .testExpression("'b' in {'a' : 1, 'b' : 2}", Boolean.TRUE)
- .testExpression("'c' in {'a' : 1, 'b' : 2}", Boolean.FALSE)
- .testExpression("1 in {'a' : 1, 'b' : 2}", Boolean.FALSE)
- .testExpression("'b' in 'abc'", Boolean.TRUE)
- .testExpression("'d' in 'abc'", Boolean.FALSE);
- }
-
- @Test
- public void testNotInOperator() throws Exception {
- ev.new Scenario()
- .testExpression("'b' not in ['a', 'b']", Boolean.FALSE)
- .testExpression("'c' not in ['a', 'b']", Boolean.TRUE)
- .testExpression("'b' not in ('a', 'b')", Boolean.FALSE)
- .testExpression("'c' not in ('a', 'b')", Boolean.TRUE)
- .testExpression("'b' not in {'a' : 1, 'b' : 2}", Boolean.FALSE)
- .testExpression("'c' not in {'a' : 1, 'b' : 2}", Boolean.TRUE)
- .testExpression("1 not in {'a' : 1, 'b' : 2}", Boolean.TRUE)
- .testExpression("'b' not in 'abc'", Boolean.FALSE)
- .testExpression("'d' not in 'abc'", Boolean.TRUE);
- }
-
- @Test
- public void testInFail() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "'in <string>' requires string as left operand, not 'int'", "1 in '123'")
- .testIfErrorContains("unsupported binary operation: string in int", "'a' in 1");
- }
-
- @Test
- public void testInCompositeForPrecedence() throws Exception {
- ev.new Scenario().testExpression("not 'a' in ['a'] or 0", 0);
- }
-
- private static StarlarkValue createObjWithStr() {
- return new StarlarkValue() {
- @Override
- public void repr(Printer printer) {
- printer.append("<str marker>");
- }
- };
- }
-
- @Test
- public void testPercentOnObjWithStr() throws Exception {
- ev.new Scenario()
- .update("obj", createObjWithStr())
- .testExpression("'%s' % obj", "<str marker>");
- }
-
- private static class Dummy implements StarlarkValue {}
-
- @Test
- public void testStringRepresentationsOfArbitraryObjects() throws Exception {
- String dummy = "<unknown object com.google.devtools.build.lib.syntax.EvaluationTest$Dummy>";
- ev.new Scenario()
- .update("dummy", new Dummy())
- .testExpression("str(dummy)", dummy)
- .testExpression("repr(dummy)", dummy)
- .testExpression("'{}'.format(dummy)", dummy)
- .testExpression("'%s' % dummy", dummy)
- .testExpression("'%r' % dummy", dummy);
- }
-
- @Test
- public void testPercentOnTupleOfDummyValues() throws Exception {
- ev.new Scenario()
- .update("obj", createObjWithStr())
- .testExpression("'%s %s' % (obj, obj)", "<str marker> <str marker>");
- ev.new Scenario()
- .update("unknown", new Dummy())
- .testExpression(
- "'%s %s' % (unknown, unknown)",
- "<unknown object com.google.devtools.build.lib.syntax.EvaluationTest$Dummy> <unknown"
- + " object com.google.devtools.build.lib.syntax.EvaluationTest$Dummy>");
- }
-
- @Test
- public void testPercOnObjectInvalidFormat() throws Exception {
- ev.new Scenario()
- .update("obj", createObjWithStr())
- .testIfExactError("invalid argument <str marker> for format pattern %d", "'%d' % obj");
- }
-
- @Test
- public void testDictKeys() throws Exception {
- ev.new Scenario().testExactOrder("{'a': 1}.keys() + ['b', 'c']", "a", "b", "c");
- }
-
- @Test
- public void testDictKeysTooManyArgs() throws Exception {
- ev.new Scenario()
- .testIfExactError("keys() got unexpected positional argument", "{'a': 1}.keys('abc')");
- }
-
- @Test
- public void testDictKeysTooManyKeyArgs() throws Exception {
- ev.new Scenario()
- .testIfExactError(
- "keys() got unexpected keyword argument 'arg'", "{'a': 1}.keys(arg='abc')");
- }
-
- @Test
- public void testDictKeysDuplicateKeyArgs() throws Exception {
- // f(a=1, a=2) is caught statically by the resolver.
- ev.new Scenario()
- .testIfExactError(
- "int() got multiple values for argument 'base'", "int('1', base=10, **dict(base=16))");
- }
-
- @Test
- public void testArgBothPosKey() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "int() got multiple values for argument 'base'", "int('2', 3, base=3)");
- }
-
- @Test
- public void testStaticNameResolution() throws Exception {
- ev.new Scenario().testIfErrorContains("name 'foo' is not defined", "[foo for x in []]");
- }
-
- @Test
- public void testExec() throws Exception {
- ParserInput input =
- ParserInput.fromLines(
- "# a file in the build language",
- "",
- "x = [1, 2, 'foo', 4] + [1, 2, \"%s%d\" % ('foo', 1)]");
- Module module = Module.create();
- try (Mutability mu = Mutability.create("test")) {
- StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
- Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
- }
- assertThat(module.getGlobal("x"))
- .isEqualTo(StarlarkList.of(/*mutability=*/ null, 1, 2, "foo", 4, 1, 2, "foo1"));
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTestCase.java
deleted file mode 100644
index c530f3f..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTestCase.java
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2006 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableMap;
-import java.util.LinkedList;
-import java.util.List;
-
-/** Helper class for tests that evaluate Starlark code. */
-// TODO(adonovan): simplify this class out of existence.
-// Most of its callers should be using the script-based test harness in net.starlark.java.eval.
-// TODO(adonovan): extended only by StarlarkFlagGuardingTest; specialize that one test instead.
-class EvaluationTestCase {
-
- private StarlarkSemantics semantics = StarlarkSemantics.DEFAULT;
- private StarlarkThread thread = null; // created lazily by getStarlarkThread
- private Module module = null; // created lazily by getModule
-
- /**
- * Updates the semantics used to filter predeclared bindings, and carried by subsequently created
- * threads. Causes a new StarlarkThread and Module to be created when next needed.
- */
- private final void setSemantics(StarlarkSemantics semantics) {
- this.semantics = semantics;
-
- // Re-initialize the thread and module with the new semantics when needed.
- this.thread = null;
- this.module = null;
- }
-
- // TODO(adonovan): don't let subclasses inherit vaguely specified "helpers".
- // Separate all the tests clearly into tests of the scanner, parser, resolver,
- // and evaluation.
-
- /** Updates a global binding in the module. */
- // TODO(adonovan): rename setGlobal.
- final EvaluationTestCase update(String varname, Object value) throws Exception {
- getModule().setGlobal(varname, value);
- return this;
- }
-
- /** Returns the value of a global binding in the module. */
- // TODO(adonovan): rename getGlobal.
- final Object lookup(String varname) throws Exception {
- return getModule().getGlobal(varname);
- }
-
- /** Joins the lines, parses them as an expression, and evaluates it. */
- final Object eval(String... lines) throws Exception {
- ParserInput input = ParserInput.fromLines(lines);
- return Starlark.eval(input, FileOptions.DEFAULT, getModule(), getStarlarkThread());
- }
-
- /** Joins the lines, parses them as a file, and executes it. */
- final void exec(String... lines)
- throws SyntaxError.Exception, EvalException, InterruptedException {
- ParserInput input = ParserInput.fromLines(lines);
- Starlark.execFile(input, FileOptions.DEFAULT, getModule(), getStarlarkThread());
- }
-
- // A hook for subclasses to alter the created module.
- // Implementations may add to the predeclared environment,
- // and return the module's client data value.
- // TODO(adonovan): only used in StarlarkFlagGuardingTest; move there.
- protected Object newModuleHook(ImmutableMap.Builder<String, Object> predeclared) {
- return null; // no client data
- }
-
- private StarlarkThread getStarlarkThread() {
- if (this.thread == null) {
- Mutability mu = Mutability.create("test");
- this.thread = new StarlarkThread(mu, semantics);
- }
- return this.thread;
- }
-
- private Module getModule() {
- if (this.module == null) {
- ImmutableMap.Builder<String, Object> predeclared = ImmutableMap.builder();
- newModuleHook(predeclared); // see StarlarkFlagGuardingTest
- this.module = Module.withPredeclared(semantics, predeclared.build());
- }
- return this.module;
- }
-
- final void checkEvalError(String msg, String... input) throws Exception {
- try {
- exec(input);
- fail("Expected error '" + msg + "' but got no error");
- } catch (SyntaxError.Exception | EvalException e) {
- assertThat(e).hasMessageThat().isEqualTo(msg);
- }
- }
-
- final void checkEvalErrorContains(String msg, String... input) throws Exception {
- try {
- exec(input);
- fail("Expected error containing '" + msg + "' but got no error");
- } catch (SyntaxError.Exception | EvalException e) {
- assertThat(e).hasMessageThat().contains(msg);
- }
- }
-
- final void checkEvalErrorDoesNotContain(String msg, String... input) throws Exception {
- try {
- exec(input);
- } catch (SyntaxError.Exception | EvalException e) {
- assertThat(e).hasMessageThat().doesNotContain(msg);
- }
- }
-
- /** Encapsulates a separate test which can be executed by a Scenario. */
- private interface Testable {
- void run() throws Exception;
- }
-
- /**
- * A test scenario (a script of steps). Beware: Scenario is an inner class that mutates its
- * enclosing EvaluationTestCase as it executes the script.
- */
- final class Scenario {
- private final SetupActions setup = new SetupActions();
- private final StarlarkSemantics semantics;
-
- Scenario() {
- this(StarlarkSemantics.DEFAULT);
- }
-
- Scenario(StarlarkSemantics semantics) {
- this.semantics = semantics;
- }
-
- private void run(Testable testable) throws Exception {
- EvaluationTestCase.this.setSemantics(semantics);
- testable.run();
- }
-
- /** Allows the execution of several statements before each following test. */
- Scenario setUp(String... lines) {
- setup.registerExec(lines);
- return this;
- }
-
- /**
- * Allows the update of the specified variable before each following test
- *
- * @param name The name of the variable that should be updated
- * @param value The new value of the variable
- * @return This {@code Scenario}
- */
- Scenario update(String name, Object value) {
- setup.registerUpdate(name, value);
- return this;
- }
-
- /**
- * Evaluates two expressions and asserts that their results are equal.
- *
- * @param src The source expression to be evaluated
- * @param expectedEvalString The expression of the expected result
- * @return This {@code Scenario}
- * @throws Exception
- */
- Scenario testEval(String src, String expectedEvalString) throws Exception {
- runTest(createComparisonTestable(src, expectedEvalString, true));
- return this;
- }
-
- /** Evaluates an expression and compares its result to the expected object. */
- Scenario testExpression(String src, Object expected) throws Exception {
- runTest(createComparisonTestable(src, expected, false));
- return this;
- }
-
- /** Evaluates an expression and compares its result to the ordered list of expected objects. */
- Scenario testExactOrder(String src, Object... items) throws Exception {
- runTest(collectionTestable(src, items));
- return this;
- }
-
- /** Evaluates an expression and checks whether it fails with the expected error. */
- Scenario testIfExactError(String expectedError, String... lines) throws Exception {
- runTest(errorTestable(true, expectedError, lines));
- return this;
- }
-
- /** Evaluates the expresson and checks whether it fails with the expected error. */
- Scenario testIfErrorContains(String expectedError, String... lines) throws Exception {
- runTest(errorTestable(false, expectedError, lines));
- return this;
- }
-
- /** Looks up the value of the specified variable and compares it to the expected value. */
- Scenario testLookup(String name, Object expected) throws Exception {
- runTest(createLookUpTestable(name, expected));
- return this;
- }
-
- /**
- * Creates a Testable that checks whether the evaluation of the given expression fails with the
- * expected error.
- *
- * @param exactMatch whether the error message must be identical to the expected error.
- */
- private Testable errorTestable(
- final boolean exactMatch, final String error, final String... lines) {
- return new Testable() {
- @Override
- public void run() throws Exception {
- if (exactMatch) {
- checkEvalError(error, lines);
- } else {
- checkEvalErrorContains(error, lines);
- }
- }
- };
- }
-
- /**
- * Creates a Testable that checks whether the value of the expression is a sequence containing
- * the expected elements.
- */
- private Testable collectionTestable(final String src, final Object... expected) {
- return new Testable() {
- @Override
- public void run() throws Exception {
- assertThat((Iterable<?>) eval(src)).containsExactly(expected).inOrder();
- }
- };
- }
-
- /**
- * Creates a testable that compares the value of the expression to a specified result.
- *
- * @param src The expression to be evaluated
- * @param expected Either the expected object or an expression whose evaluation leads to the
- * expected object
- * @param expectedIsExpression Signals whether {@code expected} is an object or an expression
- * @return An instance of Testable that runs the comparison
- */
- private Testable createComparisonTestable(
- final String src, final Object expected, final boolean expectedIsExpression) {
- return new Testable() {
- @Override
- public void run() throws Exception {
- Object actual = eval(src);
- Object realExpected = expected;
-
- // We could also print the actual object and compare the string to the expected
- // expression, but then the order of elements would matter.
- if (expectedIsExpression) {
- realExpected = eval((String) expected);
- }
-
- assertThat(actual).isEqualTo(realExpected);
- }
- };
- }
-
- /**
- * Creates a Testable that looks up the given variable and compares its value to the expected
- * value
- *
- * @param name
- * @param expected
- * @return An instance of Testable that does both lookup and comparison
- */
- private Testable createLookUpTestable(final String name, final Object expected) {
- return new Testable() {
- @Override
- public void run() throws Exception {
- assertThat(lookup(name)).isEqualTo(expected);
- }
- };
- }
-
- /**
- * Executes the given Testable
- * @param testable
- * @throws Exception
- */
- protected void runTest(Testable testable) throws Exception {
- run(new TestableDecorator(setup, testable));
- }
- }
-
- /**
- * A simple decorator that allows the execution of setup actions before running a {@code Testable}
- */
- static final class TestableDecorator implements Testable {
- private final SetupActions setup;
- private final Testable decorated;
-
- TestableDecorator(SetupActions setup, Testable decorated) {
- this.setup = setup;
- this.decorated = decorated;
- }
-
- /**
- * Executes all stored actions and updates plus the actual {@code Testable}
- */
- @Override
- public void run() throws Exception {
- setup.executeAll();
- decorated.run();
- }
- }
-
- /** A container for collection actions that should be executed before a test */
- private final class SetupActions {
- private List<Testable> setup;
-
- SetupActions() {
- setup = new LinkedList<>();
- }
-
- /**
- * Registers an update to a module variable to be bound before a test
- *
- * @param name
- * @param value
- */
- void registerUpdate(final String name, final Object value) {
- setup.add(
- new Testable() {
- @Override
- public void run() throws Exception {
- EvaluationTestCase.this.update(name, value);
- }
- });
- }
-
- /** Registers a sequence of statements for execution prior to a test. */
- void registerExec(final String... lines) {
- setup.add(
- new Testable() {
- @Override
- public void run() throws Exception {
- EvaluationTestCase.this.exec(lines);
- }
- });
- }
-
- /**
- * Executes all stored actions and updates
- *
- * @throws Exception
- */
- void executeAll() throws Exception {
- for (Testable testable : setup) {
- testable.run();
- }
- }
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/Examples.java b/src/test/java/com/google/devtools/build/lib/syntax/Examples.java
deleted file mode 100644
index e64d519..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/Examples.java
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2020 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import java.io.IOException;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.StarlarkGlobalLibrary;
-import net.starlark.java.annot.StarlarkMethod;
-
-/**
- * Examples of typical API usage of the Starlark interpreter.<br>
- * This is not a test, but it is checked by the compiler.
- */
-final class Examples {
-
- /**
- * This example reads, parses, compiles, and executes a Starlark file. It returns the module,
- * which holds the values of global variables.
- */
- Module execFile(String filename)
- throws IOException, SyntaxError.Exception, EvalException, InterruptedException {
- // Read input from the named file.
- ParserInput input = ParserInput.readFile(filename);
-
- // Create the module that will be populated by executing the file.
- // It holds the global variables, initially empty.
- // Its predeclared environment defines only the standard builtins:
- // None, True, len, and so on.
- Module module = Module.create();
-
- // Resolve, compile, and execute the file.
- //
- // The Mutability will be associated with all the values created by this thread.
- // The try-with-resources statement ensures that all values become frozen
- // after execution.
- try (Mutability mu = Mutability.create(input.getFile())) {
- StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
- Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
- }
-
- return module;
- }
-
- /**
- * This example evaluates a Starlark expression in the specified environment and returns its
- * value.
- */
- Object evalExpr(String expr, ImmutableMap<String, Object> env)
- throws SyntaxError.Exception, EvalException, InterruptedException {
- // The apparent file name (for error messages) will be "<expr>".
- ParserInput input = ParserInput.fromString(expr, "<expr>");
-
- // Create the module in which the expression is evaluated.
- // It may define additional predeclared environment bindings.
- Module module = Module.withPredeclared(StarlarkSemantics.DEFAULT, env);
-
- // Resolve, compile, and execute the expression.
- try (Mutability mu = Mutability.create(input.getFile())) {
- StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
- return Starlark.eval(input, FileOptions.DEFAULT, module, thread);
- }
- }
-
- /**
- * This advanced example reads, parses, and compiles a Starlark file to a Program, then later
- * executes it.
- */
- Module compileThenExecute()
- throws IOException, SyntaxError.Exception, EvalException, InterruptedException {
- // Read and parse the named file.
- ParserInput input = ParserInput.readFile("my/file.star");
- StarlarkFile file = StarlarkFile.parse(input);
-
- // Compile the program, with additional predeclared environment bindings.
- Program prog = Program.compileFile(file, () -> ImmutableSet.of("zero", "square"));
-
- // . . .
-
- // TODO(adonovan): when supported, show how the compiled program can be
- // saved and reloaded, to avoid repeating the cost of parsing and
- // compilation.
-
- // Execute the compiled program to populate a module.
- // The module's predeclared environment must match the
- // names provided during compilation.
- Module module = Module.withPredeclared(StarlarkSemantics.DEFAULT, makeEnvironment());
- try (Mutability mu = Mutability.create(prog.getFilename())) {
- StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
- Starlark.execFileProgram(prog, module, thread);
- }
- return module;
- }
-
- /** This function shows how to construct a callable Starlark value from a Java method. */
- ImmutableMap<String, Object> makeEnvironment() {
- ImmutableMap.Builder<String, Object> env = ImmutableMap.builder();
- env.put("zero", 0);
- Starlark.addMethods(env, new MyFunctions(), StarlarkSemantics.DEFAULT); // adds 'square'
- return env.build();
- }
-
- /** The methods of this class are accessible from Starlark. */
- @StarlarkGlobalLibrary
- static final class MyFunctions {
- @StarlarkMethod(
- name = "square",
- parameters = {@Param(name = "x", type = int.class)},
- doc = "Returns the square of its integer argument.")
- public int square(int x) {
- return x * x;
- }
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/FileLocationsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/FileLocationsTest.java
deleted file mode 100644
index a129e21..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/FileLocationsTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link FileLocations}. */
-// TODO(adonovan): express this test in terms of the public API.
-@RunWith(JUnit4.class)
-public class FileLocationsTest {
-
- private static FileLocations create(String buffer) {
- return FileLocations.create(buffer.toCharArray(), "/fake/file");
- }
-
- // Asserts that the specified offset results in a line/column pair of the form "1:2".
- private static void checkOffset(FileLocations table, int offset, String wantLineCol) {
- Location loc = table.getLocation(offset);
- String got = String.format("%d:%d", loc.line(), loc.column());
- if (!got.equals(wantLineCol)) {
- throw new AssertionError(
- String.format("location(%d) = %s, want %s", offset, got, wantLineCol));
- }
- }
-
- @Test
- public void testEmpty() {
- FileLocations table = create("");
- checkOffset(table, 0, "1:1");
- }
-
- @Test
- public void testNewline() {
- FileLocations table = create("\n");
- checkOffset(table, 0, "1:1");
- checkOffset(table, 1, "2:1"); // EOF
- }
-
- @Test
- public void testOneLiner() {
- FileLocations table = create("foo");
- checkOffset(table, 0, "1:1");
- checkOffset(table, 1, "1:2");
- checkOffset(table, 2, "1:3");
- checkOffset(table, 3, "1:4"); // EOF
- }
-
- @Test
- public void testMultiLiner() {
- FileLocations table = create("\ntwo\nthree\n\nfive\n");
-
- // \n
- checkOffset(table, 0, "1:1");
-
- // two\n
- checkOffset(table, 1, "2:1");
- checkOffset(table, 2, "2:2");
- checkOffset(table, 3, "2:3");
- checkOffset(table, 4, "2:4");
-
- // three\n
- checkOffset(table, 5, "3:1");
- checkOffset(table, 10, "3:6");
-
- // \n
- checkOffset(table, 11, "4:1");
-
- // five\n
- checkOffset(table, 12, "5:1");
- checkOffset(table, 16, "5:5");
-
- // start of final empty line
- checkOffset(table, 17, "6:1"); // EOF
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
deleted file mode 100644
index d89e600..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
+++ /dev/null
@@ -1,571 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** A test class for functions and scoping. */
-@RunWith(JUnit4.class)
-public final class FunctionTest {
-
- private final EvaluationTestCase ev = new EvaluationTestCase();
-
- @Test
- public void testDef() throws Exception {
- ev.exec("def f(a, b=1, *args, c, d=2, **kwargs): pass");
- StarlarkFunction f = (StarlarkFunction) ev.lookup("f");
- assertThat(f).isNotNull();
- assertThat(f.getName()).isEqualTo("f");
- assertThat(f.getParameterNames())
- .containsExactly("a", "b", "c", "d", "args", "kwargs")
- .inOrder();
- assertThat(f.hasVarargs()).isTrue();
- assertThat(f.hasKwargs()).isTrue();
- assertThat(getDefaults(f)).containsExactly(null, 1, null, 2, null, null).inOrder();
-
- // same, sans varargs
- ev.exec("def g(a, b=1, *, c, d=2, **kwargs): pass");
- StarlarkFunction g = (StarlarkFunction) ev.lookup("g");
- assertThat(g.getParameterNames()).containsExactly("a", "b", "c", "d", "kwargs").inOrder();
- assertThat(g.hasVarargs()).isFalse();
- assertThat(g.hasKwargs()).isTrue();
- assertThat(getDefaults(g)).containsExactly(null, 1, null, 2, null).inOrder();
- }
-
- private static List<Object> getDefaults(StarlarkFunction fn) {
- List<Object> defaults = new ArrayList<>();
- for (int i = 0; i < fn.getParameterNames().size(); i++) {
- defaults.add(fn.getDefaultValue(i));
- }
- return defaults;
- }
-
- @Test
- public void testFunctionDefCallOuterFunc() throws Exception {
- List<Object> params = new ArrayList<>();
- createOuterFunction(params);
- ev.exec(
- "def func(a):", //
- " outer_func(a)",
- "func(1)",
- "func(2)");
- assertThat(params).containsExactly(1, 2).inOrder();
- }
-
- private void createOuterFunction(final List<Object> params) throws Exception {
- StarlarkCallable outerFunc =
- new StarlarkCallable() {
- @Override
- public String getName() {
- return "outer_func";
- }
-
- @Override
- public NoneType call(
- StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs)
- throws EvalException {
- params.addAll(args);
- return Starlark.NONE;
- }
- };
- ev.update("outer_func", outerFunc);
- }
-
- @Test
- public void testFunctionDefNoEffectOutsideScope() throws Exception {
- ev.update("a", 1);
- ev.exec(
- "def func():", //
- " a = 2",
- "func()\n");
- assertThat(ev.lookup("a")).isEqualTo(1);
- }
-
- @Test
- public void testFunctionDefGlobalVaribleReadInFunction() throws Exception {
- ev.exec(
- "a = 1", //
- "def func():",
- " b = a",
- " return b",
- "c = func()\n");
- assertThat(ev.lookup("c")).isEqualTo(1);
- }
-
- @Test
- public void testFunctionDefLocalGlobalScope() throws Exception {
- ev.exec(
- "a = 1", //
- "def func():",
- " a = 2",
- " b = a",
- " return b",
- "c = func()\n");
- assertThat(ev.lookup("c")).isEqualTo(2);
- }
-
- @Test
- public void testFunctionDefLocalVariableReferencedBeforeAssignment() throws Exception {
- ev.checkEvalErrorContains(
- "local variable 'a' is referenced before assignment.",
- "a = 1",
- "def func():",
- " b = a",
- " a = 2",
- " return b",
- "c = func()\n");
- }
-
- @Test
- public void testFunctionDefLocalVariableReferencedInCallBeforeAssignment() throws Exception {
- ev.checkEvalErrorContains(
- "local variable 'a' is referenced before assignment.",
- "def dummy(x):",
- " pass",
- "a = 1",
- "def func():",
- " dummy(a)",
- " a = 2",
- "func()\n");
- }
-
- @Test
- public void testFunctionDefLocalVariableReferencedAfterAssignment() throws Exception {
- ev.exec(
- "a = 1", //
- "def func():",
- " a = 2",
- " b = a",
- " a = 3",
- " return b",
- "c = func()\n");
- assertThat(ev.lookup("c")).isEqualTo(2);
- }
-
- @SuppressWarnings("unchecked")
- @Test
- public void testStarlarkGlobalComprehensionIsAllowed() throws Exception {
- ev.exec("a = [i for i in [1, 2, 3]]\n");
- assertThat((Iterable<Object>) ev.lookup("a")).containsExactly(1, 2, 3).inOrder();
- }
-
- @Test
- public void testFunctionReturn() throws Exception {
- ev.exec(
- "def func():", //
- " return 2",
- "b = func()\n");
- assertThat(ev.lookup("b")).isEqualTo(2);
- }
-
- @Test
- public void testFunctionReturnFromALoop() throws Exception {
- ev.exec(
- "def func():", //
- " for i in [1, 2, 3, 4, 5]:",
- " return i",
- "b = func()\n");
- assertThat(ev.lookup("b")).isEqualTo(1);
- }
-
- @Test
- public void testFunctionExecutesProperly() throws Exception {
- ev.exec(
- "def func(a):",
- " b = 1",
- " if a:",
- " b = 2",
- " return b",
- "c = func(0)",
- "d = func(1)\n");
- assertThat(ev.lookup("c")).isEqualTo(1);
- assertThat(ev.lookup("d")).isEqualTo(2);
- }
-
- @Test
- public void testFunctionCallFromFunction() throws Exception {
- final List<Object> params = new ArrayList<>();
- createOuterFunction(params);
- ev.exec(
- "def func2(a):",
- " outer_func(a)",
- "def func1(b):",
- " func2(b)",
- "func1(1)",
- "func1(2)\n");
- assertThat(params).containsExactly(1, 2).inOrder();
- }
-
- @Test
- public void testFunctionCallFromFunctionReadGlobalVar() throws Exception {
- ev.exec(
- "a = 1", //
- "def func2():",
- " return a",
- "def func1():",
- " return func2()",
- "b = func1()\n");
- assertThat(ev.lookup("b")).isEqualTo(1);
- }
-
- @Test
- public void testFunctionParamCanShadowGlobalVarAfterGlobalVarIsRead() throws Exception {
- ev.exec(
- "a = 1",
- "def func2(a):",
- " return 0",
- "def func1():",
- " dummy = a",
- " return func2(2)",
- "b = func1()\n");
- assertThat(ev.lookup("b")).isEqualTo(0);
- }
-
- @Test
- public void testSingleLineFunction() throws Exception {
- ev.exec(
- "def func(): return 'a'", //
- "s = func()\n");
- assertThat(ev.lookup("s")).isEqualTo("a");
- }
-
- @Test
- public void testFunctionReturnsDictionary() throws Exception {
- ev.exec(
- "def func(): return {'a' : 1}", //
- "d = func()",
- "a = d['a']\n");
- assertThat(ev.lookup("a")).isEqualTo(1);
- }
-
- @Test
- public void testFunctionReturnsList() throws Exception {
- ev.exec(
- "def func(): return [1, 2, 3]", //
- "d = func()",
- "a = d[1]\n");
- assertThat(ev.lookup("a")).isEqualTo(2);
- }
-
- @Test
- public void testFunctionNameAliasing() throws Exception {
- ev.exec(
- "def func(a):", //
- " return a + 1",
- "alias = func",
- "r = alias(1)");
- assertThat(ev.lookup("r")).isEqualTo(2);
- }
-
- @Test
- public void testCallingFunctionsWithMixedModeArgs() throws Exception {
- ev.exec(
- "def func(a, b, c):", //
- " return a + b + c",
- "v = func(1, c = 2, b = 3)");
- assertThat(ev.lookup("v")).isEqualTo(6);
- }
-
- private String functionWithOptionalArgs() {
- return "def func(a, b = None, c = None):\n"
- + " r = a + 'a'\n"
- + " if b:\n"
- + " r += 'b'\n"
- + " if c:\n"
- + " r += 'c'\n"
- + " return r\n";
- }
-
- @Test
- public void testWhichOptionalArgsAreDefinedForFunctions() throws Exception {
- ev.exec(
- functionWithOptionalArgs(),
- "v1 = func('1', 1, 1)",
- "v2 = func(b = 2, a = '2', c = 2)",
- "v3 = func('3')",
- "v4 = func('4', c = 1)\n");
- assertThat(ev.lookup("v1")).isEqualTo("1abc");
- assertThat(ev.lookup("v2")).isEqualTo("2abc");
- assertThat(ev.lookup("v3")).isEqualTo("3a");
- assertThat(ev.lookup("v4")).isEqualTo("4ac");
- }
-
- @Test
- public void testDefaultArguments() throws Exception {
- ev.exec(
- "def func(a, b = 'b', c = 'c'):",
- " return a + b + c",
- "v1 = func('a', 'x', 'y')",
- "v2 = func(b = 'x', a = 'a', c = 'y')",
- "v3 = func('a')",
- "v4 = func('a', c = 'y')\n");
- assertThat(ev.lookup("v1")).isEqualTo("axy");
- assertThat(ev.lookup("v2")).isEqualTo("axy");
- assertThat(ev.lookup("v3")).isEqualTo("abc");
- assertThat(ev.lookup("v4")).isEqualTo("aby");
- }
-
- @Test
- public void testDefaultArgumentsInsufficientArgNum() throws Exception {
- ev.checkEvalError(
- "func() missing 1 required positional argument: a",
- "def func(a, b = 'b', c = 'c'):",
- " return a + b + c",
- "func()");
- }
-
- @Test
- public void testArgsIsNotIterable() throws Exception {
- ev.checkEvalError(
- "argument after * must be an iterable, not int",
- "def func1(a, b): return a + b",
- "func1('a', *42)");
-
- ev.checkEvalError(
- "argument after * must be an iterable, not string",
- "def func2(a, b): return a + b",
- "func2('a', *'str')");
- }
-
- @Test
- public void testKeywordOnly() throws Exception {
- ev.checkEvalError(
- "func() missing 1 required keyword-only argument: b", //
- "def func(a, *, b): pass",
- "func(5)");
-
- ev.checkEvalError(
- "func() accepts no more than 1 positional argument but got 2",
- "def func(a, *, b): pass",
- "func(5, 6)");
-
- ev.exec("def func(a, *, b, c = 'c'): return a + b + c");
- assertThat(ev.eval("func('a', b = 'b')")).isEqualTo("abc");
- assertThat(ev.eval("func('a', b = 'b', c = 'd')")).isEqualTo("abd");
- }
-
- @Test
- public void testStarArgsAndKeywordOnly() throws Exception {
- ev.checkEvalError(
- "func() missing 1 required keyword-only argument: b",
- "def func(a, *args, b): pass",
- "func(5)");
-
- ev.checkEvalError(
- "func() missing 1 required keyword-only argument: b",
- "def func(a, *args, b): pass",
- "func(5, 6)");
-
- ev.exec("def func(a, *args, b, c = 'c'): return a + str(args) + b + c");
- assertThat(ev.eval("func('a', b = 'b')")).isEqualTo("a()bc");
- assertThat(ev.eval("func('a', b = 'b', c = 'd')")).isEqualTo("a()bd");
- assertThat(ev.eval("func('a', 1, 2, b = 'b')")).isEqualTo("a(1, 2)bc");
- assertThat(ev.eval("func('a', 1, 2, b = 'b', c = 'd')")).isEqualTo("a(1, 2)bd");
- }
-
- @Test
- public void testCannotPassResidualsByName() throws Exception {
- ev.checkEvalError(
- "f() got unexpected keyword argument: args", "def f(*args): pass", "f(args=[])");
-
- ev.exec("def f(**kwargs): return kwargs");
- assertThat(Starlark.repr(ev.eval("f(kwargs=1)"))).isEqualTo("{\"kwargs\": 1}");
- }
-
- @Test
- public void testKeywordOnlyAfterStarArg() throws Exception {
- ev.checkEvalError(
- "func() missing 1 required keyword-only argument: c",
- "def func(a, *b, c): pass",
- "func(5)");
-
- ev.checkEvalError(
- "func() missing 1 required keyword-only argument: c",
- "def func(a, *b, c): pass",
- "func(5, 6, 7)");
-
- ev.exec("def func(a, *b, c): return a + str(b) + c");
- assertThat(ev.eval("func('a', c = 'c')")).isEqualTo("a()c");
- assertThat(ev.eval("func('a', 1, c = 'c')")).isEqualTo("a(1,)c");
- assertThat(ev.eval("func('a', 1, 2, c = 'c')")).isEqualTo("a(1, 2)c");
- }
-
- @Test
- public void testKwargsBadKey() throws Exception {
- ev.checkEvalError(
- "keywords must be strings, not int", //
- "def func(a, b): return a + b",
- "func('a', **{3: 1})");
- }
-
- @Test
- public void testKwargsIsNotDict() throws Exception {
- ev.checkEvalError(
- "argument after ** must be a dict, not int",
- "def func(a, b): return a + b",
- "func('a', **42)");
- }
-
- @Test
- public void testKwargsCollision() throws Exception {
- ev.checkEvalError(
- "func() got multiple values for parameter 'b'",
- "def func(a, b): return a + b",
- "func('a', 'b', **{'b': 'foo'})");
- }
-
- @Test
- public void testKwargsCollisionWithNamed() throws Exception {
- ev.checkEvalError(
- "func() got multiple values for parameter 'b'",
- "def func(a, b): return a + b",
- "func('a', b = 'b', **{'b': 'foo'})");
- }
-
- @Test
- public void testDefaultArguments2() throws Exception {
- ev.exec(
- "a = 2",
- "def foo(x=a): return x",
- "def bar():",
- " a = 3",
- " return foo()",
- "v = bar()\n");
- assertThat(ev.lookup("v")).isEqualTo(2);
- }
-
- @Test
- public void testMixingPositionalOptional() throws Exception {
- ev.exec(
- "def f(name, value = '', optional = ''):", //
- " return value",
- "v = f('name', 'value')");
- assertThat(ev.lookup("v")).isEqualTo("value");
- }
-
- @Test
- public void testStarArg() throws Exception {
- ev.exec(
- "def f(name, value = '1', optional = '2'): return name + value + optional",
- "v1 = f(*['name', 'value'])",
- "v2 = f('0', *['name', 'value'])",
- "v3 = f('0', optional = '3', *['b'])",
- "v4 = f(name='a', *[])\n");
- assertThat(ev.lookup("v1")).isEqualTo("namevalue2");
- assertThat(ev.lookup("v2")).isEqualTo("0namevalue");
- assertThat(ev.lookup("v3")).isEqualTo("0b3");
- assertThat(ev.lookup("v4")).isEqualTo("a12");
- }
-
- @Test
- public void testStarParam() throws Exception {
- ev.exec(
- "def f(name, value = '1', optional = '2', *rest):",
- " r = name + value + optional + '|'",
- " for x in rest: r += x",
- " return r",
- "v1 = f('a', 'b', 'c', 'd', 'e')",
- "v2 = f('a', optional='b', value='c')",
- "v3 = f('a')");
- assertThat(ev.lookup("v1")).isEqualTo("abc|de");
- assertThat(ev.lookup("v2")).isEqualTo("acb|");
- assertThat(ev.lookup("v3")).isEqualTo("a12|");
- }
-
- @Test
- public void testKwParam() throws Exception {
- ev.exec(
- "def foo(a, b, c=3, d=4, g=7, h=8, *args, **kwargs):\n"
- + " return (a, b, c, d, g, h, args, kwargs)\n"
- + "v1 = foo(1, 2)\n"
- + "v2 = foo(1, h=9, i=0, *['x', 'y', 'z', 't'])\n"
- + "v3 = foo(1, i=0, *[2, 3, 4, 5, 6, 7, 8])\n"
- + "def bar(**kwargs):\n"
- + " return kwargs\n"
- + "b1 = bar(name='foo', type='jpg', version=42).items()\n"
- + "b2 = bar()\n");
-
- assertThat(Starlark.repr(ev.lookup("v1"))).isEqualTo("(1, 2, 3, 4, 7, 8, (), {})");
- assertThat(Starlark.repr(ev.lookup("v2")))
- .isEqualTo("(1, \"x\", \"y\", \"z\", \"t\", 9, (), {\"i\": 0})");
- assertThat(Starlark.repr(ev.lookup("v3"))).isEqualTo("(1, 2, 3, 4, 5, 6, (7, 8), {\"i\": 0})");
- assertThat(Starlark.repr(ev.lookup("b1")))
- .isEqualTo("[(\"name\", \"foo\"), (\"type\", \"jpg\"), (\"version\", 42)]");
- assertThat(Starlark.repr(ev.lookup("b2"))).isEqualTo("{}");
- }
-
- @Test
- public void testTrailingCommas() throws Exception {
- // Test that trailing commas are allowed in function definitions and calls
- // even after last *args or **kwargs expressions, like python3
- ev.exec(
- "def f(*args, **kwargs): pass\n"
- + "v1 = f(1,)\n"
- + "v2 = f(*(1,2),)\n"
- + "v3 = f(a=1,)\n"
- + "v4 = f(**{\"a\": 1},)\n");
-
- assertThat(Starlark.repr(ev.lookup("v1"))).isEqualTo("None");
- assertThat(Starlark.repr(ev.lookup("v2"))).isEqualTo("None");
- assertThat(Starlark.repr(ev.lookup("v3"))).isEqualTo("None");
- assertThat(Starlark.repr(ev.lookup("v4"))).isEqualTo("None");
- }
-
- @Test
- public void testCalls() throws Exception {
- ev.exec("def f(a, b = None): return a, b");
-
- assertThat(Starlark.repr(ev.eval("f(1)"))).isEqualTo("(1, None)");
- assertThat(Starlark.repr(ev.eval("f(1, 2)"))).isEqualTo("(1, 2)");
- assertThat(Starlark.repr(ev.eval("f(a=1)"))).isEqualTo("(1, None)");
- assertThat(Starlark.repr(ev.eval("f(a=1, b=2)"))).isEqualTo("(1, 2)");
- assertThat(Starlark.repr(ev.eval("f(b=2, a=1)"))).isEqualTo("(1, 2)");
-
- ev.checkEvalError(
- "f() missing 1 required positional argument: a", //
- "f()");
- ev.checkEvalError(
- "f() accepts no more than 2 positional arguments but got 3", //
- "f(1, 2, 3)");
- ev.checkEvalError(
- "f() got unexpected keyword arguments: c, d", //
- "f(1, 2, c=3, d=4)");
- ev.checkEvalError(
- "f() missing 1 required positional argument: a", //
- "f(b=2)");
- ev.checkEvalError(
- "f() missing 1 required positional argument: a", //
- "f(b=2)");
- ev.checkEvalError(
- "f() got multiple values for parameter 'a'", //
- "f(2, a=1)");
- ev.checkEvalError(
- "f() got unexpected keyword argument: c", //
- "f(b=2, a=1, c=3)");
-
- ev.exec("def g(*, one, two, three): pass");
- ev.checkEvalError(
- "g() got unexpected keyword argument: tree (did you mean 'three'?)", //
- "g(tree=3)");
- ev.checkEvalError(
- "g() does not accept positional arguments, but got 3", //
- "g(1, 2 ,3)");
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java
deleted file mode 100644
index 425286a..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2006 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import com.google.common.truth.Truth;
-import java.util.Arrays;
-import java.util.Set;
-import java.util.stream.Collectors;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** A test for {@link LValue#boundIdentifiers}()}. */
-@RunWith(JUnit4.class)
-public class LValueBoundNamesTest {
-
- @Test
- public void simpleAssignment() {
- assertBoundNames("x = 1", "x");
- }
-
- @Test
- public void listAssignment() {
- assertBoundNames("x, y = 1", "x", "y");
- }
-
- @Test
- public void complexListAssignment() {
- assertBoundNames("x, [y] = 1", "x", "y");
- }
-
- @Test
- public void arrayElementAssignment() {
- assertBoundNames("x[1] = 1");
- }
-
- @Test
- public void complexListAssignment2() {
- assertBoundNames("[[x], y], [z, w[1]] = 1", "x", "y", "z");
- }
-
- private static void assertBoundNames(String assignment, String... expectedBoundNames) {
- ParserInput input = ParserInput.fromLines(assignment);
- StarlarkFile file = StarlarkFile.parse(input);
- if (!file.ok()) {
- throw new AssertionError(new SyntaxError.Exception(file.errors()));
- }
- Expression lhs = ((AssignmentStatement) file.getStatements().get(0)).getLHS();
- Set<String> boundNames =
- Identifier.boundIdentifiers(lhs).stream()
- .map(Identifier::getName)
- .collect(Collectors.toSet());
- Truth.assertThat(boundNames).containsExactlyElementsIn(Arrays.asList(expectedBoundNames));
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
deleted file mode 100644
index 255f528..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
+++ /dev/null
@@ -1,546 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.base.Joiner;
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests of tokenization behavior of the {@link Lexer}.
- */
-@RunWith(JUnit4.class)
-public class LexerTest {
-
- // TODO(adonovan): make these these tests less unnecessarily stateful.
-
- private final List<SyntaxError> errors = new ArrayList<>();
- private String lastError;
-
- /**
- * Create a lexer which takes input from the specified string. Resets the
- * error handler beforehand.
- */
- private Lexer createLexer(String input) {
- ParserInput inputSource = ParserInput.fromString(input, "/some/path.txt");
- errors.clear();
- lastError = null;
- return new Lexer(inputSource, FileOptions.DEFAULT, errors);
- }
-
- private static class Token {
- TokenKind kind;
- int start;
- int end;
- Object value;
-
- @Override
- public String toString() {
- return kind == TokenKind.STRING
- ? "\"" + value + "\""
- : value == null ? kind.toString() : value.toString();
- }
- }
-
- private ArrayList<Token> allTokens(Lexer lexer) {
- ArrayList<Token> result = new ArrayList<>();
- do {
- lexer.nextToken();
- Token tok = new Token();
- tok.kind = lexer.kind;
- tok.start = lexer.start;
- tok.end = lexer.end;
- tok.value = lexer.value;
- result.add(tok);
- } while (lexer.kind != TokenKind.EOF);
-
- for (SyntaxError error : errors) {
- lastError = error.location().file() + ":" + error.location().line() + ": " + error.message();
- }
-
- return result;
- }
-
- private Token[] tokens(String input) {
- ArrayList<Token> result = allTokens(createLexer(input));
- return result.toArray(new Token[0]);
- }
-
- /**
- * Lexes the specified input string, and returns a string containing just the line numbers of each
- * token.
- */
- private String linenums(String input) {
- Lexer lexer = createLexer(input);
- StringBuilder buf = new StringBuilder();
- for (Token tok : allTokens(lexer)) {
- if (buf.length() > 0) {
- buf.append(' ');
- }
- int line = lexer.locs.getLocation(tok.start).line();
- buf.append(line);
- }
- return buf.toString();
- }
-
- /**
- * Returns a string containing the names of the tokens and their associated
- * values. (String-literals are printed without escaping.)
- */
- private static String values(Token[] tokens) {
- StringBuilder buffer = new StringBuilder();
- for (Token token : tokens) {
- if (buffer.length() > 0) {
- buffer.append(' ');
- }
- buffer.append(token.kind.name());
- if (token.value != null) {
- buffer.append('(').append(token.value).append(')');
- }
- }
- return buffer.toString();
- }
-
- /**
- * Returns a string containing just the names of the tokens.
- */
- private static String names(Token[] tokens) {
- StringBuilder buf = new StringBuilder();
- for (Token tok : tokens) {
- if (buf.length() > 0) {
- buf.append(' ');
- }
- buf.append(tok.kind.name());
- }
- return buf.toString();
- }
-
- /**
- * Returns a string containing just the half-open position intervals of each
- * token. e.g. "[3,4) [4,9)".
- */
- private static String positions(Token[] tokens) {
- StringBuilder buf = new StringBuilder();
- for (Token tok : tokens) {
- if (buf.length() > 0) {
- buf.append(' ');
- }
- buf.append('[').append(tok.start).append(',').append(tok.end).append(')');
- }
- return buf.toString();
- }
-
- @Test
- public void testBasics1() throws Exception {
- assertThat(names(tokens("wiz) "))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
- assertThat(names(tokens("wiz )"))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
- assertThat(names(tokens(" wiz)")))
- .isEqualTo("INDENT IDENTIFIER RPAREN NEWLINE OUTDENT NEWLINE EOF");
- assertThat(names(tokens(" wiz ) ")))
- .isEqualTo("INDENT IDENTIFIER RPAREN NEWLINE OUTDENT NEWLINE EOF");
- assertThat(names(tokens("wiz\t)"))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
- }
-
- @Test
- public void testBasics2() throws Exception {
- assertThat(names(tokens(")"))).isEqualTo("RPAREN NEWLINE EOF");
- assertThat(names(tokens(" )"))).isEqualTo("INDENT RPAREN NEWLINE OUTDENT NEWLINE EOF");
- assertThat(names(tokens(" ) "))).isEqualTo("INDENT RPAREN NEWLINE OUTDENT NEWLINE EOF");
- assertThat(names(tokens(") "))).isEqualTo("RPAREN NEWLINE EOF");
- }
-
- @Test
- public void testBasics3() throws Exception {
- assertThat(names(tokens("123#456\n789"))).isEqualTo("INT NEWLINE INT NEWLINE EOF");
- assertThat(names(tokens("123 #456\n789"))).isEqualTo("INT NEWLINE INT NEWLINE EOF");
- assertThat(names(tokens("123#456 \n789"))).isEqualTo("INT NEWLINE INT NEWLINE EOF");
- assertThat(names(tokens("123#456\n 789")))
- .isEqualTo("INT NEWLINE INDENT INT NEWLINE OUTDENT NEWLINE EOF");
- assertThat(names(tokens("123#456\n789 "))).isEqualTo("INT NEWLINE INT NEWLINE EOF");
- }
-
- @Test
- public void testBasics4() throws Exception {
- assertThat(names(tokens(""))).isEqualTo("NEWLINE EOF");
- assertThat(names(tokens("# foo"))).isEqualTo("NEWLINE EOF");
- assertThat(names(tokens("1 2 3 4"))).isEqualTo("INT INT INT INT NEWLINE EOF");
- assertThat(names(tokens("1.234"))).isEqualTo("INT DOT INT NEWLINE EOF");
- assertThat(names(tokens("foo(bar, wiz)")))
- .isEqualTo("IDENTIFIER LPAREN IDENTIFIER COMMA IDENTIFIER RPAREN " + "NEWLINE EOF");
- }
-
- @Test
- public void testNoWhiteSpaceBetweenTokens() throws Exception {
- assertThat(names(tokens("6or()"))).isEqualTo("INT OR LPAREN RPAREN NEWLINE EOF");
- assertThat(names(tokens("0in(''and[])")))
- .isEqualTo("INT IN LPAREN STRING AND LBRACKET RBRACKET RPAREN NEWLINE EOF");
-
- assertThat(values(tokens("0or()"))).isEqualTo("INT(0) IDENTIFIER(r) LPAREN RPAREN NEWLINE EOF");
- assertThat(lastError).isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 0o");
- }
-
- @Test
- public void testNonAsciiIdentifiers() throws Exception {
- tokens("ümlaut");
- assertThat(lastError.toString()).contains("invalid character: 'ü'");
- tokens("umläut");
- assertThat(lastError.toString()).contains("invalid character: 'ä'");
- }
-
- @Test
- public void testCrLf() throws Exception {
- assertThat(names(tokens("\r\n\r\n"))).isEqualTo("NEWLINE EOF");
- assertThat(names(tokens("\r\n\r1\r\r\n"))).isEqualTo("INT NEWLINE EOF");
- assertThat(names(tokens("# foo\r\n# bar\r\n"))).isEqualTo("NEWLINE EOF");
- }
-
- @Test
- public void testIntegers() throws Exception {
- // Detection of MINUS immediately following integer constant proves we
- // don't consume too many chars.
-
- // decimal
- assertThat(values(tokens("12345-"))).isEqualTo("INT(12345) MINUS NEWLINE EOF");
-
- // octal
- assertThat(values(tokens("0o12345-"))).isEqualTo("INT(5349) MINUS NEWLINE EOF");
- assertThat(values(tokens("0O77"))).isEqualTo("INT(63) NEWLINE EOF");
-
- // octal (bad)
- assertThat(values(tokens("012349-"))).isEqualTo("INT(0) MINUS NEWLINE EOF");
- assertThat(lastError.toString())
- .isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 012349");
-
- assertThat(values(tokens("0o"))).isEqualTo("INT(0) NEWLINE EOF");
- assertThat(lastError.toString())
- .isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 0o");
-
- assertThat(values(tokens("012345"))).isEqualTo("INT(5349) NEWLINE EOF");
- assertThat(lastError.toString())
- .isEqualTo("/some/path.txt:1: invalid octal value `012345`, should be: `0o12345`");
-
- // hexadecimal (uppercase)
- assertThat(values(tokens("0X12345F-"))).isEqualTo("INT(1193055) MINUS NEWLINE EOF");
-
- // hexadecimal (lowercase)
- assertThat(values(tokens("0x12345f-"))).isEqualTo("INT(1193055) MINUS NEWLINE EOF");
-
- // hexadecimal (lowercase) [note: "g" cause termination of token]
- assertThat(values(tokens("0x12345g-"))).isEqualTo("INT(74565) IDENTIFIER(g) MINUS NEWLINE EOF");
- }
-
- @Test
- public void testIntegersAndDot() throws Exception {
- assertThat(values(tokens("1.2345"))).isEqualTo("INT(1) DOT INT(2345) NEWLINE EOF");
-
- assertThat(values(tokens("1.2.345"))).isEqualTo("INT(1) DOT INT(2) DOT INT(345) NEWLINE EOF");
-
- assertThat(values(tokens("1.0E10"))).isEqualTo("INT(1) DOT INT(0) NEWLINE EOF");
- assertThat(lastError.toString())
- .isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 0E10");
-
- assertThat(values(tokens("1.03E-10"))).isEqualTo("INT(1) DOT INT(0) MINUS INT(10) NEWLINE EOF");
- assertThat(lastError.toString())
- .isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 03E");
-
- assertThat(values(tokens(". 123"))).isEqualTo("DOT INT(123) NEWLINE EOF");
- assertThat(values(tokens(".123"))).isEqualTo("DOT INT(123) NEWLINE EOF");
- assertThat(values(tokens(".abc"))).isEqualTo("DOT IDENTIFIER(abc) NEWLINE EOF");
-
- assertThat(values(tokens("foo.123"))).isEqualTo("IDENTIFIER(foo) DOT INT(123) NEWLINE EOF");
- assertThat(values(tokens("foo.bcd")))
- .isEqualTo("IDENTIFIER(foo) DOT IDENTIFIER(bcd) NEWLINE EOF"); // 'b' are hex chars
- assertThat(values(tokens("foo.xyz")))
- .isEqualTo("IDENTIFIER(foo) DOT IDENTIFIER(xyz) NEWLINE EOF");
- }
-
- @Test
- public void testStringDelimiters() throws Exception {
- assertThat(values(tokens("\"foo\""))).isEqualTo("STRING(foo) NEWLINE EOF");
- assertThat(values(tokens("'foo'"))).isEqualTo("STRING(foo) NEWLINE EOF");
- }
-
- @Test
- public void testQuotesInStrings() throws Exception {
- assertThat(values(tokens("'foo\\'bar'"))).isEqualTo("STRING(foo'bar) NEWLINE EOF");
- assertThat(values(tokens("\"foo'bar\""))).isEqualTo("STRING(foo'bar) NEWLINE EOF");
- assertThat(values(tokens("'foo\"bar'"))).isEqualTo("STRING(foo\"bar) NEWLINE EOF");
- assertThat(values(tokens("\"foo\\\"bar\""))).isEqualTo("STRING(foo\"bar) NEWLINE EOF");
- }
-
- @Test
- public void testStringEscapes() throws Exception {
- assertThat(values(tokens("'a\\tb\\nc\\rd'")))
- .isEqualTo("STRING(a\tb\nc\rd) NEWLINE EOF"); // \t \r \n
- assertThat(values(tokens("'x\\hx'")))
- .isEqualTo("STRING(x\\hx) NEWLINE EOF"); // \h is unknown => "\h"
- assertThat(values(tokens("'\\$$'"))).isEqualTo("STRING(\\$$) NEWLINE EOF");
- assertThat(values(tokens("'a\\\nb'")))
- .isEqualTo("STRING(ab) NEWLINE EOF"); // escape end of line
- assertThat(values(tokens("\"ab\\ucd\""))).isEqualTo("STRING(abcd) NEWLINE EOF");
- assertThat(lastError).isEqualTo("/some/path.txt:1: invalid escape sequence: \\u");
- }
-
- @Test
- public void testEscapedCrlfInString() throws Exception {
- assertThat(values(tokens("'a\\\r\nb'"))).isEqualTo("STRING(ab) NEWLINE EOF");
- assertThat(values(tokens("\"a\\\r\nb\""))).isEqualTo("STRING(ab) NEWLINE EOF");
- assertThat(values(tokens("\"\"\"a\\\r\nb\"\"\""))).isEqualTo("STRING(ab) NEWLINE EOF");
- assertThat(values(tokens("'''a\\\r\nb'''"))).isEqualTo("STRING(ab) NEWLINE EOF");
- assertThat(values(tokens("r'a\\\r\nb'"))).isEqualTo("STRING(a\\\nb) NEWLINE EOF");
- assertThat(values(tokens("r\"a\\\r\nb\""))).isEqualTo("STRING(a\\\nb) NEWLINE EOF");
- assertThat(values(tokens("r\"a\\\r\n\\\nb\""))).isEqualTo("STRING(a\\\n\\\nb) NEWLINE EOF");
- }
-
- @Test
- public void testRawString() throws Exception {
- assertThat(values(tokens("r'abcd'"))).isEqualTo("STRING(abcd) NEWLINE EOF");
- assertThat(values(tokens("r\"abcd\""))).isEqualTo("STRING(abcd) NEWLINE EOF");
- assertThat(values(tokens("r'a\\tb\\nc\\rd'")))
- .isEqualTo("STRING(a\\tb\\nc\\rd) NEWLINE EOF"); // r'a\tb\nc\rd'
- assertThat(values(tokens("r\"a\\\"\""))).isEqualTo("STRING(a\\\") NEWLINE EOF"); // r"a\""
- assertThat(values(tokens("r'a\\\\b'"))).isEqualTo("STRING(a\\\\b) NEWLINE EOF"); // r'a\\b'
- assertThat(values(tokens("r'ab'r"))).isEqualTo("STRING(ab) IDENTIFIER(r) NEWLINE EOF");
-
- // Unterminated raw string
- values(tokens("r'\\'")); // r'\'
- assertThat(lastError.toString())
- .isEqualTo("/some/path.txt:1: unterminated string literal at eof");
- }
-
- @Test
- public void testTripleRawString() throws Exception {
- // r'''a\ncd'''
- assertThat(values(tokens("r'''ab\\ncd'''"))).isEqualTo("STRING(ab\\ncd) NEWLINE EOF");
- // r"""ab
- // cd"""
- assertThat(values(tokens("\"\"\"ab\ncd\"\"\""))).isEqualTo("STRING(ab\ncd) NEWLINE EOF");
-
- // Unterminated raw string
- values(tokens("r'''\\'''")); // r'''\'''
- assertThat(lastError.toString())
- .isEqualTo("/some/path.txt:1: unterminated string literal at eof");
- }
-
- @Test
- public void testOctalEscapes() throws Exception {
- // Regression test for a bug.
- assertThat(values(tokens("'\\0 \\1 \\11 \\77 \\111 \\1111 \\377'")))
- .isEqualTo("STRING(\0 \1 \t \u003f I I1 \u00ff) NEWLINE EOF");
- // Test boundaries (non-octal char, EOF).
- assertThat(values(tokens("'\\1b \\1'"))).isEqualTo("STRING(\1b \1) NEWLINE EOF");
- }
-
- @Test
- public void testOctalEscapeOutOfRange() throws Exception {
- assertThat(values(tokens("'\\777'"))).isEqualTo("STRING(\u00ff) NEWLINE EOF");
- assertThat(lastError.toString())
- .isEqualTo("/some/path.txt:1: octal escape sequence out of range (maximum is \\377)");
- }
-
- @Test
- public void testTripleQuotedStrings() throws Exception {
- assertThat(values(tokens("\"\"\"a\"b'c \n d\"\"e\"\"\"")))
- .isEqualTo("STRING(a\"b'c \n d\"\"e) NEWLINE EOF");
- assertThat(values(tokens("'''a\"b'c \n d\"\"e'''")))
- .isEqualTo("STRING(a\"b'c \n d\"\"e) NEWLINE EOF");
- }
-
- @Test
- public void testBadChar() throws Exception {
- assertThat(values(tokens("a$b"))).isEqualTo("IDENTIFIER(a) IDENTIFIER(b) NEWLINE EOF");
- assertThat(lastError.toString()).isEqualTo("/some/path.txt:1: invalid character: '$'");
- }
-
- @Test
- public void testIndentation() throws Exception {
- assertThat(values(tokens("1\n2\n3")))
- .isEqualTo("INT(1) NEWLINE INT(2) NEWLINE INT(3) NEWLINE EOF");
- assertThat(values(tokens("1\n 2\n 3\n4 ")))
- .isEqualTo(
- "INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT " + "INT(4) NEWLINE EOF");
- assertThat(values(tokens("1\n 2\n 3")))
- .isEqualTo("INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT " + "NEWLINE EOF");
- assertThat(values(tokens("1\n 2\n 3")))
- .isEqualTo(
- "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
- + "OUTDENT OUTDENT NEWLINE EOF");
- assertThat(values(tokens("1\n 2\n 3\n 4\n5")))
- .isEqualTo(
- "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
- + "OUTDENT INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF");
-
- assertThat(values(tokens("1\n 2\n 3\n 4\n5")))
- .isEqualTo(
- "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
- + "OUTDENT INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF");
- assertThat(lastError.toString()).isEqualTo("/some/path.txt:4: indentation error");
- }
-
- @Test
- public void testIndentationWithTab() throws Exception {
- tokens("def x():\n\tpass");
- assertThat(lastError).contains("Tab characters are not allowed");
- }
-
- @Test
- public void testIndentationWithCrLf() throws Exception {
- assertThat(values(tokens("1\r\n 2\r\n")))
- .isEqualTo("INT(1) NEWLINE INDENT INT(2) NEWLINE OUTDENT NEWLINE EOF");
- assertThat(values(tokens("1\r\n 2\r\n\r\n")))
- .isEqualTo("INT(1) NEWLINE INDENT INT(2) NEWLINE OUTDENT NEWLINE EOF");
- assertThat(values(tokens("1\r\n 2\r\n 3\r\n 4\r\n5")))
- .isEqualTo(
- "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE OUTDENT INT(4) "
- + "NEWLINE OUTDENT INT(5) NEWLINE EOF");
- assertThat(values(tokens("1\r\n 2\r\n\r\n 3\r\n4")))
- .isEqualTo(
- "INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT INT(4) NEWLINE EOF");
- }
-
- @Test
- public void testIndentationInsideParens() throws Exception {
- // Indentation is ignored inside parens:
- assertThat(values(tokens("1 (\n 2\n 3\n 4\n5")))
- .isEqualTo("INT(1) LPAREN INT(2) INT(3) INT(4) INT(5) NEWLINE EOF");
- assertThat(values(tokens("1 {\n 2\n 3\n 4\n5")))
- .isEqualTo("INT(1) LBRACE INT(2) INT(3) INT(4) INT(5) NEWLINE EOF");
- assertThat(values(tokens("1 [\n 2\n 3\n 4\n5")))
- .isEqualTo("INT(1) LBRACKET INT(2) INT(3) INT(4) INT(5) NEWLINE EOF");
- assertThat(values(tokens("1 [\n 2]\n 3\n 4\n5")))
- .isEqualTo(
- "INT(1) LBRACKET INT(2) RBRACKET NEWLINE INDENT INT(3) "
- + "NEWLINE INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF");
- }
-
- @Test
- public void testIndentationAtEOF() throws Exception {
- // Matching OUTDENTS are created at EOF:
- assertThat(values(tokens("\n 1"))).isEqualTo("INDENT INT(1) NEWLINE OUTDENT NEWLINE EOF");
- }
-
- @Test
- public void testIndentationOnFirstLine() throws Exception {
- assertThat(values(tokens(" 1"))).isEqualTo("INDENT INT(1) NEWLINE OUTDENT NEWLINE EOF");
- assertThat(values(tokens("\n\n 1"))).isEqualTo("INDENT INT(1) NEWLINE OUTDENT NEWLINE EOF");
- }
-
- @Test
- public void testBlankLineIndentation() throws Exception {
- // Blank lines and comment lines should not generate any newlines indents
- // (but note that every input ends with NEWLINE EOF).
- assertThat(names(tokens("\n #\n"))).isEqualTo("NEWLINE EOF");
- assertThat(names(tokens(" #"))).isEqualTo("NEWLINE EOF");
- assertThat(names(tokens(" #\n"))).isEqualTo("NEWLINE EOF");
- assertThat(names(tokens(" #comment\n"))).isEqualTo("NEWLINE EOF");
- assertThat(names(tokens("def f(x):\n" + " # comment\n" + "\n" + " \n" + " return x\n")))
- .isEqualTo(
- "DEF IDENTIFIER LPAREN IDENTIFIER RPAREN COLON NEWLINE "
- + "INDENT RETURN IDENTIFIER NEWLINE "
- + "OUTDENT NEWLINE EOF");
- }
-
- @Test
- public void testBackslash() throws Exception {
- assertThat(names(tokens("a\\\nb"))).isEqualTo("IDENTIFIER IDENTIFIER NEWLINE EOF");
- assertThat(names(tokens("a\\\r\nb"))).isEqualTo("IDENTIFIER IDENTIFIER NEWLINE EOF");
- assertThat(names(tokens("a\\ b"))).isEqualTo("IDENTIFIER ILLEGAL IDENTIFIER NEWLINE EOF");
- assertThat(names(tokens("a(\\\n2)"))).isEqualTo("IDENTIFIER LPAREN INT RPAREN NEWLINE EOF");
- }
-
- @Test
- public void testTokenPositions() throws Exception {
- assertThat(positions(tokens("foo(bar, {1: 'quux'}, \"\"\"b\"\"\", r\"\")")))
- .isEqualTo(
- // foo ( bar , { 1 :
- "[0,3) [3,4) [4,7) [7,8) [9,10) [10,11) [11,12)"
- // 'quux' } , """b""" , r"" ) NEWLINE EOF
- + " [13,19) [19,20) [20,21) [22,29) [29,30) [31,34) [34,35) [35,35) [35,35)");
- }
-
- @Test
- public void testLineNumbers() throws Exception {
- assertThat(linenums("foo = 1\nbar = 2\n\nwiz = 3")).isEqualTo("1 1 1 1 2 2 2 2 4 4 4 4 4");
-
- assertThat(values(tokens("foo = 1\nbar = 2\n\nwiz = $\nbar = 2")))
- .isEqualTo(
- "IDENTIFIER(foo) EQUALS INT(1) NEWLINE "
- + "IDENTIFIER(bar) EQUALS INT(2) NEWLINE "
- + "IDENTIFIER(wiz) EQUALS NEWLINE "
- + "IDENTIFIER(bar) EQUALS INT(2) NEWLINE EOF");
- assertThat(lastError.toString()).isEqualTo("/some/path.txt:4: invalid character: '$'");
-
- // '\\n' in string should not increment linenum:
- String s = "1\n'foo\\nbar'\3";
- assertThat(values(tokens(s))).isEqualTo("INT(1) NEWLINE STRING(foo\nbar) NEWLINE EOF");
- assertThat(linenums(s)).isEqualTo("1 1 2 2 2");
- }
-
- @Test
- public void testContainsErrors() throws Exception {
- Lexer lexerSuccess = createLexer("foo");
- allTokens(lexerSuccess); // ensure the file has been completely scanned
- assertThat(errors).isEmpty();
-
- Lexer lexerFail = createLexer("f$o");
- allTokens(lexerFail);
- assertThat(errors).isNotEmpty();
-
- String s = "'unterminated";
- lexerFail = createLexer(s);
- allTokens(lexerFail);
- assertThat(errors).isNotEmpty();
- assertThat(values(tokens(s))).isEqualTo("STRING(unterminated) NEWLINE EOF");
- }
-
- @Test
- public void testUnterminatedRawStringWithEscapingError() throws Exception {
- assertThat(names(tokens("r'\\"))).isEqualTo("STRING NEWLINE EOF");
- assertThat(lastError).isEqualTo("/some/path.txt:1: unterminated string literal at eof");
- }
-
- @Test
- public void testFirstCharIsTab() {
- assertThat(names(tokens("\t"))).isEqualTo("NEWLINE EOF");
- assertThat(lastError)
- .isEqualTo(
- "/some/path.txt:1: Tab characters are not allowed for indentation. Use spaces"
- + " instead.");
- }
-
- /**
- * Returns the first error whose string form contains the specified substring, or throws an
- * informative AssertionError if there is none.
- *
- * <p>Exposed for use by other frontend tests.
- */
- static SyntaxError assertContainsError(List<SyntaxError> errors, String substr) {
- for (SyntaxError error : errors) {
- if (error.toString().contains(substr)) {
- return error;
- }
- }
- if (errors.isEmpty()) {
- throw new AssertionError("no errors, want '" + substr + "'");
- } else {
- throw new AssertionError(
- "error '" + substr + "' not found, but got these:\n" + Joiner.on("\n").join(errors));
- }
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LocationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LocationTest.java
deleted file mode 100644
index 1469898..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/LocationTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public final class LocationTest {
-
- @Test
- public void fromFile() throws Exception {
- String file = "this is a filename";
- Location location = Location.fromFile(file);
- assertThat(location.file()).isEqualTo(file);
- assertThat(location.line()).isEqualTo(0);
- assertThat(location.column()).isEqualTo(0);
- assertThat(location.toString()).isEqualTo(file);
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
deleted file mode 100644
index 5703e47..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
+++ /dev/null
@@ -1,758 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import java.util.List;
-import net.starlark.java.annot.StarlarkBuiltin;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for MethodLibrary. */
-@RunWith(JUnit4.class)
-public final class MethodLibraryTest {
-
- private final EvaluationTestCase ev = new EvaluationTestCase();
-
- // Asserts that evaluation of src fails with the specified stack.
- private void checkEvalErrorStack(String src, String stack) {
- EvalException ex = assertThrows(EvalException.class, () -> ev.exec(src));
- EvalException.SourceReader reader =
- loc -> {
- // ignore filename
- List<String> lines = Splitter.on('\n').splitToList(src);
- return loc.line() > 0 && loc.line() <= lines.size() ? lines.get(loc.line() - 1) : null;
- };
- assertThat(ex.getMessageWithStack(reader)).isEqualTo(stack);
- }
-
- private static String join(String... lines) {
- return Joiner.on("\n").join(lines);
- }
-
- @Test
- public void testStackTrace() throws Exception {
- checkEvalErrorStack(
- join(
- "def foo():", //
- " bar(1)",
- "def bar(x):",
- " if x == 1:",
- " a = x",
- " b = 2",
- " 'test'.index(x) # hello",
- "foo()"),
- join(
- "Traceback (most recent call last):", //
- "\tFile \"\", line 8, column 4, in <toplevel>",
- "\t\tfoo()",
- "\tFile \"\", line 2, column 6, in foo",
- "\t\tbar(1)",
- "\tFile \"\", line 7, column 17, in bar",
- "\t\t'test'.index(x) # hello",
- "Error in index: in call to index(), parameter 'sub' got value of type 'int', want"
- + " 'string'"));
- }
-
- @Test
- public void testStackTraceWithIf() throws Exception {
- checkEvalErrorStack(
- join(
- "def foo():", //
- " s = []",
- " if s[0] == 1:",
- " x = 1",
- "foo()"),
- join(
- "Traceback (most recent call last):",
- "\tFile \"\", line 5, column 4, in <toplevel>",
- "\t\tfoo()",
- "\tFile \"\", line 3, column 7, in foo",
- "\t\tif s[0] == 1:",
- "Error: index out of range (index is 0, but sequence has 0 elements)"));
- }
-
- @Test
- public void testStackTraceWithAugmentedAssignment() throws Exception {
- // Each time the current tree-walking evaluator catches an exception, it computes and sets the
- // frame's error location. Only the first (innermost) such 'set' has any effect. When the frame
- // is popped, its error location is accurate. (In our bytecode future, we'll be able to
- // preemptively set fr.pc cheaply, before every instruction and error, as it's just an int, and
- // thus do away with this.)
- //
- // Assignment statements x=y are special in the evaluator because there's no guarantee that
- // failed evaluation of the subexpressions x or y sets the frame's error location, so
- // Eval(assign) sets the error location to '=', possibly redundantly, to ensure that some
- // location is reported. test exercises that special case.
- checkEvalErrorStack(
- join(
- "def foo():", //
- " s = 1",
- " s += '2'",
- "foo()"),
- join(
- "Traceback (most recent call last):", //
- "\tFile \"\", line 4, column 4, in <toplevel>",
- "\t\tfoo()",
- "\tFile \"\", line 3, column 5, in foo",
- "\t\ts += '2'",
- "Error: unsupported binary operation: int + string"));
- }
-
- @Test
- public void testStackErrorInBuiltinFunction() throws Exception {
- // at top level
- checkEvalErrorStack(
- "len(1)",
- join(
- "Traceback (most recent call last):", //
- "\tFile \"\", line 1, column 4, in <toplevel>",
- "\t\tlen(1)",
- "Error in len: int is not iterable"));
-
- // in a function
- checkEvalErrorStack(
- join(
- "def f():", //
- " len(1)",
- "f()"),
- join(
- "Traceback (most recent call last):", //
- "\tFile \"\", line 3, column 2, in <toplevel>",
- "\t\tf()",
- "\tFile \"\", line 2, column 6, in f",
- "\t\tlen(1)",
- "Error in len: int is not iterable"));
- }
-
- @Test
- public void testStackErrorInOperator() throws Exception {
- // at top level
- checkEvalErrorStack(
- "1//0",
- join(
- "Traceback (most recent call last):", //
- "\tFile \"\", line 1, column 2, in <toplevel>",
- "\t\t1//0",
- "Error: integer division by zero"));
-
- // in a function
- checkEvalErrorStack(
- join(
- "def f():", //
- " 1//0",
- "f()"),
- join(
- "Traceback (most recent call last):", //
- "\tFile \"\", line 3, column 2, in <toplevel>",
- "\t\tf()",
- "\tFile \"\", line 2, column 4, in f",
- "\t\t1//0",
- "Error: integer division by zero"));
-
- // in a function callback
- checkEvalErrorStack(
- join(
- "def id(x): return 1//x", //
- "sorted([2, 1, 0], key=id)"),
- join(
- "Traceback (most recent call last):", //
- "\tFile \"\", line 2, column 7, in <toplevel>",
- "\t\tsorted([2, 1, 0], key=id)",
- "\tFile \"<builtin>\", in sorted",
- "\tFile \"\", line 1, column 20, in id",
- "\t\tdef id(x): return 1//x",
- "Error: integer division by zero"));
- }
-
- @Test
- public void testBuiltinFunctionErrorMessage() throws Exception {
- ev.new Scenario()
- .testIfErrorContains("substring \"z\" not found in \"abc\"", "'abc'.index('z')")
- .testIfErrorContains(
- "in call to startswith(), parameter 'sub' got value of type 'int', want 'string or"
- + " tuple'",
- "'test'.startswith(1)")
- .testIfErrorContains("in dict, got string, want iterable", "dict('a')");
- }
-
- @Test
- public void testHasAttr() throws Exception {
- ev.new Scenario()
- .testExpression("hasattr([], 'append')", Boolean.TRUE)
- .testExpression("hasattr('test', 'count')", Boolean.TRUE)
- .testExpression("hasattr(dict(a = 1, b = 2), 'items')", Boolean.TRUE)
- .testExpression("hasattr({}, 'items')", Boolean.TRUE);
- }
-
- @Test
- public void testGetAttrMissingField() throws Exception {
- ev.new Scenario()
- .testIfExactError(
- "'string' value has no field or method 'not_there'", "getattr('a string', 'not_there')")
- .testExpression("getattr('a string', 'not_there', 'use this')", "use this")
- .testExpression("getattr('a string', 'not there', None)", Starlark.NONE);
- }
-
- @StarlarkBuiltin(name = "AStruct", documented = false, doc = "")
- static final class AStruct implements ClassObject, StarlarkValue {
- @Override
- public Object getValue(String name) {
- switch (name) {
- case "field":
- return "a";
- default:
- return null;
- }
- }
-
- @Override
- public ImmutableCollection<String> getFieldNames() {
- return ImmutableList.of("field");
- }
-
- @Override
- public String getErrorMessageForUnknownField(String name) {
- return null;
- }
- }
-
- @Test
- public void testGetAttrMissingField_typoDetection() throws Exception {
- ev.new Scenario()
- .update("s", new AStruct())
- .testIfExactError(
- "'AStruct' value has no field or method 'feild' (did you mean 'field'?)",
- "getattr(s, 'feild')");
- }
-
- @Test
- public void testGetAttrWithMethods() throws Exception {
- String msg = "'string' value has no field or method 'cnt'";
- ev.new Scenario()
- .testIfExactError(msg, "getattr('a string', 'cnt')")
- .testExpression("getattr('a string', 'cnt', 'default')", "default");
- }
-
- @Test
- public void testDir() throws Exception {
- ev.new Scenario()
- .testExpression(
- "str(dir({}))",
- "[\"clear\", \"get\", \"items\", \"keys\","
- + " \"pop\", \"popitem\", \"setdefault\", \"update\", \"values\"]");
- }
-
- @Test
- public void testBoolean() throws Exception {
- ev.new Scenario().testExpression("False", Boolean.FALSE).testExpression("True", Boolean.TRUE);
- }
-
- @Test
- public void testBooleanUnsupportedOperationFails() throws Exception {
- ev.new Scenario()
- .testIfErrorContains("unsupported binary operation: bool + bool", "True + True");
- }
-
- @Test
- public void testListSort() throws Exception {
- ev.new Scenario()
- .testEval("sorted([0,1,2,3])", "[0, 1, 2, 3]")
- .testEval("sorted([])", "[]")
- .testEval("sorted([3, 2, 1, 0])", "[0, 1, 2, 3]")
- .testEval("sorted([[1], [], [2], [1, 2]])", "[[], [1], [1, 2], [2]]")
- .testEval("sorted([True, False, True])", "[False, True, True]")
- .testEval("sorted(['a','x','b','z'])", "[\"a\", \"b\", \"x\", \"z\"]")
- .testEval("sorted({1: True, 5: True, 4: False})", "[1, 4, 5]")
- .testEval("sorted([3, 2, 1, 0], reverse=True)", "[3, 2, 1, 0]")
- .testEval("sorted([[1], [], [1, 2]], key=len, reverse=True)", "[[1, 2], [1], []]")
- .testEval("sorted([[0, 5], [4, 1], [1, 7]], key=max)", "[[4, 1], [0, 5], [1, 7]]")
- .testIfExactError("Cannot compare function with function", "sorted([sorted, sorted])");
- }
-
- @Test
- public void testDictionaryCopy() throws Exception {
- ev.new Scenario()
- .setUp("x = {1 : 2}", "y = dict(x)")
- .testEval("x[1] == 2 and y[1] == 2", "True");
- }
-
- @Test
- public void testDictionaryCopyKeyCollision() throws Exception {
- ev.new Scenario().setUp("x = {'test' : 2}", "y = dict(x, test = 3)").testEval("y['test']", "3");
- }
-
- @Test
- public void testDictionaryKeyNotFound() throws Exception {
- ev.new Scenario()
- .testIfErrorContains("key \"0\" not found in dictionary", "{}['0']")
- .testIfErrorContains("key 0 not found in dictionary", "{'0': 1, 2: 3, 4: 5}[0]");
- }
-
- @Test
- public void testDictionaryAccess() throws Exception {
- ev.new Scenario()
- .testEval("{1: ['foo']}[1]", "['foo']")
- .testExpression("{'4': 8}['4']", 8)
- .testExpression("{'a': 'aa', 'b': 'bb', 'c': 'cc'}['b']", "bb");
- }
-
- @Test
- public void testDictionaryVariableAccess() throws Exception {
- ev.new Scenario().setUp("d = {'a' : 1}", "a = d['a']").testLookup("a", 1);
- }
-
- @Test
- public void testDictionaryCreation() throws Exception {
- String expected = "{'a': 1, 'b': 2, 'c': 3}";
-
- ev.new Scenario()
- .testEval("dict([('a', 1), ('b', 2), ('c', 3)])", expected)
- .testEval("dict(a = 1, b = 2, c = 3)", expected)
- .testEval("dict([('a', 1)], b = 2, c = 3)", expected);
- }
-
- @Test
- public void testDictionaryCreationInnerLists() throws Exception {
- ev.new Scenario().testEval("dict([[1, 2], [3, 4]], a = 5)", "{1: 2, 3: 4, 'a': 5}");
- }
-
- @Test
- public void testDictionaryCreationEmpty() throws Exception {
- ev.new Scenario().testEval("dict()", "{}").testEval("dict([])", "{}");
- }
-
- @Test
- public void testDictionaryCreationDifferentKeyTypes() throws Exception {
- String expected = "{'a': 1, 2: 3}";
-
- ev.new Scenario()
- .testEval("dict([('a', 1), (2, 3)])", expected)
- .testEval("dict([(2, 3)], a = 1)", expected);
- }
-
- @Test
- public void testDictionaryCreationKeyCollision() throws Exception {
- String expected = "{'a': 1, 'b': 2, 'c': 3}";
-
- ev.new Scenario()
- .testEval("dict([('a', 42), ('b', 2), ('a', 1), ('c', 3)])", expected)
- .testEval("dict([('a', 42)], a = 1, b = 2, c = 3)", expected);
- ev.new Scenario().testEval("dict([('a', 42)], **{'a': 1, 'b': 2, 'c': 3})", expected);
- }
-
- @Test
- public void testDictionaryCreationInvalidPositional() throws Exception {
- ev.new Scenario()
- .testIfErrorContains("in dict, got string, want iterable", "dict('a')")
- .testIfErrorContains(
- "in dict, dictionary update sequence element #0 is not iterable (string)",
- "dict([('a')])")
- .testIfErrorContains(
- "in dict, dictionary update sequence element #0 is not iterable (string)",
- "dict([('a')])")
- .testIfErrorContains(
- "dict() accepts no more than 1 positional argument but got 3",
- "dict((3,4), (3,2), (1,2))")
- .testIfErrorContains(
- "item #0 has length 3, but exactly two elements are required",
- "dict([('a', 'b', 'c')])");
- }
-
- @Test
- public void testDictionaryValues() throws Exception {
- ev.new Scenario()
- .testEval("{1: 'foo'}.values()", "['foo']")
- .testEval("{}.values()", "[]")
- .testEval("{True: 3, False: 5}.values()", "[3, 5]")
- .testEval("{'a': 5, 'c': 2, 'b': 4, 'd': 3}.values()", "[5, 2, 4, 3]");
- // sorted by keys
- }
-
- @Test
- public void testDictionaryKeys() throws Exception {
- ev.new Scenario()
- .testEval("{1: 'foo'}.keys()", "[1]")
- .testEval("{}.keys()", "[]")
- .testEval("{True: 3, False: 5}.keys()", "[True, False]")
- .testEval(
- "{1:'a', 2:'b', 6:'c', 0:'d', 5:'e', 4:'f', 3:'g'}.keys()", "[1, 2, 6, 0, 5, 4, 3]");
- }
-
- @Test
- public void testDictionaryGet() throws Exception {
- ev.new Scenario()
- .testExpression("{1: 'foo'}.get(1)", "foo")
- .testExpression("{1: 'foo'}.get(2)", Starlark.NONE)
- .testExpression("{1: 'foo'}.get(2, 'a')", "a")
- .testExpression("{1: 'foo'}.get(2, default='a')", "a")
- .testExpression("{1: 'foo'}.get(2, default=None)", Starlark.NONE);
- }
-
- @Test
- public void testDictionaryItems() throws Exception {
- ev.new Scenario()
- .testEval("{'a': 'foo'}.items()", "[('a', 'foo')]")
- .testEval("{}.items()", "[]")
- .testEval("{1: 3, 2: 5}.items()", "[(1, 3), (2, 5)]")
- .testEval("{'a': 5, 'c': 2, 'b': 4}.items()", "[('a', 5), ('c', 2), ('b', 4)]");
- }
-
- @Test
- public void testDictionaryClear() throws Exception {
- ev.new Scenario()
- .setUp(
- "d = {1: 'foo', 2: 'bar', 3: 'baz'}",
- "len(d) == 3 or fail('clear 1')",
- "d.clear() == None or fail('clear 2')")
- .testEval("d", "{}");
- }
-
- @Test
- public void testDictionaryPop() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "KeyError: 1",
- "d = {1: 'foo', 2: 'bar', 3: 'baz'}\n"
- + "len(d) == 3 or fail('pop 1')\n"
- + "d.pop(2) == 'bar' or fail('pop 2')\n"
- + "d.pop(3, 'quux') == 'baz' or fail('pop 3a')\n"
- + "d.pop(3, 'quux') == 'quux' or fail('pop 3b')\n"
- + "d.pop(1) == 'foo' or fail('pop 1')\n"
- + "d == {} or fail('pop 0')\n"
- + "d.pop(1)");
- }
-
- @Test
- public void testDictionaryPopItem() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "popitem(): dictionary is empty",
- "d = {2: 'bar', 3: 'baz', 1: 'foo'}\n"
- + "len(d) == 3 or fail('popitem 0')\n"
- + "d.popitem() == (2, 'bar') or fail('popitem 2')\n"
- + "d.popitem() == (3, 'baz') or fail('popitem 3')\n"
- + "d.popitem() == (1, 'foo') or fail('popitem 1')\n"
- + "d == {} or fail('popitem 4')\n"
- + "d.popitem()");
- }
-
- @Test
- public void testDictionaryUpdate() throws Exception {
- ev.new Scenario()
- .setUp("foo = {'a': 2}", "foo.update({'b': 4})")
- .testEval("foo", "{'a': 2, 'b': 4}");
- ev.new Scenario()
- .setUp("foo = {'a': 2}", "foo.update({'a': 3, 'b': 4})")
- .testEval("foo", "{'a': 3, 'b': 4}");
- }
-
- @Test
- public void testDictionarySetDefault() throws Exception {
- ev.new Scenario()
- .setUp(
- "d = {2: 'bar', 1: 'foo'}",
- "len(d) == 2 or fail('setdefault 0')",
- "d.setdefault(1, 'a') == 'foo' or fail('setdefault 1')",
- "d.setdefault(2) == 'bar' or fail('setdefault 2')",
- "d.setdefault(3) == None or fail('setdefault 3')",
- "d.setdefault(4, 'b') == 'b' or fail('setdefault 4')")
- .testEval("d", "{1: 'foo', 2: 'bar', 3: None, 4: 'b'}");
- }
-
- @Test
- public void testListIndexMethod() throws Exception {
- ev.new Scenario()
- .testExpression("['a', 'b', 'c'].index('a')", 0)
- .testExpression("['a', 'b', 'c'].index('b')", 1)
- .testExpression("['a', 'b', 'c'].index('c')", 2)
- .testExpression("[2, 4, 6].index(4)", 1)
- .testExpression("[2, 4, 6].index(4)", 1)
- .testExpression("[0, 1, [1]].index([1])", 2)
- .testIfErrorContains("item \"a\" not found in list", "[1, 2].index('a')")
- .testIfErrorContains("item 0 not found in list", "[].index(0)");
- }
-
- @Test
- public void testHash() throws Exception {
- // We specify the same string hashing algorithm as String.hashCode().
- ev.new Scenario()
- .testExpression("hash('starlark')", "starlark".hashCode())
- .testExpression("hash('google')", "google".hashCode())
- .testIfErrorContains(
- "in call to hash(), parameter 'value' got value of type 'NoneType', want 'string'",
- "hash(None)");
- }
-
- @Test
- public void testRangeType() throws Exception {
- ev.new Scenario()
- .setUp("a = range(3)")
- .testExpression("len(a)", 3)
- .testExpression("str(a)", "range(0, 3)")
- .testExpression("str(range(1,2,3))", "range(1, 2, 3)")
- .testExpression("repr(a)", "range(0, 3)")
- .testExpression("repr(range(1,2,3))", "range(1, 2, 3)")
- .testExpression("type(a)", "range")
- .testIfErrorContains("unsupported binary operation: range + range", "a + a")
- .testIfErrorContains("'range' value has no field or method 'append'", "a.append(3)")
- .testExpression("str(list(range(5)))", "[0, 1, 2, 3, 4]")
- .testExpression("str(list(range(0)))", "[]")
- .testExpression("str(list(range(1)))", "[0]")
- .testExpression("str(list(range(-2)))", "[]")
- .testExpression("str(list(range(-3, 2)))", "[-3, -2, -1, 0, 1]")
- .testExpression("str(list(range(3, 2)))", "[]")
- .testExpression("str(list(range(3, 3)))", "[]")
- .testExpression("str(list(range(3, 4)))", "[3]")
- .testExpression("str(list(range(3, 5)))", "[3, 4]")
- .testExpression("str(list(range(-3, 5, 2)))", "[-3, -1, 1, 3]")
- .testExpression("str(list(range(-3, 6, 2)))", "[-3, -1, 1, 3, 5]")
- .testExpression("str(list(range(5, 0, -1)))", "[5, 4, 3, 2, 1]")
- .testExpression("str(list(range(5, 0, -10)))", "[5]")
- .testExpression("str(list(range(0, -3, -2)))", "[0, -2]")
- .testExpression("range(3)[-1]", 2)
- .testIfErrorContains(
- "index out of range (index is 3, but sequence has 3 elements)", "range(3)[3]")
- .testExpression("str(range(5)[1:])", "range(1, 5)")
- .testExpression("len(range(5)[1:])", 4)
- .testExpression("str(range(5)[:2])", "range(0, 2)")
- .testExpression("str(range(10)[1:9:2])", "range(1, 9, 2)")
- .testExpression("str(list(range(10)[1:9:2]))", "[1, 3, 5, 7]")
- .testExpression("str(range(10)[1:10:2])", "range(1, 10, 2)")
- .testExpression("str(range(10)[1:11:2])", "range(1, 10, 2)")
- .testExpression("str(range(0, 10, 2)[::2])", "range(0, 10, 4)")
- .testExpression("str(range(0, 10, 2)[::-2])", "range(8, -2, -4)")
- .testExpression("str(range(5)[1::-1])", "range(1, -1, -1)")
- .testIfErrorContains("step cannot be 0", "range(2, 3, 0)")
- .testIfErrorContains("unsupported binary operation: range * int", "range(3) * 3")
- .testIfErrorContains("Cannot compare range objects", "range(3) < range(5)")
- .testIfErrorContains("Cannot compare range objects", "range(4) > [1]")
- .testExpression("4 in range(1, 10)", true)
- .testExpression("4 in range(1, 3)", false)
- .testExpression("4 in range(0, 8, 2)", true)
- .testExpression("4 in range(1, 8, 2)", false)
- .testExpression("range(0, 5, 10) == range(0, 5, 11)", true)
- .testExpression("range(0, 5, 2) == [0, 2, 4]", false)
- .testExpression("str(list(range(1, 10, 2)))", "[1, 3, 5, 7, 9]")
- .testExpression("str(range(1, 10, 2)[:99])", "range(1, 11, 2)")
- .testExpression("range(1, 10, 2) == range(1, 11, 2)", true)
- .testExpression("range(1, 10, 2) == range(1, 12, 2)", false)
- // x in range(...), +ve step
- .testExpression("2 in range(3, 0x7ffffffd, 2)", false) // too low
- .testExpression("3 in range(3, 0x7ffffffd, 2)", true) // in range
- .testExpression("4 in range(3, 0x7ffffffd, 2)", false) // even
- .testExpression("5 in range(3, 0x7ffffffd, 2)", true) // in range
- .testExpression("0x7ffffffb in range(3, 0x7ffffffd, 2)", true) // in range
- .testExpression("0x7ffffffc in range(3, 0x7ffffffd, 2)", false) // even
- .testExpression("0x7ffffffd in range(3, 0x7ffffffd, 2)", false) // too high
- // x in range(...), -ve step
- .testExpression("0x7ffffffe in range(0x7ffffffd, 3, -2)", false) // too high
- .testExpression("0x7ffffffd in range(0x7ffffffd, 3, -2)", true) // in range
- .testExpression("0x7ffffffc in range(0x7ffffffd, 3, -2)", false) // even
- .testExpression("0x7ffffffb in range(0x7ffffffd, 3, -2)", true) // in range
- .testExpression("5 in range(0x7ffffffd, 3, -2)", true) // in range
- .testExpression("4 in range(0x7ffffffd, 3, -2)", false) // even
- .testExpression("3 in range(0x7ffffffd, 3, -2)", false); // too low
- }
-
- @Test
- public void testEnumerate() throws Exception {
- ev.new Scenario()
- .testExpression("str(enumerate([]))", "[]")
- .testExpression("str(enumerate([5]))", "[(0, 5)]")
- .testExpression("str(enumerate([5, 3]))", "[(0, 5), (1, 3)]")
- .testExpression("str(enumerate(['a', 'b', 'c']))", "[(0, \"a\"), (1, \"b\"), (2, \"c\")]")
- .testExpression("str(enumerate(['a']) + [(1, 'b')])", "[(0, \"a\"), (1, \"b\")]");
- }
-
- @Test
- public void testEnumerateBadArg() throws Exception {
- ev.new Scenario().testIfErrorContains("type 'string' is not iterable", "enumerate('a')");
- }
-
- @Test
- public void testReassignmentOfPrimitivesNotForbiddenByCoreLanguage() throws Exception {
- ev.new Scenario()
- .setUp("cc_binary = (['hello.cc'])")
- .testIfErrorContains(
- "'list' object is not callable",
- "cc_binary(name = 'hello', srcs=['hello.cc'], malloc = '//base:system_malloc')");
- }
-
- @Test
- public void testLenOnString() throws Exception {
- ev.new Scenario().testExpression("len('abc')", 3);
- }
-
- @Test
- public void testLenOnList() throws Exception {
- ev.new Scenario().testExpression("len([1,2,3])", 3);
- }
-
- @Test
- public void testLenOnDict() throws Exception {
- ev.new Scenario().testExpression("len({'a' : 1, 'b' : 2})", 2);
- }
-
- @Test
- public void testLenOnBadType() throws Exception {
- ev.new Scenario().testIfErrorContains("int is not iterable", "len(1)");
- }
-
- @Test
- public void testIndexOnFunction() throws Exception {
- ev.new Scenario()
- .testIfErrorContains("type 'function' has no operator [](int)", "len[1]")
- .testIfErrorContains("invalid slice operand: function", "len[1:4]");
- }
-
- @Test
- public void testBool() throws Exception {
- ev.new Scenario()
- .testExpression("bool(1)", Boolean.TRUE)
- .testExpression("bool(0)", Boolean.FALSE)
- .testExpression("bool([1, 2])", Boolean.TRUE)
- .testExpression("bool([])", Boolean.FALSE)
- .testExpression("bool(None)", Boolean.FALSE);
- }
-
- @Test
- public void testStr() throws Exception {
- ev.new Scenario()
- .testExpression("str(1)", "1")
- .testExpression("str(-2)", "-2")
- .testExpression("str([1, 2])", "[1, 2]")
- .testExpression("str(True)", "True")
- .testExpression("str(False)", "False")
- .testExpression("str(None)", "None")
- .testExpression("str(str)", "<built-in function str>");
- }
-
- @Test
- public void testStrFunction() throws Exception {
- ev.new Scenario().setUp("def foo(x): pass").testExpression("str(foo)", "<function foo>");
- }
-
- @Test
- public void testType() throws Exception {
- ev.new Scenario()
- .testExpression("type(1)", "int")
- .testExpression("type('a')", "string")
- .testExpression("type([1, 2])", "list")
- .testExpression("type((1, 2))", "tuple")
- .testExpression("type(True)", "bool")
- .testExpression("type(None)", "NoneType")
- .testExpression("type(str)", "function");
- }
-
- @Test
- public void testZipFunction() throws Exception {
- ev.new Scenario()
- .testExpression("str(zip())", "[]")
- .testExpression("str(zip([1, 2]))", "[(1,), (2,)]")
- .testExpression("str(zip([1, 2], ['a', 'b']))", "[(1, \"a\"), (2, \"b\")]")
- .testExpression("str(zip([1, 2, 3], ['a', 'b']))", "[(1, \"a\"), (2, \"b\")]")
- .testExpression("str(zip([1], [2], [3]))", "[(1, 2, 3)]")
- .testExpression("str(zip([1], {2: 'a'}))", "[(1, 2)]")
- .testExpression("str(zip([1], []))", "[]")
- .testIfErrorContains("type 'int' is not iterable", "zip(123)")
- .testIfErrorContains("type 'int' is not iterable", "zip([1], 1)");
- }
-
- /**
- * Assert that lstrip(), rstrip(), and strip() produce the expected result for a given input
- * string and chars argument. If chars is null no argument is passed.
- */
- private void checkStrip(
- String input, Object chars,
- String expLeft, String expRight, String expBoth) throws Exception {
- if (chars == null) {
- ev.new Scenario()
- .update("s", input)
- .testExpression("s.lstrip()", expLeft)
- .testExpression("s.rstrip()", expRight)
- .testExpression("s.strip()", expBoth);
- } else {
- ev.new Scenario()
- .update("s", input)
- .update("chars", chars)
- .testExpression("s.lstrip(chars)", expLeft)
- .testExpression("s.rstrip(chars)", expRight)
- .testExpression("s.strip(chars)", expBoth);
- }
- }
-
- @Test
- public void testStrip() throws Exception {
- // Strip nothing.
- checkStrip("a b c", "", "a b c", "a b c", "a b c");
- checkStrip(" a b c ", "", " a b c ", " a b c ", " a b c ");
- // Normal case, found and not found.
- checkStrip("abcba", "ba", "cba", "abc", "c");
- checkStrip("abc", "xyz", "abc", "abc", "abc");
- // Default whitespace.
- checkStrip(" a b c ", null, "a b c ", " a b c", "a b c");
- checkStrip(" a b c ", Starlark.NONE, "a b c ", " a b c", "a b c");
- // Default whitespace with full range of Latin-1 whitespace chars.
- String whitespace = "\u0009\n\u000B\u000C\r\u001C\u001D\u001E\u001F\u0020\u0085\u00A0";
- checkStrip(
- whitespace + "a" + whitespace, null,
- "a" + whitespace, whitespace + "a", "a");
- checkStrip(
- whitespace + "a" + whitespace, Starlark.NONE, "a" + whitespace, whitespace + "a", "a");
- // Empty cases.
- checkStrip("", "", "", "", "");
- checkStrip("abc", "abc", "", "", "");
- checkStrip("", "xyz", "", "", "");
- checkStrip("", null, "", "", "");
- }
-
- @Test
- public void testFail() throws Exception {
- ev.new Scenario()
- .testIfErrorContains("abc", "fail('abc')")
- .testIfErrorContains("18", "fail(18)");
- }
-
- @Test
- public void testTupleCoercion() throws Exception {
- ev.new Scenario()
- .testExpression("tuple([1, 2]) == (1, 2)", true)
- // Depends on current implementation of dict
- .testExpression("tuple({1: 'foo', 2: 'bar'}) == (1, 2)", true);
- }
-
- @Test
- public void testPositionalOnlyArgument() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "join() got named argument for positional-only parameter 'elements'",
- "','.join(elements=['foo', 'bar'])");
- }
-
- @Test
- public void testStringJoinRequiresStrings() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "expected string for sequence element 1, got 'int'", "', '.join(['foo', 2])");
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MutabilityTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MutabilityTest.java
deleted file mode 100644
index 4c527fd..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/MutabilityTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2017 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.devtools.build.lib.syntax.Mutability.Freezable;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link Mutability}. */
-@RunWith(JUnit4.class)
-public final class MutabilityTest {
-
- /** A trivial Freezable that can do nothing but freeze. */
- private static class DummyFreezable implements Mutability.Freezable {
- private final Mutability mutability;
-
- public DummyFreezable(Mutability mutability) {
- this.mutability = mutability;
- }
-
- @Override
- public Mutability mutability() {
- return mutability;
- }
- }
-
- private static void assertCheckMutableFailsBecauseFrozen(DummyFreezable x) {
- EvalException ex = assertThrows(EvalException.class, () -> Starlark.checkMutable(x));
- assertThat(ex).hasMessageThat().contains("trying to mutate a frozen DummyFreezable value");
- }
-
- @Test
- public void freeze() throws Exception {
- Mutability mutability = Mutability.create("test");
- DummyFreezable dummy = new DummyFreezable(mutability);
-
- Starlark.checkMutable(dummy);
- mutability.freeze();
- assertCheckMutableFailsBecauseFrozen(dummy);
- }
-
- @Test
- public void tryWithResources() throws Exception {
- DummyFreezable dummy;
- try (Mutability mutability = Mutability.create("test")) {
- dummy = new DummyFreezable(mutability);
- Starlark.checkMutable(dummy);
- }
- assertCheckMutableFailsBecauseFrozen(dummy);
- }
-
- @Test
- public void initiallyMutable() throws Exception {
- Mutability mutability = Mutability.create("test");
- DummyFreezable dummy = new DummyFreezable(mutability);
-
- Starlark.checkMutable(dummy);
- }
-
- @Test
- public void temporarilyImmutableDuringIteration() throws Exception {
- Mutability mutability = Mutability.create("test");
- DummyFreezable x = new DummyFreezable(mutability);
- x.updateIteratorCount(+1);
- EvalException ex = assertThrows(EvalException.class, () -> Starlark.checkMutable(x));
- assertThat(ex)
- .hasMessageThat()
- .contains("DummyFreezable value is temporarily immutable due to active for-loop iteration");
-
- x.updateIteratorCount(+1);
- x.updateIteratorCount(-1); // net +1 => still immutable
- ex = assertThrows(EvalException.class, () -> Starlark.checkMutable(x));
- assertThat(ex)
- .hasMessageThat()
- .contains("DummyFreezable value is temporarily immutable due to active for-loop iteration");
-
- x.updateIteratorCount(-1); // net 0 => mutable
- Starlark.checkMutable(x); // ok
-
- assertThrows(IllegalStateException.class, () -> x.updateIteratorCount(-1)); // underflow
- }
-
- @Test
- public void addIteratorAndThenFreeze() throws Exception {
- Mutability mutability = Mutability.create("test");
- DummyFreezable dummy = new DummyFreezable(mutability);
- dummy.updateIteratorCount(+1);
- mutability.freeze();
- // Should fail with frozen error, not temporarily immutable error.
- assertCheckMutableFailsBecauseFrozen(dummy);
- }
-
- @Test
- public void checkUnsafeShallowFreezePrecondition_FailsWhenAlreadyFrozen() throws Exception {
- Mutability mutability = Mutability.create("test").freeze();
- assertThrows(
- IllegalArgumentException.class,
- () -> Freezable.checkUnsafeShallowFreezePrecondition(new DummyFreezable(mutability)));
- }
-
- @Test
- public void checkUnsafeShallowFreezePrecondition_FailsWhenDisallowed() throws Exception {
- Mutability mutability = Mutability.create("test");
- assertThrows(
- IllegalArgumentException.class,
- () -> Freezable.checkUnsafeShallowFreezePrecondition(new DummyFreezable(mutability)));
- }
-
- @Test
- public void checkUnsafeShallowFreezePrecondition_SucceedsWhenAllowed() throws Exception {
- Mutability mutability = Mutability.createAllowingShallowFreeze("test");
- Freezable.checkUnsafeShallowFreezePrecondition(new DummyFreezable(mutability));
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/NodePrinterTest.java b/src/test/java/com/google/devtools/build/lib/syntax/NodePrinterTest.java
deleted file mode 100644
index bddabbb..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/NodePrinterTest.java
+++ /dev/null
@@ -1,413 +0,0 @@
-// Copyright 2017 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.base.Joiner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests {@link Node#toString} and {@code NodePrinter}. */
-@RunWith(JUnit4.class)
-public final class NodePrinterTest {
-
- private static StarlarkFile parseFile(String... lines) throws SyntaxError.Exception {
- ParserInput input = ParserInput.fromLines(lines);
- StarlarkFile file = StarlarkFile.parse(input);
- if (!file.ok()) {
- throw new SyntaxError.Exception(file.errors());
- }
- return file;
- }
-
- private static Statement parseStatement(String... lines) throws SyntaxError.Exception {
- return parseFile(lines).getStatements().get(0);
- }
-
- private static Expression parseExpression(String... lines) throws SyntaxError.Exception {
- return Expression.parse(ParserInput.fromLines(lines));
- }
-
- private static String join(String... lines) {
- return Joiner.on("\n").join(lines);
- }
-
- /**
- * Asserts that the given node's pretty print at a given indent level matches the given string.
- */
- private static void assertPrettyMatches(Node node, int indentLevel, String expected) {
- StringBuilder buf = new StringBuilder();
- new NodePrinter(buf, indentLevel).printNode(node);
- assertThat(buf.toString()).isEqualTo(expected);
- }
-
- /** Asserts that the given node's pretty print with no indent matches the given string. */
- private static void assertPrettyMatches(Node node, String expected) {
- assertPrettyMatches(node, 0, expected);
- }
-
- /** Asserts that the given node's pretty print with one indent matches the given string. */
- private static void assertIndentedPrettyMatches(Node node, String expected) {
- assertPrettyMatches(node, 1, expected);
- }
-
- /** Asserts that the given node's {@code toString} matches the given string. */
- private static void assertTostringMatches(Node node, String expected) {
- assertThat(node.toString()).isEqualTo(expected);
- }
-
- /**
- * Parses the given string as an expression, and asserts that its pretty print matches the given
- * string.
- */
- private static void assertExprPrettyMatches(String source, String expected)
- throws SyntaxError.Exception {
- Expression node = parseExpression(source);
- assertPrettyMatches(node, expected);
- }
-
- /**
- * Parses the given string as an expression, and asserts that its {@code toString} matches the
- * given string.
- */
- private static void assertExprTostringMatches(String source, String expected)
- throws SyntaxError.Exception {
- Expression node = parseExpression(source);
- assertThat(node.toString()).isEqualTo(expected);
- }
-
- /**
- * Parses the given string as an expression, and asserts that both its pretty print and {@code
- * toString} return the original string.
- */
- private static void assertExprBothRoundTrip(String source) throws SyntaxError.Exception {
- assertExprPrettyMatches(source, source);
- assertExprTostringMatches(source, source);
- }
-
- /**
- * Parses the given string as a statement, and asserts that its pretty print with one indent
- * matches the given string.
- */
- private static void assertStmtIndentedPrettyMatches(String source, String expected)
- throws SyntaxError.Exception {
- Statement node = parseStatement(source);
- assertIndentedPrettyMatches(node, expected);
- }
-
- /**
- * Parses the given string as an statement, and asserts that its {@code toString} matches the
- * given string.
- */
- private static void assertStmtTostringMatches(String source, String expected)
- throws SyntaxError.Exception {
- Statement node = parseStatement(source);
- assertThat(node.toString()).isEqualTo(expected);
- }
-
- // Expressions.
-
- @Test
- public void abstractComprehension() throws SyntaxError.Exception {
- // Covers DictComprehension and ListComprehension.
- assertExprBothRoundTrip("[z for y in x if True for z in y]");
- assertExprBothRoundTrip("{z: x for y in x if True for z in y}");
- }
-
- @Test
- public void binaryOperatorExpression() throws SyntaxError.Exception {
- assertExprPrettyMatches("1 + 2", "(1 + 2)");
- assertExprTostringMatches("1 + 2", "1 + 2");
-
- assertExprPrettyMatches("1 + (2 * 3)", "(1 + (2 * 3))");
- assertExprTostringMatches("1 + (2 * 3)", "1 + 2 * 3");
- }
-
- @Test
- public void conditionalExpression() throws SyntaxError.Exception {
- assertExprBothRoundTrip("1 if True else 2");
- }
-
- @Test
- public void dictExpression() throws SyntaxError.Exception {
- assertExprBothRoundTrip("{1: \"a\", 2: \"b\"}");
- }
-
- @Test
- public void dotExpression() throws SyntaxError.Exception {
- assertExprBothRoundTrip("o.f");
- }
-
- @Test
- public void funcallExpression() throws SyntaxError.Exception {
- assertExprBothRoundTrip("f()");
- assertExprBothRoundTrip("f(a)");
- assertExprBothRoundTrip("f(a, b = B, c = C, *d, **e)");
- assertExprBothRoundTrip("o.f()");
- }
-
- @Test
- public void identifier() throws SyntaxError.Exception {
- assertExprBothRoundTrip("foo");
- }
-
- @Test
- public void indexExpression() throws SyntaxError.Exception {
- assertExprBothRoundTrip("a[i]");
- }
-
- @Test
- public void integerLiteral() throws SyntaxError.Exception {
- assertExprBothRoundTrip("5");
- }
-
- @Test
- public void listLiteralShort() throws SyntaxError.Exception {
- assertExprBothRoundTrip("[]");
- assertExprBothRoundTrip("[5]");
- assertExprBothRoundTrip("[5, 6]");
- assertExprBothRoundTrip("()");
- assertExprBothRoundTrip("(5,)");
- assertExprBothRoundTrip("(5, 6)");
- }
-
- @Test
- public void listLiteralLong() throws SyntaxError.Exception {
- // List literals with enough elements to trigger the abbreviated toString() format.
- assertExprPrettyMatches("[1, 2, 3, 4, 5, 6]", "[1, 2, 3, 4, 5, 6]");
- assertExprTostringMatches("[1, 2, 3, 4, 5, 6]", "[1, 2, 3, 4, +2 more]");
-
- assertExprPrettyMatches("(1, 2, 3, 4, 5, 6)", "(1, 2, 3, 4, 5, 6)");
- assertExprTostringMatches("(1, 2, 3, 4, 5, 6)", "(1, 2, 3, 4, +2 more)");
- }
-
- @Test
- public void listLiteralNested() throws SyntaxError.Exception {
- // Make sure that the inner list doesn't get abbreviated when the outer list is printed using
- // prettyPrint().
- assertExprPrettyMatches(
- "[1, 2, 3, [10, 20, 30, 40, 50, 60], 4, 5, 6]",
- "[1, 2, 3, [10, 20, 30, 40, 50, 60], 4, 5, 6]");
- // It doesn't matter as much what toString does.
- assertExprTostringMatches("[1, 2, 3, [10, 20, 30, 40, 50, 60], 4, 5, 6]", "[1, 2, 3, +4 more]");
- }
-
- @Test
- public void sliceExpression() throws SyntaxError.Exception {
- assertExprBothRoundTrip("a[b:c:d]");
- assertExprBothRoundTrip("a[b:c]");
- assertExprBothRoundTrip("a[b:]");
- assertExprBothRoundTrip("a[:c:d]");
- assertExprBothRoundTrip("a[:c]");
- assertExprBothRoundTrip("a[::d]");
- assertExprBothRoundTrip("a[:]");
- }
-
- @Test
- public void stringLiteral() throws SyntaxError.Exception {
- assertExprBothRoundTrip("\"foo\"");
- assertExprBothRoundTrip("\"quo\\\"ted\"");
- }
-
- @Test
- public void unaryOperatorExpression() throws SyntaxError.Exception {
- assertExprPrettyMatches("not True", "not (True)");
- assertExprTostringMatches("not True", "not True");
- assertExprPrettyMatches("-5", "-(5)");
- assertExprTostringMatches("-5", "-5");
- }
-
- // Statements.
-
- @Test
- public void assignmentStatement() throws SyntaxError.Exception {
- assertStmtIndentedPrettyMatches("x = y", " x = y\n");
- assertStmtTostringMatches("x = y", "x = y\n");
- }
-
- @Test
- public void augmentedAssignmentStatement() throws SyntaxError.Exception {
- assertStmtIndentedPrettyMatches("x += y", " x += y\n");
- assertStmtTostringMatches("x += y", "x += y\n");
- }
-
- @Test
- public void expressionStatement() throws SyntaxError.Exception {
- assertStmtIndentedPrettyMatches("5", " 5\n");
- assertStmtTostringMatches("5", "5\n");
- }
-
- @Test
- public void defStatement() throws SyntaxError.Exception {
- assertStmtIndentedPrettyMatches(
- join("def f(x):",
- " print(x)"),
- join(" def f(x):",
- " print(x)",
- ""));
- assertStmtTostringMatches(
- join("def f(x):",
- " print(x)"),
- "def f(x): ...\n");
-
- assertStmtIndentedPrettyMatches(
- join("def f(a, b=B, *c, d=D, **e):",
- " print(x)"),
- join(" def f(a, b=B, *c, d=D, **e):",
- " print(x)",
- ""));
- assertStmtTostringMatches(
- join(
- "def f(a, b=B, *c, d=D, **e):", //
- " print(x)"),
- "def f(a, b=B, *c, d=D, **e): ...\n");
-
- assertStmtIndentedPrettyMatches(
- join("def f():",
- " pass"),
- join(" def f():",
- " pass",
- ""));
- assertStmtTostringMatches(
- join("def f():",
- " pass"),
- "def f(): ...\n");
- }
-
- @Test
- public void flowStatement() throws SyntaxError.Exception {
- assertStmtIndentedPrettyMatches(
- join("def f():", " pass", " continue", " break"),
- join(" def f():", " pass", " continue", " break", ""));
- }
-
- @Test
- public void forStatement() throws SyntaxError.Exception {
- assertStmtIndentedPrettyMatches(
- join("for x in y:",
- " print(x)"),
- join(" for x in y:",
- " print(x)",
- ""));
- assertStmtTostringMatches(
- join("for x in y:",
- " print(x)"),
- "for x in y: ...\n");
-
- assertStmtIndentedPrettyMatches(
- join("for x in y:",
- " pass"),
- join(" for x in y:",
- " pass",
- ""));
- assertStmtTostringMatches(
- join("for x in y:",
- " pass"),
- "for x in y: ...\n");
- }
-
- @Test
- public void ifStatement() throws SyntaxError.Exception {
- assertStmtIndentedPrettyMatches(
- join("if True:",
- " print(x)"),
- join(" if True:",
- " print(x)",
- ""));
- assertStmtTostringMatches(
- join("if True:",
- " print(x)"),
- "if True: ...\n");
-
- assertStmtIndentedPrettyMatches(
- join("if True:",
- " print(x)",
- "elif False:",
- " print(y)",
- "else:",
- " print(z)"),
- join(" if True:",
- " print(x)",
- " elif False:",
- " print(y)",
- " else:",
- " print(z)",
- ""));
- assertStmtTostringMatches(
- join("if True:",
- " print(x)",
- "elif False:",
- " print(y)",
- "else:",
- " print(z)"),
- "if True: ...\n");
- }
-
- @Test
- public void loadStatement() throws SyntaxError.Exception {
- assertStmtIndentedPrettyMatches(
- "load(\"foo.bzl\", a=\"A\", \"B\")", " load(\"foo.bzl\", a=\"A\", \"B\")\n");
- assertStmtTostringMatches(
- "load(\"foo.bzl\", a=\"A\", \"B\")\n", "load(\"foo.bzl\", a=\"A\", \"B\")\n");
- }
-
- @Test
- public void returnStatement() throws SyntaxError.Exception {
- assertStmtIndentedPrettyMatches("return \"foo\"", " return \"foo\"\n");
- assertStmtTostringMatches("return \"foo\"", "return \"foo\"\n");
-
- assertStmtIndentedPrettyMatches("return None", " return None\n");
- assertStmtTostringMatches("return None", "return None\n");
-
- assertStmtIndentedPrettyMatches("return", " return\n");
- assertStmtTostringMatches("return", "return\n");
- }
-
- // Miscellaneous.
-
- @Test
- public void file() throws SyntaxError.Exception {
- Node node = parseFile("print(x)\nprint(y)");
- assertIndentedPrettyMatches(
- node,
- join(" print(x)",
- " print(y)",
- ""));
- assertTostringMatches(node, "<StarlarkFile with 2 statements>");
- }
-
- @Test
- public void comment() throws SyntaxError.Exception {
- ParserInput input =
- ParserInput.fromLines(
- "# foo", //
- "expr # bar");
- Parser.ParseResult r = Parser.parseFile(input, FileOptions.DEFAULT);
- Comment c0 = r.comments.get(0);
- assertIndentedPrettyMatches(c0, " # foo");
- assertTostringMatches(c0, "# foo");
- Comment c1 = r.comments.get(1);
- assertIndentedPrettyMatches(c1, " # bar");
- assertTostringMatches(c1, "# bar");
- }
-
- /* Not tested explicitly because they're covered implicitly by tests for other nodes:
- * - DictExpression.Entry
- * - Argument / Parameter
- * - IfStatements
- */
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java b/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java
deleted file mode 100644
index 2b7dcaa..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2015 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for @{code NodeVisitor} */
-@RunWith(JUnit4.class)
-public final class NodeVisitorTest {
-
- private static StarlarkFile parse(String... lines) throws SyntaxError.Exception {
- ParserInput input = ParserInput.fromLines(lines);
- StarlarkFile file = StarlarkFile.parse(input);
- if (!file.ok()) {
- throw new SyntaxError.Exception(file.errors());
- }
- return file;
- }
-
- @Test
- public void everyIdentifierAndParameterIsVisitedInOrder() throws Exception {
- final List<String> idents = new ArrayList<>();
- final List<String> params = new ArrayList<>();
-
- class IdentVisitor extends NodeVisitor {
- @Override
- public void visit(Identifier node) {
- idents.add(node.getName());
- }
-
- @Override
- public void visit(Parameter node) {
- params.add(node.toString());
- }
- }
-
- StarlarkFile file =
- parse(
- "a = b", //
- "def c(p1, p2=4, **p3):",
- " for d in e: f(g)",
- " return h + i.j()");
- IdentVisitor visitor = new IdentVisitor();
- file.accept(visitor);
- assertThat(idents).containsExactly("b", "a", "c", "e", "d", "f", "g", "h", "i", "j").inOrder();
- assertThat(params).containsExactly("p1", "p2=4", "**p3").inOrder();
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserInputTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserInputTest.java
deleted file mode 100644
index d231913..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserInputTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.ISO_8859_1;
-
-import java.io.IOException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** A test case for {@link ParserInput}. */
-@RunWith(JUnit4.class)
-public class ParserInputTest {
-
- @Test
- public void testFromLatin1() throws IOException {
- String content = "éclair";
- byte[] bytes = content.getBytes(ISO_8859_1);
- ParserInput input = ParserInput.fromLatin1(bytes, "foo.txt");
- assertThat(new String(input.getContent())).isEqualTo(content);
- assertThat(input.getFile()).isEqualTo("foo.txt");
- }
-
- @Test
- public void testFromString() {
- String content = "Content provided as a string.";
- String pathName = "/the/name/of/the/content.txt";
- ParserInput input = ParserInput.fromString(content, pathName);
- assertThat(new String(input.getContent())).isEqualTo(content);
- assertThat(input.getFile()).isEqualTo(pathName);
- }
-
- @Test
- public void testFromCharArray() {
- String content = "Content provided as a string.";
- String pathName = "/the/name/of/the/content.txt";
- char[] contentChars = content.toCharArray();
- ParserInput input = ParserInput.fromCharArray(contentChars, pathName);
- assertThat(new String(input.getContent())).isEqualTo(content);
- assertThat(input.getFile()).isEqualTo(pathName);
- }
-
- @Test
- public void testWillNotTryToReadInputFileIfContentProvidedAsString() {
- ParserInput.fromString("Content provided as string.", "/will/not/try/to/read");
- }
-
- @Test
- public void testWillNotTryToReadInputFileIfContentProvidedAsChars() {
- char[] content = "Content provided as char array.".toCharArray();
- ParserInput.fromCharArray(content, "/will/not/try/to/read");
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
deleted file mode 100644
index dd16ea3..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ /dev/null
@@ -1,1315 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of parser. */
-@RunWith(JUnit4.class)
-public final class ParserTest {
-
- private final List<SyntaxError> events = new ArrayList<>();
- private boolean failFast = true;
-
- private SyntaxError assertContainsError(String expectedMessage) {
- return LexerTest.assertContainsError(events, expectedMessage);
- }
-
- private void setFailFast(boolean failFast) {
- this.failFast = failFast;
- }
-
- // Joins the lines, parse, and returns an expression.
- private static Expression parseExpression(String... lines) throws SyntaxError.Exception {
- ParserInput input = ParserInput.fromLines(lines);
- return Expression.parse(input);
- }
-
- // Parses the expression, asserts that parsing fails,
- // and returns the first error message.
- private static String parseExpressionError(String src) {
- ParserInput input = ParserInput.fromLines(src);
- try {
- Expression.parse(input);
- throw new AssertionError("parseExpression(%s) succeeded unexpectedly: " + src);
- } catch (SyntaxError.Exception ex) {
- return ex.errors().get(0).message();
- }
- }
-
- // Joins the lines, parses, and returns a file.
- // Errors are added to this.events, or thrown if this.failFast;
- private StarlarkFile parseFile(String... lines) throws SyntaxError.Exception {
- ParserInput input = ParserInput.fromLines(lines);
- StarlarkFile file = StarlarkFile.parse(input);
- if (!file.ok()) {
- if (failFast) {
- throw new SyntaxError.Exception(file.errors());
- }
- // TODO(adonovan): return these, and eliminate a stateful field.
- events.addAll(file.errors());
- }
- return file;
- }
-
- // Joins the lines, parses, and returns the sole statement.
- private Statement parseStatement(String... lines) throws SyntaxError.Exception {
- return Iterables.getOnlyElement(parseStatements(lines));
- }
-
- // Joins the lines, parses, and returns the statements.
- private ImmutableList<Statement> parseStatements(String... lines) throws SyntaxError.Exception {
- return parseFile(lines).getStatements();
- }
-
- private static String getText(String text, Node node) {
- return text.substring(node.getStartOffset(), node.getEndOffset());
- }
-
- private static void assertLocation(int start, int end, Node node) throws Exception {
- int actualStart = node.getStartOffset();
- int actualEnd = node.getEndOffset();
-
- if (actualStart != start || actualEnd != end) {
- fail("Expected location = [" + start + ", " + end + "), found ["
- + actualStart + ", " + actualEnd + ")");
- }
- }
-
- // helper func for testListExpressions:
- private static int getIntElem(DictExpression.Entry entry, boolean key) {
- return ((IntegerLiteral) (key ? entry.getKey() : entry.getValue())).getValue();
- }
-
- // helper func for testListExpressions:
- private static int getIntElem(ListExpression list, int index) {
- return ((IntegerLiteral) list.getElements().get(index)).getValue();
- }
-
- // helper func for testListExpressions:
- private static DictExpression.Entry getElem(DictExpression list, int index) {
- return list.getEntries().get(index);
- }
-
- // helper func for testListExpressions:
- private static Expression getElem(ListExpression list, int index) {
- return list.getElements().get(index);
- }
-
- // helper func for testing arguments:
- private static Expression getArg(CallExpression f, int index) {
- return f.getArguments().get(index).getValue();
- }
-
- @Test
- public void testPrecedence1() throws Exception {
- BinaryOperatorExpression e =
- (BinaryOperatorExpression) parseExpression("'%sx' % 'foo' + 'bar'");
-
- assertThat(e.getOperator()).isEqualTo(TokenKind.PLUS);
- }
-
- @Test
- public void testPrecedence2() throws Exception {
- BinaryOperatorExpression e =
- (BinaryOperatorExpression) parseExpression("('%sx' % 'foo') + 'bar'");
- assertThat(e.getOperator()).isEqualTo(TokenKind.PLUS);
- }
-
- @Test
- public void testPrecedence3() throws Exception {
- BinaryOperatorExpression e =
- (BinaryOperatorExpression) parseExpression("'%sx' % ('foo' + 'bar')");
- assertThat(e.getOperator()).isEqualTo(TokenKind.PERCENT);
- }
-
- @Test
- public void testPrecedence4() throws Exception {
- BinaryOperatorExpression e =
- (BinaryOperatorExpression) parseExpression("1 + - (2 - 3)");
- assertThat(e.getOperator()).isEqualTo(TokenKind.PLUS);
- }
-
- @Test
- public void testPrecedence5() throws Exception {
- BinaryOperatorExpression e =
- (BinaryOperatorExpression) parseExpression("2 * x | y + 1");
- assertThat(e.getOperator()).isEqualTo(TokenKind.PIPE);
- }
-
- @Test
- public void testNonAssociativeOperators() throws Exception {
- assertThat(parseExpressionError("0 < 2 < 4"))
- .contains("Operator '<' is not associative with operator '<'");
- assertThat(parseExpressionError("0 == 2 < 4"))
- .contains("Operator '==' is not associative with operator '<'");
- assertThat(parseExpressionError("1 in [1, 2] == True"))
- .contains("Operator 'in' is not associative with operator '=='");
- assertThat(parseExpressionError("1 >= 2 <= 3"))
- .contains("Operator '>=' is not associative with operator '<='");
- }
-
- @Test
- public void testNonAssociativeOperatorsWithParens() throws Exception {
- parseExpression("(0 < 2) < 4");
- parseExpression("(0 == 2) < 4");
- parseExpression("(1 in [1, 2]) == True");
- parseExpression("1 >= (2 <= 3)");
- }
-
- @Test
- public void testUnaryMinusExpr() throws Exception {
- UnaryOperatorExpression e = (UnaryOperatorExpression) parseExpression("-5");
- UnaryOperatorExpression e2 = (UnaryOperatorExpression) parseExpression("- 5");
-
- IntegerLiteral i = (IntegerLiteral) e.getX();
- assertThat(i.getValue()).isEqualTo(5);
- IntegerLiteral i2 = (IntegerLiteral) e2.getX();
- assertThat(i2.getValue()).isEqualTo(5);
- assertLocation(0, 2, e);
- assertLocation(0, 3, e2);
- }
-
- @Test
- public void testFuncallExpr() throws Exception {
- CallExpression e = (CallExpression) parseExpression("foo[0](1, 2, bar=wiz)");
-
- IndexExpression function = (IndexExpression) e.getFunction();
- Identifier functionList = (Identifier) function.getObject();
- assertThat(functionList.getName()).isEqualTo("foo");
- IntegerLiteral listIndex = (IntegerLiteral) function.getKey();
- assertThat(listIndex.getValue()).isEqualTo(0);
-
- assertThat(e.getArguments()).hasSize(3);
- assertThat(e.getNumPositionalArguments()).isEqualTo(2);
-
- IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
- assertThat((int) arg0.getValue()).isEqualTo(1);
-
- IntegerLiteral arg1 = (IntegerLiteral) e.getArguments().get(1).getValue();
- assertThat((int) arg1.getValue()).isEqualTo(2);
-
- Argument arg2 = e.getArguments().get(2);
- assertThat(arg2.getName()).isEqualTo("bar");
- Identifier arg2val = (Identifier) arg2.getValue();
- assertThat(arg2val.getName()).isEqualTo("wiz");
- }
-
- @Test
- public void testMethCallExpr() throws Exception {
- CallExpression e = (CallExpression) parseExpression("foo.foo(1, 2, bar=wiz)");
-
- DotExpression dotExpression = (DotExpression) e.getFunction();
- assertThat(dotExpression.getField().getName()).isEqualTo("foo");
-
- assertThat(e.getArguments()).hasSize(3);
- assertThat(e.getNumPositionalArguments()).isEqualTo(2);
-
- IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
- assertThat((int) arg0.getValue()).isEqualTo(1);
-
- IntegerLiteral arg1 = (IntegerLiteral) e.getArguments().get(1).getValue();
- assertThat((int) arg1.getValue()).isEqualTo(2);
-
- Argument arg2 = e.getArguments().get(2);
- assertThat(arg2.getName()).isEqualTo("bar");
- Identifier arg2val = (Identifier) arg2.getValue();
- assertThat(arg2val.getName()).isEqualTo("wiz");
- }
-
- @Test
- public void testChainedMethCallExpr() throws Exception {
- CallExpression e = (CallExpression) parseExpression("foo.replace().split(1)");
-
- DotExpression dotExpr = (DotExpression) e.getFunction();
- assertThat(dotExpr.getField().getName()).isEqualTo("split");
-
- assertThat(e.getArguments()).hasSize(1);
- assertThat(e.getNumPositionalArguments()).isEqualTo(1);
-
- IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
- assertThat((int) arg0.getValue()).isEqualTo(1);
- }
-
- @Test
- public void testPropRefExpr() throws Exception {
- DotExpression e = (DotExpression) parseExpression("foo.foo");
-
- Identifier ident = e.getField();
- assertThat(ident.getName()).isEqualTo("foo");
- }
-
- @Test
- public void testStringMethExpr() throws Exception {
- CallExpression e = (CallExpression) parseExpression("'foo'.foo()");
-
- DotExpression dotExpression = (DotExpression) e.getFunction();
- assertThat(dotExpression.getField().getName()).isEqualTo("foo");
-
- assertThat(e.getArguments()).isEmpty();
- }
-
- @Test
- public void testStringLiteralOptimizationValue() throws Exception {
- StringLiteral l = (StringLiteral) parseExpression("'abc' + 'def'");
- assertThat(l.getValue()).isEqualTo("abcdef");
- }
-
- @Test
- public void testStringLiteralOptimizationToString() throws Exception {
- StringLiteral l = (StringLiteral) parseExpression("'abc' + 'def'");
- assertThat(l.toString()).isEqualTo("\"abcdef\"");
- }
-
- @Test
- public void testStringLiteralOptimizationLocation() throws Exception {
- StringLiteral l = (StringLiteral) parseExpression("'abc' + 'def'");
- assertThat(l.getStartOffset()).isEqualTo(0);
- assertThat(l.getEndOffset()).isEqualTo(13);
- }
-
- @Test
- public void testStringLiteralOptimizationDifferentQuote() throws Exception {
- StringLiteral l = (StringLiteral) parseExpression("'abc' + \"def\"");
- assertThat(l.getStartOffset()).isEqualTo(0);
- assertThat(l.getEndOffset()).isEqualTo(13);
- }
-
- @Test
- public void testIndex() throws Exception {
- IndexExpression e = (IndexExpression) parseExpression("a[i]");
- assertThat(e.getObject().toString()).isEqualTo("a");
- assertThat(e.getKey().toString()).isEqualTo("i");
- assertLocation(0, 4, e);
- }
-
- @Test
- public void testSubstring() throws Exception {
- SliceExpression s = (SliceExpression) parseExpression("'FOO.CC'[:].lower()[1:]");
- assertThat(((IntegerLiteral) s.getStart()).getValue()).isEqualTo(1);
-
- CallExpression e = (CallExpression) parseExpression("'FOO.CC'.lower()[1:].startswith('oo')");
- DotExpression dotExpression = (DotExpression) e.getFunction();
- assertThat(dotExpression.getField().getName()).isEqualTo("startswith");
- assertThat(e.getArguments()).hasSize(1);
-
- s = (SliceExpression) parseExpression("'FOO.CC'[1:][:2]");
- assertThat(((IntegerLiteral) s.getStop()).getValue()).isEqualTo(2);
- }
-
- @Test
- public void testSlice() throws Exception {
- evalSlice("'0123'[:]", "", "", "");
- evalSlice("'0123'[1:]", 1, "", "");
- evalSlice("'0123'[:3]", "", 3, "");
- evalSlice("'0123'[::]", "", "", "");
- evalSlice("'0123'[1::]", 1, "", "");
- evalSlice("'0123'[:3:]", "", 3, "");
- evalSlice("'0123'[::-1]", "", "", -1);
- evalSlice("'0123'[1:3:]", 1, 3, "");
- evalSlice("'0123'[1::-1]", 1, "", -1);
- evalSlice("'0123'[:3:-1]", "", 3, -1);
- evalSlice("'0123'[1:3:-1]", 1, 3, -1);
-
- Expression slice = parseExpression("'0123'[1:3:-1]");
- assertLocation(0, 14, slice);
- }
-
- private static void evalSlice(String statement, Object... expectedArgs)
- throws SyntaxError.Exception {
- SliceExpression e = (SliceExpression) parseExpression(statement);
-
- // There is no way to evaluate the expression here, so we rely on string comparison.
- String start = e.getStart() == null ? "" : e.getStart().toString();
- String stop = e.getStop() == null ? "" : e.getStop().toString();
- String step = e.getStep() == null ? "" : e.getStep().toString();
-
- assertThat(start).isEqualTo(expectedArgs[0].toString());
- assertThat(stop).isEqualTo(expectedArgs[1].toString());
- assertThat(step).isEqualTo(expectedArgs[2].toString());
- }
-
- @Test
- public void testErrorRecovery() throws Exception {
- setFailFast(false);
-
- // We call parseFile, not parseExpression, as the latter is all-or-nothing.
- String src = "f(1, [x for foo foo foo foo], 3)";
- CallExpression e = (CallExpression) ((ExpressionStatement) parseStatement(src)).getExpression();
-
- assertContainsError("syntax error at 'foo'");
-
- // Test that the arguments are (1, '[x for foo foo foo foo]', 3),
- // where the second, errant one is represented as an Identifier.
-
- Identifier ident = (Identifier) e.getFunction();
- assertThat(ident.getName()).isEqualTo("f");
-
- assertThat(e.getArguments()).hasSize(3);
- assertThat(e.getNumPositionalArguments()).isEqualTo(3);
-
- IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
- assertThat((int) arg0.getValue()).isEqualTo(1);
-
- Argument arg1 = e.getArguments().get(1);
- Identifier arg1val = ((Identifier) arg1.getValue());
- assertThat(arg1val.getName()).isEqualTo("[x for foo foo foo foo]");
-
- assertLocation(5, 28, arg1val);
- assertThat(src.substring(5, 28)).isEqualTo("[x for foo foo foo foo]");
- assertThat(arg1val.getEndLocation().column()).isEqualTo(29);
-
- IntegerLiteral arg2 = (IntegerLiteral) e.getArguments().get(2).getValue();
- assertThat((int) arg2.getValue()).isEqualTo(3);
- }
-
- @Test
- public void testDoesntGetStuck() throws Exception {
- // Make sure the parser does not get stuck when trying
- // to parse an expression containing a syntax error.
- // This usually results in OutOfMemoryError because the
- // parser keeps filling up the error log.
- // We need to make sure that we will always advance
- // in the token stream.
- parseExpressionError("f(1, ], 3)");
- parseExpressionError("f(1, ), 3)");
- parseExpressionError("[ ) for v in 3)");
- }
-
- @Test
- public void testPrimaryLocation() throws SyntaxError.Exception {
- String expr = "f(1 + 2)";
- CallExpression call = (CallExpression) parseExpression(expr);
- Argument arg = call.getArguments().get(0);
- assertThat(arg.getEndLocation()).isLessThan(call.getEndLocation());
- }
-
- @Test
- public void testAssignLocation() throws Exception {
- List<Statement> statements = parseStatements("a = b;c = d\n");
- Statement statement = statements.get(0);
- assertThat(statement.getEndOffset()).isEqualTo(5);
- }
-
- @Test
- public void testAssignKeyword() throws Exception {
- assertThat(parseExpressionError("with = 4")).contains("keyword 'with' not supported");
- }
-
- @Test
- public void testBreak() throws Exception {
- assertThat(parseExpressionError("break"))
- .contains("syntax error at 'break': expected expression");
- }
-
- @Test
- public void testTry() throws Exception {
- assertThat(parseExpressionError("try: 1 + 1"))
- .contains("'try' not supported, all exceptions are fatal");
- }
-
- @Test
- public void testDel() throws Exception {
- assertThat(parseExpressionError("del d['a']"))
- .contains("'del' not supported, use '.pop()' to delete");
- }
-
- @Test
- public void testTupleAssign() throws Exception {
- List<Statement> statements = parseStatements("list[0] = 5; dict['key'] = value\n");
- assertThat(statements).hasSize(2);
- assertThat(statements.get(0)).isInstanceOf(AssignmentStatement.class);
- assertThat(statements.get(1)).isInstanceOf(AssignmentStatement.class);
- }
-
- @Test
- public void testAssign() throws Exception {
- List<Statement> statements = parseStatements("a, b = 5\n");
- assertThat(statements).hasSize(1);
- assertThat(statements.get(0)).isInstanceOf(AssignmentStatement.class);
- AssignmentStatement assign = (AssignmentStatement) statements.get(0);
- assertThat(assign.getLHS()).isInstanceOf(ListExpression.class);
- }
-
- @Test
- public void testInvalidAssign() throws Exception {
- assertThat(parseExpressionError("1 + (b = c)")).contains("syntax error");
- }
-
- @Test
- public void testAugmentedAssign() throws Exception {
- assertThat(parseStatements("x += 1").toString()).isEqualTo("[x += 1\n]");
- assertThat(parseStatements("x -= 1").toString()).isEqualTo("[x -= 1\n]");
- assertThat(parseStatements("x *= 1").toString()).isEqualTo("[x *= 1\n]");
- assertThat(parseStatements("x /= 1").toString()).isEqualTo("[x /= 1\n]");
- assertThat(parseStatements("x %= 1").toString()).isEqualTo("[x %= 1\n]");
- assertThat(parseStatements("x |= 1").toString()).isEqualTo("[x |= 1\n]");
- assertThat(parseStatements("x &= 1").toString()).isEqualTo("[x &= 1\n]");
- assertThat(parseStatements("x <<= 1").toString()).isEqualTo("[x <<= 1\n]");
- assertThat(parseStatements("x >>= 1").toString()).isEqualTo("[x >>= 1\n]");
- }
-
- @Test
- public void testPrettyPrintFunctions() throws Exception {
- assertThat(parseStatements("x[1:3]").toString()).isEqualTo("[x[1:3]\n]");
- assertThat(parseStatements("x[1:3:1]").toString()).isEqualTo("[x[1:3:1]\n]");
- assertThat(parseStatements("x[1:3:2]").toString()).isEqualTo("[x[1:3:2]\n]");
- assertThat(parseStatements("x[1::2]").toString()).isEqualTo("[x[1::2]\n]");
- assertThat(parseStatements("x[1:]").toString()).isEqualTo("[x[1:]\n]");
- assertThat(parseStatements("str[42]").toString()).isEqualTo("[str[42]\n]");
- assertThat(parseStatements("ctx.actions.declare_file('hello')").toString())
- .isEqualTo("[ctx.actions.declare_file(\"hello\")\n]");
- assertThat(parseStatements("new_file(\"hello\")").toString())
- .isEqualTo("[new_file(\"hello\")\n]");
- }
-
- @Test
- public void testEndLineAndColumnIsExclusive() throws Exception {
- // The behavior was 'inclusive' for a couple of years (see CL 170723732),
- // but this was a mistake. Arithmetic on half-open intervals is much simpler.
- AssignmentStatement stmt = (AssignmentStatement) parseStatement("a = b");
- assertThat(stmt.getLHS().getEndLocation().toString()).isEqualTo(":1:2");
- }
-
- @Test
- public void testFuncallLocation() throws Exception {
- List<Statement> statements = parseStatements("a(b);c = d\n");
- Statement statement = statements.get(0);
- assertThat(statement.getEndOffset()).isEqualTo(4);
- }
-
- @Test
- public void testListPositions() throws Exception {
- String expr = "[0,f(1),2]";
- assertExpressionLocationCorrect(expr);
- ListExpression list = (ListExpression) parseExpression(expr);
- assertThat(getText(expr, getElem(list, 0))).isEqualTo("0");
- assertThat(getText(expr, getElem(list, 1))).isEqualTo("f(1)");
- assertThat(getText(expr, getElem(list, 2))).isEqualTo("2");
- }
-
- @Test
- public void testDictPositions() throws Exception {
- String expr = "{1:2,2:f(1),3:4}";
- assertExpressionLocationCorrect(expr);
- DictExpression list = (DictExpression) parseExpression(expr);
- assertThat(getText(expr, getElem(list, 0))).isEqualTo("1:2");
- assertThat(getText(expr, getElem(list, 1))).isEqualTo("2:f(1)");
- assertThat(getText(expr, getElem(list, 2))).isEqualTo("3:4");
- }
-
- @Test
- public void testArgumentPositions() throws Exception {
- String expr = "f(0,g(1,2),2)";
- assertExpressionLocationCorrect(expr);
- CallExpression f = (CallExpression) parseExpression(expr);
- assertThat(getText(expr, getArg(f, 0))).isEqualTo("0");
- assertThat(getText(expr, getArg(f, 1))).isEqualTo("g(1,2)");
- assertThat(getText(expr, getArg(f, 2))).isEqualTo("2");
- }
-
- @Test
- public void testSuffixPosition() throws Exception {
- assertExpressionLocationCorrect("'a'.len");
- assertExpressionLocationCorrect("'a'[0]");
- assertExpressionLocationCorrect("'a'[0:1]");
- }
-
- @Test
- public void testTuplePosition() throws Exception {
- String input = "for a,b in []: pass";
- ForStatement stmt = (ForStatement) parseStatement(input);
- assertThat(getText(input, stmt.getVars())).isEqualTo("a,b");
-
- input = "for (a,b) in []: pass";
- stmt = (ForStatement) parseStatement(input);
- assertThat(getText(input, stmt.getVars())).isEqualTo("(a,b)");
-
- assertExpressionLocationCorrect("a, b");
- assertExpressionLocationCorrect("(a, b)");
- }
-
- @Test
- public void testComprehensionPosition() throws Exception {
- assertExpressionLocationCorrect("[[] for x in []]");
- assertExpressionLocationCorrect("{1: [] for x in []}");
- }
-
- @Test
- public void testUnaryOperationPosition() throws Exception {
- assertExpressionLocationCorrect("not True");
- }
-
- @Test
- public void testLoadStatementPosition() throws Exception {
- String input = "load(':foo.bzl', 'bar')";
- LoadStatement stmt = (LoadStatement) parseStatement(input);
- assertThat(getText(input, stmt)).isEqualTo(input);
- // Also try it with another token at the end (newline), which broke the location in the past.
- stmt = (LoadStatement) parseStatement(input + "\n");
- assertThat(getText(input, stmt)).isEqualTo(input);
- }
-
- @Test
- public void testElif() throws Exception {
- IfStatement ifA =
- (IfStatement)
- parseStatement(
- "if a:", //
- " pass", "elif b:", " pass", "else:", " pass", "");
- IfStatement ifB = (IfStatement) Iterables.getOnlyElement(ifA.getElseBlock());
- assertThat(ifB.isElif()).isTrue();
-
- ifA =
- (IfStatement)
- parseStatement(
- "if a:", //
- " pass",
- "else:",
- " if b:",
- " pass",
- " else:",
- " pass",
- "");
- ifB = (IfStatement) Iterables.getOnlyElement(ifA.getElseBlock());
- assertThat(ifB.isElif()).isFalse();
- }
-
- @Test
- public void testIfStatementPosition() throws Exception {
- assertStatementLocationCorrect("if True:\n pass");
- assertStatementLocationCorrect("if True:\n pass\nelif True:\n pass");
- assertStatementLocationCorrect("if True:\n pass\nelse:\n pass");
- }
-
- @Test
- public void testForStatementPosition() throws Exception {
- assertStatementLocationCorrect("for x in []:\n pass");
- }
-
- @Test
- public void testDefStatementPosition() throws Exception {
- assertStatementLocationCorrect("def foo():\n pass");
- }
-
- private void assertStatementLocationCorrect(String stmtStr) throws SyntaxError.Exception {
- Statement stmt = parseStatement(stmtStr);
- assertThat(getText(stmtStr, stmt)).isEqualTo(stmtStr);
- // Also try it with another token at the end (newline), which broke the location in the past.
- stmt = parseStatement(stmtStr + "\n");
- assertThat(getText(stmtStr, stmt)).isEqualTo(stmtStr);
- }
-
- private static void assertExpressionLocationCorrect(String exprStr) throws SyntaxError.Exception {
- Expression expr = parseExpression(exprStr);
- assertThat(getText(exprStr, expr)).isEqualTo(exprStr);
- // Also try it with another token at the end (newline), which broke the location in the past.
- expr = parseExpression(exprStr + "\n");
- assertThat(getText(exprStr, expr)).isEqualTo(exprStr);
- }
-
- @Test
- public void testForBreakContinuePass() throws Exception {
- List<Statement> file =
- parseStatements(
- "def foo():", //
- " for i in [1, 2]:",
- " break",
- " continue",
- " pass",
- " break");
- assertThat(file).hasSize(1);
- List<Statement> body = ((DefStatement) file.get(0)).getBody();
- assertThat(body).hasSize(1);
-
- List<Statement> loop = ((ForStatement) body.get(0)).getBody();
- assertThat(loop).hasSize(4);
-
- assertThat(((FlowStatement) loop.get(0)).getKind()).isEqualTo(TokenKind.BREAK);
- assertLocation(34, 39, loop.get(0));
-
- assertThat(((FlowStatement) loop.get(1)).getKind()).isEqualTo(TokenKind.CONTINUE);
- assertLocation(44, 52, loop.get(1));
-
- assertThat(((FlowStatement) loop.get(2)).getKind()).isEqualTo(TokenKind.PASS);
- assertLocation(57, 61, loop.get(2));
-
- assertThat(((FlowStatement) loop.get(3)).getKind()).isEqualTo(TokenKind.BREAK);
- assertLocation(66, 71, loop.get(3));
- }
-
- @Test
- public void testListExpressions1() throws Exception {
- ListExpression list = (ListExpression) parseExpression("[0,1,2]");
- assertThat(list.isTuple()).isFalse();
- assertThat(list.getElements()).hasSize(3);
- assertThat(list.isTuple()).isFalse();
- for (int i = 0; i < 3; ++i) {
- assertThat(getIntElem(list, i)).isEqualTo(i);
- }
- }
-
- @Test
- public void testTupleLiterals2() throws Exception {
- ListExpression tuple = (ListExpression) parseExpression("(0,1,2)");
- assertThat(tuple.isTuple()).isTrue();
- assertThat(tuple.getElements()).hasSize(3);
- assertThat(tuple.isTuple()).isTrue();
- for (int i = 0; i < 3; ++i) {
- assertThat(getIntElem(tuple, i)).isEqualTo(i);
- }
- }
-
- @Test
- public void testTupleWithoutParens() throws Exception {
- ListExpression tuple = (ListExpression) parseExpression("0, 1, 2");
- assertThat(tuple.isTuple()).isTrue();
- assertThat(tuple.getElements()).hasSize(3);
- assertThat(tuple.isTuple()).isTrue();
- for (int i = 0; i < 3; ++i) {
- assertThat(getIntElem(tuple, i)).isEqualTo(i);
- }
- }
-
- @Test
- public void testTupleWithTrailingComma() throws Exception {
- // Unlike Python, we require parens here.
- assertThat(parseExpressionError("0, 1, 2, 3,")).contains("Trailing comma");
- assertThat(parseExpressionError("1 + 2,")).contains("Trailing comma");
-
- ListExpression tuple = (ListExpression) parseExpression("(0, 1, 2, 3,)");
- assertThat(tuple.isTuple()).isTrue();
- assertThat(tuple.getElements()).hasSize(4);
- assertThat(tuple.isTuple()).isTrue();
- for (int i = 0; i < 4; ++i) {
- assertThat(getIntElem(tuple, i)).isEqualTo(i);
- }
- }
-
- @Test
- public void testTupleLiterals3() throws Exception {
- ListExpression emptyTuple = (ListExpression) parseExpression("()");
- assertThat(emptyTuple.isTuple()).isTrue();
- assertThat(emptyTuple.getElements()).isEmpty();
- }
-
- @Test
- public void testTupleLiterals4() throws Exception {
- ListExpression singletonTuple = (ListExpression) parseExpression("(42,)");
- assertThat(singletonTuple.isTuple()).isTrue();
- assertThat(singletonTuple.getElements()).hasSize(1);
- assertThat(getIntElem(singletonTuple, 0)).isEqualTo(42);
- }
-
- @Test
- public void testTupleLiterals5() throws Exception {
- IntegerLiteral intLit = (IntegerLiteral) parseExpression("(42)"); // not a tuple!
- assertThat((int) intLit.getValue()).isEqualTo(42);
- }
-
- @Test
- public void testListExpressions6() throws Exception {
- ListExpression emptyList = (ListExpression) parseExpression("[]");
- assertThat(emptyList.isTuple()).isFalse();
- assertThat(emptyList.getElements()).isEmpty();
- }
-
- @Test
- public void testListExpressions7() throws Exception {
- ListExpression singletonList = (ListExpression) parseExpression("[42,]");
- assertThat(singletonList.isTuple()).isFalse();
- assertThat(singletonList.getElements()).hasSize(1);
- assertThat(getIntElem(singletonList, 0)).isEqualTo(42);
- }
-
- @Test
- public void testListExpressions8() throws Exception {
- ListExpression singletonList = (ListExpression) parseExpression("[42]"); // a singleton
- assertThat(singletonList.isTuple()).isFalse();
- assertThat(singletonList.getElements()).hasSize(1);
- assertThat(getIntElem(singletonList, 0)).isEqualTo(42);
- }
-
- @Test
- public void testDictExpressions() throws Exception {
- DictExpression dictionaryList =
- (DictExpression) parseExpression("{1:42}"); // a singleton dictionary
- assertThat(dictionaryList.getEntries()).hasSize(1);
- DictExpression.Entry tuple = getElem(dictionaryList, 0);
- assertThat(getIntElem(tuple, true)).isEqualTo(1);
- assertThat(getIntElem(tuple, false)).isEqualTo(42);
- }
-
- @Test
- public void testDictExpressions1() throws Exception {
- DictExpression dictionaryList = (DictExpression) parseExpression("{}"); // an empty dictionary
- assertThat(dictionaryList.getEntries()).isEmpty();
- }
-
- @Test
- public void testDictExpressions2() throws Exception {
- DictExpression dictionaryList =
- (DictExpression) parseExpression("{1:42,}"); // a singleton dictionary
- assertThat(dictionaryList.getEntries()).hasSize(1);
- DictExpression.Entry tuple = getElem(dictionaryList, 0);
- assertThat(getIntElem(tuple, true)).isEqualTo(1);
- assertThat(getIntElem(tuple, false)).isEqualTo(42);
- }
-
- @Test
- public void testDictExpressions3() throws Exception {
- DictExpression dictionaryList = (DictExpression) parseExpression("{1:42,2:43,3:44}");
- assertThat(dictionaryList.getEntries()).hasSize(3);
- for (int i = 0; i < 3; i++) {
- DictExpression.Entry tuple = getElem(dictionaryList, i);
- assertThat(getIntElem(tuple, true)).isEqualTo(i + 1);
- assertThat(getIntElem(tuple, false)).isEqualTo(i + 42);
- }
- }
-
- @Test
- public void testListExpressions9() throws Exception {
- ListExpression singletonList =
- (ListExpression) parseExpression("[ abi + opt_level + \'/include\' ]");
- assertThat(singletonList.isTuple()).isFalse();
- assertThat(singletonList.getElements()).hasSize(1);
- }
-
- @Test
- public void testListComprehensionSyntax() throws Exception {
- assertThat(parseExpressionError("[x for")).contains("syntax error at 'newline'");
- assertThat(parseExpressionError("[x for x")).contains("syntax error at 'newline'");
- assertThat(parseExpressionError("[x for x in")).contains("syntax error at 'newline'");
- assertThat(parseExpressionError("[x for x in []")).contains("syntax error at 'newline'");
- assertThat(parseExpressionError("[x for x for y in ['a']]")).contains("syntax error at 'for'");
- assertThat(parseExpressionError("[x for x for y in 1, 2]")).contains("syntax error at 'for'");
- }
-
- @Test
- public void testListComprehensionEmptyList() throws Exception {
- List<Comprehension.Clause> clauses =
- ((Comprehension) parseExpression("['foo/%s.java' % x for x in []]")).getClauses();
- assertThat(clauses).hasSize(1);
- Comprehension.For for0 = (Comprehension.For) clauses.get(0);
- assertThat(for0.getIterable().toString()).isEqualTo("[]");
- assertThat(for0.getVars().toString()).isEqualTo("x");
- }
-
- @Test
- public void testListComprehension() throws Exception {
- List<Comprehension.Clause> clauses =
- ((Comprehension) parseExpression("['foo/%s.java' % x for x in ['bar', 'wiz', 'quux']]"))
- .getClauses();
- assertThat(clauses).hasSize(1);
- Comprehension.For for0 = (Comprehension.For) clauses.get(0);
- assertThat(for0.getVars().toString()).isEqualTo("x");
- assertThat(for0.getIterable()).isInstanceOf(ListExpression.class);
- }
-
- @Test
- public void testForForListComprehension() throws Exception {
- List<Comprehension.Clause> clauses =
- ((Comprehension)
- parseExpression("['%s/%s.java' % (x, y) for x in ['foo', 'bar'] for y in list]"))
- .getClauses();
- assertThat(clauses).hasSize(2);
- Comprehension.For for0 = (Comprehension.For) clauses.get(0);
- assertThat(for0.getVars().toString()).isEqualTo("x");
- assertThat(for0.getIterable()).isInstanceOf(ListExpression.class);
- Comprehension.For for1 = (Comprehension.For) clauses.get(1);
- assertThat(for1.getVars().toString()).isEqualTo("y");
- assertThat(for1.getIterable()).isInstanceOf(Identifier.class);
- }
-
- @Test
- public void testParserRecovery() throws Exception {
- setFailFast(false);
- List<Statement> statements =
- parseStatements(
- "def foo():",
- " a = 2 for 4", // parse error
- " b = [3, 4]",
- "",
- "d = 4 ada", // parse error
- "",
- "def bar():",
- " a = [3, 4]",
- " b = 2 * * 5", // parse error
- "");
-
- assertContainsError("syntax error at 'for': expected newline");
- assertContainsError("syntax error at 'ada': expected newline");
- assertContainsError("syntax error at '*': expected expression");
- assertThat(events).hasSize(3);
- assertThat(statements).hasSize(3);
- }
-
- @Test
- public void testParserContainsErrors() throws Exception {
- setFailFast(false);
- parseFile("*");
- assertContainsError("syntax error at '*'");
- }
-
- @Test
- public void testSemicolonAndNewline() throws Exception {
- List<Statement> stmts =
- parseStatements(
- "foo='bar'; foo(bar)", //
- "",
- "foo='bar'; foo(bar)");
- assertThat(stmts).hasSize(4);
- }
-
- @Test
- public void testSemicolonAndNewline2() throws Exception {
- setFailFast(false);
- List<Statement> stmts = parseStatements("foo='foo' error(bar)", "", "");
- assertContainsError("syntax error at 'error'");
- assertThat(stmts).hasSize(1);
- }
-
- @Test
- public void testExprAsStatement() throws Exception {
- List<Statement> stmts =
- parseStatements(
- "li = []", //
- "li.append('a.c')",
- "\"\"\" string comment \"\"\"",
- "foo(bar)");
- assertThat(stmts).hasSize(4);
- }
-
- @Test
- public void testParseBuildFileWithSingleRule() throws Exception {
- List<Statement> stmts =
- parseStatements(
- "genrule(name = 'foo',", //
- " srcs = ['input.csv'],",
- " outs = [ 'result.txt',",
- " 'result.log'],",
- " cmd = 'touch result.txt result.log')",
- "");
- assertThat(stmts).hasSize(1);
- }
-
- @Test
- public void testParseBuildFileWithMultipleRules() throws Exception {
- List<Statement> stmts =
- parseStatements(
- "genrule(name = 'foo',", //
- " srcs = ['input.csv'],",
- " outs = [ 'result.txt',",
- " 'result.log'],",
- " cmd = 'touch result.txt result.log')",
- "",
- "genrule(name = 'bar',",
- " srcs = ['input.csv'],",
- " outs = [ 'graph.svg'],",
- " cmd = 'touch graph.svg')");
- assertThat(stmts).hasSize(2);
- }
-
- @Test
- public void testParseBuildFileWithComments() throws Exception {
- StarlarkFile result =
- parseFile(
- "# Test BUILD file", //
- "# with multi-line comment",
- "",
- "genrule(name = 'foo',",
- " srcs = ['input.csv'],",
- " outs = [ 'result.txt',",
- " 'result.log'],",
- " cmd = 'touch result.txt result.log')");
- assertThat(result.getStatements()).hasSize(1);
- assertThat(result.getComments()).hasSize(2);
- }
-
- @Test
- public void testParseBuildFileWithManyComments() throws Exception {
- StarlarkFile result =
- parseFile(
- "# 1", //
- "# 2",
- "",
- "# 4 ",
- "# 5",
- "#", // 6 - find empty comment for syntax highlighting
- "# 7 ",
- "# 8",
- "genrule(name = 'foo',",
- " srcs = ['input.csv'],",
- " # 11",
- " outs = [ 'result.txt',",
- " 'result.log'], # 13",
- " cmd = 'touch result.txt result.log')",
- "# 15");
- assertThat(result.getStatements()).hasSize(1); // Single genrule
- StringBuilder commentLines = new StringBuilder();
- for (Comment comment : result.getComments()) {
- // Comments start and end on the same line
- Location start = comment.getStartLocation();
- Location end = comment.getEndLocation();
- assertWithMessage(start.line() + " ends on " + end.line())
- .that(end.line())
- .isEqualTo(start.line());
- commentLines.append('(');
- commentLines.append(start.line());
- commentLines.append(',');
- commentLines.append(start.column());
- commentLines.append(") ");
- }
- assertWithMessage("Found: " + commentLines)
- .that(result.getComments().size()).isEqualTo(10); // One per '#'
- }
-
- @Test
- public void testMissingComma() throws Exception {
- setFailFast(false);
- // Regression test.
- // Note: missing comma after name='foo'
- parseFile("genrule(name = 'foo'\n"
- + " srcs = ['in'])");
- assertContainsError("syntax error at 'srcs'");
- }
-
- @Test
- public void testDoubleSemicolon() throws Exception {
- setFailFast(false);
- // Regression test.
- parseFile("x = 1; ; x = 2;");
- assertContainsError("syntax error at ';'");
- }
-
- @Test
- public void testDefSingleLine() throws Exception {
- List<Statement> statements = parseStatements("def foo(): x = 1; y = 2\n");
- DefStatement stmt = (DefStatement) statements.get(0);
- assertThat(stmt.getBody()).hasSize(2);
- }
-
- @Test
- public void testForPass() throws Exception {
- List<Statement> statements = parseStatements("def foo():", " pass\n");
-
- assertThat(statements).hasSize(1);
- DefStatement stmt = (DefStatement) statements.get(0);
- assertThat(stmt.getBody().get(0)).isInstanceOf(FlowStatement.class);
- }
-
- @Test
- public void testForLoopMultipleVariables() throws Exception {
- List<Statement> stmts1 = parseStatements("[ i for i, j, k in [(1, 2, 3)] ]\n");
- assertThat(stmts1).hasSize(1);
-
- List<Statement> stmts2 = parseStatements("[ i for i, j in [(1, 2, 3)] ]\n");
- assertThat(stmts2).hasSize(1);
-
- List<Statement> stmts3 = parseStatements("[ i for (i, j, k) in [(1, 2, 3)] ]\n");
- assertThat(stmts3).hasSize(1);
- }
-
- @Test
- public void testReturnNone() throws Exception {
- List<Statement> defNone = parseStatements("def foo():", " return None\n");
- assertThat(defNone).hasSize(1);
-
- List<Statement> bodyNone = ((DefStatement) defNone.get(0)).getBody();
- assertThat(bodyNone).hasSize(1);
-
- ReturnStatement returnNone = (ReturnStatement) bodyNone.get(0);
- assertThat(((Identifier) returnNone.getResult()).getName()).isEqualTo("None");
-
- int i = 0;
- for (String end : new String[]{";", "\n"}) {
- List<Statement> defNoExpr = parseStatements("def bar" + i + "():", " return" + end);
- i++;
- assertThat(defNoExpr).hasSize(1);
-
- List<Statement> bodyNoExpr = ((DefStatement) defNoExpr.get(0)).getBody();
- assertThat(bodyNoExpr).hasSize(1);
-
- ReturnStatement returnNoExpr = (ReturnStatement) bodyNoExpr.get(0);
- assertThat(returnNoExpr.getResult()).isNull();
- }
- }
-
- @Test
- public void testForLoopBadSyntax() throws Exception {
- setFailFast(false);
- parseFile("[1 for (a, b, c in var]\n");
- assertContainsError("syntax error");
- }
-
- @Test
- public void testForLoopBadSyntax2() throws Exception {
- setFailFast(false);
- parseFile("[1 for in var]\n");
- assertContainsError("syntax error");
- }
-
- @Test
- public void testFunCallBadSyntax() throws Exception {
- setFailFast(false);
- parseFile("f(1,\n");
- assertContainsError("syntax error");
- }
-
- @Test
- public void testFunCallBadSyntax2() throws Exception {
- setFailFast(false);
- parseFile("f(1, 5, ,)\n");
- assertContainsError("syntax error");
- }
-
- @Test
- public void testLoadNoSymbol() throws Exception {
- setFailFast(false);
- parseFile("load('//foo/bar:file.bzl')\n");
- assertContainsError("expected at least one symbol to load");
- }
-
- @Test
- public void testLoadOneSymbol() throws Exception {
- String text = "load('//foo/bar:file.bzl', 'fun_test')\n";
- List<Statement> statements = parseStatements(text);
- LoadStatement stmt = (LoadStatement) statements.get(0);
- assertThat(stmt.getImport().getValue()).isEqualTo("//foo/bar:file.bzl");
- assertThat(stmt.getBindings()).hasSize(1);
- Identifier sym = stmt.getBindings().get(0).getLocalName();
- assertThat(getText(text, sym)).isEqualTo("fun_test"); // apparent location within string literal
- }
-
- @Test
- public void testLoadOneSymbolWithTrailingComma() throws Exception {
- List<Statement> statements = parseStatements("load('//foo/bar:file.bzl', 'fun_test',)\n");
- LoadStatement stmt = (LoadStatement) statements.get(0);
- assertThat(stmt.getImport().getValue()).isEqualTo("//foo/bar:file.bzl");
- assertThat(stmt.getBindings()).hasSize(1);
- }
-
- @Test
- public void testLoadMultipleSymbols() throws Exception {
- List<Statement> statements = parseStatements("load(':file.bzl', 'foo', 'bar')\n");
- LoadStatement stmt = (LoadStatement) statements.get(0);
- assertThat(stmt.getImport().getValue()).isEqualTo(":file.bzl");
- assertThat(stmt.getBindings()).hasSize(2);
- }
-
- @Test
- public void testLoadLabelQuoteError() throws Exception {
- setFailFast(false);
- parseFile("load(non_quoted, 'a')\n");
- assertContainsError("syntax error");
- }
-
- @Test
- public void testLoadSymbolQuoteError() throws Exception {
- setFailFast(false);
- parseFile("load('label', non_quoted)\n");
- assertContainsError("syntax error");
- }
-
- @Test
- public void testLoadDisallowSameLine() throws Exception {
- setFailFast(false);
- parseFile("load('foo.bzl', 'foo') load('bar.bzl', 'bar')");
- assertContainsError("syntax error");
- }
-
- @Test
- public void testLoadNotAtTopLevel() throws Exception {
- // "This is not a parse error." --Magritte
- parseFile("if 1: load('', 'x')\n");
- }
-
- @Test
- public void testLoadModuleNotStringLiteral() throws Exception {
- setFailFast(false);
- parseFile("load(123, 'x')");
- assertContainsError("syntax error at '123': expected string literal");
- }
-
- @Test
- public void testLoadAlias() throws Exception {
- List<Statement> statements = parseStatements("load('//foo/bar:file.bzl', my_alias = 'lawl')\n");
- LoadStatement stmt = (LoadStatement) statements.get(0);
- ImmutableList<LoadStatement.Binding> actualSymbols = stmt.getBindings();
-
- assertThat(actualSymbols).hasSize(1);
- Identifier sym = actualSymbols.get(0).getLocalName();
- assertThat(sym.getName()).isEqualTo("my_alias");
- int startOffset = sym.getStartOffset();
- assertWithMessage("getStartOffset()").that(startOffset).isEqualTo(27);
- assertWithMessage("getEndOffset()").that(sym.getEndOffset()).isEqualTo(startOffset + 8);
- }
-
- @Test
- public void testLoadAliasMultiple() throws Exception {
- runLoadAliasTestForSymbols(
- "my_alias = 'lawl', 'lol', next_alias = 'rofl'", "my_alias", "lol", "next_alias");
- }
-
- private void runLoadAliasTestForSymbols(String loadSymbolString, String... expectedSymbols)
- throws SyntaxError.Exception {
- List<Statement> statements =
- parseStatements(String.format("load('//foo/bar:file.bzl', %s)\n", loadSymbolString));
- LoadStatement stmt = (LoadStatement) statements.get(0);
-
- List<String> actualSymbolNames = new ArrayList<>();
- for (LoadStatement.Binding binding : stmt.getBindings()) {
- actualSymbolNames.add(binding.getLocalName().getName());
- }
- assertThat(actualSymbolNames).containsExactly((Object[]) expectedSymbols);
- }
-
- @Test
- public void testLoadAliasSyntaxError() throws Exception {
- setFailFast(false);
- parseFile("load('//foo:bzl', test1 = )\n");
- assertContainsError("syntax error at ')': expected string");
-
- parseFile("load(':foo.bzl', test2 = 1)\n");
- assertContainsError("syntax error at '1': expected string");
-
- parseFile("load(':foo.bzl', test3 = old)\n");
- assertContainsError("syntax error at 'old': expected string");
- }
-
- @Test
- public void testLoadIsASmallStatement() throws Exception {
- // Regression test for b/148802200.
- parseFile("a=1; load('file', 'b'); c=3");
- }
-
- @Test
- public void testParseErrorNotComparison() throws Exception {
- setFailFast(false);
- parseFile("2 < not 3");
- assertContainsError("syntax error at 'not'");
- }
-
- @Test
- public void testNotWithArithmeticOperatorsBadSyntax() throws Exception {
- setFailFast(false);
- parseFile("0 + not 0");
- assertContainsError("syntax error at 'not'");
- }
-
- @Test
- public void testElseWithoutIf() throws Exception {
- setFailFast(false);
- parseFile(
- "def func(a):",
- // no if
- " else: return a");
- assertContainsError("syntax error at 'else': expected expression");
- }
-
- @Test
- public void testForElse() throws Exception {
- setFailFast(false);
- parseFile(
- "def func(a):", //
- " for i in range(a):",
- " print(i)",
- " else: return a");
- assertContainsError("syntax error at 'else': expected expression");
- }
-
- @Test
- public void testTryStatementInBuild() throws Exception {
- setFailFast(false);
- parseFile("try: pass");
- assertContainsError("'try' not supported, all exceptions are fatal");
- }
-
- @Test
- public void testClassDefinitionInBuild() throws Exception {
- setFailFast(false);
- parseFile("class test(object): pass");
- assertContainsError("keyword 'class' not supported");
- }
-
- @Test
- public void testClassDefinitionInStarlark() throws Exception {
- setFailFast(false);
- parseFile("class test(object): pass");
- assertContainsError("keyword 'class' not supported");
- }
-
-
- @Test
- public void testStringsAreDeduped() throws Exception {
- StarlarkFile file = parseFile("L1 = ['cat', 'dog', 'fish']", "L2 = ['dog', 'fish', 'cat']");
- Set<String> uniqueStringInstances = Sets.newIdentityHashSet();
- NodeVisitor collectAllStringsInStringLiteralsVisitor =
- new NodeVisitor() {
- @Override
- public void visit(StringLiteral stringLiteral) {
- uniqueStringInstances.add(stringLiteral.getValue());
- }
- };
- collectAllStringsInStringLiteralsVisitor.visit(file);
- assertThat(uniqueStringInstances).containsExactly("cat", "dog", "fish");
- }
-
- @Test
- public void testConditionalExpressions() throws Exception {
- assertThat(parseExpressionError("1 if 2"))
- .contains("missing else clause in conditional expression or semicolon before if");
- }
-
- @Test
- public void testParseFileStackOverflow() throws Exception {
- StarlarkFile file = StarlarkFile.parse(veryDeepExpression());
- SyntaxError ex = LexerTest.assertContainsError(file.errors(), "internal error: stack overflow");
- assertThat(ex.message()).contains("parseDictEntry"); // includes stack
- assertThat(ex.message()).contains("Please report the bug");
- assertThat(ex.message()).contains("include the text of foo.star"); // includes file name
- }
-
- @Test
- public void testParseExpressionStackOverflow() throws Exception {
- SyntaxError.Exception ex =
- assertThrows(SyntaxError.Exception.class, () -> Expression.parse(veryDeepExpression()));
- SyntaxError err = LexerTest.assertContainsError(ex.errors(), "internal error: stack overflow");
- assertThat(err.message()).contains("parseDictEntry"); // includes stack
- assertThat(err.message())
- .contains("while parsing Starlark expression <<{{{{"); // includes expression
- assertThat(err.message()).contains("Please report the bug");
- }
-
- private static ParserInput veryDeepExpression() {
- StringBuilder s = new StringBuilder();
- for (int i = 0; i < 1000; i++) {
- s.append("{");
- }
- return ParserInput.fromString(s.toString(), "foo.star");
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java b/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java
deleted file mode 100644
index e39c5a1..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2015 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableMap;
-import java.util.IllegalFormatException;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Test properties of the evaluator's datatypes and utility functions
- * without actually creating any parse trees.
- */
-@RunWith(JUnit4.class)
-public class PrinterTest {
-
- @Test
- public void testPrinter() throws Exception {
- // Note that str and repr only differ on behaviour of strings at toplevel.
- assertThat(Starlark.str(createObjWithStr())).isEqualTo("<str marker>");
- assertThat(Starlark.repr(createObjWithStr())).isEqualTo("<repr marker>");
-
- assertThat(Starlark.str("foo\nbar")).isEqualTo("foo\nbar");
- assertThat(Starlark.repr("foo\nbar")).isEqualTo("\"foo\\nbar\"");
- assertThat(Starlark.str("'")).isEqualTo("'");
- assertThat(Starlark.repr("'")).isEqualTo("\"'\"");
- assertThat(Starlark.str("\"")).isEqualTo("\"");
- assertThat(Starlark.repr("\"")).isEqualTo("\"\\\"\"");
- assertThat(Starlark.str(3)).isEqualTo("3");
- assertThat(Starlark.repr(3)).isEqualTo("3");
- assertThat(Starlark.repr(Starlark.NONE)).isEqualTo("None");
-
- List<?> list = StarlarkList.of(null, "foo", "bar");
- List<?> tuple = Tuple.of("foo", "bar");
-
- assertThat(Starlark.str(Tuple.of(1, list, 3))).isEqualTo("(1, [\"foo\", \"bar\"], 3)");
- assertThat(Starlark.repr(Tuple.of(1, list, 3))).isEqualTo("(1, [\"foo\", \"bar\"], 3)");
- assertThat(Starlark.str(StarlarkList.of(null, 1, tuple, 3)))
- .isEqualTo("[1, (\"foo\", \"bar\"), 3]");
- assertThat(Starlark.repr(StarlarkList.of(null, 1, tuple, 3)))
- .isEqualTo("[1, (\"foo\", \"bar\"), 3]");
-
- Map<Object, Object> dict =
- ImmutableMap.<Object, Object>of(1, tuple, 2, list, "foo", StarlarkList.of(null));
- assertThat(Starlark.str(dict))
- .isEqualTo("{1: (\"foo\", \"bar\"), 2: [\"foo\", \"bar\"], \"foo\": []}");
- assertThat(Starlark.repr(dict))
- .isEqualTo("{1: (\"foo\", \"bar\"), 2: [\"foo\", \"bar\"], \"foo\": []}");
- }
-
- private void checkFormatPositionalFails(String errorMessage, String format, Object... arguments) {
- IllegalFormatException e =
- assertThrows(IllegalFormatException.class, () -> Starlark.format(format, arguments));
- assertThat(e).hasMessageThat().isEqualTo(errorMessage);
- }
-
- @Test
- public void testOutputOrderOfMap() throws Exception {
- Map<Object, Object> map = new LinkedHashMap<>();
- map.put(5, 5);
- map.put(3, 3);
- map.put("foo", 42);
- map.put(7, "bar");
- assertThat(Starlark.str(map)).isEqualTo("{5: 5, 3: 3, \"foo\": 42, 7: \"bar\"}");
- }
-
- @Test
- public void testFormatPositional() throws Exception {
- assertThat(Starlark.formatWithList("%s %d", Tuple.of("foo", 3))).isEqualTo("foo 3");
- assertThat(Starlark.format("%s %d", "foo", 3)).isEqualTo("foo 3");
-
- assertThat(Starlark.format("%s %s %s", 1, null, 3)).isEqualTo("1 null 3");
-
- // Note: formatToString doesn't perform scalar x -> (x) conversion;
- // The %-operator is responsible for that.
- assertThat(Starlark.formatWithList("", Tuple.of())).isEmpty();
- assertThat(Starlark.format("%s", "foo")).isEqualTo("foo");
- assertThat(Starlark.format("%s", 3.14159)).isEqualTo("3.14159");
- checkFormatPositionalFails("not all arguments converted during string formatting",
- "%s", 1, 2, 3);
- assertThat(Starlark.format("%%%s", "foo")).isEqualTo("%foo");
- checkFormatPositionalFails("not all arguments converted during string formatting",
- "%%s", "foo");
- checkFormatPositionalFails("unsupported format character \" \" at index 1 in \"% %s\"",
- "% %s", "foo");
- assertThat(Starlark.format("%s", StarlarkList.of(null, 1, 2, 3))).isEqualTo("[1, 2, 3]");
- assertThat(Starlark.format("%s", Tuple.of(1, 2, 3))).isEqualTo("(1, 2, 3)");
- assertThat(Starlark.format("%s", StarlarkList.of(null))).isEqualTo("[]");
- assertThat(Starlark.format("%s", Tuple.of())).isEqualTo("()");
- assertThat(Starlark.format("%% %d %r %s", 1, "2", "3")).isEqualTo("% 1 \"2\" 3");
-
- checkFormatPositionalFails(
- "invalid argument \"1\" for format pattern %d",
- "%d", "1");
- checkFormatPositionalFails("unsupported format character \".\" at index 1 in \"%.3g\"",
- "%.3g");
- checkFormatPositionalFails("unsupported format character \".\" at index 1 in \"%.3g\"",
- "%.3g", 1, 2);
- checkFormatPositionalFails("unsupported format character \".\" at index 1 in \"%.s\"",
- "%.s");
- }
-
- private StarlarkValue createObjWithStr() {
- return new StarlarkValue() {
- @Override
- public void repr(Printer printer) {
- printer.append("<repr marker>");
- }
-
- @Override
- public void str(Printer printer) {
- printer.append("<str marker>");
- }
- };
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ResolverTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ResolverTest.java
deleted file mode 100644
index 3e80252..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/ResolverTest.java
+++ /dev/null
@@ -1,396 +0,0 @@
-// Copyright 2015 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.devtools.build.lib.syntax.LexerTest.assertContainsError;
-
-import com.google.common.collect.ImmutableSet;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of the Starlark resolver. */
-@RunWith(JUnit4.class)
-public class ResolverTest {
-
- private final FileOptions.Builder options = FileOptions.builder();
-
- // Resolves a file using the current options,
- // in an environment with a single predeclared name, pre.
- // Errors are recorded in file.errors().
- private StarlarkFile resolveFile(String... lines) throws SyntaxError.Exception {
- ParserInput input = ParserInput.fromLines(lines);
- StarlarkFile file = StarlarkFile.parse(input, options.build());
- Resolver.resolveFile(file, () -> ImmutableSet.of("pre"));
- return file;
- }
-
- // Assertions that parsing and resolution succeeds.
- private void assertValid(String... lines) throws SyntaxError.Exception {
- StarlarkFile file = resolveFile(lines);
- if (!file.ok()) {
- throw new SyntaxError.Exception(file.errors());
- }
- }
-
- // Asserts that parsing of the program succeeds but resolution fails
- // with at least the specified error.
- private void assertInvalid(String expectedError, String... lines) throws SyntaxError.Exception {
- List<SyntaxError> errors = getResolutionErrors(lines);
- assertContainsError(errors, expectedError);
- }
-
- // Returns the non-empty list of resolution errors of the program.
- private List<SyntaxError> getResolutionErrors(String... lines) throws SyntaxError.Exception {
- StarlarkFile file = resolveFile(lines);
- if (file.ok()) {
- throw new AssertionError("resolution succeeded unexpectedly");
- }
- return file.errors();
- }
-
- @Test
- public void testAssignmentNotValidLValue() throws Exception {
- assertInvalid("cannot assign to '\"a\"'", "'a' = 1");
- }
-
- @Test
- public void testAssignmentToDotExpression() throws Exception {
- // According to the spec, this is allowed. TODO(adonovan): implement.
- // Once it is allowed, we'll need a test (in lib.packages)
- // that assignments to fields of a Bazel 'struct' are disallowed.
- assertInvalid("cannot assign to 'pre.field'", "pre.field = ()");
- }
-
- @Test
- public void testAugmentedAssignmentWithMultipleLValues() throws Exception {
- assertInvalid(
- "cannot perform augmented assignment on a list or tuple expression", //
- "a, b += 2, 3");
- }
-
- @Test
- public void testReturnOutsideFunction() throws Exception {
- assertInvalid(
- "return statements must be inside a function", //
- "return 2\n");
- }
-
- @Test
- public void testLoadAfterStatement() throws Exception {
- options.requireLoadStatementsFirst(true);
- List<SyntaxError> errors = getResolutionErrors("a = 5", "load(':b.bzl', 'c')");
- assertContainsError(errors, ":2:1: load statements must appear before any other statement");
- assertContainsError(errors, ":1:1: \tfirst non-load statement appears here");
- }
-
- @Test
- public void testAllowLoadAfterStatement() throws Exception {
- options.requireLoadStatementsFirst(false);
- assertValid(
- "a = 5", //
- "load(':b.bzl', 'c')");
- }
-
- @Test
- public void testLoadDuplicateSymbols() throws Exception {
- assertInvalid(
- "load statement defines 'x' more than once", //
- "load('module', 'x', 'x')");
- assertInvalid(
- "load statement defines 'x' more than once", //
- "load('module', 'x', x='y')");
-
- // Eventually load bindings will be local,
- // at which point these errors will need adjusting.
- assertInvalid(
- "cannot reassign global 'x'", //
- "x=1; load('module', 'x')");
- assertInvalid(
- "cannot reassign global 'x'", //
- "load('module', 'x'); x=1");
- }
-
- @Test
- public void testForbiddenToplevelIfStatement() throws Exception {
- assertInvalid(
- "if statements are not allowed at the top level", //
- "if pre: a = 2");
- }
-
- @Test
- public void testFunctionLocalVariable() throws Exception {
- assertInvalid(
- "name 'a' is not defined", //
- "def func2(b):",
- " c = b",
- " c = a",
- "def func1():",
- " a = 1",
- " func2(2)");
- }
-
- @Test
- public void testFunctionLocalVariableDoesNotEffectGlobalEnv() throws Exception {
- assertInvalid(
- "name 'a' is not defined", //
- "def func1():",
- " a = 1",
- "def func2(b):",
- " b = a");
- }
-
- @Test
- public void testFunctionParameterDoesNotEffectGlobalEnv() throws Exception {
- assertInvalid(
- "name 'a' is not defined", //
- "def func1(a):",
- " return a",
- "def func2():",
- " b = a");
- }
-
- @Test
- public void testDefinitionByItself() throws Exception {
- // Variables are assumed to be statically visible in the block (even if they might not be
- // initialized).
- assertValid("a = a");
- assertValid("a += a");
- assertValid("[[] for _ in [] for a in a]");
- assertValid("def f():", " for a in a: pass");
- }
-
- @Test
- public void testLocalEnvironmentsAreSeparate() throws Exception {
- assertValid(
- "def func1():", //
- " a = 1",
- "def func2():",
- " a = 'abc'");
- }
-
- @Test
- public void testBuiltinsCanBeShadowed() throws Exception {
- assertValid("pre = 1");
- }
-
- @Test
- public void testNoGlobalReassign() throws Exception {
- List<SyntaxError> errors = getResolutionErrors("a = 1", "a = 2");
- assertContainsError(errors, ":2:1: cannot reassign global 'a'");
- assertContainsError(errors, ":1:1: 'a' previously declared here");
- }
-
- @Test
- public void testTwoFunctionsWithTheSameName() throws Exception {
- List<SyntaxError> errors = getResolutionErrors("def foo(): pass", "def foo(): pass");
- assertContainsError(errors, ":2:5: cannot reassign global 'foo'");
- assertContainsError(errors, ":1:5: 'foo' previously declared here");
- }
-
- @Test
- public void testFunctionDefRecursion() throws Exception {
- assertValid("def func():", " func()\n");
- }
-
- @Test
- public void testMutualRecursion() throws Exception {
- assertValid("def foo(i):", " bar(i)", "def bar(i):", " foo(i)", "foo(4)");
- }
-
- @Test
- public void testFunctionDefinedBelow() throws Exception {
- assertValid("def bar(): a = foo() + 'a'", "def foo(): return 1\n");
- }
-
- @Test
- public void testGlobalDefinedBelow() throws Exception {
- assertValid("def bar(): return x", "x = 5\n");
- }
-
- @Test
- public void testLocalVariableDefinedBelow() throws Exception {
- assertValid(
- "def bar():",
- " for i in pre(5):",
- " if i > 2: return x",
- " x = i" // x is visible in the entire function block
- );
- }
-
- @Test
- public void testFunctionDoesNotExist() throws Exception {
- assertInvalid(
- "name 'foo' is not defined", //
- "def bar(): a = foo() + 'a'");
- }
-
- @Test
- public void testTupleLiteralWorksForDifferentTypes() throws Exception {
- assertValid("('a', 1)");
- }
-
- @Test
- public void testDictExpressionDifferentValueTypeWorks() throws Exception {
- assertValid("{'a': 1, 'b': 'c'}");
- }
-
- // Starlark built-in functions specific tests
-
- @Test
- public void testFuncReturningDictAssignmentAsLValue() throws Exception {
- assertValid(
- "def my_dict():", //
- " return {'a': 1}",
- "def func():",
- " my_dict()['b'] = 2");
- }
-
- @Test
- public void testEmptyLiteralGenericIsSetInLaterConcatWorks() throws Exception {
- assertValid(
- "def func():", //
- " s = {}",
- " s['a'] = 'b'");
- }
-
- @Test
- public void testBuiltinGlobalFunctionsReadOnlyInFuncDefBody() throws Exception {
- assertValid("def func():", " rule = 'abc'");
- }
-
- @Test
- public void testBuiltinGlobalFunctionsReadOnlyAsFuncDefArg() throws Exception {
- assertValid("def func(rule):", " return rule");
- }
-
- @Test
- public void testTopLevelForFails() throws Exception {
- assertInvalid(
- "for loops are not allowed at the top level", //
- "for i in []: 0\n");
- }
-
- @Test
- public void testNestedFunctionFails() throws Exception {
- assertInvalid(
- "nested functions are not allowed. Move the function to the top level", //
- "def func(a):",
- " def bar(): return 0",
- " return bar()",
- "");
- }
-
- @Test
- public void testComprehension() throws Exception {
- // The operand of the first for clause is resolved outside the comprehension block.
- assertInvalid("name 'x' is not defined", "[() for x in x]");
- assertValid("[() for x in () for x in x]"); // forward ref
- }
-
- @Test
- public void testDuplicateParameter() throws Exception {
- assertInvalid(
- "duplicate parameter: a",
- "def func(a, b, a):", //
- " a = 1");
- }
-
- @Test
- public void testParameterOrdering() throws Exception {
- // ordering
- assertInvalid(
- "required parameter a may not follow **kwargs", //
- "def func(**kwargs, a): pass");
- assertInvalid(
- "required positional parameter b may not follow an optional parameter", //
- "def func(a=1, b): pass");
- assertInvalid(
- "optional parameter may not follow **kwargs", //
- "def func(**kwargs, a=1): pass");
- assertInvalid(
- "* parameter may not follow **kwargs", //
- "def func(**kwargs, *args): pass");
- assertInvalid(
- "* parameter may not follow **kwargs", //
- "def func(**kwargs, *): pass");
- assertInvalid(
- "bare * must be followed by keyword-only parameters", //
- "def func(*): pass");
-
- // duplicate parameters
- assertInvalid("duplicate parameter: a", "def func(a, a): pass");
- assertInvalid("duplicate parameter: a", "def func(a, a=1): pass");
- assertInvalid("duplicate parameter: a", "def func(a, *a): pass");
- assertInvalid("duplicate parameter: a", "def func(*a, a): pass");
- assertInvalid("duplicate parameter: a", "def func(*a, a=1): pass");
- assertInvalid("duplicate parameter: a", "def func(a, **a): pass");
- assertInvalid("duplicate parameter: a", "def func(*a, **a): pass");
-
- // multiple *
- assertInvalid("multiple * parameters not allowed", "def func(a, *, b, *): pass");
- assertInvalid("multiple * parameters not allowed", "def func(a, *args, b, *): pass");
- assertInvalid("multiple * parameters not allowed", "def func(a, *, b, *args): pass");
- assertInvalid("multiple * parameters not allowed", "def func(a, *args, b, *args): pass");
-
- // multiple **kwargs
- assertInvalid("multiple ** parameters not allowed", "def func(**kwargs, **kwargs): pass");
-
- assertValid("def f(a, b, c=1, d=2, *args, e, f=3, g, **kwargs): pass");
- }
-
- @Test
- public void testArgumentOrdering() throws Exception {
- // positionals go before keywords
- assertInvalid(
- "positional argument may not follow keyword", //
- "pre(a=1, 0)");
-
- // keywords must be unique
- assertInvalid(
- "duplicate keyword argument: a", //
- "pre(a=1, a=2)");
-
- // no arguments after **kwargs
- assertInvalid(
- "positional argument may not follow **kwargs", //
- "pre(**0, 0)");
- assertInvalid(
- "keyword argument a may not follow **kwargs", //
- "pre(**0, a=1)");
- assertInvalid(
- "*args may not follow **kwargs", //
- "pre(**0, *0)");
- assertInvalid(
- "multiple **kwargs not allowed", //
- "pre(**0, **0)");
- assertInvalid(
- "*args may not follow **kwargs", // also, a parse error
- "pre(**0, *)");
-
- // bad arguments after *args
- assertInvalid(
- "positional argument may not follow *args", //
- "pre(*0, 1)");
- assertInvalid(
- "keyword argument a may not follow *args", //
- "pre(*0, a=1)"); // Python (even v2) allows this
- assertInvalid(
- "multiple *args not allowed", //
- "pre(*0, *0)");
-
- assertValid("pre(0, a=0, *0, **0)");
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkEvaluationTest.java
deleted file mode 100644
index ec0e0b3..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkEvaluationTest.java
+++ /dev/null
@@ -1,2059 +0,0 @@
-// Copyright 2015 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.joining;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.errorprone.annotations.DoNotCall;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.ParamType;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkGlobalLibrary;
-import net.starlark.java.annot.StarlarkMethod;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of Starlark evaluation. */
-// There is no clear distinction between this and EvaluationTest.
-// TODO(adonovan): reorganize.
-@StarlarkGlobalLibrary // required for @StarlarkMethod-annotated methods
-@RunWith(JUnit4.class)
-public final class StarlarkEvaluationTest {
-
- private final EvaluationTestCase ev = new EvaluationTestCase();
-
- static class Bad {
- Bad () {
- }
- }
-
- @StarlarkMethod(name = "foobar", documented = false)
- public String foobar() {
- return "foobar";
- }
-
- @DoNotCall("Always throws java.lang.InterruptedException")
- @StarlarkMethod(name = "interrupted_function", documented = false)
- public NoneType interruptedFunction() throws InterruptedException {
- throw new InterruptedException();
- }
-
- @StarlarkMethod(name = "stackoverflow", documented = false)
- public int stackoverflow() {
- return true ? stackoverflow() : 0; // (defeat static recursion checker)
- }
-
- @StarlarkMethod(name = "thrownpe", documented = false)
- public void thrownpe() {
- throw new NullPointerException("oops");
- }
-
- // A trivial struct-like class with Starlark fields defined by a map.
- private static class SimpleStruct implements StarlarkValue, ClassObject {
- final ImmutableMap<String, Object> fields;
-
- SimpleStruct(ImmutableMap<String, Object> fields) {
- this.fields = fields;
- }
-
- @Override
- public ImmutableCollection<String> getFieldNames() {
- return fields.keySet();
- }
-
- @Override
- public Object getValue(String name) {
- return fields.get(name);
- }
-
- @Override
- public String getErrorMessageForUnknownField(String name) {
- return null;
- }
-
- @Override
- public void repr(Printer p) {
- // This repr function prints only the fields.
- // Any methods are still accessible through dir/getattr/hasattr.
- p.append("simplestruct(");
- String sep = "";
- for (Map.Entry<String, Object> e : fields.entrySet()) {
- p.append(sep).append(e.getKey()).append(" = ").repr(e.getValue());
- sep = ", ";
- }
- p.append(")");
- }
- }
-
- @StarlarkBuiltin(name = "Mock", doc = "")
- class Mock implements StarlarkValue {
- @StarlarkMethod(
- name = "MockFn",
- selfCall = true,
- documented = false,
- parameters = {
- @Param(name = "pos", positional = true, type = String.class),
- })
- public String selfCall(String myName) {
- return "I'm a mock named " + myName;
- }
-
- @StarlarkMethod(
- name = "value_of",
- parameters = {@Param(name = "str", type = String.class)},
- documented = false)
- public Integer valueOf(String str) {
- return Integer.valueOf(str);
- }
-
- @StarlarkMethod(
- name = "is_empty",
- parameters = {@Param(name = "str", type = String.class)},
- documented = false)
- public Boolean isEmpty(String str) {
- return str.isEmpty();
- }
- public void value() {}
-
- @StarlarkMethod(name = "return_bad", documented = false)
- public Bad returnBad() {
- return new Bad(); // not a legal Starlark value
- }
-
- @StarlarkMethod(name = "struct_field", documented = false, structField = true)
- public String structField() {
- return "a";
- }
-
- @StarlarkMethod(
- name = "struct_field_with_extra",
- documented = false,
- structField = true,
- useStarlarkSemantics = true)
- public String structFieldWithExtra(StarlarkSemantics sem) {
- return "struct_field_with_extra("
- + (sem != null)
- + ")";
- }
-
- @StarlarkMethod(name = "struct_field_callable", documented = false, structField = true)
- public Object structFieldCallable() {
- return new BuiltinCallable(StarlarkEvaluationTest.this, "foobar");
- }
-
- @StarlarkMethod(name = "interrupted_struct_field", documented = false, structField = true)
- public Object structFieldInterruptedCallable() throws InterruptedException {
- throw new InterruptedException();
- }
-
- @StarlarkMethod(name = "function", documented = false, structField = false)
- public String function() {
- return "a";
- }
-
- @SuppressWarnings("unused")
- @StarlarkMethod(
- name = "nullfunc_failing",
- parameters = {
- @Param(name = "p1", type = String.class),
- @Param(name = "p2", type = Integer.class),
- },
- documented = false,
- allowReturnNones = false)
- public StarlarkValue nullfuncFailing(String p1, Integer p2) {
- return null;
- }
-
- @StarlarkMethod(name = "nullfunc_working", documented = false, allowReturnNones = true)
- public StarlarkValue nullfuncWorking() {
- return null;
- }
-
- @StarlarkMethod(name = "voidfunc", documented = false)
- public void voidfunc() {}
-
- @StarlarkMethod(name = "string_list", documented = false)
- public ImmutableList<String> stringList() {
- return ImmutableList.<String>of("a", "b");
- }
-
- @StarlarkMethod(name = "string", documented = false)
- public String string() {
- return "a";
- }
-
- @StarlarkMethod(name = "string_list_dict", documented = false)
- public Map<String, List<String>> stringListDict() {
- return ImmutableMap.of("a", ImmutableList.of("b", "c"));
- }
-
- @StarlarkMethod(
- name = "with_params",
- documented = false,
- parameters = {
- @Param(name = "pos1"),
- @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
- @Param(
- name = "posOrNamed",
- defaultValue = "False",
- type = Boolean.class,
- positional = true,
- named = true),
- @Param(name = "named", type = Boolean.class, positional = false, named = true),
- @Param(
- name = "optionalNamed",
- type = Boolean.class,
- defaultValue = "False",
- positional = false,
- named = true),
- @Param(
- name = "nonNoneable",
- type = Object.class,
- defaultValue = "\"a\"",
- positional = false,
- named = true),
- @Param(
- name = "noneable",
- type = Integer.class,
- defaultValue = "None",
- noneable = true,
- positional = false,
- named = true),
- @Param(
- name = "multi",
- allowedTypes = {
- @ParamType(type = String.class),
- @ParamType(type = Integer.class),
- @ParamType(type = Sequence.class, generic1 = Integer.class),
- },
- defaultValue = "None",
- noneable = true,
- positional = false,
- named = true)
- })
- public String withParams(
- Integer pos1,
- boolean pos2,
- boolean posOrNamed,
- boolean named,
- boolean optionalNamed,
- Object nonNoneable,
- Object noneable,
- Object multi) {
- return "with_params("
- + pos1
- + ", "
- + pos2
- + ", "
- + posOrNamed
- + ", "
- + named
- + ", "
- + optionalNamed
- + ", "
- + nonNoneable
- + (noneable != Starlark.NONE ? ", " + noneable : "")
- + (multi != Starlark.NONE ? ", " + multi : "")
- + ")";
- }
-
- @StarlarkMethod(name = "with_extra", documented = false, useStarlarkThread = true)
- public String withExtraInterpreterParams(StarlarkThread thread) {
- return "with_extra(" + thread.getCallerLocation().line() + ")";
- }
-
- @StarlarkMethod(
- name = "with_params_and_extra",
- documented = false,
- parameters = {
- @Param(name = "pos1"),
- @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
- @Param(
- name = "posOrNamed",
- defaultValue = "False",
- type = Boolean.class,
- positional = true,
- named = true),
- @Param(name = "named", type = Boolean.class, positional = false, named = true),
- @Param(
- name = "optionalNamed",
- type = Boolean.class,
- defaultValue = "False",
- positional = false,
- named = true),
- @Param(
- name = "nonNoneable",
- type = Object.class,
- defaultValue = "\"a\"",
- positional = false,
- named = true),
- @Param(
- name = "noneable",
- type = Integer.class,
- defaultValue = "None",
- noneable = true,
- positional = false,
- named = true),
- @Param(
- name = "multi",
- allowedTypes = {
- @ParamType(type = String.class),
- @ParamType(type = Integer.class),
- @ParamType(type = Sequence.class, generic1 = Integer.class),
- },
- defaultValue = "None",
- noneable = true,
- positional = false,
- named = true)
- },
- useStarlarkThread = true)
- public String withParamsAndExtraInterpreterParams(
- Integer pos1,
- boolean pos2,
- boolean posOrNamed,
- boolean named,
- boolean optionalNamed,
- Object nonNoneable,
- Object noneable,
- Object multi,
- StarlarkThread thread) {
- return "with_params_and_extra("
- + pos1
- + ", "
- + pos2
- + ", "
- + posOrNamed
- + ", "
- + named
- + ", "
- + optionalNamed
- + ", "
- + nonNoneable
- + (noneable != Starlark.NONE ? ", " + noneable : "")
- + (multi != Starlark.NONE ? ", " + multi : "")
- + ", "
- + thread.getCallerLocation().line()
- + ")";
- }
-
- @StarlarkMethod(
- name = "proxy_methods_object",
- doc = "Returns a struct containing all callable method objects of this mock",
- allowReturnNones = true)
- public ClassObject proxyMethodsObject() {
- ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
- Starlark.addMethods(builder, this);
- return new SimpleStruct(builder.build());
- }
-
- @StarlarkMethod(
- name = "with_args_and_thread",
- documented = false,
- parameters = {
- @Param(name = "pos1", type = Integer.class),
- @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
- @Param(name = "named", type = Boolean.class, positional = false, named = true),
- },
- extraPositionals = @Param(name = "args"),
- useStarlarkThread = true)
- public String withArgsAndThread(
- Integer pos1, boolean pos2, boolean named, Sequence<?> args, StarlarkThread thread) {
- String argsString = debugPrintArgs(args);
- return "with_args_and_thread("
- + pos1
- + ", "
- + pos2
- + ", "
- + named
- + ", "
- + argsString
- + ")";
- }
-
- @StarlarkMethod(
- name = "with_kwargs",
- documented = false,
- parameters = {
- @Param(name = "pos", defaultValue = "False", type = Boolean.class),
- @Param(name = "named", type = Boolean.class, positional = false, named = true),
- },
- extraKeywords = @Param(name = "kwargs"))
- public String withKwargs(boolean pos, boolean named, Dict<String, Object> kwargs) {
- String kwargsString =
- "kwargs("
- + kwargs
- .entrySet()
- .stream()
- .map(entry -> entry.getKey() + "=" + entry.getValue())
- .collect(joining(", "))
- + ")";
- return "with_kwargs(" + pos + ", " + named + ", " + kwargsString + ")";
- }
-
- @StarlarkMethod(
- name = "with_args_and_kwargs",
- documented = false,
- parameters = {
- @Param(name = "foo", named = true, positional = true, type = String.class),
- },
- extraPositionals = @Param(name = "args"),
- extraKeywords = @Param(name = "kwargs"))
- public String withArgsAndKwargs(String foo, Tuple<Object> args, Dict<String, Object> kwargs) {
- String argsString = debugPrintArgs(args);
- String kwargsString =
- "kwargs("
- + kwargs
- .entrySet()
- .stream()
- .map(entry -> entry.getKey() + "=" + entry.getValue())
- .collect(joining(", "))
- + ")";
- return "with_args_and_kwargs(" + foo + ", " + argsString + ", " + kwargsString + ")";
- }
-
- @StarlarkMethod(name = "raise_unchecked_exception", documented = false)
- public void raiseUncheckedException() {
- throw new InternalError("buggy code");
- }
-
- @Override
- public String toString() {
- return "<mock>";
- }
- }
-
- private static String debugPrintArgs(Iterable<?> args) {
- Printer p = new Printer();
- p.append("args(");
- String sep = "";
- for (Object arg : args) {
- p.append(sep).debugPrint(arg);
- sep = ", ";
- }
- return p.append(")").toString();
- }
-
- @StarlarkBuiltin(name = "MockInterface", doc = "")
- static interface MockInterface extends StarlarkValue {
- @StarlarkMethod(
- name = "is_empty_interface",
- parameters = {@Param(name = "str", type = String.class)},
- documented = false)
- public Boolean isEmptyInterface(String str);
- }
-
- @StarlarkBuiltin(name = "MockSubClass", doc = "")
- final class MockSubClass extends Mock implements MockInterface {
- @Override
- public Boolean isEmpty(String str) {
- return str.isEmpty();
- }
- @Override
- public Boolean isEmptyInterface(String str) {
- return str.isEmpty();
- }
- }
-
- @StarlarkBuiltin(name = "ParamterizedMock", doc = "")
- static interface ParameterizedApi<ObjectT> extends StarlarkValue {
- @StarlarkMethod(
- name = "method",
- documented = false,
- parameters = {
- @Param(name = "foo", named = true, positional = true, type = Object.class),
- })
- public ObjectT method(ObjectT o);
- }
-
- static final class ParameterizedMock implements ParameterizedApi<String> {
- @Override
- public String method(String o) {
- return o;
- }
- }
-
- // Verifies that a method implementation overriding a parameterized annotated interface method
- // is still treated as Starlark-callable. Concretely, method() below should be treated as
- // callable even though its method signature isn't an *exact* match of the annotated method
- // declaration, due to the interface's method declaration being generic.
- @Test
- public void testParameterizedMock() throws Exception {
- ev.new Scenario()
- .update("mock", new ParameterizedMock())
- .setUp("result = mock.method('bar')")
- .testLookup("result", "bar");
- }
-
- @Test
- public void testSimpleIf() throws Exception {
- ev.new Scenario()
- .setUp("def foo():", " a = 0", " x = 0", " if x: a = 5", " return a", "a = foo()")
- .testLookup("a", 0);
- }
-
- @Test
- public void testIfPass() throws Exception {
- ev.new Scenario()
- .setUp("def foo():", " a = 1", " x = True", " if x: pass", " return a", "a = foo()")
- .testLookup("a", 1);
- }
-
- @Test
- public void testNestedIf() throws Exception {
- executeNestedIf(0, 0, 0);
- executeNestedIf(1, 0, 3);
- executeNestedIf(1, 1, 5);
- }
-
- private void executeNestedIf(int x, int y, int expected) throws Exception {
- String fun = String.format("foo%s%s", x, y);
- ev.new Scenario()
- .setUp(
- "def " + fun + "():",
- " x = " + x,
- " y = " + y,
- " a = 0",
- " b = 0",
- " if x:",
- " if y:",
- " a = 2",
- " b = 3",
- " return a + b",
- "x = " + fun + "()")
- .testLookup("x", expected);
- }
-
- @Test
- public void testIfElse() throws Exception {
- executeIfElse("foo", "something", 2);
- executeIfElse("bar", "", 3);
- }
-
- private void executeIfElse(String fun, String y, int expected) throws Exception {
- ev.new Scenario()
- .setUp(
- "def " + fun + "():",
- " y = '" + y + "'",
- " x = 5",
- " if x:",
- " if y: a = 2",
- " else: a = 3",
- " return a",
- "z = " + fun + "()")
- .testLookup("z", expected);
- }
-
- @Test
- public void testIfElifElse_ifExecutes() throws Exception {
- execIfElifElse(1, 0, 1);
- }
-
- @Test
- public void testIfElifElse_elifExecutes() throws Exception {
- execIfElifElse(0, 1, 2);
- }
-
- @Test
- public void testIfElifElse_elseExecutes() throws Exception {
- execIfElifElse(0, 0, 3);
- }
-
- private void execIfElifElse(int x, int y, int v) throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " x = " + x + "",
- " y = " + y + "",
- " if x:",
- " return 1",
- " elif y:",
- " return 2",
- " else:",
- " return 3",
- "v = foo()")
- .testLookup("v", v);
- }
-
- @Test
- public void testForOnList() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " s = ''",
- " for i in ['hello', ' ', 'world']:",
- " s = s + i",
- " return s",
- "s = foo()")
- .testLookup("s", "hello world");
- }
-
- @Test
- public void testForAssignmentList() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " d = ['a', 'b', 'c']",
- " s = ''",
- " for i in d:",
- " s = s + i",
- " d = ['d', 'e', 'f']", // check that we use the old list
- " return s",
- "s = foo()")
- .testLookup("s", "abc");
- }
-
- @Test
- public void testForAssignmentDict() throws Exception {
- ev.new Scenario()
- .setUp(
- "def func():",
- " d = {'a' : 1, 'b' : 2, 'c' : 3}",
- " s = ''",
- " for i in d:",
- " s = s + i",
- " d = {'d' : 1, 'e' : 2, 'f' : 3}",
- " return s",
- "s = func()")
- .testLookup("s", "abc");
- }
-
- @Test
- public void testForUpdateList() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " xs = [1, 2, 3]",
- " for x in xs:",
- " if x == 1:",
- " xs.append(10)")
- .testIfErrorContains(
- "list value is temporarily immutable due to active for-loop iteration", "foo()");
- }
-
- @Test
- public void testForUpdateDict() throws Exception {
- ev.new Scenario()
- .setUp("def foo():", " d = {'a': 1, 'b': 2, 'c': 3}", " for k in d:", " d[k] *= 2")
- .testIfErrorContains(
- "dict value is temporarily immutable due to active for-loop iteration", "foo()");
- }
-
- @Test
- public void testForUnlockedAfterBreak() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " xs = [1, 2]",
- " for x in xs:",
- " break",
- " xs.append(3)",
- " return xs")
- .testEval("foo()", "[1, 2, 3]");
- }
-
- @Test
- public void testForNestedOnSameListStillLocked() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " xs = [1, 2]",
- " ys = []",
- " for x1 in xs:",
- " for x2 in xs:",
- " ys.append(x1 * x2)",
- " xs.append(4)",
- " return ys")
- .testIfErrorContains(
- "list value is temporarily immutable due to active for-loop iteration", "foo()");
- }
-
- @Test
- public void testForNestedOnSameListUnlockedAtEnd() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " xs = [1, 2]",
- " ys = []",
- " for x1 in xs:",
- " for x2 in xs:",
- " ys.append(x1 * x2)",
- " xs.append(4)",
- " return ys")
- .testEval("foo()", "[1, 2, 2, 4]");
- }
-
- @Test
- public void testForNestedWithListCompGood() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " xs = [1, 2]",
- " ys = []",
- " for x in xs:",
- " zs = [None for x in xs for y in (ys.append(x) or ys)]",
- " return ys")
- .testEval("foo()", "[1, 2, 1, 2]");
- }
- @Test
- public void testForNestedWithListCompBad() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " xs = [1, 2, 3]",
- " ys = []",
- " for x in xs:",
- " zs = [None for x in xs for y in (xs.append(x) or ys)]",
- " return ys")
- .testIfErrorContains(
- "list value is temporarily immutable due to active for-loop iteration", "foo()");
- }
-
- @Test
- public void testForDeepUpdate() throws Exception {
- // Check that indirectly reachable values can still be manipulated as normal.
- ev.new Scenario()
- .setUp(
- "def foo():",
- " xs = [['a'], ['b'], ['c']]",
- " ys = []",
- " for x in xs:",
- " for y in x:",
- " ys.append(y)",
- " xs[2].append(x[0])",
- " return ys",
- "ys = foo()")
- .testLookup("ys", StarlarkList.of(null, "a", "b", "c", "a", "b"));
- }
-
- @Test
- public void testForNotIterable() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfErrorContains(
- "type 'int' is not iterable",
- "def func():",
- " for i in mock.value_of('1'): a = i",
- "func()\n");
- }
-
- @Test
- public void testForStringNotIterable() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfErrorContains(
- "type 'string' is not iterable", "def func():", " for i in 'abc': a = i", "func()\n");
- }
-
- @Test
- public void testForOnDictionary() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " d = {1: 'a', 2: 'b', 3: 'c'}",
- " s = ''",
- " for i in d: s = s + d[i]",
- " return s",
- "s = foo()")
- .testLookup("s", "abc");
- }
-
- @Test
- public void testBadDictKey() throws Exception {
- ev.new Scenario().testIfErrorContains("unhashable type: 'list'", "{ [1, 2]: [3, 4] }");
- }
-
- @Test
- public void testForLoopReuseVariable() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " s = ''",
- " for i in ['a', 'b']:",
- " for i in ['c', 'd']: s = s + i",
- " return s",
- "s = foo()")
- .testLookup("s", "cdcd");
- }
-
- @Test
- public void testForLoopMultipleVariables() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " s = ''",
- " for [i, j] in [[1, 2], [3, 4]]:",
- " s = s + str(i) + str(j) + '.'",
- " return s",
- "s = foo()")
- .testLookup("s", "12.34.");
- }
-
- @Test
- public void testForLoopBreak() throws Exception {
- simpleFlowTest("break", 1);
- }
-
- @Test
- public void testForLoopContinue() throws Exception {
- simpleFlowTest("continue", 10);
- }
-
- @SuppressWarnings("unchecked")
- private void simpleFlowTest(String statement, int expected) throws Exception {
- ev.exec(
- "def foo():",
- " s = 0",
- " hit = 0",
- " for i in range(0, 10):",
- " s = s + 1",
- " " + statement + "",
- " hit = 1",
- " return [s, hit]",
- "x = foo()");
- assertThat((Iterable<Object>) ev.lookup("x")).containsExactly(expected, 0).inOrder();
- }
-
- @Test
- public void testForLoopBreakFromDeeperBlock() throws Exception {
- flowFromDeeperBlock("break", 1);
- flowFromNestedBlocks("break", 29);
- }
-
- @Test
- public void testForLoopContinueFromDeeperBlock() throws Exception {
- flowFromDeeperBlock("continue", 5);
- flowFromNestedBlocks("continue", 39);
- }
-
- private void flowFromDeeperBlock(String statement, int expected) throws Exception {
- ev.exec(
- "def foo():",
- " s = 0",
- " for i in range(0, 10):",
- " if i % 2 != 0:",
- " " + statement + "",
- " s = s + 1",
- " return s",
- "x = foo()");
- assertThat(ev.lookup("x")).isEqualTo(expected);
- }
-
- private void flowFromNestedBlocks(String statement, int expected) throws Exception {
- ev.exec(
- "def foo2():",
- " s = 0",
- " for i in range(1, 41):",
- " if i % 2 == 0:",
- " if i % 3 == 0:",
- " if i % 5 == 0:",
- " " + statement + "",
- " s = s + 1",
- " return s",
- "y = foo2()");
- assertThat(ev.lookup("y")).isEqualTo(expected);
- }
-
- @Test
- public void testNestedForLoopsMultipleBreaks() throws Exception {
- nestedLoopsTest("break", 2, 6, 6);
- }
-
- @Test
- public void testNestedForLoopsMultipleContinues() throws Exception {
- nestedLoopsTest("continue", 4, 20, 20);
- }
-
- @SuppressWarnings("unchecked")
- private void nestedLoopsTest(String statement, Integer outerExpected, int firstExpected,
- int secondExpected) throws Exception {
- ev.exec(
- "def foo():",
- " outer = 0",
- " first = 0",
- " second = 0",
- " for i in range(0, 5):",
- " for j in range(0, 5):",
- " if j == 2:",
- " " + statement + "",
- " first = first + 1",
- " for k in range(0, 5):",
- " if k == 2:",
- " " + statement + "",
- " second = second + 1",
- " if i == 2:",
- " " + statement + "",
- " outer = outer + 1",
- " return [outer, first, second]",
- "x = foo()");
- assertThat((Iterable<Object>) ev.lookup("x"))
- .containsExactly(outerExpected, firstExpected, secondExpected)
- .inOrder();
- }
-
- @Test
- public void testForLoopBreakError() throws Exception {
- flowStatementInsideFunction("break");
- flowStatementAfterLoop("break");
- }
-
- @Test
- public void testForLoopContinueError() throws Exception {
- flowStatementInsideFunction("continue");
- flowStatementAfterLoop("continue");
- }
-
- // TODO(adonovan): move this and all tests that use it to ResolverTest.
- private void assertResolutionError(String expectedError, final String... lines) throws Exception {
- SyntaxError.Exception error = assertThrows(SyntaxError.Exception.class, () -> ev.exec(lines));
- assertThat(error).hasMessageThat().contains(expectedError);
- }
-
- private void flowStatementInsideFunction(String statement) throws Exception {
- assertResolutionError(
- statement + " statement must be inside a for loop",
- //
- "def foo():",
- " " + statement,
- "x = foo()");
- }
-
- private void flowStatementAfterLoop(String statement) throws Exception {
- assertResolutionError(
- statement + " statement must be inside a for loop",
- //
- "def foo2():",
- " for i in range(0, 3):",
- " pass",
- " " + statement,
- "y = foo2()");
- }
-
- @Test
- public void testNoneAssignment() throws Exception {
- ev.new Scenario()
- .setUp("def foo(x=None):", " x = 1", " x = None", " return 2", "s = foo()")
- .testLookup("s", 2);
- }
-
- @Test
- public void testReassignment() throws Exception {
- ev.exec(
- "def foo(x=None):", //
- " x = 1",
- " x = [1, 2]",
- " x = 'str'",
- " return x",
- "s = foo()");
- assertThat(ev.lookup("s")).isEqualTo("str");
- }
-
- @Test
- public void testJavaCalls() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.is_empty('a')")
- .testLookup("b", Boolean.FALSE);
- }
-
- @Test
- public void testJavaCallsOnSubClass() throws Exception {
- ev.new Scenario()
- .update("mock", new MockSubClass())
- .setUp("b = mock.is_empty('a')")
- .testLookup("b", Boolean.FALSE);
- }
-
- @Test
- public void testJavaCallsOnInterface() throws Exception {
- ev.new Scenario()
- .update("mock", new MockSubClass())
- .setUp("b = mock.is_empty_interface('a')")
- .testLookup("b", Boolean.FALSE);
- }
-
- @Test
- public void testJavaCallsNotStarlarkMethod() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfExactError("'Mock' value has no field or method 'value'", "mock.value()");
- }
-
- @Test
- public void testNoOperatorIndex() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfExactError("type 'Mock' has no operator [](int)", "mock[2]");
- }
-
- @Test
- public void testJavaCallsNoMethod() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfExactError("'Mock' value has no field or method 'bad'", "mock.bad()");
- }
-
- @Test
- public void testJavaCallsNoMethodErrorMsg() throws Exception {
- ev.new Scenario()
- .testIfExactError("'int' value has no field or method 'bad'", "s = 3.bad('a', 'b', 'c')");
- }
-
- @Test
- public void testJavaCallWithKwargs() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfExactError(
- "'Mock' value has no field or method 'isEmpty' (did you mean 'is_empty'?)",
- "mock.isEmpty(str='abc')");
- }
-
- @Test
- public void testStringListDictValues() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp(
- "def func(mock):",
- " for i, v in mock.string_list_dict().items():",
- " modified_list = v + ['extra_string']",
- " return modified_list",
- "m = func(mock)")
- .testLookup("m", StarlarkList.of(null, "b", "c", "extra_string"));
- }
-
- @Test
- public void testProxyMethodsObject() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("m = mock.proxy_methods_object()", "b = m.with_params(1, True, named=True)")
- .testLookup("b", "with_params(1, true, false, true, false, a)");
- }
-
- /**
- * This test verifies an error is raised when a method parameter is set both positionally and
- * by name.
- */
- @Test
- public void testArgSpecifiedBothByNameAndPosition() throws Exception {
- // in with_params, 'posOrNamed' is positional parameter index 2. So by specifying both
- // posOrNamed by name and three positional parameters, there is a conflict.
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfErrorContains(
- "with_params() got multiple values for argument 'posOrNamed'",
- "mock.with_params(1, True, True, posOrNamed=True, named=True)");
- }
-
- @Test
- public void testTooManyPositionalArgs() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfErrorContains(
- "with_params() accepts no more than 3 positional arguments but got 4",
- "mock.with_params(1, True, True, 'toomany', named=True)");
-
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfErrorContains(
- "with_params() accepts no more than 3 positional arguments but got 5",
- "mock.with_params(1, True, True, 'toomany', 'alsotoomany', named=True)");
-
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfErrorContains(
- "is_empty() accepts no more than 1 positional argument but got 2",
- "mock.is_empty('a', 'b')");
- }
-
- @Test
- public void testJavaCallWithPositionalAndKwargs() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_params(1, True, named=True)")
- .testLookup("b", "with_params(1, true, false, true, false, a)");
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_params(1, True, named=True, multi=1)")
- .testLookup("b", "with_params(1, true, false, true, false, a, 1)");
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_params(1, True, named=True, multi='abc')")
- .testLookup("b", "with_params(1, true, false, true, false, a, abc)");
-
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_params(1, True, named=True, multi=[1,2,3])")
- .testLookup("b", "with_params(1, true, false, true, false, a, [1, 2, 3])");
-
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("")
- .testIfExactError(
- "with_params() missing 1 required named argument: named", "mock.with_params(1, True)");
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("")
- .testIfExactError(
- "with_params() missing 1 required named argument: named",
- "mock.with_params(1, True, True)");
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_params(1, True, True, named=True)")
- .testLookup("b", "with_params(1, true, true, true, false, a)");
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_params(1, True, named=True, posOrNamed=True)")
- .testLookup("b", "with_params(1, true, true, true, false, a)");
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_params(1, True, named=True, posOrNamed=True, optionalNamed=True)")
- .testLookup("b", "with_params(1, true, true, true, true, a)");
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("")
- .testIfExactError(
- "with_params() got unexpected keyword argument 'posornamed' (did you mean"
- + " 'posOrNamed'?)",
- "mock.with_params(1, True, named=True, posornamed=True)");
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("")
- .testIfExactError(
- "with_params() got unexpected keyword argument 'n'",
- "mock.with_params(1, True, named=True, posOrNamed=True, n=2)");
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("")
- .testIfExactError(
- "in call to with_params(), parameter 'nonNoneable' cannot be None",
- "mock.with_params(1, True, True, named=True, optionalNamed=False, nonNoneable=None)");
-
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("")
- .testIfExactError(
- "in call to with_params(), parameter 'multi' got value of type 'bool', want 'string or"
- + " int or sequence or NoneType'",
- "mock.with_params(1, True, named=True, multi=False)");
-
- // We do not enforce list item parameter type constraints.
- // Test for this behavior.
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_params(1, True, named=True, multi=['a', 'b'])")
- .testLookup("b", "with_params(1, true, false, true, false, a, [\"a\", \"b\"])");
- }
-
- @Test
- public void testNoJavaCallsWithoutStarlark() throws Exception {
- ev.new Scenario()
- .testIfExactError("'int' value has no field or method 'to_string'", "s = 3.to_string()");
- }
-
- @Test
- public void testStructAccess() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("v = mock.struct_field")
- .testLookup("v", "a");
- }
-
- @Test
- public void testStructAccessAsFuncallNonCallable() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfExactError("'string' object is not callable", "v = mock.struct_field()");
- }
-
- @Test
- public void testSelfCall() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("v = mock('bestmock')")
- .testLookup("v", "I'm a mock named bestmock");
-
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("mockfunction = mock", "v = mockfunction('bestmock')")
- .testLookup("v", "I'm a mock named bestmock");
-
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfErrorContains(
- "in call to MockFn(), parameter 'pos' got value of type 'int', want 'string'",
- "v = mock(1)");
- }
-
- @Test
- public void testStructAccessAsFuncall() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("v = mock.struct_field_callable()")
- .testLookup("v", "foobar");
- }
-
- @Test
- public void testCallingInterruptedStructField() throws Exception {
- ev.update("mock", new Mock());
- assertThrows(InterruptedException.class, () -> ev.eval("mock.interrupted_struct_field()"));
- }
-
- @Test
- public void testCallingInterruptedFunction() throws Exception {
- ev.update("interrupted_function", new BuiltinCallable(this, "interrupted_function"));
- assertThrows(InterruptedException.class, () -> ev.eval("interrupted_function()"));
- }
-
- @Test
- public void testCallingMethodThatRaisesUncheckedException() throws Exception {
- ev.update("mock", new Mock());
- assertThrows(InternalError.class, () -> ev.eval("mock.raise_unchecked_exception()"));
- }
-
- @Test
- public void testJavaFunctionWithExtraInterpreterParams() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("v = mock.with_extra()")
- .testLookup("v", "with_extra(1)");
- }
-
- @Test
- public void testStructFieldWithExtraInterpreterParams() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("v = mock.struct_field_with_extra")
- .testLookup("v", "struct_field_with_extra(true)");
- }
-
- @Test
- public void testJavaFunctionWithParamsAndExtraInterpreterParams() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_params_and_extra(1, True, named=True)")
- .testLookup("b", "with_params_and_extra(1, true, false, true, false, a, 1)");
- }
-
- @Test
- public void testJavaFunctionWithExtraArgsAndThread() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_args_and_thread(1, True, 'extraArg1', 'extraArg2', named=True)")
- .testLookup("b", "with_args_and_thread(1, true, true, args(extraArg1, extraArg2))");
-
- // Use an args list.
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp(
- "myargs = ['extraArg2']",
- "b = mock.with_args_and_thread(1, True, 'extraArg1', named=True, *myargs)")
- .testLookup("b", "with_args_and_thread(1, true, true, args(extraArg1, extraArg2))");
- }
-
- @Test
- public void testJavaFunctionWithExtraKwargs() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_kwargs(True, extraKey1=True, named=True, extraKey2='x')")
- .testLookup("b", "with_kwargs(true, true, kwargs(extraKey1=true, extraKey2=x))");
-
- // Use a kwargs dict.
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp(
- "mykwargs = {'extraKey2':'x', 'named':True}",
- "b = mock.with_kwargs(True, extraKey1=True, **mykwargs)")
- .testLookup("b", "with_kwargs(true, true, kwargs(extraKey1=true, extraKey2=x))");
- }
-
- @Test
- public void testJavaFunctionWithArgsAndKwargs() throws Exception {
- // Foo is used positionally
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_args_and_kwargs('foo', 'bar', 'baz', extraKey1=True, extraKey2='x')")
- .testLookup(
- "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey1=true, extraKey2=x))");
-
- // Use an args list and a kwargs dict
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp(
- "mykwargs = {'extraKey1':True}",
- "myargs = ['baz']",
- "b = mock.with_args_and_kwargs('foo', 'bar', extraKey2='x', *myargs, **mykwargs)")
- .testLookup(
- "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey2=x, extraKey1=true))");
-
- // Foo is used by name
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_args_and_kwargs(foo='foo', extraKey1=True)")
- .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs(extraKey1=true))");
-
- // Empty args and kwargs.
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("b = mock.with_args_and_kwargs('foo')")
- .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs())");
- }
-
- @Test
- public void testProxyMethodsObjectWithArgsAndKwargs() throws Exception {
- // Foo is used positionally
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp(
- "m = mock.proxy_methods_object()",
- "b = m.with_args_and_kwargs('foo', 'bar', 'baz', extraKey1=True, extraKey2='x')")
- .testLookup(
- "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey1=true, extraKey2=x))");
-
- // Use an args list and a kwargs dict
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp(
- "mykwargs = {'extraKey1':True}",
- "myargs = ['baz']",
- "m = mock.proxy_methods_object()",
- "b = m.with_args_and_kwargs('foo', 'bar', extraKey2='x', *myargs, **mykwargs)")
- .testLookup(
- "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey2=x, extraKey1=true))");
-
- // Foo is used by name
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp(
- "m = mock.proxy_methods_object()",
- "b = m.with_args_and_kwargs(foo='foo', extraKey1=True)")
- .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs(extraKey1=true))");
-
- // Empty args and kwargs.
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("m = mock.proxy_methods_object()", "b = m.with_args_and_kwargs('foo')")
- .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs())");
- }
-
- @Test
- public void testStructAccessOfMethod() throws Exception {
- ev.new Scenario().update("mock", new Mock()).testExpression("type(mock.function)", "function");
- ev.new Scenario().update("mock", new Mock()).testExpression("mock.function()", "a");
- }
-
- @Test
- public void testStructAccessTypo() throws Exception {
- ev.new Scenario()
- .update("mock", new SimpleStruct(ImmutableMap.of("field", 123)))
- .testIfExactError(
- "'SimpleStruct' value has no field or method 'fild' (did you mean 'field'?)",
- "mock.fild");
- }
-
- @Test
- public void testStructAccessType_nonClassObject() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .testIfExactError(
- "'Mock' value has no field or method 'sturct_field' (did you mean 'struct_field'?)",
- "v = mock.sturct_field");
- }
-
- @Test
- public void testJavaFunctionReturnsIllegalValue() throws Exception {
- ev.update("mock", new Mock());
- Starlark.UncheckedEvalException e =
- assertThrows(Starlark.UncheckedEvalException.class, () -> ev.eval("mock.return_bad()"));
- assertThat(e)
- .hasMessageThat()
- .contains(
- "cannot expose internal type to Starlark: class"
- + " com.google.devtools.build.lib.syntax.StarlarkEvaluationTest$Bad");
- }
-
- @Test
- public void testJavaFunctionReturnsNullFails() throws Exception {
- ev.update("mock", new Mock());
- RuntimeException e =
- assertThrows(RuntimeException.class, () -> ev.eval("mock.nullfunc_failing('abc', 1)"));
- assertThat(e).hasMessageThat().contains("method invocation returned null");
- }
-
- @Test
- public void testJavaFunctionOverflowsStack() throws Exception {
- ev.update("stackoverflow", new BuiltinCallable(this, "stackoverflow"));
- Starlark.UncheckedEvalException e =
- assertThrows(Starlark.UncheckedEvalException.class, () -> ev.eval("stackoverflow()"));
- assertThat(e).hasCauseThat().isInstanceOf(StackOverflowError.class);
- // Wrapper reveals stack.
- assertThat(e)
- .hasMessageThat()
- .contains(" (Starlark stack: [<expr>@:1:14, stackoverflow@<builtin>])");
- }
-
- @Test
- public void testJavaFunctionThrowsNPE() throws Exception {
- ev.update("thrownpe", new BuiltinCallable(this, "thrownpe"));
- Starlark.UncheckedEvalException e =
- assertThrows(Starlark.UncheckedEvalException.class, () -> ev.eval("thrownpe()"));
- // Wrapper reveals stack.
- assertThat(e)
- .hasMessageThat()
- .contains("oops (Starlark stack: [<expr>@:1:9, thrownpe@<builtin>])");
- // The underlying exception is preserved as cause.
- assertThat(e).hasCauseThat().isInstanceOf(NullPointerException.class);
- assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("oops");
- }
-
- @Test
- public void testClassObjectAccess() throws Exception {
- ev.new Scenario()
- .update("mock", new SimpleStruct(ImmutableMap.of("field", "a")))
- .setUp("v = mock.field")
- .testLookup("v", "a");
- }
-
- @Test
- public void testFieldReturnsNonStarlarkValue() throws Exception {
- ev.update("s", new SimpleStruct(ImmutableMap.of("bad", new StringBuilder())));
- RuntimeException e = assertThrows(RuntimeException.class, () -> ev.eval("s.bad"));
- assertThat(e)
- .hasMessageThat()
- .contains("invalid Starlark value: class java.lang.StringBuilder");
- }
-
- @Test
- public void testJavaFunctionReturnsNone() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("v = mock.nullfunc_working()")
- .testLookup("v", Starlark.NONE);
- }
-
- @Test
- public void testVoidJavaFunctionReturnsNone() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("v = mock.voidfunc()")
- .testLookup("v", Starlark.NONE);
- }
-
- @Test
- public void testAugmentedAssignment() throws Exception {
- ev.new Scenario()
- .setUp("def f1(x):", " x += 1", " return x", "", "foo = f1(41)")
- .testLookup("foo", 42);
- }
-
- @Test
- public void testAugmentedAssignmentHasNoSideEffects() throws Exception {
- // Check object position.
- ev.new Scenario()
- .setUp(
- "counter = [0]",
- "value = [1, 2]",
- "",
- "def f():",
- " counter[0] = counter[0] + 1",
- " return value",
- "",
- "f()[1] += 1") // `f()` should be called only once here
- .testLookup("counter", StarlarkList.of(null, 1));
-
- // Check key position.
- ev.new Scenario()
- .setUp(
- "counter = [0]",
- "value = [1, 2]",
- "",
- "def f():",
- " counter[0] = counter[0] + 1",
- " return 1",
- "",
- "value[f()] += 1") // `f()` should be called only once here
- .testLookup("counter", StarlarkList.of(null, 1));
- }
-
- @Test
- public void testInvalidAugmentedAssignment_listExpression() throws Exception {
- assertResolutionError(
- "cannot perform augmented assignment on a list or tuple expression",
- //
- "def f(a, b):",
- " [a, b] += []",
- "f(1, 2)");
- }
-
- @Test
- public void testInvalidAugmentedAssignment_notAnLValue() throws Exception {
- assertResolutionError(
- "cannot assign to 'x + 1'",
- //
- "x + 1 += 2");
- }
-
- @Test
- public void testAssignmentEvaluationOrder() throws Exception {
- ev.new Scenario()
- .setUp(
- "ordinary = []",
- "augmented = []",
- "value = [1, 2]",
- "",
- "def f(record):",
- " record.append('f')",
- " return value",
- "",
- "def g(record):",
- " record.append('g')",
- " return value",
- "",
- "f(ordinary)[0] = g(ordinary)[1]",
- "f(augmented)[0] += g(augmented)[1]")
- .testLookup("ordinary", StarlarkList.of(null, "g", "f")) // This order is consistent
- .testLookup("augmented", StarlarkList.of(null, "f", "g")); // with Python
- }
-
- @Test
- public void testDictComprehensions_iterationOrder() throws Exception {
- ev.new Scenario()
- .setUp(
- "def foo():",
- " d = {x : x for x in ['c', 'a', 'b']}",
- " s = ''",
- " for a in d:",
- " s += a",
- " return s",
- "s = foo()")
- .testLookup("s", "cab");
- }
-
- @Test
- public void testDotExpressionOnNonStructObject() throws Exception {
- ev.new Scenario()
- .testIfExactError(
- "'string' value has no field or method 'field' (did you mean 'find'?)",
- "x = 'a'.field");
- }
-
- @Test
- public void testPlusEqualsOnListMutating() throws Exception {
- ev.new Scenario()
- .setUp(
- "def func():",
- " l1 = [1, 2]",
- " l2 = l1",
- " l2 += [3, 4]",
- " return l1, l2",
- "lists = str(func())")
- .testLookup("lists", "([1, 2, 3, 4], [1, 2, 3, 4])");
-
- // The same but with += after an IndexExpression
- ev.new Scenario()
- .setUp(
- "def func():",
- " l = [1, 2]",
- " d = {0: l}",
- " d[0] += [3, 4]",
- " return l, d[0]",
- "lists = str(func())")
- .testLookup("lists", "([1, 2, 3, 4], [1, 2, 3, 4])");
- }
-
- @Test
- public void testPlusEqualsOnTuple() throws Exception {
- ev.new Scenario()
- .setUp(
- "def func():",
- " t1 = (1, 2)",
- " t2 = t1",
- " t2 += (3, 4)",
- " return t1, t2",
- "tuples = func()")
- .testLookup("tuples", Tuple.of(Tuple.of(1, 2), Tuple.of(1, 2, 3, 4)));
- }
-
- @Test
- public void testPlusOnDictDeprecated() throws Exception {
- ev.new Scenario()
- .testIfErrorContains("unsupported binary operation: dict + dict", "{1: 2} + {3: 4}");
- ev.new Scenario()
- .testIfErrorContains(
- "unsupported binary operation: dict + dict",
- "def func():",
- " d = {1: 2}",
- " d += {3: 4}",
- "func()");
- }
-
- @Test
- public void testDictAssignmentAsLValue() throws Exception {
- ev.new Scenario()
- .setUp("def func():", " d = {'a' : 1}", " d['b'] = 2", " return d", "d = func()")
- .testLookup("d", ImmutableMap.of("a", 1, "b", 2));
- }
-
- @Test
- public void testNestedDictAssignmentAsLValue() throws Exception {
- ev.new Scenario()
- .setUp(
- "def func():",
- " d = {'a' : 1}",
- " e = {'d': d}",
- " e['d']['b'] = 2",
- " return e",
- "e = func()")
- .testLookup("e", ImmutableMap.of("d", ImmutableMap.of("a", 1, "b", 2)));
- }
-
- @Test
- public void testListAssignmentAsLValue() throws Exception {
- ev.new Scenario()
- .setUp(
- "def func():",
- " a = [1, 2]",
- " a[1] = 3",
- " a[-2] = 4",
- " return a",
- "a = str(func())")
- .testLookup("a", "[4, 3]");
- }
-
- @Test
- public void testNestedListAssignmentAsLValue() throws Exception {
- ev.new Scenario()
- .setUp(
- "def func():",
- " d = [1, 2]",
- " e = [3, d]",
- " e[1][1] = 4",
- " return e",
- "e = str(func())")
- .testLookup("e", "[3, [1, 4]]");
- }
-
- @Test
- public void testDictTupleAssignmentAsLValue() throws Exception {
- ev.new Scenario()
- .setUp(
- "def func():", " d = {'a' : 1}", " d['b'], d['c'] = 2, 3", " return d", "d = func()")
- .testLookup("d", ImmutableMap.of("a", 1, "b", 2, "c", 3));
- }
-
- @Test
- public void testDictItemPlusEqual() throws Exception {
- ev.new Scenario()
- .setUp("def func():", " d = {'a' : 2}", " d['a'] += 3", " return d", "d = func()")
- .testLookup("d", ImmutableMap.of("a", 5));
- }
-
- @Test
- public void testDictAssignmentAsLValueSideEffects() throws Exception {
- ev.new Scenario()
- .setUp("def func(d):", " d['b'] = 2", "d = {'a' : 1}", "func(d)")
- .testLookup("d", Dict.of((Mutability) null, "a", 1, "b", 2));
- }
-
- @Test
- public void testAssignmentToListInDictSideEffect() throws Exception {
- ev.new Scenario()
- .setUp("l = [1, 2]", "d = {0: l}", "d[0].append(3)")
- .testLookup("l", StarlarkList.of(null, 1, 2, 3));
- }
-
- @Test
- public void testUserFunctionKeywordArgs() throws Exception {
- ev.new Scenario()
- .setUp("def foo(a, b, c):", " return a + b + c", "s = foo(1, c=2, b=3)")
- .testLookup("s", 6);
- }
-
- @Test
- public void testFunctionCallOrdering() throws Exception {
- ev.new Scenario()
- .setUp("def func(): return foo() * 2", "def foo(): return 2", "x = func()")
- .testLookup("x", 4);
- }
-
- @Test
- public void testFunctionCallBadOrdering() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "global variable 'foo' is referenced before assignment.",
- "def func(): return foo() * 2",
- "x = func()",
- "def foo(): return 2");
- }
-
- @Test
- public void testLocalVariableDefinedBelow() throws Exception {
- ev.new Scenario()
- .setUp(
- "def beforeEven(li):", // returns the value before the first even number
- " for i in li:",
- " if i % 2 == 0:",
- " return a",
- " else:",
- " a = i",
- "res = beforeEven([1, 3, 4, 5])")
- .testLookup("res", 3);
- }
-
- @Test
- public void testShadowisNotInitialized() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- /* error message */ "local variable 'gl' is referenced before assignment",
- "gl = 5",
- "def foo():",
- " if False: gl = 2",
- " return gl",
- "res = foo()");
- }
-
- @Test
- public void testShadowBuiltin() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "global variable 'len' is referenced before assignment",
- "x = len('abc')",
- "len = 2",
- "y = x + len");
- }
-
- @Test
- public void testFunctionCallRecursion() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "function 'f' called recursively",
- "def main():",
- " f(5)",
- "def f(n):",
- " if n > 0: g(n - 1)",
- "def g(n):",
- " if n > 0: f(n - 1)",
- "main()");
- }
-
- @Test
- // TODO(adonovan): move to ResolverTest.
- public void testTypo() throws Exception {
- assertResolutionError(
- "name 'my_variable' is not defined (did you mean 'myVariable'?)",
- //
- "myVariable = 2",
- "x = my_variable + 1");
- }
-
- @Test
- public void testNoneTrueFalseInStarlark() throws Exception {
- ev.new Scenario()
- .setUp("a = None", "b = True", "c = False")
- .testLookup("a", Starlark.NONE)
- .testLookup("b", Boolean.TRUE)
- .testLookup("c", Boolean.FALSE);
- }
-
- @Test
- public void testHasattrMethods() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp(
- "a = hasattr(mock, 'struct_field')",
- "b = hasattr(mock, 'function')",
- "c = hasattr(mock, 'is_empty')",
- "d = hasattr('str', 'replace')",
- "e = hasattr(mock, 'other')\n")
- .testLookup("a", Boolean.TRUE)
- .testLookup("b", Boolean.TRUE)
- .testLookup("c", Boolean.TRUE)
- .testLookup("d", Boolean.TRUE)
- .testLookup("e", Boolean.FALSE);
- }
-
- @Test
- public void testGetattrMethods() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp(
- "a = str(getattr(mock, 'struct_field', 'no'))",
- "b = str(getattr(mock, 'function', 'no'))",
- "c = str(getattr(mock, 'is_empty', 'no'))",
- "d = str(getattr('str', 'replace', 'no'))",
- "e = str(getattr(mock, 'other', 'no'))\n")
- .testLookup("a", "a")
- .testLookup("b", "<built-in function function>")
- .testLookup("c", "<built-in function is_empty>")
- .testLookup("d", "<built-in function replace>")
- .testLookup("e", "no");
- }
-
- @Test
- public void testListAnTupleConcatenationDoesNotWorkInStarlark() throws Exception {
- ev.new Scenario()
- .testIfExactError("unsupported binary operation: list + tuple", "[1, 2] + (3, 4)");
- }
-
- @Test
- public void testCannotCreateMixedListInStarlark() throws Exception {
- ev.new Scenario().testExactOrder("['a', 'b', 1, 2]", "a", "b", 1, 2);
- }
-
- @Test
- public void testCannotConcatListInStarlarkWithDifferentGenericTypes() throws Exception {
- ev.new Scenario().testExactOrder("[1, 2] + ['a', 'b']", 1, 2, "a", "b");
- }
-
- @Test
- public void testConcatEmptyListWithNonEmptyWorks() throws Exception {
- ev.new Scenario().testExactOrder("[] + ['a', 'b']", "a", "b");
- }
-
- @Test
- public void testFormatStringWithTuple() throws Exception {
- ev.new Scenario().setUp("v = '%s%s' % ('a', 1)").testLookup("v", "a1");
- }
-
- @Test
- public void testSingletonTuple() throws Exception {
- ev.new Scenario().testExactOrder("(1,)", 1);
- }
-
- @Test
- public void testDirFindsClassObjectFields() throws Exception {
- ev.new Scenario()
- .update("s", new SimpleStruct(ImmutableMap.of("a", 1, "b", 2)))
- .testExactOrder("dir(s)", "a", "b");
- }
-
- @Test
- public void testDirFindsJavaObjectStructFieldsAndMethods() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .testExactOrder(
- "dir(mock)",
- "function",
- "interrupted_struct_field",
- "is_empty",
- "nullfunc_failing",
- "nullfunc_working",
- "proxy_methods_object",
- "raise_unchecked_exception",
- "return_bad",
- "string",
- "string_list",
- "string_list_dict",
- "struct_field",
- "struct_field_callable",
- "struct_field_with_extra",
- "value_of",
- "voidfunc",
- "with_args_and_kwargs",
- "with_args_and_thread",
- "with_extra",
- "with_kwargs",
- "with_params",
- "with_params_and_extra");
- }
-
- @Test
- public void testPrint() throws Exception {
- ParserInput input =
- ParserInput.fromLines(
- "print('hello')", //
- "print('a', 'b')",
- "print('a', 'b', sep='x')");
- List<String> prints = new ArrayList<>();
- try (Mutability mu = Mutability.create("test")) {
- StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
- thread.setPrintHandler((unused, msg) -> prints.add(msg));
- Starlark.execFile(input, FileOptions.DEFAULT, Module.create(), thread);
- }
- assertThat(prints).containsExactly("hello", "a b", "axb").inOrder();
- }
-
- @Test
- public void testPrintBadKwargs() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "print() got unexpected keyword argument 'end'", "print(end='x', other='y')");
- }
-
- @Test
- public void testConditionalExpressionAtToplevel() throws Exception {
- ev.new Scenario().setUp("x = 1 if 2 else 3").testLookup("x", 1);
- }
-
- @Test
- public void testConditionalExpressionInFunction() throws Exception {
- ev.new Scenario()
- .setUp("def foo(a, b, c): return a+b if c else a-b\n")
- .testExpression("foo(23, 5, 0)", 18);
- }
-
- // SimpleStructWithMethods augments SimpleStruct's fields with annotated Java methods.
- private static final class SimpleStructWithMethods extends SimpleStruct {
-
- // A function that returns "fromValues".
- private static final Object returnFromValues =
- new StarlarkCallable() {
- @Override
- public String getName() {
- return "returnFromValues";
- }
-
- @Override
- public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
- return "fromValues";
- }
- };
-
- SimpleStructWithMethods() {
- super(
- ImmutableMap.of(
- "values_only_field",
- "fromValues",
- "values_only_method",
- returnFromValues,
- "collision_field",
- "fromValues",
- "collision_method",
- returnFromValues));
- }
-
- @StarlarkMethod(name = "callable_only_field", documented = false, structField = true)
- public String getCallableOnlyField() {
- return "fromStarlarkMethod";
- }
-
- @StarlarkMethod(name = "callable_only_method", documented = false, structField = false)
- public String getCallableOnlyMethod() {
- return "fromStarlarkMethod";
- }
-
- @StarlarkMethod(name = "collision_field", documented = false, structField = true)
- public String getCollisionField() {
- return "fromStarlarkMethod";
- }
-
- @StarlarkMethod(name = "collision_method", documented = false, structField = false)
- public String getCollisionMethod() {
- return "fromStarlarkMethod";
- }
- }
-
- @Test
- public void testStructFieldDefinedOnlyInValues() throws Exception {
- ev.new Scenario()
- .update("val", new SimpleStructWithMethods())
- .setUp("v = val.values_only_field")
- .testLookup("v", "fromValues");
- }
-
- @Test
- public void testStructMethodDefinedOnlyInValues() throws Exception {
- ev.new Scenario()
- .update("val", new SimpleStructWithMethods())
- .setUp("v = val.values_only_method()")
- .testLookup("v", "fromValues");
- }
-
- @Test
- public void testStructFieldDefinedOnlyInStarlarkMethod() throws Exception {
- ev.new Scenario()
- .update("val", new SimpleStructWithMethods())
- .setUp("v = val.callable_only_field")
- .testLookup("v", "fromStarlarkMethod");
- }
-
- @Test
- public void testStructMethodDefinedOnlyInStarlarkMethod() throws Exception {
- ev.new Scenario()
- .update("val", new SimpleStructWithMethods())
- .setUp("v = val.callable_only_method()")
- .testLookup("v", "fromStarlarkMethod");
- }
-
- @Test
- public void testStructMethodDefinedInValuesAndStarlarkMethod() throws Exception {
- // This test exercises the resolution of ambiguity between @StarlarkMethod-annotated
- // fields and those reported by ClassObject.getValue.
- ev.new Scenario()
- .update("val", new SimpleStructWithMethods())
- .setUp("v = val.collision_method()")
- .testLookup("v", "fromStarlarkMethod");
- }
-
- @Test
- public void testAttrNotDefined() throws Exception {
- ev.new Scenario()
- .update("s", new SimpleStructWithMethods())
- // dir shows all fields and methods
- .testEval(
- "dir(s)",
- "['callable_only_field', 'callable_only_method', 'collision_field',"
- + " 'collision_method', 'values_only_field', 'values_only_method']")
- // field-like non-existent access
- .testIfExactError(
- "'SimpleStructWithMethods' value has no field or method 'nonesuch'", "s.nonesuch")
- // method-like non-existent access (same result)
- .testIfExactError(
- "'SimpleStructWithMethods' value has no field or method 'nonesuch'", "s.nonesuch()")
- // spelling hint
- .testIfExactError(
- "'SimpleStructWithMethods' value has no field or method 'collision_metod' (did you"
- + " mean 'collision_method'?)",
- "s.collision_metod");
- }
-
- @Test
- public void testListComprehensionsShadowGlobalVariable() throws Exception {
- ev.exec(
- "a = 18", //
- "def foo():",
- " b = [a for a in range(3)]",
- " return a",
- "x = foo()");
- assertThat(ev.lookup("x")).isEqualTo(18);
- }
-
- @Test
- public void testComprehensionsAreLocal() throws Exception {
- // Regression test for https://github.com/bazelbuild/starlark/issues/92.
- ev.exec(
- "x = 1", // this global binding is not affected (even temporarily) by the comprehension
- "def f():",
- " return x",
- "y = [f() for x in [2]][0]");
- assertThat(ev.lookup("y")).isEqualTo(1);
- }
-
- @Test
- public void testFunctionEvaluatedBeforeArguments() throws Exception {
- // ''.nonesuch must be evaluated (and fail) before f().
- ev.new Scenario()
- .testIfErrorContains(
- "'string' value has no field or method 'nonesuch'",
- "def f(): x = 1//0",
- "''.nonesuch(f())");
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java
deleted file mode 100644
index 576c913..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2006 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.base.Joiner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of StarlarkFile parsing. */
-// TODO(adonovan): move tests of parsing into ParserTest.
-@RunWith(JUnit4.class)
-public class StarlarkFileTest {
-
- /**
- * Parses the contents of the specified string (using 'foo.star' as the apparent filename) and
- * returns the AST. Resets the error handler beforehand.
- */
- private static StarlarkFile parseFile(String... lines) {
- String src = Joiner.on("\n").join(lines);
- ParserInput input = ParserInput.fromString(src, "foo.star");
- return StarlarkFile.parse(input);
- }
-
- @Test
- public void testParsesFineWithNewlines() throws Exception {
- StarlarkFile file = parseFile("foo()", "bar()", "something = baz()", "bar()");
- assertThat(file.getStatements()).hasSize(4);
- }
-
- @Test
- public void testFailsIfNewlinesAreMissing() throws Exception {
- StarlarkFile file = parseFile("foo() bar() something = baz() bar()");
-
- SyntaxError error =
- LexerTest.assertContainsError(file.errors(), "syntax error at \'bar\': expected newline");
- assertThat(error.location().toString()).isEqualTo("foo.star:1:7");
- }
-
- @Test
- public void testImplicitStringConcatenationFails() throws Exception {
- // TODO(adonovan): move to ParserTest.
- StarlarkFile file = parseFile("a = 'foo' 'bar'");
- SyntaxError error =
- LexerTest.assertContainsError(
- file.errors(), "Implicit string concatenation is forbidden, use the + operator");
- assertThat(error.location().toString()).isEqualTo("foo.star:1:11"); // start of 'bar'
- }
-
- @Test
- public void testImplicitStringConcatenationAcrossLinesIsIllegal() throws Exception {
- StarlarkFile file = parseFile("a = 'foo'\n 'bar'");
-
- SyntaxError error = LexerTest.assertContainsError(file.errors(), "indentation error");
- assertThat(error.location().toString()).isEqualTo("foo.star:2:2");
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java
deleted file mode 100644
index 082c07e..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java
+++ /dev/null
@@ -1,320 +0,0 @@
-// Copyright 2018 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import com.google.common.collect.ImmutableMap;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkMethod;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Starlark evaluation tests which verify the infrastructure which toggles build API methods and
- * parameters with semantic flags.
- */
-@RunWith(JUnit4.class)
-public final class StarlarkFlagGuardingTest {
-
- // We define two arbitrary flags (one experimental, one incompatible) for our testing.
- private static final String EXPERIMENTAL_FLAG = "-experimental_flag";
- private static final String INCOMPATIBLE_FLAG = "+incompatible_flag";
-
- private static final String FLAG1 = EXPERIMENTAL_FLAG;
- private static final StarlarkSemantics FLAG1_TRUE =
- StarlarkSemantics.builder().setBool(EXPERIMENTAL_FLAG, true).build();
- private static final StarlarkSemantics FLAG1_FALSE =
- StarlarkSemantics.builder().setBool(EXPERIMENTAL_FLAG, false).build();
-
- private static final String FLAG2 = INCOMPATIBLE_FLAG;
- private static final StarlarkSemantics FLAG2_TRUE =
- StarlarkSemantics.builder().setBool(INCOMPATIBLE_FLAG, true).build();
- private static final StarlarkSemantics FLAG2_FALSE =
- StarlarkSemantics.builder().setBool(INCOMPATIBLE_FLAG, false).build();
-
- private EvaluationTestCase ev = new EvaluationTestCase();
-
- /** Mock containing exposed methods for flag-guarding tests. */
- @StarlarkBuiltin(name = "Mock", doc = "")
- public static class Mock implements StarlarkValue {
-
- @StarlarkMethod(
- name = "positionals_only_method",
- documented = false,
- parameters = {
- @Param(name = "a", positional = true, named = false, type = Integer.class),
- @Param(
- name = "b",
- positional = true,
- named = false,
- type = Boolean.class,
- enableOnlyWithFlag = EXPERIMENTAL_FLAG,
- valueWhenDisabled = "False"),
- @Param(name = "c", positional = true, named = false, type = Integer.class),
- },
- useStarlarkThread = true)
- public String positionalsOnlyMethod(Integer a, boolean b, Integer c, StarlarkThread thread) {
- return "positionals_only_method(" + a + ", " + b + ", " + c + ")";
- }
-
- @StarlarkMethod(
- name = "keywords_only_method",
- documented = false,
- parameters = {
- @Param(name = "a", positional = false, named = true, type = Integer.class),
- @Param(
- name = "b",
- positional = false,
- named = true,
- type = Boolean.class,
- enableOnlyWithFlag = EXPERIMENTAL_FLAG,
- valueWhenDisabled = "False"),
- @Param(name = "c", positional = false, named = true, type = Integer.class),
- },
- useStarlarkThread = true)
- public String keywordsOnlyMethod(Integer a, boolean b, Integer c, StarlarkThread thread) {
- return "keywords_only_method(" + a + ", " + b + ", " + c + ")";
- }
-
- @StarlarkMethod(
- name = "mixed_params_method",
- documented = false,
- parameters = {
- @Param(name = "a", positional = true, named = false, type = Integer.class),
- @Param(
- name = "b",
- positional = true,
- named = false,
- type = Boolean.class,
- enableOnlyWithFlag = EXPERIMENTAL_FLAG,
- valueWhenDisabled = "False"),
- @Param(
- name = "c",
- positional = false,
- named = true,
- type = Integer.class,
- enableOnlyWithFlag = EXPERIMENTAL_FLAG,
- valueWhenDisabled = "3"),
- @Param(name = "d", positional = false, named = true, type = Boolean.class),
- },
- useStarlarkThread = true)
- public String mixedParamsMethod(
- Integer a, boolean b, Integer c, boolean d, StarlarkThread thread) {
- return "mixed_params_method(" + a + ", " + b + ", " + c + ", " + d + ")";
- }
-
- @StarlarkMethod(
- name = "keywords_multiple_flags",
- documented = false,
- parameters = {
- @Param(name = "a", positional = false, named = true, type = Integer.class),
- @Param(
- name = "b",
- positional = false,
- named = true,
- type = Boolean.class,
- disableWithFlag = FLAG2,
- valueWhenDisabled = "False"),
- @Param(
- name = "c",
- positional = false,
- named = true,
- type = Integer.class,
- enableOnlyWithFlag = FLAG1,
- valueWhenDisabled = "3"),
- },
- useStarlarkThread = true)
- public String keywordsMultipleFlags(Integer a, boolean b, Integer c, StarlarkThread thread) {
- return "keywords_multiple_flags(" + a + ", " + b + ", " + c + ")";
- }
- }
-
- @Test
- public void testPositionalsOnlyGuardedMethod() throws Exception {
- ev.new Scenario(FLAG1_TRUE)
- .update("mock", new Mock())
- .testEval(
- "mock.positionals_only_method(1, True, 3)", "'positionals_only_method(1, true, 3)'");
-
- ev.new Scenario(FLAG1_TRUE)
- .update("mock", new Mock())
- .testIfErrorContains(
- "in call to positionals_only_method(), parameter 'b' got value of type 'int', want"
- + " 'bool'",
- "mock.positionals_only_method(1, 3)");
-
- ev.new Scenario(FLAG1_FALSE)
- .update("mock", new Mock())
- .testEval("mock.positionals_only_method(1, 3)", "'positionals_only_method(1, false, 3)'");
-
- ev.new Scenario(FLAG1_FALSE)
- .update("mock", new Mock())
- .testIfErrorContains(
- "in call to positionals_only_method(), parameter 'c' got value of type 'bool', want"
- + " 'int'",
- "mock.positionals_only_method(1, True, 3)");
- }
-
- @Test
- public void testKeywordOnlyGuardedMethod() throws Exception {
- ev.new Scenario(FLAG1_TRUE)
- .update("mock", new Mock())
- .testEval(
- "mock.keywords_only_method(a=1, b=True, c=3)", "'keywords_only_method(1, true, 3)'");
-
- ev.new Scenario(FLAG1_TRUE)
- .update("mock", new Mock())
- .testIfErrorContains(
- "keywords_only_method() missing 1 required named argument: b",
- "mock.keywords_only_method(a=1, c=3)");
-
- ev.new Scenario(FLAG1_FALSE)
- .update("mock", new Mock())
- .testEval("mock.keywords_only_method(a=1, c=3)", "'keywords_only_method(1, false, 3)'");
-
- ev.new Scenario(FLAG1_FALSE)
- .update("mock", new Mock())
- .testIfErrorContains(
- "parameter 'b' is experimental and thus unavailable with the current "
- + "flags. It may be enabled by setting --experimental_flag",
- "mock.keywords_only_method(a=1, b=True, c=3)");
- }
-
- @Test
- public void testMixedParamsMethod() throws Exception {
- // def mixed_params_method(a, b, c = ?, d = ?)
- ev.new Scenario(FLAG1_TRUE)
- .update("mock", new Mock())
- .testEval(
- "mock.mixed_params_method(1, True, c=3, d=True)",
- "'mixed_params_method(1, true, 3, true)'");
-
- ev.new Scenario(FLAG1_TRUE)
- .update("mock", new Mock())
- .testIfErrorContains(
- // Missing named arguments (d) are not reported
- // if there are missing positional arguments.
- "mixed_params_method() missing 1 required positional argument: b",
- "mock.mixed_params_method(1, c=3)");
-
- // def mixed_params_method(a, b disabled = False, c disabled = 3, d = ?)
- ev.new Scenario(FLAG1_FALSE)
- .update("mock", new Mock())
- .testEval(
- "mock.mixed_params_method(1, d=True)", "'mixed_params_method(1, false, 3, true)'");
-
- ev.new Scenario(FLAG1_FALSE)
- .update("mock", new Mock())
- .testIfErrorContains(
- "mixed_params_method() accepts no more than 1 positional argument but got 2",
- "mock.mixed_params_method(1, True, d=True)");
-
- ev.new Scenario(FLAG1_FALSE)
- .update("mock", new Mock())
- .testIfErrorContains(
- "mixed_params_method() accepts no more than 1 positional argument but got 2",
- "mock.mixed_params_method(1, True, c=3, d=True)");
- }
-
- @Test
- public void testKeywordsMultipleFlags() throws Exception {
- StarlarkSemantics tf = FLAG1_TRUE.toBuilder().setBool(FLAG2, false).build();
- ev.new Scenario(tf)
- .update("mock", new Mock())
- .testEval(
- "mock.keywords_multiple_flags(a=42, b=True, c=0)",
- "'keywords_multiple_flags(42, true, 0)'")
- .testIfErrorContains(
- "keywords_multiple_flags() missing 2 required named arguments: b, c",
- "mock.keywords_multiple_flags(a=42)");
-
- StarlarkSemantics ft = FLAG1_FALSE.toBuilder().setBool(FLAG2, true).build();
- ev.new Scenario(ft)
- .update("mock", new Mock())
- .testEval("mock.keywords_multiple_flags(a=42)", "'keywords_multiple_flags(42, false, 3)'")
- .testIfErrorContains(
- "parameter 'b' is deprecated and will be removed soon. It may be "
- + "temporarily re-enabled by setting --incompatible_flag=false",
- "mock.keywords_multiple_flags(a=42, b=True, c=0)");
- }
-
- @Test
- public void testExperimentalFlagGuardedValue() throws Exception {
- // This test uses an arbitrary experimental flag to verify this functionality. If this
- // experimental flag were to go away, this test may be updated to use any experimental flag.
- // The flag itself is unimportant to the test.
-
- // clumsy way to predeclare
- ev =
- new EvaluationTestCase() {
- @Override
- protected Object newModuleHook(ImmutableMap.Builder<String, Object> predeclared) {
- predeclared.put(
- "GlobalSymbol",
- FlagGuardedValue.onlyWhenExperimentalFlagIsTrue(EXPERIMENTAL_FLAG, "foo"));
- return null; // no client data
- }
- };
-
- String errorMessage =
- "GlobalSymbol is experimental and thus unavailable with the current "
- + "flags. It may be enabled by setting --experimental_flag";
-
- ev.new Scenario(FLAG1_TRUE).setUp("var = GlobalSymbol").testLookup("var", "foo");
-
- ev.new Scenario(FLAG1_FALSE).testIfErrorContains(errorMessage, "var = GlobalSymbol");
-
- ev.new Scenario(FLAG1_FALSE)
- .testIfErrorContains(errorMessage, "def my_function():", " var = GlobalSymbol");
-
- ev.new Scenario(FLAG1_FALSE)
- .setUp("GlobalSymbol = 'other'", "var = GlobalSymbol")
- .testLookup("var", "other");
- }
-
- @Test
- public void testIncompatibleFlagGuardedValue() throws Exception {
- // This test uses an arbitrary incompatible flag to verify this functionality. If this
- // incompatible flag were to go away, this test may be updated to use any incompatible flag.
- // The flag itself is unimportant to the test.
-
- ev =
- new EvaluationTestCase() {
- @Override
- protected Object newModuleHook(ImmutableMap.Builder<String, Object> predeclared) {
- predeclared.put(
- "GlobalSymbol", FlagGuardedValue.onlyWhenIncompatibleFlagIsFalse(FLAG2, "foo"));
- return null; // no client data
- }
- };
-
- String errorMessage =
- "GlobalSymbol is deprecated and will be removed soon. It may be "
- + "temporarily re-enabled by setting --"
- + FLAG2.substring(1)
- + "=false";
-
- ev.new Scenario(FLAG2_FALSE).setUp("var = GlobalSymbol").testLookup("var", "foo");
-
- ev.new Scenario(FLAG2_TRUE).testIfErrorContains(errorMessage, "var = GlobalSymbol");
-
- ev.new Scenario(FLAG2_TRUE)
- .testIfErrorContains(errorMessage, "def my_function():", " var = GlobalSymbol");
-
- ev.new Scenario(FLAG2_TRUE)
- .setUp("GlobalSymbol = 'other'", "var = GlobalSymbol")
- .testLookup("var", "other");
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkInterfaceUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkInterfaceUtilsTest.java
deleted file mode 100644
index 7d5afa2..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkInterfaceUtilsTest.java
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright 2016 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import java.lang.reflect.Method;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkInterfaceUtils;
-import net.starlark.java.annot.StarlarkMethod;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Test Starlark interface annotations and utilities. */
-@RunWith(JUnit4.class)
-public class StarlarkInterfaceUtilsTest {
-
- /** MockClassA */
- @StarlarkBuiltin(name = "MockClassA", doc = "MockClassA")
- public static class MockClassA implements StarlarkValue {
- @StarlarkMethod(name = "foo", doc = "MockClassA#foo")
- public void foo() {}
-
- @StarlarkMethod(name = "bar", doc = "MockClassA#bar")
- public void bar() {}
-
- public void baz() {}
- }
-
- /** MockInterfaceB1 */
- @StarlarkBuiltin(name = "MockInterfaceB1", doc = "MockInterfaceB1")
- public static interface MockInterfaceB1 extends StarlarkValue {
- @StarlarkMethod(name = "foo", doc = "MockInterfaceB1#foo")
- void foo();
-
- @StarlarkMethod(name = "bar", doc = "MockInterfaceB1#bar")
- void bar();
-
- @StarlarkMethod(name = "baz", doc = "MockInterfaceB1#baz")
- void baz();
- }
-
- /** MockInterfaceB2 */
- @StarlarkBuiltin(name = "MockInterfaceB2", doc = "MockInterfaceB2")
- public static interface MockInterfaceB2 extends StarlarkValue {
- @StarlarkMethod(name = "baz", doc = "MockInterfaceB2#baz")
- void baz();
-
- @StarlarkMethod(name = "qux", doc = "MockInterfaceB2#qux")
- void qux();
- }
-
- /** MockClassC */
- @StarlarkBuiltin(name = "MockClassC", doc = "MockClassC")
- public static class MockClassC extends MockClassA implements MockInterfaceB1, MockInterfaceB2 {
- @Override
- @StarlarkMethod(name = "foo", doc = "MockClassC#foo")
- public void foo() {}
-
- @Override
- public void bar() {}
- @Override
- public void baz() {}
- @Override
- public void qux() {}
- }
-
- /** MockClassD */
- public static class MockClassD extends MockClassC {
- @Override
- @StarlarkMethod(name = "foo", doc = "MockClassD#foo")
- public void foo() {}
- }
-
- /**
- * A mock class that implements two unrelated module interfaces. This is invalid as the Starlark
- * type of such an object is ambiguous.
- */
- public static class ImplementsTwoUnrelatedInterfaceModules
- implements MockInterfaceB1, MockInterfaceB2 {
- @Override
- public void foo() {}
- @Override
- public void bar() {}
- @Override
- public void baz() {}
- @Override
- public void qux() {}
- }
-
- /** ClassAModule test class */
- @StarlarkBuiltin(name = "ClassAModule", doc = "ClassAModule")
- public static class ClassAModule implements StarlarkValue {}
-
- /** ExtendsClassA test class */
- public static class ExtendsClassA extends ClassAModule {}
-
- /** InterfaceBModule test interface */
- @StarlarkBuiltin(name = "InterfaceBModule", doc = "InterfaceBModule")
- public static interface InterfaceBModule extends StarlarkValue {}
-
- /** ExtendsInterfaceB test interface */
- public static interface ExtendsInterfaceB extends InterfaceBModule {}
-
- /**
- * A mock class which has two transitive superclasses ({@link ClassAModule} and {@link
- * InterfaceBModule})) which are unrelated modules. This is invalid as the Starlark type of such
- * an object is ambiguous.
- *
- * <p>In other words: AmbiguousClass -> ClassAModule AmbiguousClass -> InterfaceBModule ... but
- * ClassAModule and InterfaceBModule have no relation.
- */
- public static class AmbiguousClass extends ExtendsClassA implements ExtendsInterfaceB {}
-
- /** SubclassOfBoth test interface */
- @StarlarkBuiltin(name = "SubclassOfBoth", doc = "SubclassOfBoth")
- public static class SubclassOfBoth extends ExtendsClassA implements ExtendsInterfaceB {}
-
- /**
- * A mock class similar to {@link AmbiugousClass} in that it has two separate superclass-paths to
- * Starlark modules, but is resolvable.
- *
- * <p>Concretely: UnambiguousClass -> SubclassOfBoth UnambiguousClass -> InterfaceBModule
- * SubclassOfBoth -> InterfaceBModule
- *
- * <p>... so UnambiguousClass is of type SubclassOfBoth.
- */
- public static class UnambiguousClass extends SubclassOfBoth implements ExtendsInterfaceB {}
-
- /** MockClassZ */
- public static class MockClassZ {
- }
-
- // The tests for getStarlarkBuiltin() double as tests for getParentWithStarlarkBuiltin(),
- // since they share an implementation.
-
- @Test
- public void testGetStarlarkBuiltinBasic() throws Exception {
- // Normal case.
- StarlarkBuiltin ann = StarlarkInterfaceUtils.getStarlarkBuiltin(MockClassA.class);
- Class<?> cls = StarlarkInterfaceUtils.getParentWithStarlarkBuiltin(MockClassA.class);
- assertThat(ann).isNotNull();
- assertThat(ann.doc()).isEqualTo("MockClassA");
- assertThat(cls).isNotNull();
- assertThat(cls).isEqualTo(MockClassA.class);
- }
-
- @Test
- public void testGetStarlarkBuiltinSubclass() throws Exception {
- // Subclass's annotation is used.
- StarlarkBuiltin ann = StarlarkInterfaceUtils.getStarlarkBuiltin(MockClassC.class);
- Class<?> cls = StarlarkInterfaceUtils.getParentWithStarlarkBuiltin(MockClassC.class);
- assertThat(ann).isNotNull();
- assertThat(ann.doc()).isEqualTo("MockClassC");
- assertThat(cls).isNotNull();
- assertThat(cls).isEqualTo(MockClassC.class);
- }
-
- @Test
- public void testGetStarlarkBuiltinSubclassNoSubannotation() throws Exception {
- // Falls back on superclass's annotation.
- StarlarkBuiltin ann = StarlarkInterfaceUtils.getStarlarkBuiltin(MockClassD.class);
- Class<?> cls = StarlarkInterfaceUtils.getParentWithStarlarkBuiltin(MockClassD.class);
- assertThat(ann).isNotNull();
- assertThat(ann.doc()).isEqualTo("MockClassC");
- assertThat(cls).isNotNull();
- assertThat(cls).isEqualTo(MockClassC.class);
- }
-
- @Test
- public void testGetStarlarkBuiltinNotFound() throws Exception {
- // Doesn't exist.
- StarlarkBuiltin ann = StarlarkInterfaceUtils.getStarlarkBuiltin(MockClassZ.class);
- Class<?> cls = StarlarkInterfaceUtils.getParentWithStarlarkBuiltin(MockClassZ.class);
- assertThat(ann).isNull();
- assertThat(cls).isNull();
- }
-
- @Test
- public void testGetStarlarkBuiltinAmbiguous() throws Exception {
- assertThrows(IllegalArgumentException.class,
- () -> StarlarkInterfaceUtils.getStarlarkBuiltin(ImplementsTwoUnrelatedInterfaceModules.class));
- }
-
- @Test
- public void testGetStarlarkBuiltinTransitivelyAmbiguous() throws Exception {
- assertThrows(IllegalArgumentException.class,
- () -> StarlarkInterfaceUtils.getStarlarkBuiltin(AmbiguousClass.class));
- }
-
- @Test
- public void testGetStarlarkBuiltinUnambiguousComplex() throws Exception {
- assertThat(StarlarkInterfaceUtils.getStarlarkBuiltin(SubclassOfBoth.class))
- .isEqualTo(SubclassOfBoth.class.getAnnotation(StarlarkBuiltin.class));
-
- assertThat(StarlarkInterfaceUtils.getStarlarkBuiltin(UnambiguousClass.class))
- .isEqualTo(SubclassOfBoth.class.getAnnotation(StarlarkBuiltin.class));
- }
-
- @Test
- public void testGetStarlarkCallableBasic() throws Exception {
- // Normal case. Ensure two-arg form is consistent with one-arg form.
- Method method = MockClassA.class.getMethod("foo");
- StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
- assertThat(ann).isNotNull();
- assertThat(ann.doc()).isEqualTo("MockClassA#foo");
-
- StarlarkMethod ann2 = StarlarkInterfaceUtils.getStarlarkMethod(MockClassA.class, method);
- assertThat(ann2).isEqualTo(ann);
- }
-
- @Test
- public void testGetStarlarkCallableSubclass() throws Exception {
- // Subclass's annotation is used.
- Method method = MockClassC.class.getMethod("foo");
- StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
- assertThat(ann).isNotNull();
- assertThat(ann.doc()).isEqualTo("MockClassC#foo");
- }
-
- @Test
- public void testGetStarlarkCallableSubclassNoSubannotation() throws Exception {
- // Falls back on superclass's annotation. Superclass takes precedence over interface.
- Method method = MockClassC.class.getMethod("bar");
- StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
- assertThat(ann).isNotNull();
- assertThat(ann.doc()).isEqualTo("MockClassA#bar");
- }
-
- @Test
- public void testGetStarlarkCallableTwoargForm() throws Exception {
- // Ensure that when passing superclass in directly, we bypass subclass's annotation.
- Method method = MockClassC.class.getMethod("foo");
- StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(MockClassA.class, method);
- assertThat(ann).isNotNull();
- assertThat(ann.doc()).isEqualTo("MockClassA#foo");
- }
-
- @Test
- public void testGetStarlarkCallableNotFound() throws Exception {
- // Null result when no annotation present...
- Method method = MockClassA.class.getMethod("baz");
- StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
- assertThat(ann).isNull();
-
- // ... including when it's only present in a subclass that was bypassed...
- method = MockClassC.class.getMethod("baz");
- ann = StarlarkInterfaceUtils.getStarlarkMethod(MockClassA.class, method);
- assertThat(ann).isNull();
-
- // ... or when the method itself is only in the subclass that was bypassed.
- method = MockClassC.class.getMethod("qux");
- ann = StarlarkInterfaceUtils.getStarlarkMethod(MockClassA.class, method);
- assertThat(ann).isNull();
- }
-
- @Test
- public void testGetStarlarkCallableInterface() throws Exception {
- // Search through parent interfaces. First interface takes priority.
- Method method = MockClassC.class.getMethod("baz");
- StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
- assertThat(ann).isNotNull();
- assertThat(ann.doc()).isEqualTo("MockInterfaceB1#baz");
-
- // Make sure both are still traversed.
- method = MockClassC.class.getMethod("qux");
- ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
- assertThat(ann).isNotNull();
- assertThat(ann.doc()).isEqualTo("MockInterfaceB2#qux");
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkListTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkListTest.java
deleted file mode 100644
index 7ecf257..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkListTest.java
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import java.util.ArrayList;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for Sequence. */
-@RunWith(JUnit4.class)
-public final class StarlarkListTest {
-
- private final EvaluationTestCase ev = new EvaluationTestCase();
-
- @Test
- public void testIndex() throws Exception {
- ev.exec("l = [1, '2', 3]");
- assertThat(ev.eval("l[0]")).isEqualTo(1);
- assertThat(ev.eval("l[1]")).isEqualTo("2");
- assertThat(ev.eval("l[2]")).isEqualTo(3);
-
- ev.exec("t = (1, '2', 3)");
- assertThat(ev.eval("t[0]")).isEqualTo(1);
- assertThat(ev.eval("t[1]")).isEqualTo("2");
- assertThat(ev.eval("t[2]")).isEqualTo(3);
- }
-
- @Test
- public void testIndexOutOfBounds() throws Exception {
- ev.checkEvalError(
- "index out of range (index is 3, but sequence has 3 elements)", "['a', 'b', 'c'][3]");
- ev.checkEvalError(
- "index out of range (index is 10, but sequence has 3 elements)", "['a', 'b', 'c'][10]");
- ev.checkEvalError("index out of range (index is 0, but sequence has 0 elements)", "[][0]");
- }
-
- @Test
- public void testNegativeIndices() throws Exception {
- ev.exec("l = ['a', 'b', 'c']");
- assertThat(ev.eval("l[0]")).isEqualTo("a");
- assertThat(ev.eval("l[-1]")).isEqualTo("c");
- assertThat(ev.eval("l[-2]")).isEqualTo("b");
- assertThat(ev.eval("l[-3]")).isEqualTo("a");
- ev.checkEvalError("index out of range (index is -4, but sequence has 3 elements)", "l[-4]");
- ev.checkEvalError("index out of range (index is -1, but sequence has 0 elements)", "[][-1]");
- }
-
- @SuppressWarnings("unchecked")
- private Sequence<Object> listEval(String... input) throws Exception {
- return (Sequence<Object>) ev.eval(input);
- }
-
- @Test
- public void testSlice() throws Exception {
- ev.exec("l = ['a', 'b', 'c']");
- assertThat(listEval("l[0:3]")).containsExactly("a", "b", "c").inOrder();
- assertThat(listEval("l[0:2]")).containsExactly("a", "b").inOrder();
- assertThat(listEval("l[0:1]")).containsExactly("a").inOrder();
- assertThat(listEval("l[0:0]")).isEmpty();
- assertThat(listEval("l[1:3]")).containsExactly("b", "c").inOrder();
- assertThat(listEval("l[2:3]")).containsExactly("c").inOrder();
- assertThat(listEval("l[3:3]")).isEmpty();
- assertThat(listEval("l[2:1]")).isEmpty();
- assertThat(listEval("l[3:0]")).isEmpty();
-
- ev.exec("t = ('a', 'b', 'c')");
- assertThat(listEval("t[0:3]")).containsExactly("a", "b", "c").inOrder();
- assertThat(listEval("t[1:2]")).containsExactly("b").inOrder();
- }
-
- @Test
- public void testSliceDefault() throws Exception {
- ev.exec("l = ['a', 'b', 'c']");
- assertThat(listEval("l[:]")).containsExactly("a", "b", "c").inOrder();
- assertThat(listEval("l[:2]")).containsExactly("a", "b").inOrder();
- assertThat(listEval("l[2:]")).containsExactly("c").inOrder();
- }
-
- @Test
- public void testSliceNegative() throws Exception {
- ev.exec("l = ['a', 'b', 'c']");
- assertThat(listEval("l[-2:-1]")).containsExactly("b").inOrder();
- assertThat(listEval("l[-2:]")).containsExactly("b", "c").inOrder();
- assertThat(listEval("l[0:-1]")).containsExactly("a", "b").inOrder();
- assertThat(listEval("l[-1:1]")).isEmpty();
- }
-
- @Test
- public void testSliceBounds() throws Exception {
- ev.exec("l = ['a', 'b', 'c']");
- assertThat(listEval("l[0:5]")).containsExactly("a", "b", "c").inOrder();
- assertThat(listEval("l[-10:2]")).containsExactly("a", "b").inOrder();
- assertThat(listEval("l[3:10]")).isEmpty();
- assertThat(listEval("l[-10:-9]")).isEmpty();
- }
-
- @Test
- public void testSliceSkip() throws Exception {
- ev.exec("l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']");
- assertThat(listEval("l[0:6:2]")).containsExactly("a", "c", "e").inOrder();
- assertThat(listEval("l[0:7:2]")).containsExactly("a", "c", "e", "g").inOrder();
- assertThat(listEval("l[0:10:2]")).containsExactly("a", "c", "e", "g").inOrder();
- assertThat(listEval("l[-6:10:2]")).containsExactly("b", "d", "f").inOrder();
- assertThat(listEval("l[1:5:3]")).containsExactly("b", "e").inOrder();
- assertThat(listEval("l[-10:3:2]")).containsExactly("a", "c").inOrder();
- assertThat(listEval("l[-10:10:1]")).containsExactly(
- "a", "b", "c", "d", "e", "f", "g").inOrder();
- }
-
- @Test
- public void testSliceNegativeSkip() throws Exception {
- ev.exec("l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']");
- assertThat(listEval("l[5:2:-1]")).containsExactly("f", "e", "d").inOrder();
- assertThat(listEval("l[5:2:-2]")).containsExactly("f", "d").inOrder();
- assertThat(listEval("l[5:3:-2]")).containsExactly("f").inOrder();
- assertThat(listEval("l[6::-4]")).containsExactly("g", "c").inOrder();
- assertThat(listEval("l[7::-4]")).containsExactly("g", "c").inOrder();
- assertThat(listEval("l[-1::-4]")).containsExactly("g", "c").inOrder();
- assertThat(listEval("l[-1:-10:-4]")).containsExactly("g", "c").inOrder();
- assertThat(listEval("l[-1:-3:-4]")).containsExactly("g").inOrder();
- assertThat(listEval("l[2:5:-1]")).isEmpty();
- assertThat(listEval("l[-10:5:-1]")).isEmpty();
- assertThat(listEval("l[1:-8:-1]")).containsExactly("b", "a").inOrder();
-
- ev.checkEvalError("slice step cannot be zero", "l[2:5:0]");
- }
-
- @Test
- public void testListSize() throws Exception {
- assertThat(ev.eval("len([42, 'hello, world', []])")).isEqualTo(3);
- }
-
- @Test
- public void testListEmpty() throws Exception {
- assertThat(ev.eval("8 if [1, 2, 3] else 9")).isEqualTo(8);
- assertThat(ev.eval("8 if [] else 9")).isEqualTo(9);
- }
-
- @Test
- public void testListConcat() throws Exception {
- assertThat(ev.eval("[1, 2] + [3, 4]"))
- .isEqualTo(StarlarkList.of(/*mutability=*/ null, 1, 2, 3, 4));
- }
-
- @Test
- public void testConcatListIndex() throws Exception {
- ev.exec(
- "l = [1, 2] + [3, 4]", //
- "e0 = l[0]",
- "e1 = l[1]",
- "e2 = l[2]",
- "e3 = l[3]");
- assertThat(ev.lookup("e0")).isEqualTo(1);
- assertThat(ev.lookup("e1")).isEqualTo(2);
- assertThat(ev.lookup("e2")).isEqualTo(3);
- assertThat(ev.lookup("e3")).isEqualTo(4);
- }
-
- @Test
- public void testConcatListHierarchicalIndex() throws Exception {
- ev.exec(
- "l = [1] + (([2] + [3, 4]) + [5])", //
- "e0 = l[0]",
- "e1 = l[1]",
- "e2 = l[2]",
- "e3 = l[3]",
- "e4 = l[4]");
- assertThat(ev.lookup("e0")).isEqualTo(1);
- assertThat(ev.lookup("e1")).isEqualTo(2);
- assertThat(ev.lookup("e2")).isEqualTo(3);
- assertThat(ev.lookup("e3")).isEqualTo(4);
- assertThat(ev.lookup("e4")).isEqualTo(5);
- }
-
- @Test
- public void testConcatListSize() throws Exception {
- assertThat(ev.eval("len([1, 2] + [3, 4])")).isEqualTo(4);
- }
-
- @Test
- public void testAppend() throws Exception {
- ev.exec("l = [1, 2]");
- assertThat(Starlark.NONE).isEqualTo(ev.eval("l.append([3, 4])"));
- assertThat(ev.eval("[1, 2, [3, 4]]")).isEqualTo(ev.lookup("l"));
- }
-
- @Test
- public void testExtend() throws Exception {
- ev.exec("l = [1, 2]");
- assertThat(Starlark.NONE).isEqualTo(ev.eval("l.extend([3, 4])"));
- assertThat(ev.eval("[1, 2, 3, 4]")).isEqualTo(ev.lookup("l"));
- }
-
- @Test
- public void listAfterRemoveHasExpectedEqualsAndHashCode() throws Exception {
- ev.exec("l = [1, 2, 3]");
- ev.exec("l.remove(3)");
- assertThat(ev.lookup("l")).isEqualTo(ev.eval("[1, 2]"));
- assertThat(ev.lookup("l").hashCode()).isEqualTo(ev.eval("[1, 2]").hashCode());
- }
-
- @Test
- public void testConcatListToString() throws Exception {
- assertThat(ev.eval("str([1, 2] + [3, 4])")).isEqualTo("[1, 2, 3, 4]");
- }
-
- @Test
- public void testConcatListNotEmpty() throws Exception {
- ev.exec("l = [1, 2] + [3, 4]", "v = 1 if l else 0");
- assertThat(ev.lookup("v")).isEqualTo(1);
- }
-
- @Test
- public void testConcatListEmpty() throws Exception {
- ev.exec("l = [] + []", "v = 1 if l else 0");
- assertThat(ev.lookup("v")).isEqualTo(0);
- }
-
- @Test
- public void testListComparison() throws Exception {
- assertThat(ev.eval("(1, 'two', [3, 4]) == (1, 'two', [3, 4])")).isEqualTo(true);
- assertThat(ev.eval("[1, 2, 3, 4] == [1, 2] + [3, 4]")).isEqualTo(true);
- assertThat(ev.eval("[1, 2, 3, 4] == (1, 2, 3, 4)")).isEqualTo(false);
- assertThat(ev.eval("[1, 2] == [1, 2, 3]")).isEqualTo(false);
- assertThat(ev.eval("[] == []")).isEqualTo(true);
- assertThat(ev.eval("() == ()")).isEqualTo(true);
- assertThat(ev.eval("() == (1,)")).isEqualTo(false);
- assertThat(ev.eval("(1) == (1,)")).isEqualTo(false);
- }
-
- @Test
- public void testListAddWithIndex() throws Exception {
- Mutability mutability = Mutability.create("test");
- StarlarkList<String> list = StarlarkList.newList(mutability);
- Location loc = null;
- list.add("a", loc);
- list.add("b", loc);
- list.add("c", loc);
- list.add(0, "d", loc);
- assertThat(list.toString()).isEqualTo("[\"d\", \"a\", \"b\", \"c\"]");
- list.add(2, "e", loc);
- assertThat(list.toString()).isEqualTo("[\"d\", \"a\", \"e\", \"b\", \"c\"]");
- list.add(4, "f", loc);
- assertThat(list.toString()).isEqualTo("[\"d\", \"a\", \"e\", \"b\", \"f\", \"c\"]");
- list.add(6, "g", loc);
- assertThat(list.toString()).isEqualTo("[\"d\", \"a\", \"e\", \"b\", \"f\", \"c\", \"g\"]");
- assertThrows(ArrayIndexOutOfBoundsException.class, () -> list.add(8, "h", loc));
- }
-
- @Test
- public void testMutatorsCheckMutability() throws Exception {
- Mutability mutability = Mutability.create("test");
- StarlarkList<Object> list = StarlarkList.copyOf(mutability, ImmutableList.of(1, 2, 3));
- mutability.freeze();
-
- // The casts force selection of the Starlark add/remove methods,
- // not the disabled ones like List.add(int, Object).
- // We could enable the List method, but then it would have to
- // report failures using unchecked exceptions.
- EvalException e =
- assertThrows(EvalException.class, () -> list.add((Object) 4, (Location) null));
- assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
- e = assertThrows(EvalException.class, () -> list.add(0, (Object) 4, (Location) null));
- assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
- e =
- assertThrows(
- EvalException.class, () -> list.addAll(ImmutableList.of(4, 5, 6), (Location) null));
- assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
- e = assertThrows(EvalException.class, () -> list.remove(0, (Location) null));
- assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
- e = assertThrows(EvalException.class, () -> list.set(0, 10, (Location) null));
- assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
- }
-
- @Test
- public void testCannotMutateAfterShallowFreeze() throws Exception {
- Mutability mutability = Mutability.createAllowingShallowFreeze("test");
- StarlarkList<Object> list = StarlarkList.copyOf(mutability, ImmutableList.of(1, 2, 3));
- list.unsafeShallowFreeze();
-
- EvalException e = assertThrows(EvalException.class, () -> list.add((Object) 4, null));
- assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
- }
-
- @Test
- public void testCopyOfTakesCopy() throws EvalException {
- ArrayList<String> copyFrom = Lists.newArrayList("hi");
- Mutability mutability = Mutability.create("test");
- StarlarkList<String> mutableList = StarlarkList.copyOf(mutability, copyFrom);
- copyFrom.add("added1");
- mutableList.add("added2", (Location) null);
-
- assertThat(copyFrom).containsExactly("hi", "added1").inOrder();
- assertThat(mutableList).containsExactly("hi", "added2").inOrder();
- }
-
- @Test
- public void testWrapTakesOwnershipOfArray() throws EvalException {
- String[] wrapped = {"hello"};
- Mutability mutability = Mutability.create("test");
- StarlarkList<String> mutableList = StarlarkList.wrap(mutability, wrapped);
-
- // Big no-no, but we're proving a point.
- wrapped[0] = "goodbye";
- assertThat(mutableList).containsExactly("goodbye");
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkMutableTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkMutableTest.java
deleted file mode 100644
index 2bbc336..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkMutableTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2017 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link StarlarkMutable}. */
-@RunWith(JUnit4.class)
-public final class StarlarkMutableTest {
-
- @Test
- public void testListViewsCheckMutability() throws Exception {
- Mutability mutability = Mutability.create("test");
- StarlarkList<Object> list = StarlarkList.copyOf(mutability, ImmutableList.of(1, 2, 3));
- mutability.freeze();
-
- {
- Iterator<?> it = list.iterator();
- it.next();
- assertThrows(
- UnsupportedOperationException.class,
- () -> it.remove());
- }
- {
- Iterator<?> it = list.listIterator();
- it.next();
- assertThrows(
- UnsupportedOperationException.class,
- () -> it.remove());
- }
- {
- Iterator<?> it = list.listIterator(1);
- it.next();
- assertThrows(
- UnsupportedOperationException.class,
- () -> it.remove());
- }
- {
- List<Object> sublist = list.subList(1, 2);
- assertThrows(
- UnsupportedOperationException.class,
- () -> sublist.set(0, 4));
- }
- }
-
- @Test
- public void testDictViewsCheckMutability() throws Exception {
- Mutability mutability = Mutability.create("test");
- Dict<Object, Object> dict = Dict.copyOf(mutability, ImmutableMap.of(1, 2, 3, 4));
- mutability.freeze();
-
- {
- Iterator<Map.Entry<Object, Object>> it = dict.entrySet().iterator();
- Map.Entry<Object, Object> entry = it.next();
- assertThrows(
- UnsupportedOperationException.class,
- () -> entry.setValue(5));
- }
- {
- Iterator<Object> it = dict.keySet().iterator();
- it.next();
- assertThrows(
- UnsupportedOperationException.class,
- () -> it.remove());
- }
- {
- Iterator<Object> it = dict.values().iterator();
- it.next();
- assertThrows(
- UnsupportedOperationException.class,
- () -> it.remove());
- }
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java
deleted file mode 100644
index b52b482..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2018 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.syntax.Debug.ReadyToPause;
-import com.google.devtools.build.lib.syntax.Debug.Stepping;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of debugging features of StarlarkThread. */
-@RunWith(JUnit4.class)
-public class StarlarkThreadDebuggingTest {
-
- // TODO(adonovan): rewrite these tests at a higher level.
-
- private static StarlarkThread newThread() {
- return new StarlarkThread(Mutability.create("test"), StarlarkSemantics.DEFAULT);
- }
-
- // Executes the definition of a trivial function f and returns the function value.
- private static StarlarkFunction defineFunc() throws Exception {
- return (StarlarkFunction)
- Starlark.execFile(
- ParserInput.fromLines("def f(): pass\nf"),
- FileOptions.DEFAULT,
- Module.create(),
- newThread());
- }
-
- @Test
- public void testListFramesEmptyStack() throws Exception {
- StarlarkThread thread = newThread();
- assertThat(Debug.getCallStack(thread)).isEmpty();
- assertThat(thread.getCallStack()).isEmpty();
- }
-
- @Test
- public void testListFramesFromBuiltin() throws Exception {
- // f is a built-in that captures the stack using the Debugger API.
- Object[] result = {null, null};
- StarlarkCallable f =
- new StarlarkCallable() {
- @Override
- public String getName() {
- return "f";
- }
-
- @Override
- public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
- result[0] = Debug.getCallStack(thread);
- result[1] = thread.getCallStack();
- return Starlark.NONE;
- }
-
- @Override
- public Location getLocation() {
- return Location.fromFileLineColumn("builtin", 12, 0);
- }
-
- @Override
- public String toString() {
- return "<debug function>";
- }
- };
-
- // Set up global environment.
- Module module =
- Module.withPredeclared(StarlarkSemantics.DEFAULT, ImmutableMap.of("a", 1, "b", 2, "f", f));
-
- // Execute a small file that calls f.
- ParserInput input =
- ParserInput.fromString(
- "def g(a, y, z):\n" // shadows global a
- + " f()\n"
- + "g(4, 5, 6)",
- "main.star");
- Starlark.execFile(input, FileOptions.DEFAULT, module, newThread());
-
- @SuppressWarnings("unchecked")
- ImmutableList<Debug.Frame> stack = (ImmutableList<Debug.Frame>) result[0];
-
- // Check the stack captured by f.
- // We compare printed string forms, as it gives more informative assertion failures.
- StringBuilder buf = new StringBuilder();
- for (Debug.Frame fr : stack) {
- buf.append(
- String.format(
- "%s @ %s local=%s\n", fr.getFunction().getName(), fr.getLocation(), fr.getLocals()));
- }
- assertThat(buf.toString())
- .isEqualTo(
- ""
- // location is paren of g(4, 5, 6) call:
- + "<toplevel> @ main.star:3:2 local={}\n"
- // location is paren of "f()" call:
- + "g @ main.star:2:4 local={a=4, y=5, z=6}\n"
- // location is "current PC" in f.
- + "f @ builtin:12 local={}\n");
-
- // Same, with "lite" stack API.
- assertThat(result[1].toString()) // an ImmutableList<StarlarkThread.CallStackEntry>
- .isEqualTo("[<toplevel>@main.star:3:2, g@main.star:2:4, f@builtin:12]");
-
- // TODO(adonovan): more tests:
- // - a stack containing functions defined in different modules.
- // - changing environment at various program points within a function.
- }
-
- @Test
- public void testStepIntoFunction() throws Exception {
- StarlarkThread thread = newThread();
-
- ReadyToPause predicate = Debug.stepControl(thread, Stepping.INTO);
- thread.push(defineFunc());
-
- assertThat(predicate.test(thread)).isTrue();
- }
-
- @Test
- public void testStepIntoFallsBackToStepOver() {
- // test that when stepping into, we'll fall back to stopping at the next statement in the
- // current frame
- StarlarkThread thread = newThread();
-
- ReadyToPause predicate = Debug.stepControl(thread, Stepping.INTO);
-
- assertThat(predicate.test(thread)).isTrue();
- }
-
- @Test
- public void testStepIntoFallsBackToStepOut() throws Exception {
- // test that when stepping into, we'll fall back to stopping when exiting the current frame
- StarlarkThread thread = newThread();
- thread.push(defineFunc());
-
- ReadyToPause predicate = Debug.stepControl(thread, Stepping.INTO);
- thread.pop();
-
- assertThat(predicate.test(thread)).isTrue();
- }
-
- @Test
- public void testStepOverFunction() throws Exception {
- StarlarkThread thread = newThread();
-
- ReadyToPause predicate = Debug.stepControl(thread, Stepping.OVER);
- thread.push(defineFunc());
-
- assertThat(predicate.test(thread)).isFalse();
- thread.pop();
- assertThat(predicate.test(thread)).isTrue();
- }
-
- @Test
- public void testStepOverFallsBackToStepOut() throws Exception {
- // test that when stepping over, we'll fall back to stopping when exiting the current frame
- StarlarkThread thread = newThread();
- thread.push(defineFunc());
-
- ReadyToPause predicate = Debug.stepControl(thread, Stepping.OVER);
- thread.pop();
-
- assertThat(predicate.test(thread)).isTrue();
- }
-
- @Test
- public void testStepOutOfInnerFrame() throws Exception {
- StarlarkThread thread = newThread();
- thread.push(defineFunc());
-
- ReadyToPause predicate = Debug.stepControl(thread, Stepping.OUT);
-
- assertThat(predicate.test(thread)).isFalse();
- thread.pop();
- assertThat(predicate.test(thread)).isTrue();
- }
-
- @Test
- public void testStepOutOfOutermostFrame() {
- StarlarkThread thread = newThread();
-
- assertThat(Debug.stepControl(thread, Stepping.OUT)).isNull();
- }
-
- @Test
- public void testStepControlWithNoSteppingReturnsNull() {
- StarlarkThread thread = newThread();
-
- assertThat(Debug.stepControl(thread, Stepping.NONE)).isNull();
- }
-
- @Test
- public void testEvaluateVariableInScope() throws Exception {
- Module module = Module.withPredeclared(StarlarkSemantics.DEFAULT, ImmutableMap.of("a", 1));
-
- StarlarkThread thread = newThread();
- Object a = Starlark.execFile(ParserInput.fromLines("a"), FileOptions.DEFAULT, module, thread);
- assertThat(a).isEqualTo(1);
- }
-
- @Test
- public void testEvaluateVariableNotInScopeFails() throws Exception {
- Module module = Module.create();
-
- SyntaxError.Exception e =
- assertThrows(
- SyntaxError.Exception.class,
- () ->
- Starlark.execFile(
- ParserInput.fromLines("b"), FileOptions.DEFAULT, module, newThread()));
-
- assertThat(e).hasMessageThat().isEqualTo("name 'b' is not defined");
- }
-
- @Test
- public void testEvaluateExpressionOnVariableInScope() throws Exception {
- StarlarkThread thread = newThread();
- Module module =
- Module.withPredeclared(
- StarlarkSemantics.DEFAULT, /*predeclared=*/ ImmutableMap.of("a", "string"));
-
- assertThat(
- Starlark.execFile(
- ParserInput.fromLines("a.startswith('str')"), FileOptions.DEFAULT, module, thread))
- .isEqualTo(true);
- Starlark.execFile(ParserInput.fromLines("a = 1"), FileOptions.DEFAULT, module, thread);
- assertThat(Starlark.execFile(ParserInput.fromLines("a"), FileOptions.DEFAULT, module, thread))
- .isEqualTo(1);
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
deleted file mode 100644
index 946098a..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of StarlarkThread. */
-@RunWith(JUnit4.class)
-public final class StarlarkThreadTest {
-
- private final EvaluationTestCase ev = new EvaluationTestCase();
-
- // Test the API directly
- @Test
- public void testLookupAndUpdate() throws Exception {
- assertThat(ev.lookup("foo")).isNull();
- ev.update("foo", "bar");
- assertThat(ev.lookup("foo")).isEqualTo("bar");
- }
-
- @Test
- public void testDoubleUpdateSucceeds() throws Exception {
- assertThat(ev.lookup("VERSION")).isNull();
- ev.update("VERSION", 42);
- assertThat(ev.lookup("VERSION")).isEqualTo(42);
- ev.update("VERSION", 43);
- assertThat(ev.lookup("VERSION")).isEqualTo(43);
- }
-
- // Test assign through interpreter, ev.lookup through API:
- @Test
- public void testAssign() throws Exception {
- assertThat(ev.lookup("foo")).isNull();
- ev.exec("foo = 'bar'");
- assertThat(ev.lookup("foo")).isEqualTo("bar");
- }
-
- // Test update through API, reference through interpreter:
- @Test
- public void testReference() throws Exception {
- SyntaxError.Exception e = assertThrows(SyntaxError.Exception.class, () -> ev.eval("foo"));
- assertThat(e).hasMessageThat().isEqualTo("name 'foo' is not defined");
- ev.update("foo", "bar");
- assertThat(ev.eval("foo")).isEqualTo("bar");
- }
-
- // Test assign and reference through interpreter:
- @Test
- public void testAssignAndReference() throws Exception {
- SyntaxError.Exception e = assertThrows(SyntaxError.Exception.class, () -> ev.eval("foo"));
- assertThat(e).hasMessageThat().isEqualTo("name 'foo' is not defined");
- ev.exec("foo = 'bar'");
- assertThat(ev.eval("foo")).isEqualTo("bar");
- }
-
- @Test
- public void testBindToNullThrowsException() throws Exception {
- NullPointerException e =
- assertThrows(NullPointerException.class, () -> ev.update("some_name", null));
- assertThat(e).hasMessageThat().isEqualTo("Module.setGlobal(some_name, null)");
- }
-
- @Test
- public void testBuiltinsCanBeShadowed() throws Exception {
- Module module = Module.create();
- try (Mutability mu = Mutability.create("test")) {
- StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
- Starlark.execFile(ParserInput.fromLines("True = 123"), FileOptions.DEFAULT, module, thread);
- }
- assertThat(module.getGlobal("True")).isEqualTo(123);
- }
-
- @Test
- public void testVariableIsReferencedBeforeAssignment() throws Exception {
- ev.new Scenario()
- .testIfErrorContains(
- "local variable 'y' is referenced before assignment",
- "y = 1", // bind => y is global
- "def foo(x):",
- " x += y", // fwd ref to local y
- " y = 2", // binding => y is local
- " return x",
- "foo(1)");
- ev.new Scenario()
- .testIfErrorContains(
- "global variable 'len' is referenced before assignment",
- "print(len)", // fwd ref to global len
- "len = 1"); // binding => len is local
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StringModuleTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StringModuleTest.java
deleted file mode 100644
index 62e1a86..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StringModuleTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2020 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for StringModule. */
-// TODO(bazel-team): Migrate these test cases back to string_misc.sky, once either
-// 1) --incompatible_string_replace_count has been flipped (#11244) and deleted, or 2) the
-// standalone Starlark interpreter and tests gain the ability to run with semantics flags.
-@RunWith(JUnit4.class)
-public class StringModuleTest {
-
- private final EvaluationTestCase ev = new EvaluationTestCase();
-
- private void runReplaceTest(StarlarkSemantics semantics) throws Exception {
- ev.new Scenario(semantics)
- .testEval("'banana'.replace('a', 'o')", "'bonono'")
- .testEval("'banana'.replace('a', 'o', 2)", "'bonona'")
- .testEval("'banana'.replace('a', 'o', 0)", "'banana'")
- .testEval("'banana'.replace('a', 'e')", "'benene'")
- .testEval("'banana'.replace('a', '$()')", "'b$()n$()n$()'")
- .testEval("'banana'.replace('a', '$')", "'b$n$n$'")
- .testEval("'b$()n$()n$()'.replace('$()', '$($())')", "'b$($())n$($())n$($())'")
- .testEval("'banana'.replace('a', 'e', 2)", "'benena'")
- .testEval("'banana'.replace('a', 'e', 0)", "'banana'")
- .testEval("'banana'.replace('', '-')", "'-b-a-n-a-n-a-'")
- .testEval("'banana'.replace('', '-', 2)", "'-b-anana'")
- .testEval("'banana'.replace('', '-', 0)", "'banana'")
- .testEval("'banana'.replace('', '')", "'banana'")
- .testEval("'banana'.replace('a', '')", "'bnn'")
- .testEval("'banana'.replace('a', '', 2)", "'bnna'");
- }
-
- @Test
- public void testReplaceWithAndWithoutFlag() throws Exception {
- runReplaceTest(replaceCount(false));
- runReplaceTest(replaceCount(true));
- }
-
- @Test
- public void testReplaceIncompatibleFlag() throws Exception {
- // Test the scenario that changes with the incompatible flag
- ev.new Scenario(replaceCount(false))
- .testEval("'banana'.replace('a', 'o', -2)", "'banana'")
- .testEval("'banana'.replace('a', 'e', -1)", "'banana'")
- .testEval("'banana'.replace('a', 'e', -10)", "'banana'")
- .testEval("'banana'.replace('', '-', -2)", "'banana'");
-
- ev.new Scenario(replaceCount(true))
- .testEval("'banana'.replace('a', 'o', -2)", "'bonono'")
- .testEval("'banana'.replace('a', 'e', -1)", "'benene'")
- .testEval("'banana'.replace('a', 'e', -10)", "'benene'")
- .testEval("'banana'.replace('', '-', -2)", "'-b-a-n-a-n-a-'");
- }
-
- @Test
- public void testReplaceNoneCount() throws Exception {
- // Passing None as the max number of replacements is disallowed with the incompatible flag.
- ev.new Scenario(replaceCount(false)).testEval("'banana'.replace('a', 'e', None)", "'benene'");
- ev.new Scenario(replaceCount(true))
- .testIfErrorContains("Cannot pass a None count", "'banana'.replace('a', 'e', None)");
- }
-
- // Returns semantics for --incompatible_string_replace_count=x.
- private static final StarlarkSemantics replaceCount(boolean x) {
- return StarlarkSemantics.builder()
- .setBool(StarlarkSemantics.INCOMPATIBLE_STRING_REPLACE_COUNT, x)
- .build();
- }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/util/BUILD b/src/test/java/com/google/devtools/build/lib/syntax/util/BUILD
index 6d594b8..f6828ba 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/syntax/util/BUILD
@@ -13,10 +13,11 @@
testonly = 1,
srcs = glob(["*.java"]),
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/events",
"//src/main/java/com/google/devtools/build/lib/packages/semantics",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/events:testutil",
"//third_party:guava",
"//third_party:junit4",
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
index f8247fc..dc4e466 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
@@ -23,20 +23,20 @@
import com.google.devtools.build.lib.events.ExtendedEventHandler;
import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Expression;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
import com.google.devtools.common.options.Options;
import com.google.devtools.common.options.OptionsParsingException;
import java.util.LinkedList;
import java.util.List;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Expression;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.SyntaxError;
/** Helper class for tests that evaluate Starlark code. */
// TODO(adonovan): stop extending this class. Prefer composition over inheritance.
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/BUILD b/src/test/java/com/google/devtools/build/lib/testutil/BUILD
index 8119e5e..0395805 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/testutil/BUILD
@@ -56,7 +56,6 @@
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/events",
"//src/main/java/com/google/devtools/build/lib/packages",
- "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/util",
"//src/main/java/com/google/devtools/build/lib/util:filetype",
"//src/main/java/com/google/devtools/build/lib/util:os",
@@ -65,6 +64,7 @@
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
+ "//src/main/java/net/starlark/java/syntax",
"//third_party:guava",
"//third_party:jsr305",
"//third_party:junit4",
@@ -77,7 +77,6 @@
testonly = 0,
srcs = ["BazelPackageLoadingListenerForTesting.java"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
"//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
"//src/main/java/com/google/devtools/build/lib/cmdline",
@@ -85,6 +84,8 @@
"//src/main/java/com/google/devtools/build/lib/skyframe/packages:BazelPackageLoader",
"//src/main/java/com/google/devtools/build/lib/skyframe/packages:PackageLoader",
"//src/main/java/com/google/devtools/build/lib/vfs",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//third_party:guava",
],
)
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageLoadingListenerForTesting.java b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageLoadingListenerForTesting.java
index 29d264b..bd45785 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageLoadingListenerForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageLoadingListenerForTesting.java
@@ -26,8 +26,8 @@
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.skyframe.packages.BazelPackageLoader;
import com.google.devtools.build.lib.skyframe.packages.PackageLoader;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.vfs.Root;
+import net.starlark.java.eval.StarlarkSemantics;
/**
* A {@link PackageLoadingListener} for use in tests that a sanity check with {@link
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java b/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
index 2ee3f28..7309e94 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
@@ -39,10 +39,10 @@
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.Type;
-import com.google.devtools.build.lib.syntax.Location;
import com.google.devtools.build.lib.util.FileTypeSet;
import java.lang.reflect.Method;
import java.util.Map;
+import net.starlark.java.syntax.Location;
/**
* Helper class to provide a RuleClassProvider for tests.
diff --git a/src/test/java/com/google/devtools/build/skydoc/BUILD b/src/test/java/com/google/devtools/build/skydoc/BUILD
index 9096d02..71ad25a 100644
--- a/src/test/java/com/google/devtools/build/skydoc/BUILD
+++ b/src/test/java/com/google/devtools/build/skydoc/BUILD
@@ -21,13 +21,14 @@
srcs = ["SkydocTest.java"],
visibility = ["//devtools/blaze/main:__pkg__"],
deps = [
- "//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/skydoc:skydoc_lib",
"//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
"//src/main/java/com/google/devtools/build/skydoc/rendering",
"//src/main/java/com/google/devtools/build/skydoc/rendering/proto:stardoc_output_java_proto",
+ "//src/main/java/net/starlark/java/eval",
+ "//src/main/java/net/starlark/java/syntax",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//third_party:guava",
"//third_party:junit4",
diff --git a/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java b/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
index b5724c1..c55444b 100644
--- a/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
+++ b/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
@@ -22,9 +22,6 @@
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; // a bad dependency!
import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.skydoc.SkydocMain.StarlarkEvaluationException;
@@ -40,6 +37,9 @@
import java.io.IOException;
import java.util.Map;
import java.util.stream.Collectors;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.ParserInput;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;