Skip to content

Commit 460b33f

Browse files
authored
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.
1 parent 7b05e49 commit 460b33f

File tree

6 files changed

+89
-49
lines changed

6 files changed

+89
-49
lines changed

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

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -71,48 +71,15 @@ public static List<PainlessContextInfo> getContextInfos() throws IOException {
7171
}
7272

7373
public static String getType(Map<String, String> javaNamesToDisplayNames, String javaType) {
74-
int arrayDimensions = 0;
75-
76-
while (javaType.charAt(arrayDimensions) == '[') {
77-
++arrayDimensions;
78-
}
79-
80-
if (arrayDimensions > 0) {
81-
if (javaType.charAt(javaType.length() - 1) == ';') {
82-
javaType = javaType.substring(arrayDimensions + 1, javaType.length() - 1);
83-
} else {
84-
javaType = javaType.substring(arrayDimensions);
85-
}
74+
if (javaType.endsWith("[]") == false) {
75+
return javaNamesToDisplayNames.getOrDefault(javaType, javaType);
8676
}
87-
88-
if ("Z".equals(javaType) || "boolean".equals(javaType)) {
89-
javaType = "boolean";
90-
} else if ("V".equals(javaType) || "void".equals(javaType)) {
91-
javaType = "void";
92-
} else if ("B".equals(javaType) || "byte".equals(javaType)) {
93-
javaType = "byte";
94-
} else if ("S".equals(javaType) || "short".equals(javaType)) {
95-
javaType = "short";
96-
} else if ("C".equals(javaType) || "char".equals(javaType)) {
97-
javaType = "char";
98-
} else if ("I".equals(javaType) || "int".equals(javaType)) {
99-
javaType = "int";
100-
} else if ("J".equals(javaType) || "long".equals(javaType)) {
101-
javaType = "long";
102-
} else if ("F".equals(javaType) || "float".equals(javaType)) {
103-
javaType = "float";
104-
} else if ("D".equals(javaType) || "double".equals(javaType)) {
105-
javaType = "double";
106-
} else if ("org.elasticsearch.painless.lookup.def".equals(javaType)) {
107-
javaType = "def";
108-
} else {
109-
javaType = javaNamesToDisplayNames.get(javaType);
110-
}
111-
112-
while (arrayDimensions-- > 0) {
113-
javaType += "[]";
77+
int bracePosition = javaType.indexOf('[');
78+
String braces = javaType.substring(bracePosition);
79+
String type = javaType.substring(0, bracePosition);
80+
if (javaNamesToDisplayNames.containsKey(type)) {
81+
return javaNamesToDisplayNames.get(type) + braces;
11482
}
115-
11683
return javaType;
11784
}
11885

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,11 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
212212
builder.field(PainlessContextMethodInfo.DECLARING.getPreferredName(), declaring);
213213
builder.field(PainlessContextMethodInfo.NAME.getPreferredName(), name);
214214
builder.field(PainlessContextMethodInfo.RTN.getPreferredName(), rtn);
215-
if (javadoc != null) {
215+
if (javadoc != null && "".equals(javadoc) == false) {
216216
builder.field(JAVADOC.getPreferredName(), javadoc);
217217
}
218218
builder.field(PainlessContextMethodInfo.PARAMETERS.getPreferredName(), parameters);
219-
if (parameterNames != null) {
219+
if (parameterNames != null && parameterNames.size() > 0) {
220220
builder.field(PARAMETER_NAMES.getPreferredName(), parameterNames);
221221
}
222222
builder.endObject();
@@ -268,10 +268,10 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
268268
builder.startObject();
269269
builder.field(PainlessContextConstructorInfo.DECLARING.getPreferredName(), declaring);
270270
builder.field(PainlessContextConstructorInfo.PARAMETERS.getPreferredName(), parameters);
271-
if (parameterNames != null) {
271+
if (parameterNames != null && parameterNames.size() > 0) {
272272
builder.field(PARAMETER_NAMES.getPreferredName(), parameterNames);
273273
}
274-
if (javadoc != null) {
274+
if (javadoc != null && "".equals(javadoc) == false) {
275275
builder.field(JAVADOC.getPreferredName(), javadoc);
276276
}
277277
builder.endObject();
@@ -315,7 +315,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
315315
builder.field(PainlessContextFieldInfo.DECLARING.getPreferredName(), declaring);
316316
builder.field(PainlessContextFieldInfo.NAME.getPreferredName(), name);
317317
builder.field(PainlessContextFieldInfo.TYPE.getPreferredName(), type);
318-
if (javadoc != null) {
318+
if (javadoc != null && "".equals(javadoc) == false) {
319319
builder.field(JAVADOC.getPreferredName(), javadoc);
320320
}
321321
builder.endObject();

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ public class PainlessContextConstructorInfo implements Writeable, ToXContentObje
6363
public PainlessContextConstructorInfo(PainlessConstructor painlessConstructor) {
6464
this (
6565
painlessConstructor.javaConstructor.getDeclaringClass().getName(),
66-
painlessConstructor.typeParameters.stream().map(Class::getName).collect(Collectors.toList())
66+
painlessConstructor.typeParameters.stream()
67+
.map(c -> PainlessContextTypeInfo.getType(c.getName()))
68+
.collect(Collectors.toList())
6769
);
6870
}
6971

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public PainlessContextFieldInfo(PainlessField painlessField) {
6363
this(
6464
painlessField.javaField.getDeclaringClass().getName(),
6565
painlessField.javaField.getName(),
66-
painlessField.typeParameter.getName()
66+
PainlessContextTypeInfo.getType(painlessField.typeParameter.getName())
6767
);
6868
}
6969

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ public PainlessContextMethodInfo(PainlessMethod painlessMethod) {
7272
this(
7373
painlessMethod.javaMethod.getDeclaringClass().getName(),
7474
painlessMethod.javaMethod.getName(),
75-
painlessMethod.returnType.getName(),
76-
painlessMethod.typeParameters.stream().map(Class::getName).collect(Collectors.toList())
75+
PainlessContextTypeInfo.getType(painlessMethod.returnType.getName()),
76+
painlessMethod.typeParameters.stream().map(c -> PainlessContextTypeInfo.getType(c.getName())).collect(Collectors.toList())
7777
);
7878
}
7979

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Licensed to Elasticsearch under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.elasticsearch.painless.action;
21+
22+
public class PainlessContextTypeInfo {
23+
/**
24+
* Translates array types from internal java Field Descriptors (JVM Spec 4.3.2) to readable names. Also translates
25+
* the fully qualified name of the def type to "def".
26+
*/
27+
public static String getType(String javaType) {
28+
int arrayDimensions = 0;
29+
30+
while (javaType.charAt(arrayDimensions) == '[') {
31+
++arrayDimensions;
32+
}
33+
34+
if (arrayDimensions > 0) {
35+
if (javaType.charAt(javaType.length() - 1) == ';') {
36+
// Arrays of object types have the form [L<name>; where <name> is the class path, trimming the L & ;
37+
javaType = javaType.substring(arrayDimensions + 1, javaType.length() - 1);
38+
} else {
39+
javaType = javaType.substring(arrayDimensions);
40+
}
41+
}
42+
43+
if ("Z".equals(javaType) || "boolean".equals(javaType)) {
44+
javaType = "boolean";
45+
} else if ("V".equals(javaType) || "void".equals(javaType)) {
46+
javaType = "void";
47+
} else if ("B".equals(javaType) || "byte".equals(javaType)) {
48+
javaType = "byte";
49+
} else if ("S".equals(javaType) || "short".equals(javaType)) {
50+
javaType = "short";
51+
} else if ("C".equals(javaType) || "char".equals(javaType)) {
52+
javaType = "char";
53+
} else if ("I".equals(javaType) || "int".equals(javaType)) {
54+
javaType = "int";
55+
} else if ("J".equals(javaType) || "long".equals(javaType)) {
56+
javaType = "long";
57+
} else if ("F".equals(javaType) || "float".equals(javaType)) {
58+
javaType = "float";
59+
} else if ("D".equals(javaType) || "double".equals(javaType)) {
60+
javaType = "double";
61+
} else if ("org.elasticsearch.painless.lookup.def".equals(javaType)) {
62+
javaType = "def";
63+
}
64+
65+
while (arrayDimensions-- > 0) {
66+
javaType += "[]";
67+
}
68+
69+
return javaType;
70+
}
71+
}

0 commit comments

Comments
 (0)