Properly map List -> list and Map -> dict for ApiExporter Starlark.fromJava() converts these into their Starlark equivalents. PiperOrigin-RevId: 511823824 Change-Id: If35f8d5f3327b8bae19d75e100c468da4fafc024
diff --git a/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkJavaMethodDoc.java b/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkJavaMethodDoc.java index 15ae698..b2fd12f 100644 --- a/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkJavaMethodDoc.java +++ b/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkJavaMethodDoc.java
@@ -126,7 +126,7 @@ @Override public String getReturnType() { - return Starlark.classType(method.getReturnType()); + return Starlark.classTypeFromJava(method.getReturnType()); } @Override
diff --git a/src/main/java/net/starlark/java/eval/Starlark.java b/src/main/java/net/starlark/java/eval/Starlark.java index 7522f64..545fb28 100644 --- a/src/main/java/net/starlark/java/eval/Starlark.java +++ b/src/main/java/net/starlark/java/eval/Starlark.java
@@ -412,6 +412,42 @@ } /** + * Returns the name of the type of instances of {@code c} after being converted to Starlark values + * by {@link #fromJava}, or "unknown" for {@code Object.class}, since that is used as a wildcard + * type by evaluation machinery. + * + * <p>Note that {@code void.class} is treated as "NoneType" since void methods will return None to + * Starlark. + * + * @throws InvalidStarlarkValueException if {@code c} is not {@code Object.class} and {@link + * #fromJava} would throw for instances of {@code c}. + */ + public static String classTypeFromJava(Class<?> c) { + if (c.equals( + void.class) // Method.invoke on void-returning methods returns null; we treat it as None + || c.equals(String.class) + || c.equals(boolean.class) + || c.equals(Boolean.class) + || StarlarkValue.class.isAssignableFrom(c) + || c.equals(Object.class)) { + return classType(c); + } else if (c.equals(int.class) + || c.equals(Integer.class) + || c.equals(long.class) + || c.equals(Long.class) + || BigInteger.class.isAssignableFrom(c)) { + return classType(StarlarkInt.class); + } else if (c.equals(double.class) || c.equals(Double.class)) { + return classType(StarlarkFloat.class); + } else if (List.class.isAssignableFrom(c)) { + return classType(StarlarkList.class); + } else if (Map.class.isAssignableFrom(c)) { + return classType(Dict.class); + } + throw new InvalidStarlarkValueException(c); + } + + /** * The ordering relation over (some) Starlark values. * * <p>Starlark values are ordered as follows.