Move SymbolGenerator to java.net.starlark.eval package.
PiperOrigin-RevId: 623806117
Change-Id: I2412e782dfe1ae235ee69ec7846fc94e35c63cc7
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java b/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java
index abf9064..2ee31a8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java
@@ -16,12 +16,12 @@
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
-import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import javax.annotation.Nullable;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
/** Bazel application data for the Starlark thread that performs analysis of rules and aspects. */
public class BazelRuleAnalysisThreadContext extends BazelStarlarkContext {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 9955438..6f1c0df 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -80,7 +80,6 @@
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.packages.StarlarkAspectClass;
import com.google.devtools.build.lib.packages.StarlarkProviderWrapper;
-import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.packages.Type;
@@ -109,6 +108,7 @@
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
import net.starlark.java.syntax.Identifier;
import net.starlark.java.syntax.Location;
@@ -216,7 +216,7 @@
this.attributes = attributes;
this.features = computeFeatures();
this.ruleClassNameForLogging = builder.getRuleClassNameForLogging();
- this.actionOwnerSymbolGenerator = new SymbolGenerator<>(builder.actionOwnerSymbol);
+ this.actionOwnerSymbolGenerator = SymbolGenerator.create(builder.actionOwnerSymbol);
this.reporter = builder.reporter;
this.toolchainContexts = builder.toolchainContexts;
this.execGroupCollection = execGroupCollection;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
index 482f314..2e334af 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
@@ -42,7 +42,6 @@
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleTransitionData;
import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigurationTransitionApi;
import com.google.devtools.build.lib.util.RegexFilter;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -68,6 +67,7 @@
import net.starlark.java.eval.StarlarkCallable;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
import net.starlark.java.syntax.Location;
/**
@@ -548,7 +548,7 @@
// to calculate equality between instances of Starlark objects. A candidate
// for transition instance uniqueness is the Rule and configuration that
// are used as inputs to the configuration.
- SymbolGenerator<Object> dummySymbolGenerator = new SymbolGenerator<>(new Object());
+ SymbolGenerator<Object> dummySymbolGenerator = SymbolGenerator.createTransient();
Dict<String, Object> previousSettingsDict =
createBuildSettingsDict(previousSettings, optionInfoMap, mu);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java
index a05c461..53a6e0e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java
@@ -33,7 +33,6 @@
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
import com.google.devtools.build.lib.packages.Rule;
-import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
import com.google.devtools.build.lib.profiler.Profiler;
@@ -68,6 +67,7 @@
import net.starlark.java.eval.StarlarkCallable;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
/** A repository function to delegate work done by Starlark remote repositories. */
public final class StarlarkRepositoryFunction extends RepositoryFunction {
@@ -260,7 +260,7 @@
new BazelStarlarkContext(
BazelStarlarkContext.Phase.LOADING, // ("fetch")
- new SymbolGenerator<>(key))
+ SymbolGenerator.create(key))
.storeInThread(thread);
StarlarkRepositoryContext starlarkRepositoryContext =
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
index 2246e53..751ea5e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
@@ -11,14 +11,13 @@
// 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.packages;
-
import com.google.common.base.Preconditions;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
/*
* TODO(b/236456122): We should break this class up into separate classes for each kind of Starlark
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java b/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java
index 65b6293..ac9a62e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java
@@ -24,6 +24,7 @@
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
/**
* Bazel application data for the Starlark thread that evaluates the top-level code in a .bzl (or
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index b2817c1..4b751b3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -81,6 +81,7 @@
import net.starlark.java.eval.Module;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
import net.starlark.java.syntax.Location;
/**
@@ -763,7 +764,7 @@
@Nullable Globber globber) {
return new Builder(
BazelStarlarkContext.Phase.LOADING,
- new SymbolGenerator<>(id),
+ SymbolGenerator.create(id),
packageSettings,
id,
filename,
@@ -790,7 +791,7 @@
BazelStarlarkContext.Phase.WORKSPACE,
// The SymbolGenerator is based on workspaceFileKey rather than a package id or path,
// in order to distinguish different chunks of the same WORKSPACE file.
- new SymbolGenerator<>(workspaceFileKey),
+ SymbolGenerator.create(workspaceFileKey),
packageSettings,
LabelConstants.EXTERNAL_PACKAGE_IDENTIFIER,
/* filename= */ workspaceFileKey.getPath(),
@@ -813,7 +814,7 @@
RepositoryMapping repoMapping) {
return new Builder(
BazelStarlarkContext.Phase.LOADING,
- new SymbolGenerator<>(basePackageId),
+ SymbolGenerator.create(basePackageId),
PackageSettings.DEFAULTS,
basePackageId,
/* filename= */ moduleFilePath,
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java
index 6516702..8141382 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java
@@ -24,6 +24,7 @@
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.Structure;
+import net.starlark.java.eval.SymbolGenerator;
/**
* A helper class for calling Starlark functions from Java, where the argument values are supplied
@@ -72,7 +73,7 @@
// should have a unique owner object to associate it with for distinguishing
// reference-equality objects. But I don't think implicit outputs or computed defaults
// care about identity.
- new SymbolGenerator<>(new Object()))
+ SymbolGenerator.createTransient())
.storeInThread(thread);
return Starlark.call(
thread, callback, buildArgumentList(struct, arguments), /*kwargs=*/ ImmutableMap.of());
diff --git a/src/main/java/com/google/devtools/build/lib/packages/TargetDefinitionContext.java b/src/main/java/com/google/devtools/build/lib/packages/TargetDefinitionContext.java
index df871af..2977283 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/TargetDefinitionContext.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/TargetDefinitionContext.java
@@ -19,6 +19,7 @@
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
/**
* A context object, usually stored in a {@link StarlarkThread}, upon which rules and symbolic
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 4f53e63..18df105 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -42,7 +42,6 @@
import com.google.devtools.build.lib.packages.Info;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
-import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.devtools.build.lib.packages.TriState;
import com.google.devtools.build.lib.packages.Type;
import com.google.devtools.build.lib.rules.android.ZipFilterBuilder.CheckHashMismatchMode;
@@ -73,6 +72,7 @@
import java.util.List;
import java.util.stream.Stream;
import javax.annotation.Nullable;
+import net.starlark.java.eval.SymbolGenerator;
/**
* A helper class for android rules.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingContext.java
index 32f399f..80c8d0f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingContext.java
@@ -27,7 +27,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.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcLinkingContextApi;
import com.google.devtools.build.lib.starlarkbuildapi.cpp.LinkerInputApi;
@@ -44,6 +43,7 @@
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
/** Structure of CcLinkingContext. */
public class CcLinkingContext implements CcLinkingContextApi<Artifact> {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index 25ef234..83e53a91 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -26,7 +26,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.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
-import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.devtools.build.lib.rules.cpp.CcLinkingContext.Linkstamp;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.VariablesExtension;
@@ -44,6 +43,7 @@
import javax.annotation.Nullable;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.SymbolGenerator;
/**
* A class to create C/C++ link actions in a way that is consistent with cc_library. Rules that
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
index 9c57bac..8a816bb 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
@@ -44,7 +44,6 @@
import com.google.devtools.build.lib.packages.BzlVisibility;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.StarlarkExportable;
-import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.devtools.build.lib.packages.WorkspaceFileValue;
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
import com.google.devtools.build.lib.server.FailureDetails.StarlarkLoading.Code;
@@ -75,6 +74,7 @@
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
import net.starlark.java.syntax.LoadStatement;
import net.starlark.java.syntax.Location;
import net.starlark.java.syntax.Program;
@@ -859,7 +859,7 @@
ruleClassProvider.getToolsRepository(),
ruleClassProvider.getNetworkAllowlistForTests(),
ruleClassProvider.getConfigurationFragmentMap(),
- new SymbolGenerator<>(label));
+ SymbolGenerator.create(label));
// executeBzlFile may post events to the Environment's handler, but events do not matter when
// caching BzlLoadValues. Note that executing the code mutates the Module and
diff --git a/src/main/java/net/starlark/java/eval/BUILD b/src/main/java/net/starlark/java/eval/BUILD
index 0d41acd..7ad8140 100644
--- a/src/main/java/net/starlark/java/eval/BUILD
+++ b/src/main/java/net/starlark/java/eval/BUILD
@@ -56,6 +56,7 @@
"StarlarkValue.java",
"StringModule.java",
"Structure.java",
+ "SymbolGenerator.java",
"Tuple.java",
],
visibility = ["//src/main/java/net/starlark/java:clients"],
@@ -65,6 +66,7 @@
"//src/main/java/net/starlark/java/spelling",
"//src/main/java/net/starlark/java/syntax",
"//third_party:error_prone_annotations",
+ "//third_party:auto_value",
"//third_party:flogger",
"//third_party:guava",
"//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SymbolGenerator.java b/src/main/java/net/starlark/java/eval/SymbolGenerator.java
similarity index 61%
rename from src/main/java/com/google/devtools/build/lib/packages/SymbolGenerator.java
rename to src/main/java/net/starlark/java/eval/SymbolGenerator.java
index eaacceb..722fa3c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SymbolGenerator.java
+++ b/src/main/java/net/starlark/java/eval/SymbolGenerator.java
@@ -11,10 +11,7 @@
// 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.packages;
-
-import com.google.devtools.build.lib.concurrent.ThreadSafety;
+package net.starlark.java.eval;
/**
* Class to be used when an object wants to be compared using reference equality. Since reference
@@ -31,15 +28,48 @@
private final T owner;
private int index = 0;
- public SymbolGenerator(T owner) {
+ /**
+ * Creates a new symbol generator for the Starlark evaluation uniquely identified by the given
+ * owner.
+ *
+ * <p>Precisely, two {@code SymbolGenerators} that have owners {@code o1} and {@code o2} are
+ * considered to be for the same Starlark evaluation, if and only if {@code o1.equals(o2)}.
+ */
+ public static <T> SymbolGenerator<T> create(T owner) {
+ return new SymbolGenerator<>(owner);
+ }
+
+ /**
+ * Creates a generator for a Starlark evaluation whose values don't require strict reference
+ * equality checks.
+ *
+ * <p>This can be used in the following cases.
+ *
+ * <ul>
+ * <li>The result of a Starlark evaluation has a simple type (like numbers or strings) where
+ * values are compared, not object references.
+ * <li>The result is temporary and it won't be stored, transmitted or regenerated while being
+ * retained.
+ * </ul>
+ *
+ * <p>The "regenerated while being retained" condition may occur, for example, if a part of the
+ * resulting value is retained somewhere in the process, but the value itself is evicted from a
+ * cache and is subsequently regenerated.
+ */
+ public static SymbolGenerator<Object> createTransient() {
+ return create(new Object());
+ }
+
+ private SymbolGenerator(T owner) {
this.owner = owner;
}
- @ThreadSafety.ThreadSafe
public synchronized Symbol<T> generate() {
return new Symbol<>(owner, index++);
}
+ // TODO(bazel-team): The name "Symbol", in the context of an interpreter, is a bit confusing.
+ // Consider renaming to "Token" or similar.
private static final class Symbol<T> {
private final T owner;
private final int index;
@@ -71,5 +101,5 @@
public String toString() {
return "<symbol=" + owner + ", index=" + index + ">";
}
- };
+ }
}
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 b32649f..dfb2cb5 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
@@ -29,7 +29,6 @@
import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
import com.google.devtools.build.lib.packages.BzlInitThreadContext;
import com.google.devtools.build.lib.packages.StarlarkExportable;
-import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
import com.google.devtools.build.lib.rules.config.ConfigGlobalLibrary;
import com.google.devtools.build.lib.rules.config.ConfigStarlarkCommon;
@@ -48,6 +47,7 @@
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.SymbolGenerator;
import net.starlark.java.syntax.FileOptions;
import net.starlark.java.syntax.ParserInput;
import net.starlark.java.syntax.Program;
@@ -161,7 +161,7 @@
TestConstants.TOOLS_REPOSITORY,
/* networkAllowlistForTests= */ Optional.empty(),
/* fragmentNameToClass= */ ImmutableMap.of(),
- new SymbolGenerator<>(new Object()))
+ SymbolGenerator.createTransient())
.storeInThread(thread);
}