Pārlūkot izejas kodu

Scripting: readable array types for context api (#68237)

Instead of fixing up array names post-hoc when generating the api spec
and painless context docs, fix them up in the `_scripts/painless/_context`
API call.
Stuart Tettemer 4 gadi atpakaļ
vecāks
revīzija
460b33f9b2

+ 7 - 40
modules/lang-painless/src/doc/java/org/elasticsearch/painless/ContextGeneratorCommon.java

@@ -71,48 +71,15 @@ public class ContextGeneratorCommon {
     }
 
     public static String getType(Map<String, String> javaNamesToDisplayNames, String javaType) {
-        int arrayDimensions = 0;
-
-        while (javaType.charAt(arrayDimensions) == '[') {
-            ++arrayDimensions;
-        }
-
-        if (arrayDimensions > 0) {
-            if (javaType.charAt(javaType.length() - 1) == ';') {
-                javaType = javaType.substring(arrayDimensions + 1, javaType.length() - 1);
-            } else {
-                javaType = javaType.substring(arrayDimensions);
-            }
+        if (javaType.endsWith("[]") == false) {
+            return javaNamesToDisplayNames.getOrDefault(javaType, javaType);
         }
-
-        if ("Z".equals(javaType) || "boolean".equals(javaType)) {
-            javaType = "boolean";
-        } else if ("V".equals(javaType) || "void".equals(javaType)) {
-            javaType = "void";
-        } else if ("B".equals(javaType) || "byte".equals(javaType)) {
-            javaType = "byte";
-        } else if ("S".equals(javaType) || "short".equals(javaType)) {
-            javaType = "short";
-        } else if ("C".equals(javaType) || "char".equals(javaType)) {
-            javaType = "char";
-        } else if ("I".equals(javaType) || "int".equals(javaType)) {
-            javaType = "int";
-        } else if ("J".equals(javaType) || "long".equals(javaType)) {
-            javaType = "long";
-        } else if ("F".equals(javaType) || "float".equals(javaType)) {
-            javaType = "float";
-        } else if ("D".equals(javaType) || "double".equals(javaType)) {
-            javaType = "double";
-        } else if ("org.elasticsearch.painless.lookup.def".equals(javaType)) {
-            javaType = "def";
-        } else {
-            javaType = javaNamesToDisplayNames.get(javaType);
-        }
-
-        while (arrayDimensions-- > 0) {
-            javaType += "[]";
+        int bracePosition = javaType.indexOf('[');
+        String braces = javaType.substring(bracePosition);
+        String type = javaType.substring(0, bracePosition);
+        if (javaNamesToDisplayNames.containsKey(type)) {
+            return javaNamesToDisplayNames.get(type) + braces;
         }
-
         return javaType;
     }
 

+ 5 - 5
modules/lang-painless/src/doc/java/org/elasticsearch/painless/PainlessInfoJson.java

@@ -212,11 +212,11 @@ public class PainlessInfoJson {
             builder.field(PainlessContextMethodInfo.DECLARING.getPreferredName(), declaring);
             builder.field(PainlessContextMethodInfo.NAME.getPreferredName(), name);
             builder.field(PainlessContextMethodInfo.RTN.getPreferredName(), rtn);
-            if (javadoc != null) {
+            if (javadoc != null && "".equals(javadoc) == false) {
                 builder.field(JAVADOC.getPreferredName(), javadoc);
             }
             builder.field(PainlessContextMethodInfo.PARAMETERS.getPreferredName(), parameters);
-            if (parameterNames != null) {
+            if (parameterNames != null && parameterNames.size() > 0) {
                 builder.field(PARAMETER_NAMES.getPreferredName(), parameterNames);
             }
             builder.endObject();
@@ -268,10 +268,10 @@ public class PainlessInfoJson {
             builder.startObject();
             builder.field(PainlessContextConstructorInfo.DECLARING.getPreferredName(), declaring);
             builder.field(PainlessContextConstructorInfo.PARAMETERS.getPreferredName(), parameters);
-            if (parameterNames != null) {
+            if (parameterNames != null && parameterNames.size() > 0) {
                 builder.field(PARAMETER_NAMES.getPreferredName(), parameterNames);
             }
-            if (javadoc != null) {
+            if (javadoc != null && "".equals(javadoc) == false) {
                 builder.field(JAVADOC.getPreferredName(), javadoc);
             }
             builder.endObject();
@@ -315,7 +315,7 @@ public class PainlessInfoJson {
             builder.field(PainlessContextFieldInfo.DECLARING.getPreferredName(), declaring);
             builder.field(PainlessContextFieldInfo.NAME.getPreferredName(), name);
             builder.field(PainlessContextFieldInfo.TYPE.getPreferredName(), type);
-            if (javadoc != null) {
+            if (javadoc != null && "".equals(javadoc) == false) {
                 builder.field(JAVADOC.getPreferredName(), javadoc);
             }
             builder.endObject();

+ 3 - 1
modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessContextConstructorInfo.java

@@ -63,7 +63,9 @@ public class PainlessContextConstructorInfo implements Writeable, ToXContentObje
     public PainlessContextConstructorInfo(PainlessConstructor painlessConstructor) {
         this (
                 painlessConstructor.javaConstructor.getDeclaringClass().getName(),
-                painlessConstructor.typeParameters.stream().map(Class::getName).collect(Collectors.toList())
+                painlessConstructor.typeParameters.stream()
+                        .map(c -> PainlessContextTypeInfo.getType(c.getName()))
+                        .collect(Collectors.toList())
         );
     }
 

+ 1 - 1
modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessContextFieldInfo.java

@@ -63,7 +63,7 @@ public class PainlessContextFieldInfo implements Writeable, ToXContentObject {
         this(
                 painlessField.javaField.getDeclaringClass().getName(),
                 painlessField.javaField.getName(),
-                painlessField.typeParameter.getName()
+                PainlessContextTypeInfo.getType(painlessField.typeParameter.getName())
         );
     }
 

+ 2 - 2
modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessContextMethodInfo.java

@@ -72,8 +72,8 @@ public class PainlessContextMethodInfo implements Writeable, ToXContentObject {
         this(
                 painlessMethod.javaMethod.getDeclaringClass().getName(),
                 painlessMethod.javaMethod.getName(),
-                painlessMethod.returnType.getName(),
-                painlessMethod.typeParameters.stream().map(Class::getName).collect(Collectors.toList())
+                PainlessContextTypeInfo.getType(painlessMethod.returnType.getName()),
+                painlessMethod.typeParameters.stream().map(c -> PainlessContextTypeInfo.getType(c.getName())).collect(Collectors.toList())
         );
     }
 

+ 71 - 0
modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessContextTypeInfo.java

@@ -0,0 +1,71 @@
+/*
+ * Licensed to Elasticsearch under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch licenses this file to you 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 org.elasticsearch.painless.action;
+
+public class PainlessContextTypeInfo {
+    /**
+     * Translates array types from internal java Field Descriptors (JVM Spec 4.3.2) to readable names.  Also translates
+     * the fully qualified name of the def type to "def".
+     */
+    public static String getType(String javaType) {
+        int arrayDimensions = 0;
+
+        while (javaType.charAt(arrayDimensions) == '[') {
+            ++arrayDimensions;
+        }
+
+        if (arrayDimensions > 0) {
+            if (javaType.charAt(javaType.length() - 1) == ';') {
+                // Arrays of object types have the form [L<name>; where <name> is the class path, trimming the L & ;
+                javaType = javaType.substring(arrayDimensions + 1, javaType.length() - 1);
+            } else {
+                javaType = javaType.substring(arrayDimensions);
+            }
+        }
+
+        if ("Z".equals(javaType) || "boolean".equals(javaType)) {
+            javaType = "boolean";
+        } else if ("V".equals(javaType) || "void".equals(javaType)) {
+            javaType = "void";
+        } else if ("B".equals(javaType) || "byte".equals(javaType)) {
+            javaType = "byte";
+        } else if ("S".equals(javaType) || "short".equals(javaType)) {
+            javaType = "short";
+        } else if ("C".equals(javaType) || "char".equals(javaType)) {
+            javaType = "char";
+        } else if ("I".equals(javaType) || "int".equals(javaType)) {
+            javaType = "int";
+        } else if ("J".equals(javaType) || "long".equals(javaType)) {
+            javaType = "long";
+        } else if ("F".equals(javaType) || "float".equals(javaType)) {
+            javaType = "float";
+        } else if ("D".equals(javaType) || "double".equals(javaType)) {
+            javaType = "double";
+        } else if ("org.elasticsearch.painless.lookup.def".equals(javaType)) {
+            javaType = "def";
+        }
+
+        while (arrayDimensions-- > 0) {
+            javaType += "[]";
+        }
+
+        return javaType;
+    }
+}