BEGIN_PUBLIC
starlark: abolish 'int reboxing' hack
...in which a StarlarkMethod-annotated Java function could declare
a parameter of type Integer to mean "StarlarkInt in the signed 32-bit range".
The feature was useful in transition but does not carry its weight.
END_PUBLIC
PiperOrigin-RevId: 336087480
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
index d2f06af..cbe91ba 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
@@ -89,6 +89,7 @@
import net.starlark.java.eval.Mutability;
import net.starlark.java.eval.Sequence;
import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
@@ -535,13 +536,14 @@
@Override
public StarlarkExecutionResult execute(
Sequence<?> arguments, // <String> or <StarlarkPath> or <Label> expected
- Integer timeout,
+ StarlarkInt timeoutI,
Dict<?, ?> uncheckedEnvironment, // <String, String> expected
boolean quiet,
String workingDirectory,
StarlarkThread thread)
throws EvalException, RepositoryFunctionException, InterruptedException {
validateExecuteArguments(arguments);
+ int timeout = Starlark.toInt(timeoutI, "timeout");
Map<String, String> environment =
Dict.cast(uncheckedEnvironment, String.class, String.class, "environment");
@@ -575,7 +577,7 @@
env.getListener().post(w);
createDirectory(outputDirectory);
- long timeoutMillis = Math.round(timeout.longValue() * 1000 * timeoutScaling);
+ long timeoutMillis = Math.round(timeout * 1000L * timeoutScaling);
if (processWrapper != null) {
args =
processWrapper
@@ -622,8 +624,9 @@
}
@Override
- public void patch(Object patchFile, Integer strip, StarlarkThread thread)
+ public void patch(Object patchFile, StarlarkInt stripI, StarlarkThread thread)
throws EvalException, RepositoryFunctionException, InterruptedException {
+ int strip = Starlark.toInt(stripI, "strip");
StarlarkPath starlarkPath = getPath("patch()", patchFile);
WorkspaceRuleEvent w =
WorkspaceRuleEvent.newPatchEvent(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
index 7068ddf..355ee22 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
@@ -34,6 +34,7 @@
import com.google.devtools.build.lib.starlarkbuildapi.cpp.BazelCcModuleApi;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.Tuple;
@@ -129,7 +130,7 @@
String language,
String outputType,
boolean linkDepsStatically,
- int stamp,
+ StarlarkInt stamp,
Sequence<?> additionalInputs, // <Artifact> expected
Object grepIncludes,
StarlarkThread thread)
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
index 2bb40a0..91feef8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
@@ -79,7 +79,7 @@
public Sequence<?> glob(
Sequence<?> include,
Sequence<?> exclude,
- Integer excludeDirs,
+ StarlarkInt excludeDirs,
Object allowEmptyArgument,
StarlarkThread thread)
throws EvalException, ConversionException, InterruptedException {
@@ -103,7 +103,7 @@
try {
Globber.Token globToken =
- context.globber.runAsync(includes, excludes, excludeDirs != 0, allowEmpty);
+ context.globber.runAsync(includes, excludes, excludeDirs.signum() != 0, allowEmpty);
matches = context.globber.fetchUnsorted(globToken);
} catch (IOException e) {
String errorMessage =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index a80ff57..f747701 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -78,6 +78,7 @@
import net.starlark.java.eval.NoneType;
import net.starlark.java.eval.Sequence;
import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.Tuple;
@@ -1863,7 +1864,7 @@
String language,
String outputType,
boolean linkDepsStatically,
- int stamp,
+ StarlarkInt stamp,
Sequence<?> additionalInputs,
Object grepIncludes,
StarlarkThread thread)
@@ -1871,7 +1872,7 @@
validateLanguage(language);
validateOutputType(outputType);
boolean isStampingEnabled =
- isStampingEnabled(stamp, actions.getRuleContext().getConfiguration());
+ isStampingEnabled(stamp.toInt("stamp"), actions.getRuleContext().getConfiguration());
CcToolchainProvider ccToolchainProvider =
convertFromNoneable(starlarkCcToolchainProvider, null);
FeatureConfigurationForStarlark featureConfiguration =
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java
index 55a56aa..c242578 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java
@@ -22,6 +22,7 @@
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.NoneType;
import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.StarlarkValue;
@@ -67,7 +68,6 @@
// TODO(bazel-team): accept booleans as well as integers? (and eventually migrate?)
@Param(
name = "exclude_directories",
- type = Integer.class,
defaultValue = "1", // keep consistent with glob prefetching logic in PackageFactory
named = true,
doc = "A flag whether to exclude directories or not."),
@@ -86,7 +86,7 @@
Sequence<?> glob(
Sequence<?> include,
Sequence<?> exclude,
- Integer excludeDirectories,
+ StarlarkInt excludeDirectories,
Object allowEmpty,
StarlarkThread thread)
throws EvalException, InterruptedException;
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
index bf16581..cab2f1d 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
@@ -26,6 +26,7 @@
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.NoneType;
import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.Tuple;
@@ -355,7 +356,7 @@
positional = false,
named = true,
defaultValue = "0",
- type = Integer.class),
+ type = StarlarkInt.class),
@Param(
name = "additional_inputs",
doc = "For additional inputs to the linking action, e.g.: linking scripts.",
@@ -382,7 +383,7 @@
String language,
String outputType,
boolean linkDepsStatically,
- int stamp,
+ StarlarkInt stamp,
Sequence<?> additionalInputs, // <FileT> expected
Object grepIncludes,
StarlarkThread thread)
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java
index ae0e2c0..109f2ca 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java
@@ -24,6 +24,7 @@
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.StarlarkValue;
@@ -236,7 +237,6 @@
+ "execute."),
@Param(
name = "timeout",
- type = Integer.class,
named = true,
defaultValue = "600",
doc = "maximum duration of the command in seconds (default is 600 seconds)."),
@@ -263,7 +263,7 @@
})
StarlarkExecutionResultApi execute(
Sequence<?> arguments,
- Integer timeout,
+ StarlarkInt timeout,
Dict<?, ?> environment, // <String, String> expected
boolean quiet,
String workingDirectory,
@@ -313,12 +313,11 @@
+ "If it's a relative path, it will resolve to the repository directory."),
@Param(
name = "strip",
- type = Integer.class,
named = true,
defaultValue = "0",
doc = "strip the specified number of leading components from file names."),
})
- void patch(Object patchFile, Integer strip, StarlarkThread thread)
+ void patch(Object patchFile, StarlarkInt strip, StarlarkThread thread)
throws EvalException, RepositoryFunctionExceptionT, InterruptedException;
@StarlarkMethod(
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
index 1b1fd00..dbe5b38 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
@@ -26,6 +26,7 @@
import net.starlark.java.eval.Sequence;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.syntax.Location;
@@ -37,7 +38,7 @@
public Sequence<?> glob(
Sequence<?> include,
Sequence<?> exclude,
- Integer excludeDirectories,
+ StarlarkInt excludeDirectories,
Object allowEmpty,
StarlarkThread thread)
throws EvalException, InterruptedException {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
index b21c1c5..5c126ff 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
@@ -37,6 +37,7 @@
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.Tuple;
@@ -290,7 +291,7 @@
String language,
String outputType,
boolean linkDepsStatically,
- int stamp,
+ StarlarkInt stamp,
Sequence<?> additionalInputs,
Object grepIncludes,
StarlarkThread thread)
diff --git a/src/main/java/net/starlark/java/annot/StarlarkInterfaceUtils.java b/src/main/java/net/starlark/java/annot/StarlarkInterfaceUtils.java
index 352f66d..832cc71 100644
--- a/src/main/java/net/starlark/java/annot/StarlarkInterfaceUtils.java
+++ b/src/main/java/net/starlark/java/annot/StarlarkInterfaceUtils.java
@@ -24,8 +24,7 @@
/**
* Returns the more specific class of two classes. Class x is more specific than class y if x is
- * assignable to y. For example, of Integer.class and Object.class, Integer.class is more
- * specific.
+ * assignable to y. For example, of String.class and Object.class, String.class is more specific.
*
* <p>If either class is null, returns the other class.
*
diff --git a/src/main/java/net/starlark/java/annot/StarlarkMethod.java b/src/main/java/net/starlark/java/annot/StarlarkMethod.java
index c1f7a40..ac89d58 100644
--- a/src/main/java/net/starlark/java/annot/StarlarkMethod.java
+++ b/src/main/java/net/starlark/java/annot/StarlarkMethod.java
@@ -63,15 +63,6 @@
* <li>Noneable parameter variables must be declared with type Object, as the actual value may be
* either {@code None} or some other value, which do not share a superclass other than Object
* (or StarlarkValue, which is typically no more descriptive than Object).
- * <li>A parameter may have type Integer, or have a {@link Param#type} or {@link
- * Param#allowedTypes} annotation that includes Integer.class, even though Integer is not a
- * legal Starlark value type. When called from Starlark code, such a parameter accepts
- * StarlarkInt values, but only in the signed 32-bit value range. These values are "reboxed"
- * to Integer. Note that reboxing will still occur in the case where the annotation-declared
- * types include Integer.class but the parameter's type is Object. This means the parameter's
- * value cannot be assumed to be a legal Starlark value and should not be freely passed to
- * other functions in the Starlark API that require a legal value. To avoid the range and
- * legality limitations of reboxing, simply use StarlarkInt in place of Integer.
* <li>Parameter variables whose class is generic must be declared using wildcard types. For
* example, {@code Sequence<?>} is allowed but {@code Sequence<String>} is forbidden. This is
* because the call-time dynamic checks verify the class but cannot verify the type
diff --git a/src/main/java/net/starlark/java/annot/processor/StarlarkMethodProcessor.java b/src/main/java/net/starlark/java/annot/processor/StarlarkMethodProcessor.java
index 71b3767..9103eb0 100644
--- a/src/main/java/net/starlark/java/annot/processor/StarlarkMethodProcessor.java
+++ b/src/main/java/net/starlark/java/annot/processor/StarlarkMethodProcessor.java
@@ -329,6 +329,15 @@
paramAnnot.name());
}
+ // Give helpful hint for parameter of type Integer.
+ TypeMirror integerType = getType("java.lang.Integer");
+ if (types.isSameType(paramType, integerType)) {
+ errorf(
+ param,
+ "use StarlarkInt, not Integer for parameter '%s' (and see Starlark.toInt)",
+ paramAnnot.name());
+ }
+
// Check param.type.
if (!types.isSameType(getParamType(paramAnnot), voidType)) {
// Reject Param.type if not assignable to parameter variable.
diff --git a/src/main/java/net/starlark/java/eval/BuiltinCallable.java b/src/main/java/net/starlark/java/eval/BuiltinCallable.java
index 8410c8e..a3f1342 100644
--- a/src/main/java/net/starlark/java/eval/BuiltinCallable.java
+++ b/src/main/java/net/starlark/java/eval/BuiltinCallable.java
@@ -185,7 +185,6 @@
}
Object value = positional[argIndex++];
- value = param.reboxIntMaybe(value);
checkParamValue(param, value);
vector[paramIndex] = value;
}
@@ -268,7 +267,6 @@
continue;
}
- value = param.reboxIntMaybe(value);
checkParamValue(param, value);
// duplicate?
diff --git a/src/main/java/net/starlark/java/eval/MethodLibrary.java b/src/main/java/net/starlark/java/eval/MethodLibrary.java
index 65ff604..a908636 100644
--- a/src/main/java/net/starlark/java/eval/MethodLibrary.java
+++ b/src/main/java/net/starlark/java/eval/MethodLibrary.java
@@ -382,7 +382,7 @@
@Param(name = "x", type = Object.class, doc = "The string to convert."),
@Param(
name = "base",
- type = Integer.class,
+ type = StarlarkInt.class,
defaultValue = "unbound",
doc =
"The base used to interpret a string value; defaults to 10. Must be between 2 "
@@ -391,29 +391,25 @@
+ "string.",
named = true)
})
- public StarlarkInt intForStarlark(Object x, Object base) throws EvalException {
+ public StarlarkInt intForStarlark(Object x, Object baseO) throws EvalException {
if (x instanceof String) {
- if (base == Starlark.UNBOUND) {
- base = 10;
- } else if (!(base instanceof Integer)) {
- throw Starlark.errorf("got %s for base, want int", Starlark.type(base));
- }
+ int base = baseO == Starlark.UNBOUND ? 10 : Starlark.toInt(baseO, "base");
try {
- return StarlarkInt.parse((String) x, (Integer) base);
+ return StarlarkInt.parse((String) x, base);
} catch (NumberFormatException ex) {
throw Starlark.errorf("%s", ex.getMessage());
}
- } else {
- if (base != Starlark.UNBOUND) {
- throw Starlark.errorf("can't convert non-string with explicit base");
- }
- if (x instanceof Boolean) {
- return StarlarkInt.of(((Boolean) x).booleanValue() ? 1 : 0);
- } else if (x instanceof StarlarkInt) {
- return (StarlarkInt) x;
- }
- throw Starlark.errorf("got %s, want string, int, or bool", Starlark.type(x));
}
+
+ if (baseO != Starlark.UNBOUND) {
+ throw Starlark.errorf("can't convert non-string with explicit base");
+ }
+ if (x instanceof Boolean) {
+ return StarlarkInt.of(((Boolean) x).booleanValue() ? 1 : 0);
+ } else if (x instanceof StarlarkInt) {
+ return (StarlarkInt) x;
+ }
+ throw Starlark.errorf("got %s, want string, int, or bool", Starlark.type(x));
}
// TODO(adonovan): move into StarlarkInt.parse in a follow-up.
@@ -534,14 +530,15 @@
@Param(name = "list", type = Object.class, doc = "input sequence.", named = true),
@Param(
name = "start",
- type = Integer.class,
+ type = StarlarkInt.class,
doc = "start index.",
defaultValue = "0",
named = true)
},
useStarlarkThread = true)
- public StarlarkList<?> enumerate(Object input, Integer start, StarlarkThread thread)
+ public StarlarkList<?> enumerate(Object input, StarlarkInt startI, StarlarkThread thread)
throws EvalException {
+ int start = Starlark.toInt(startI, "start");
Object[] array = Starlark.toArray(input);
for (int i = 0; i < array.length; i++) {
array[i] = Tuple.pair(StarlarkInt.of(i + start), array[i]); // update in place
@@ -576,13 +573,13 @@
parameters = {
@Param(
name = "start_or_stop",
- type = Integer.class,
+ type = StarlarkInt.class,
doc =
"Value of the start element if stop is provided, "
+ "otherwise value of stop and the actual start is 0"),
@Param(
name = "stop_or_none",
- type = Integer.class,
+ type = StarlarkInt.class,
noneable = true,
defaultValue = "None",
doc =
@@ -590,28 +587,28 @@
+ "list; generation of the list stops before <code>stop</code> is reached."),
@Param(
name = "step",
- type = Integer.class,
+ type = StarlarkInt.class,
defaultValue = "1",
doc = "The increment (default is 1). It may be negative.")
},
useStarlarkThread = true)
public Sequence<StarlarkInt> range(
- Integer startOrStop, Object stopOrNone, Integer step, StarlarkThread thread)
+ StarlarkInt startOrStop, Object stopOrNone, StarlarkInt stepI, StarlarkThread thread)
throws EvalException {
int start;
int stop;
if (stopOrNone == Starlark.NONE) {
start = 0;
- stop = startOrStop;
- } else if (stopOrNone instanceof Integer) {
- start = startOrStop;
- stop = (Integer) stopOrNone;
+ stop = startOrStop.toInt("stop");
} else {
- throw Starlark.errorf("want int, got %s", Starlark.type(stopOrNone));
+ start = startOrStop.toInt("start");
+ stop = Starlark.toInt(stopOrNone, "stop");
}
+ int step = stepI.toInt("step");
if (step == 0) {
throw Starlark.errorf("step cannot be 0");
}
+ // TODO(adonovan): support arbitrary integers.
return new RangeList(start, stop, step);
}
diff --git a/src/main/java/net/starlark/java/eval/ParamDescriptor.java b/src/main/java/net/starlark/java/eval/ParamDescriptor.java
index 8edc2d5..811e505 100644
--- a/src/main/java/net/starlark/java/eval/ParamDescriptor.java
+++ b/src/main/java/net/starlark/java/eval/ParamDescriptor.java
@@ -30,7 +30,6 @@
final class ParamDescriptor {
private final String name;
- private final boolean reboxInt; // whether StarlarkInt is converted to Integer
@Nullable private final Object defaultValue;
private final boolean noneable;
private final boolean named;
@@ -47,16 +46,9 @@
boolean named,
boolean positional,
List<Class<?>> allowedClasses,
- boolean reboxInt,
@Nullable String disabledByFlag) {
this.name = name;
- this.reboxInt = reboxInt;
- try {
- this.defaultValue =
- defaultExpr.isEmpty() ? null : reboxIntMaybe(evalDefault(name, defaultExpr));
- } catch (EvalException ex) {
- throw new IllegalStateException(ex); // bad default
- }
+ this.defaultValue = defaultExpr.isEmpty() ? null : evalDefault(name, defaultExpr);
this.noneable = noneable;
this.named = named;
this.positional = positional;
@@ -65,17 +57,6 @@
}
/**
- * Converts (if necessary for this parameter) a StarlarkInt argument to an Integer parameter,
- * applying a range check.
- */
- Object reboxIntMaybe(Object value) throws EvalException {
- if (reboxInt && value instanceof StarlarkInt) {
- return ((StarlarkInt) value).toInt(getName()); // may fail
- }
- return value;
- }
-
- /**
* Returns a {@link ParamDescriptor} representing the given raw {@link Param} annotation and the
* given semantics.
*/
@@ -92,22 +73,12 @@
Preconditions.checkState(!disabledByFlag.isEmpty());
}
- // A parameter of type Integer may accept an argument of type StarlarkInt,
- // in which case BuiltinCallable.fastcall will apply this range check
- // and convert (rebox) the argument.
- // We also do this conversion for a parameter type of (say) Object
- // if the allowedClasses include Integer.
- boolean reboxInt = paramClass == Integer.class;
-
// Compute set of allowed classes.
ParamType[] allowedTypes = param.allowedTypes();
List<Class<?>> allowedClasses = new ArrayList<>();
if (allowedTypes.length > 0) {
for (ParamType pt : allowedTypes) {
allowedClasses.add(pt.type());
- if (pt.type() == Integer.class) {
- reboxInt = true;
- }
}
} else if (param.type() == Void.class) {
// If no Param.type type was specified, use the class of the parameter itself.
@@ -116,9 +87,6 @@
} else {
allowedClasses.add(param.type());
}
- if (param.type() == Integer.class) {
- reboxInt = true;
- }
if (param.noneable()) {
// A few annotations redundantly declare NoneType.
if (!allowedClasses.contains(NoneType.class)) {
@@ -133,7 +101,6 @@
param.named(),
param.positional(),
allowedClasses,
- reboxInt,
disabledByFlag);
}
diff --git a/src/main/java/net/starlark/java/eval/Starlark.java b/src/main/java/net/starlark/java/eval/Starlark.java
index 68517d4..1690f77 100644
--- a/src/main/java/net/starlark/java/eval/Starlark.java
+++ b/src/main/java/net/starlark/java/eval/Starlark.java
@@ -270,12 +270,6 @@
return "string";
} else if (StarlarkInt.class.isAssignableFrom(c)) {
return "int";
- } else if (c.equals(Integer.class)) {
- // Integer is not a legal Starlark value, but it is used for parameter types
- // in built-in functions; StarlarkBuiltin.fastcall does a range check
- // and reboxing. Use of this type means "signed 32-bit int value",
- // but that's a lot for an error message.
- return "int";
} else if (c.equals(Boolean.class)) {
return "bool";
}
@@ -325,6 +319,11 @@
// Any class of java.util.Map that isn't a Dict.
return "Map";
+ } else if (c.equals(Integer.class)) {
+ // Integer is not a legal Starlark value, but it does appear as
+ // the return type for many built-in functions.
+ return "int";
+
} else {
String simpleName = c.getSimpleName();
return simpleName.isEmpty() ? c.getName() : simpleName;
diff --git a/src/main/java/net/starlark/java/eval/StarlarkList.java b/src/main/java/net/starlark/java/eval/StarlarkList.java
index e658dae..4fa3b88 100644
--- a/src/main/java/net/starlark/java/eval/StarlarkList.java
+++ b/src/main/java/net/starlark/java/eval/StarlarkList.java
@@ -395,12 +395,12 @@
name = "insert",
doc = "Inserts an item at a given position.",
parameters = {
- @Param(name = "index", type = Integer.class, doc = "The index of the given position."),
+ @Param(name = "index", type = StarlarkInt.class, doc = "The index of the given position."),
@Param(name = "item", type = Object.class, doc = "The item.", noneable = true)
})
@SuppressWarnings("unchecked")
- public NoneType insert(Integer index, Object item) throws EvalException {
- add(EvalUtils.toIndex(index, size), (E) item, (Location) null); // unchecked
+ public NoneType insert(StarlarkInt index, Object item) throws EvalException {
+ add(EvalUtils.toIndex(index.toInt("index"), size), (E) item, (Location) null); // unchecked
return Starlark.NONE;
}
@@ -424,22 +424,22 @@
@Param(name = "x", type = Object.class, doc = "The object to search."),
@Param(
name = "start",
- type = Integer.class,
+ type = StarlarkInt.class,
defaultValue = "None",
noneable = true, // TODO(adonovan): this is wrong
- named = true,
+ named = true, // TODO(adonovan): this is wrong
doc = "The start index of the list portion to inspect."),
@Param(
name = "end",
- type = Integer.class,
+ type = StarlarkInt.class,
defaultValue = "None",
noneable = true, // TODO(adonovan): this is wrong
- named = true,
+ named = true, // TODO(adonovan): this is wrong
doc = "The end index of the list portion to inspect.")
})
public Integer index(Object x, Object start, Object end) throws EvalException {
- int i = start == Starlark.NONE ? 0 : EvalUtils.toIndex((Integer) start, size);
- int j = end == Starlark.NONE ? size : EvalUtils.toIndex((Integer) end, size);
+ int i = start == Starlark.NONE ? 0 : EvalUtils.toIndex(Starlark.toInt(start, "start"), size);
+ int j = end == Starlark.NONE ? size : EvalUtils.toIndex(Starlark.toInt(end, "end"), size);
for (; i < j; i++) {
if (elems[i].equals(x)) {
return i;
@@ -457,13 +457,13 @@
parameters = {
@Param(
name = "i",
- type = Integer.class,
- noneable = true, // TODO(adonovan): this is wrong
+ type = StarlarkInt.class,
+ noneable = true, // TODO(adonovan): this is not what Python3 does
defaultValue = "-1",
doc = "The index of the item.")
})
public Object pop(Object i) throws EvalException {
- int arg = i == Starlark.NONE ? -1 : (Integer) i;
+ int arg = i == Starlark.NONE ? -1 : Starlark.toInt(i, "i");
int index = EvalUtils.getSequenceIndex(arg, size);
Object result = elems[index];
remove(index, (Location) null);
diff --git a/src/main/java/net/starlark/java/eval/StringModule.java b/src/main/java/net/starlark/java/eval/StringModule.java
index 09cdf31..7375526 100644
--- a/src/main/java/net/starlark/java/eval/StringModule.java
+++ b/src/main/java/net/starlark/java/eval/StringModule.java
@@ -272,7 +272,7 @@
@Param(name = "new", type = String.class, doc = "The string to replace with."),
@Param(
name = "count",
- type = Integer.class,
+ type = StarlarkInt.class,
noneable = true, // TODO(#11244): Set false once incompatible flag is deleted.
defaultValue = "unbound",
doc =
@@ -297,13 +297,16 @@
+ "can temporarily opt out of this change by setting "
+ "--incompatible_string_replace_count=false.)");
}
- if (countUnchecked != Starlark.UNBOUND && (Integer) countUnchecked >= 0) {
- count = (Integer) countUnchecked;
+ if (countUnchecked != Starlark.UNBOUND) {
+ int x = Starlark.toInt(countUnchecked, "count");
+ if (x >= 0) {
+ count = x;
+ }
}
} else {
if (countUnchecked != Starlark.UNBOUND && countUnchecked != Starlark.NONE) {
// Negative has same effect as 0 below.
- count = (Integer) countUnchecked;
+ count = Starlark.toInt(countUnchecked, "count");
}
}
@@ -340,7 +343,7 @@
@Param(name = "sep", type = String.class, doc = "The string to split on."),
@Param(
name = "maxsplit",
- type = Integer.class,
+ type = StarlarkInt.class,
noneable = true,
defaultValue = "None",
doc = "The maximum number of splits.")
@@ -353,7 +356,7 @@
}
int maxSplit = Integer.MAX_VALUE;
if (maxSplitO != Starlark.NONE) {
- maxSplit = (Integer) maxSplitO;
+ maxSplit = Starlark.toInt(maxSplitO, "maxsplit");
}
ArrayList<String> res = new ArrayList<>();
int start = 0;
@@ -380,7 +383,7 @@
@Param(name = "sep", type = String.class, doc = "The string to split on."),
@Param(
name = "maxsplit",
- type = Integer.class,
+ type = StarlarkInt.class,
noneable = true,
defaultValue = "None",
doc = "The maximum number of splits.")
@@ -393,7 +396,7 @@
}
int maxSplit = Integer.MAX_VALUE;
if (maxSplitO != Starlark.NONE) {
- maxSplit = (Integer) maxSplitO;
+ maxSplit = Starlark.toInt(maxSplitO, "maxsplit");
}
ArrayList<String> res = new ArrayList<>();
int end = self.length();
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 c5b9b38..439c451 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
@@ -60,6 +60,7 @@
import net.starlark.java.eval.Mutability;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
@@ -303,7 +304,7 @@
StarlarkPath patchFile = context.path("my.patch");
context.createFile(
context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, thread);
- context.patch(patchFile, 0, thread);
+ context.patch(patchFile, StarlarkInt.of(0), thread);
testOutputFile(foo.getPath(), String.format("line one%nline two%n"));
}
@@ -314,7 +315,7 @@
context.createFile(
context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, thread);
try {
- context.patch(patchFile, 0, thread);
+ context.patch(patchFile, StarlarkInt.of(0), thread);
fail("Expected RepositoryFunctionException");
} catch (RepositoryFunctionException ex) {
assertThat(ex)
@@ -337,7 +338,7 @@
true,
thread);
try {
- context.patch(patchFile, 0, thread);
+ context.patch(patchFile, StarlarkInt.of(0), thread);
fail("Expected RepositoryFunctionException");
} catch (RepositoryFunctionException ex) {
assertThat(ex)
@@ -358,7 +359,7 @@
context.createFile(
context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, thread);
try {
- context.patch(patchFile, 0, thread);
+ context.patch(patchFile, StarlarkInt.of(0), thread);
fail("Expected RepositoryFunctionException");
} catch (RepositoryFunctionException ex) {
assertThat(ex)
@@ -416,7 +417,7 @@
StarlarkExecutionResult starlarkExecutionResult =
context.execute(
StarlarkList.of(/*mutability=*/ null, "/bin/cmd", "arg1"),
- /*timeout=*/ 10,
+ /* timeoutI= */ StarlarkInt.of(10),
/*uncheckedEnvironment=*/ Dict.empty(),
/*quiet=*/ true,
/*workingDirectory=*/ "",
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 0758ec4..5635748 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
@@ -32,6 +32,7 @@
import java.util.Map;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkInt;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -139,7 +140,7 @@
ConversionException.class,
() ->
BuildType.LABEL_KEYED_STRING_DICT.convert(
- ImmutableMap.of(1, "OK"), null, currentRule));
+ ImmutableMap.of(StarlarkInt.of(1), "OK"), null, currentRule));
assertThat(expected)
.hasMessageThat()
.isEqualTo("expected value of type 'string' for dict key element, but got 1 (int)");
@@ -152,7 +153,7 @@
ConversionException.class,
() ->
BuildType.LABEL_KEYED_STRING_DICT.convert(
- ImmutableMap.of("//actually/a:label", 3), null, currentRule));
+ ImmutableMap.of("//actually/a:label", StarlarkInt.of(3)), null, currentRule));
assertThat(expected)
.hasMessageThat()
.isEqualTo("expected value of type 'string' for dict value element, but got 3 (int)");
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 776e183..f7d6110 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
@@ -107,7 +107,8 @@
@Test
public void testNonString() throws Exception {
Type.ConversionException e =
- assertThrows(Type.ConversionException.class, () -> Type.STRING.convert(3, null));
+ assertThrows(
+ Type.ConversionException.class, () -> Type.STRING.convert(StarlarkInt.of(3), null));
assertThat(e).hasMessageThat().isEqualTo("expected value of type 'string', but got 3 (int)");
}
@@ -242,7 +243,8 @@
@Test
public void testNonLabel() throws Exception {
Type.ConversionException e =
- assertThrows(Type.ConversionException.class, () -> BuildType.LABEL.convert(3, null));
+ assertThrows(
+ Type.ConversionException.class, () -> BuildType.LABEL.convert(StarlarkInt.of(3), null));
assertThat(e).hasMessageThat().isEqualTo("expected value of type 'string', but got 3 (int)");
}
@@ -281,7 +283,9 @@
@Test
public void testNonStringList() throws Exception {
Type.ConversionException e =
- assertThrows(Type.ConversionException.class, () -> Type.STRING_LIST.convert(3, "blah"));
+ assertThrows(
+ Type.ConversionException.class,
+ () -> Type.STRING_LIST.convert(StarlarkInt.of(3), "blah"));
assertThat(e)
.hasMessageThat()
.isEqualTo("expected value of type 'list(string)' for blah, but got 3 (int)");
@@ -289,7 +293,7 @@
@Test
public void testStringListBadElements() throws Exception {
- Object input = Arrays.<Object>asList("foo", "bar", 1);
+ Object input = Arrays.<Object>asList("foo", "bar", StarlarkInt.of(1));
Type.ConversionException e =
assertThrows(
Type.ConversionException.class, () -> Type.STRING_LIST.convert(input, "argument quux"));
@@ -326,7 +330,7 @@
Type.ConversionException e =
assertThrows(
Type.ConversionException.class,
- () -> BuildType.LABEL_LIST.convert(3, "foo", currentRule));
+ () -> BuildType.LABEL_LIST.convert(StarlarkInt.of(3), "foo", currentRule));
assertThat(e)
.hasMessageThat()
.isEqualTo("expected value of type 'list(label)' for foo, but got 3 (int)");
@@ -334,7 +338,7 @@
@Test
public void testLabelListBadElements() throws Exception {
- Object list = Arrays.<Object>asList("//foo:bar", 2, "foo");
+ Object list = Arrays.<Object>asList("//foo:bar", StarlarkInt.of(2), "foo");
Type.ConversionException e =
assertThrows(
Type.ConversionException.class,
@@ -375,8 +379,9 @@
@Test
public void testStringListDictBadFirstElement() throws Exception {
- Object input = ImmutableMap.of(2, Arrays.asList("foo", "bar"),
- "wiz", Arrays.asList("bang"));
+ Object input =
+ ImmutableMap.of(
+ StarlarkInt.of(2), Arrays.asList("foo", "bar"), "wiz", Arrays.asList("bang"));
Type.ConversionException e =
assertThrows(
Type.ConversionException.class,
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 4b80fae..95a81a7 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
@@ -56,6 +56,7 @@
import net.starlark.java.eval.Module;
import net.starlark.java.eval.Mutability;
import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
@@ -443,12 +444,12 @@
.addScope(
Scope.newBuilder()
.setName("local")
- .addBinding(getValueProto("a", 2))
- .addBinding(getValueProto("b", 1)))
+ .addBinding(getValueProto("a", StarlarkInt.of(2)))
+ .addBinding(getValueProto("b", StarlarkInt.of(1))))
.addScope(
Scope.newBuilder()
.setName("global")
- .addBinding(getValueProto("c", 3))
+ .addBinding(getValueProto("c", StarlarkInt.of(3)))
.addBinding(getValueProto("fn", module.getGlobal("fn"))))
.build());
@@ -464,8 +465,8 @@
.addScope(
Scope.newBuilder()
.setName("global")
- .addBinding(getValueProto("a", 1))
- .addBinding(getValueProto("c", 3))
+ .addBinding(getValueProto("a", StarlarkInt.of(1)))
+ .addBinding(getValueProto("c", StarlarkInt.of(3)))
.addBinding(getValueProto("fn", module.getGlobal("fn"))))
.build());
}
@@ -493,7 +494,8 @@
EvaluateRequest.newBuilder().setThreadId(threadId).setStatement("x[1]").build())
.build());
assertThat(response.hasEvaluate()).isTrue();
- assertThat(response.getEvaluate().getResult()).isEqualTo(getValueProto("Evaluation result", 2));
+ assertThat(response.getEvaluate().getResult())
+ .isEqualTo(getValueProto("Evaluation result", StarlarkInt.of(2)));
}
@Test
@@ -526,7 +528,9 @@
ListFramesResponse frames = listFrames(threadId);
assertThat(frames.getFrame(0).getScope(0).getBindingList())
- .contains(getValueProto("x", StarlarkList.of(/*mutability=*/ null, 5, 6)));
+ .contains(
+ getValueProto(
+ "x", StarlarkList.of(/*mutability=*/ null, StarlarkInt.of(5), StarlarkInt.of(6))));
}
@Test
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/ConflictingMethodNames.java b/src/test/java/net/starlark/java/annot/processor/testsources/ConflictingMethodNames.java
index 0604898..7b0e11c 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/ConflictingMethodNames.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/ConflictingMethodNames.java
@@ -16,6 +16,7 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkValue;
/**
@@ -39,9 +40,9 @@
documented = false,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
})
- public String conflictingMethodTwo(String one, Integer two) {
+ public String conflictingMethodTwo(String one, StarlarkInt two) {
return "foo";
}
}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/DisabledValueParamNoToggle.java b/src/test/java/net/starlark/java/annot/processor/testsources/DisabledValueParamNoToggle.java
index d38f033..0cf2a7b 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/DisabledValueParamNoToggle.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/DisabledValueParamNoToggle.java
@@ -16,6 +16,7 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkValue;
/**
@@ -31,7 +32,7 @@
@Param(name = "one", named = true, positional = true),
@Param(name = "two", named = true, valueWhenDisabled = "3", positional = true)
})
- public Integer noToggleMethod(Integer one, Integer two) {
+ public Integer noToggleMethod(StarlarkInt one, StarlarkInt two) {
return 42;
}
}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlag.java b/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlag.java
index c4b9e67..01abb8c 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlag.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlag.java
@@ -30,11 +30,11 @@
documented = false,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
},
enableOnlyWithFlag = FOO,
disableWithFlag = FOO)
- public String someMethod(String one, Integer two) {
+ public String someMethod(String one, StarlarkInt two) {
return "foo";
}
}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlagParam.java b/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlagParam.java
index a891499..fd2c654 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlagParam.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlagParam.java
@@ -16,6 +16,7 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkValue;
/**
@@ -33,12 +34,12 @@
@Param(name = "one", type = String.class, named = true),
@Param(
name = "two",
- type = Integer.class,
+ type = StarlarkInt.class,
named = true,
enableOnlyWithFlag = FOO,
disableWithFlag = FOO),
})
- public String someMethod(String one, Integer two) {
+ public String someMethod(String one, StarlarkInt two) {
return "foo";
}
}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/GoldenCase.java b/src/test/java/net/starlark/java/annot/processor/testsources/GoldenCase.java
index a605fa8..33940c1 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/GoldenCase.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/GoldenCase.java
@@ -18,6 +18,7 @@
import net.starlark.java.annot.StarlarkMethod;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.StarlarkValue;
@@ -48,7 +49,7 @@
documented = false,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
@Param(
name = "three",
type = String.class,
@@ -56,7 +57,7 @@
defaultValue = "None",
noneable = true),
})
- public String threeArgMethod(String one, Integer two, Object three) {
+ public String threeArgMethod(String one, StarlarkInt two, Object three) {
return "bar";
}
@@ -65,12 +66,12 @@
documented = false,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
@Param(name = "three", type = String.class, named = true),
},
useStarlarkThread = true)
public String threeArgMethodWithParams(
- String one, Integer two, String three, StarlarkThread thread) {
+ String one, StarlarkInt two, String three, StarlarkThread thread) {
return "baz";
}
@@ -105,12 +106,12 @@
documented = false,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
},
extraKeywords = @Param(name = "kwargs"),
useStarlarkThread = true)
public String twoArgMethodWithParamsAndInfoAndKwargs(
- String one, Integer two, Dict<String, Object> kwargs, StarlarkThread thread) {
+ String one, StarlarkInt two, Dict<String, Object> kwargs, StarlarkThread thread) {
return "blep";
}
@@ -119,13 +120,13 @@
documented = false,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
},
extraPositionals = @Param(name = "args"),
extraKeywords = @Param(name = "kwargs"),
useStarlarkThread = true)
public String twoArgMethodWithParamsAndInfoAndKwargs(
- String one, Integer two, Sequence<?> args, Dict<?, ?> kwargs, StarlarkThread thread) {
+ String one, StarlarkInt two, Sequence<?> args, Dict<?, ?> kwargs, StarlarkThread thread) {
return "yar";
}
@@ -134,10 +135,10 @@
selfCall = true,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
},
documented = false)
- public Integer selfCallMethod(String one, Integer two) {
+ public Integer selfCallMethod(String one, StarlarkInt two) {
return 0;
}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/MultipleSelfCallMethods.java b/src/test/java/net/starlark/java/annot/processor/testsources/MultipleSelfCallMethods.java
index d4f0dc4..893056c 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/MultipleSelfCallMethods.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/MultipleSelfCallMethods.java
@@ -16,6 +16,7 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkValue;
/** Test case for a class with multiple StarlarkMethod methods which have selfCall=true. */
@@ -26,15 +27,15 @@
selfCall = true,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
},
documented = false)
- public Integer selfCallMethod(String one, Integer two) {
+ public StarlarkInt selfCallMethod(String one, StarlarkInt two) {
return 0;
}
@StarlarkMethod(name = "selfCallMethodTwo", selfCall = true, documented = false)
- public Integer selfCallMethodTwo() {
+ public StarlarkInt selfCallMethodTwo() {
return 0;
}
}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/NonDefaultParamAfterDefault.java b/src/test/java/net/starlark/java/annot/processor/testsources/NonDefaultParamAfterDefault.java
index 1c5d75c..4701f0c 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/NonDefaultParamAfterDefault.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/NonDefaultParamAfterDefault.java
@@ -16,6 +16,7 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkValue;
/**
@@ -31,7 +32,7 @@
@Param(name = "one", named = true, defaultValue = "1", positional = true),
@Param(name = "two", named = true, positional = true)
})
- public Integer nonDefaultAfterDefault(Integer one, Integer two) {
+ public Integer nonDefaultAfterDefault(StarlarkInt one, StarlarkInt two) {
return 42;
}
-}
\ No newline at end of file
+}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/PositionalOnlyParamAfterNamed.java b/src/test/java/net/starlark/java/annot/processor/testsources/PositionalOnlyParamAfterNamed.java
index b3916db..56ddbfd 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/PositionalOnlyParamAfterNamed.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/PositionalOnlyParamAfterNamed.java
@@ -16,6 +16,7 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkValue;
/**
@@ -31,7 +32,7 @@
@Param(name = "one", named = true, positional = true),
@Param(name = "two", named = false, positional = true)
})
- public Integer positionalOnlyAfterNamed(Integer one, Integer two) {
+ public Integer positionalOnlyAfterNamed(StarlarkInt one, StarlarkInt two) {
return 42;
}
-}
\ No newline at end of file
+}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/PositionalParamAfterNonPositional.java b/src/test/java/net/starlark/java/annot/processor/testsources/PositionalParamAfterNonPositional.java
index a003bdf..ab252b3 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/PositionalParamAfterNonPositional.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/PositionalParamAfterNonPositional.java
@@ -16,6 +16,7 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkValue;
/**
@@ -31,7 +32,7 @@
@Param(name = "one", named = true, positional = false),
@Param(name = "two", named = true, positional = true)
})
- public Integer positionalAfterNonPositional(Integer one, Integer two) {
+ public Integer positionalAfterNonPositional(StarlarkInt one, StarlarkInt two) {
return 42;
}
-}
\ No newline at end of file
+}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkInfoBeforeParams.java b/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkInfoBeforeParams.java
index 59009f1..fb28b66 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkInfoBeforeParams.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkInfoBeforeParams.java
@@ -16,6 +16,7 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.StarlarkValue;
@@ -29,11 +30,11 @@
documented = false,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
@Param(name = "three", type = String.class, named = true)
},
useStarlarkThread = true)
- public String threeArgMethod(StarlarkThread thread, String one, Integer two, String three) {
+ public String threeArgMethod(StarlarkThread thread, String one, StarlarkInt two, String three) {
return "bar";
}
}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkThreadMissing.java b/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkThreadMissing.java
index 034d546..6b1a1f1 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkThreadMissing.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkThreadMissing.java
@@ -16,6 +16,7 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkValue;
/**
@@ -29,10 +30,10 @@
documented = false,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
},
useStarlarkThread = true)
- public String threeArgMethod(String one, Integer two, String shouldBeThread) {
+ public String threeArgMethod(String one, StarlarkInt two, String shouldBeThread) {
return "bar";
}
}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/ToggledKwargsParam.java b/src/test/java/net/starlark/java/annot/processor/testsources/ToggledKwargsParam.java
index 95a1e0f..1f57f8d 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/ToggledKwargsParam.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/ToggledKwargsParam.java
@@ -18,6 +18,7 @@
import net.starlark.java.annot.StarlarkMethod;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.StarlarkValue;
@@ -34,13 +35,13 @@
documented = false,
parameters = {
@Param(name = "one", type = String.class, named = true),
- @Param(name = "two", type = Integer.class, named = true),
+ @Param(name = "two", type = StarlarkInt.class, named = true),
},
extraPositionals = @Param(name = "args"),
extraKeywords = @Param(name = "kwargs", enableOnlyWithFlag = FOO),
useStarlarkThread = true)
public String toggledKwargsMethod(
- String one, Integer two, Sequence<?> args, Dict<?, ?> kwargs, StarlarkThread thread) {
+ String one, StarlarkInt two, Sequence<?> args, Dict<?, ?> kwargs, StarlarkThread thread) {
return "cat";
}
}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/ToggledParamNoDisabledValue.java b/src/test/java/net/starlark/java/annot/processor/testsources/ToggledParamNoDisabledValue.java
index 5df4e82..de0a494 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/ToggledParamNoDisabledValue.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/ToggledParamNoDisabledValue.java
@@ -16,6 +16,7 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkValue;
/**
@@ -33,7 +34,7 @@
@Param(name = "one", named = true, positional = true),
@Param(name = "two", named = true, enableOnlyWithFlag = FOO, positional = true)
})
- public Integer noDisabledValueMethod(Integer one, Integer two) {
+ public Integer noDisabledValueMethod(StarlarkInt one, StarlarkInt two) {
return 42;
}
}
diff --git a/src/test/java/net/starlark/java/eval/EvalUtilsTest.java b/src/test/java/net/starlark/java/eval/EvalUtilsTest.java
index 71bd1f7..1d4a63e 100644
--- a/src/test/java/net/starlark/java/eval/EvalUtilsTest.java
+++ b/src/test/java/net/starlark/java/eval/EvalUtilsTest.java
@@ -17,6 +17,8 @@
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 java.math.BigInteger;
import javax.annotation.Nullable;
import net.starlark.java.annot.StarlarkBuiltin;
@@ -50,13 +52,20 @@
@Test
public void testDataTypeNames() throws Exception {
assertThat(Starlark.type("foo")).isEqualTo("string");
- assertThat(Starlark.type(3)).isEqualTo("int");
+ assertThat(Starlark.type(StarlarkInt.of(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");
+
+ // Not legal values, but relied upon by (e.g.) ApiExporter
+ // when formatting the result type of an annotated method.
+ // Other types accepted by fromJava are treated similarly.
+ assertThat(Starlark.type(3)).isEqualTo("int");
+ assertThat(Starlark.type(ImmutableList.of())).isEqualTo("List");
+ assertThat(Starlark.type(ImmutableMap.of())).isEqualTo("Map");
}
@Test
diff --git a/src/test/java/net/starlark/java/eval/EvaluationTest.java b/src/test/java/net/starlark/java/eval/EvaluationTest.java
index e397239..03c68c8 100644
--- a/src/test/java/net/starlark/java/eval/EvaluationTest.java
+++ b/src/test/java/net/starlark/java/eval/EvaluationTest.java
@@ -139,7 +139,9 @@
class C {
long run(int n) throws SyntaxError.Exception, EvalException, InterruptedException {
- Module module = Module.withPredeclared(StarlarkSemantics.DEFAULT, ImmutableMap.of("n", n));
+ Module module =
+ Module.withPredeclared(
+ StarlarkSemantics.DEFAULT, ImmutableMap.of("n", StarlarkInt.of(n)));
long steps0 = thread.getExecutedSteps();
Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
return thread.getExecutedSteps() - steps0;
diff --git a/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java b/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
index d8e121b..4f3a9d3a 100644
--- a/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
+++ b/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
@@ -186,11 +186,11 @@
name = "nullfunc_failing",
parameters = {
@Param(name = "p1", type = String.class),
- @Param(name = "p2", type = Integer.class),
+ @Param(name = "p2", type = StarlarkInt.class),
},
documented = false,
allowReturnNones = false)
- public StarlarkValue nullfuncFailing(String p1, Integer p2) {
+ public StarlarkValue nullfuncFailing(String p1, StarlarkInt p2) {
return null;
}
@@ -244,7 +244,7 @@
named = true),
@Param(
name = "noneable",
- type = Integer.class,
+ type = StarlarkInt.class,
defaultValue = "None",
noneable = true,
positional = false,
@@ -253,8 +253,8 @@
name = "multi",
allowedTypes = {
@ParamType(type = String.class),
- @ParamType(type = Integer.class),
- @ParamType(type = Sequence.class, generic1 = Integer.class),
+ @ParamType(type = StarlarkInt.class),
+ @ParamType(type = Sequence.class, generic1 = StarlarkInt.class),
},
defaultValue = "None",
noneable = true,
@@ -262,7 +262,7 @@
named = true)
})
public String withParams(
- Integer pos1,
+ StarlarkInt pos1,
boolean pos2,
boolean posOrNamed,
boolean named,
@@ -319,7 +319,7 @@
named = true),
@Param(
name = "noneable",
- type = Integer.class,
+ type = StarlarkInt.class,
defaultValue = "None",
noneable = true,
positional = false,
@@ -328,8 +328,8 @@
name = "multi",
allowedTypes = {
@ParamType(type = String.class),
- @ParamType(type = Integer.class),
- @ParamType(type = Sequence.class, generic1 = Integer.class),
+ @ParamType(type = StarlarkInt.class),
+ @ParamType(type = Sequence.class, generic1 = StarlarkInt.class),
},
defaultValue = "None",
noneable = true,
@@ -338,7 +338,7 @@
},
useStarlarkThread = true)
public String withParamsAndExtraInterpreterParams(
- Integer pos1,
+ StarlarkInt pos1,
boolean pos2,
boolean posOrNamed,
boolean named,
@@ -388,14 +388,14 @@
name = "with_args_and_thread",
documented = false,
parameters = {
- @Param(name = "pos1", type = Integer.class),
+ @Param(name = "pos1", type = StarlarkInt.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) {
+ StarlarkInt pos1, boolean pos2, boolean named, Sequence<?> args, StarlarkThread thread) {
String argsString = debugPrintArgs(args);
return "with_args_and_thread("
+ pos1
@@ -454,24 +454,6 @@
throw new InternalError("buggy code");
}
- @StarlarkMethod(
- name = "int_conversion",
- doc = "test implicit StarlarkInt to Integer conversion",
- parameters = {
- @Param(name = "a", type = Integer.class),
- @Param(
- name = "b",
- allowedTypes = {
- @ParamType(type = String.class),
- @ParamType(type = Integer.class),
- }),
- @Param(name = "c"),
- @Param(name = "d"),
- })
- public String intConversion(Object a, Object b, Integer c, Object d) {
- return String.format("(%s, %s, %s, %s)", a, b, c, d);
- }
-
@Override
public String toString() {
return "<mock>";
@@ -922,8 +904,8 @@
}
@SuppressWarnings("unchecked")
- private void nestedLoopsTest(String statement, Integer outerExpected, int firstExpected,
- int secondExpected) throws Exception {
+ private void nestedLoopsTest(
+ String statement, int outerExpected, int firstExpected, int secondExpected) throws Exception {
ev.exec(
"def foo():",
" outer = 0",
@@ -1908,7 +1890,6 @@
.testExactOrder(
"dir(mock)",
"function",
- "int_conversion",
"interrupted_struct_field",
"is_empty",
"nullfunc_failing",
@@ -2122,23 +2103,4 @@
() -> Starlark.addMethods(ImmutableMap.builder(), new Mock()));
assertThat(ex).hasMessageThat().contains("method struct_field has structField=true");
}
-
- @Test
- public void testIntegerReboxing() throws Exception {
- ev.new Scenario()
- .update("mock", new Mock())
- .setUp("big = 111111111 * 111111111")
- .testExpression("mock.int_conversion(1, 2, 3, 4)", "(1, 2, 3, 4)")
- .testExpression("mock.int_conversion(1, 'b', 3, 'd')", "(1, b, 3, d)")
- .testIfErrorContains(
- "got 12345678987654321 for a, want value in signed 32-bit range",
- "mock.int_conversion(big, 0, 0, 0)")
- .testIfErrorContains(
- "got 12345678987654321 for b, want value in signed 32-bit range",
- "mock.int_conversion(0, big, 0, 0)")
- .testIfErrorContains(
- "got 12345678987654321 for c, want value in signed 32-bit range",
- "mock.int_conversion(0, 0, big, 0)")
- .testExpression("mock.int_conversion(0, 0, 0, big)", "(0, 0, 0, 12345678987654321)");
- }
}
diff --git a/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java b/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java
index aad859d..3e4c4bd 100644
--- a/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java
+++ b/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java
@@ -54,7 +54,7 @@
name = "positionals_only_method",
documented = false,
parameters = {
- @Param(name = "a", positional = true, named = false, type = Integer.class),
+ @Param(name = "a", positional = true, named = false, type = StarlarkInt.class),
@Param(
name = "b",
positional = true,
@@ -62,10 +62,11 @@
type = Boolean.class,
enableOnlyWithFlag = EXPERIMENTAL_FLAG,
valueWhenDisabled = "False"),
- @Param(name = "c", positional = true, named = false, type = Integer.class),
+ @Param(name = "c", positional = true, named = false, type = StarlarkInt.class),
},
useStarlarkThread = true)
- public String positionalsOnlyMethod(Integer a, boolean b, Integer c, StarlarkThread thread) {
+ public String positionalsOnlyMethod(
+ StarlarkInt a, boolean b, StarlarkInt c, StarlarkThread thread) {
return "positionals_only_method(" + a + ", " + b + ", " + c + ")";
}
@@ -73,7 +74,7 @@
name = "keywords_only_method",
documented = false,
parameters = {
- @Param(name = "a", positional = false, named = true, type = Integer.class),
+ @Param(name = "a", positional = false, named = true, type = StarlarkInt.class),
@Param(
name = "b",
positional = false,
@@ -81,10 +82,11 @@
type = Boolean.class,
enableOnlyWithFlag = EXPERIMENTAL_FLAG,
valueWhenDisabled = "False"),
- @Param(name = "c", positional = false, named = true, type = Integer.class),
+ @Param(name = "c", positional = false, named = true, type = StarlarkInt.class),
},
useStarlarkThread = true)
- public String keywordsOnlyMethod(Integer a, boolean b, Integer c, StarlarkThread thread) {
+ public String keywordsOnlyMethod(
+ StarlarkInt a, boolean b, StarlarkInt c, StarlarkThread thread) {
return "keywords_only_method(" + a + ", " + b + ", " + c + ")";
}
@@ -92,7 +94,7 @@
name = "mixed_params_method",
documented = false,
parameters = {
- @Param(name = "a", positional = true, named = false, type = Integer.class),
+ @Param(name = "a", positional = true, named = false, type = StarlarkInt.class),
@Param(
name = "b",
positional = true,
@@ -104,14 +106,14 @@
name = "c",
positional = false,
named = true,
- type = Integer.class,
+ type = StarlarkInt.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) {
+ StarlarkInt a, boolean b, StarlarkInt c, boolean d, StarlarkThread thread) {
return "mixed_params_method(" + a + ", " + b + ", " + c + ", " + d + ")";
}
@@ -119,7 +121,7 @@
name = "keywords_multiple_flags",
documented = false,
parameters = {
- @Param(name = "a", positional = false, named = true, type = Integer.class),
+ @Param(name = "a", positional = false, named = true, type = StarlarkInt.class),
@Param(
name = "b",
positional = false,
@@ -131,12 +133,13 @@
name = "c",
positional = false,
named = true,
- type = Integer.class,
+ type = StarlarkInt.class,
enableOnlyWithFlag = FLAG1,
valueWhenDisabled = "3"),
},
useStarlarkThread = true)
- public String keywordsMultipleFlags(Integer a, boolean b, Integer c, StarlarkThread thread) {
+ public String keywordsMultipleFlags(
+ StarlarkInt a, boolean b, StarlarkInt c, StarlarkThread thread) {
return "keywords_multiple_flags(" + a + ", " + b + ", " + c + ")";
}
}