You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jt...@apache.org on 2017/12/02 18:33:11 UTC
[incubator-netbeans-html4j] 02/02: Print error when using other
array than Object[]
This is an automated email from the ASF dual-hosted git repository.
jtulach pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans-html4j.git
commit 2ee7501b534f9c36e12b0d3cce384841492a2409
Author: Jaroslav Tulach <ja...@oracle.com>
AuthorDate: Sat Dec 2 19:32:27 2017 +0100
Print error when using other array than Object[]
---
.../html/boot/impl/JavaScriptProcesor.java | 32 +++++++++--
.../java/org/netbeans/html/boot/impl/Arithm.java | 12 +---
.../html/boot/impl/JavaScriptProcesorTest.java | 66 ++++++++++++++++++++++
.../netbeans/html/boot/impl/JsClassLoaderBase.java | 12 ----
.../org/netbeans/html/boot/impl/JsMethods.java | 13 +----
5 files changed, 97 insertions(+), 38 deletions(-)
diff --git a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java
index 956f11f..42b6136 100644
--- a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java
+++ b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java
@@ -118,6 +118,14 @@ public final class JavaScriptProcesor extends AbstractProcessor {
if (!jsb.javacall() && jsb.body().contains(".@")) {
msg.printMessage(Diagnostic.Kind.WARNING, "Usage of .@ usually requires javacall=true", e);
}
+ if (ee.getReturnType().getKind() == TypeKind.ARRAY) {
+ ArrayType at = (ArrayType) ee.getReturnType();
+ TypeMirror objectType = processingEnv.getElementUtils().getTypeElement("java.lang.Object").asType();
+ final TypeMirror componentType = at.getComponentType();
+ if (!processingEnv.getTypeUtils().isSameType(objectType, componentType)) {
+ wrongArrayError(componentType, e);
+ }
+ }
if (jsb.javacall()) {
JsCallback verify = new VerifyCallback(e);
try {
@@ -201,6 +209,10 @@ public final class JavaScriptProcesor extends AbstractProcessor {
return null;
}
+ final void wrongArrayError(TypeMirror paramType, Element method) {
+ processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Don't use " + paramType + " array. Use Object[].", method);
+ }
+
private class VerifyCallback extends JsCallback {
private final Element e;
public VerifyCallback(Element e) {
@@ -217,13 +229,14 @@ public final class JavaScriptProcesor extends AbstractProcessor {
return "";
}
ExecutableElement found = null;
+ String paramTypes = null;
StringBuilder foundParams = new StringBuilder();
for (Element m : type.getEnclosedElements()) {
if (m.getKind() != ElementKind.METHOD) {
continue;
}
if (m.getSimpleName().contentEquals(method)) {
- String paramTypes = findParamTypes((ExecutableElement)m);
+ paramTypes = findParamTypes((ExecutableElement)m);
if (paramTypes.equals(params)) {
found = (ExecutableElement) m;
break;
@@ -248,7 +261,7 @@ public final class JavaScriptProcesor extends AbstractProcessor {
mangledOnes = new TreeMap<String, ExecutableElement>();
javacalls.put(findPkg(e), mangledOnes);
}
- String mangled = JsCallback.mangle(fqn, method, findParamTypes(found));
+ String mangled = JsCallback.mangle(fqn, method, paramTypes);
mangledOnes.put(mangled, found);
}
return "";
@@ -258,10 +271,13 @@ public final class JavaScriptProcesor extends AbstractProcessor {
ExecutableType t = (ExecutableType) method.asType();
StringBuilder sb = new StringBuilder();
sb.append('(');
- for (TypeMirror tm : t.getParameterTypes()) {
+ for (TypeMirror paramType : t.getParameterTypes()) {
+ TypeMirror tm = paramType;
+ boolean isArray = false;
while (tm.getKind() == TypeKind.ARRAY) {
sb.append('[');
tm = ((ArrayType) tm).getComponentType();
+ isArray = true;
}
if (tm.getKind().isPrimitive()) {
switch (tm.getKind()) {
@@ -276,10 +292,18 @@ public final class JavaScriptProcesor extends AbstractProcessor {
default:
throw new IllegalStateException("Unknown " + tm.getKind());
}
+ if (isArray) {
+ wrongArrayError(paramType, method);
+ }
} else {
sb.append('L');
Types tu = processingEnv.getTypeUtils();
- Element elm = tu.asElement(tu.erasure(tm));
+ final TypeMirror erasedType = tu.erasure(tm);
+ TypeMirror objectType = processingEnv.getElementUtils().getTypeElement("java.lang.Object").asType();
+ if (isArray && !processingEnv.getTypeUtils().isSameType(objectType, erasedType)) {
+ wrongArrayError(paramType, method);
+ }
+ Element elm = tu.asElement(erasedType);
dumpElems(sb, elm, ';');
}
}
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/Arithm.java b/boot/src/test/java/org/netbeans/html/boot/impl/Arithm.java
index 6df88af..06eb8b8 100644
--- a/boot/src/test/java/org/netbeans/html/boot/impl/Arithm.java
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/Arithm.java
@@ -27,19 +27,11 @@ public class Arithm {
return a + b;
}
- public int sumInts(int[] arr) {
- int s = 0;
- for (int e : arr) {
- s += e;
- }
- return s;
- }
-
public int sumArr(java.lang.Object[] arr) {
- int[] copy = new int[arr.length];
+ Integer[] copy = new Integer[arr.length];
for (int i = 0; i < arr.length; i++) {
copy[i] = ((Number)arr[i]).intValue();
}
- return sumInts(copy);
+ return 0;
}
}
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/JavaScriptProcesorTest.java b/boot/src/test/java/org/netbeans/html/boot/impl/JavaScriptProcesorTest.java
index 85058fe..a05a600 100644
--- a/boot/src/test/java/org/netbeans/html/boot/impl/JavaScriptProcesorTest.java
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/JavaScriptProcesorTest.java
@@ -95,6 +95,72 @@ public class JavaScriptProcesorTest {
c.assertNoErrors();
}
+ @Test public void primitiveArrayGeneratesAnError() throws IOException {
+ String code = "package x.y.z;\n"
+ + "import net.java.html.js.JavaScriptBody;\n"
+ + "class X {\n"
+ + " @JavaScriptBody(args={\"r\"}, body =\n"
+ + " \"return [ 1, 2 ];\"\n"
+ + " )\n"
+ + " private static native double[] returnPrimitive(Object r);\n"
+ + "}\n";
+
+ Compile c = Compile.create("", code);
+ c.assertErrors();
+ c.assertError("Use Object[]");
+ }
+
+ @Test public void nonObjectArrayGeneratesAnError() throws IOException {
+ String code = "package x.y.z;\n"
+ + "import net.java.html.js.JavaScriptBody;\n"
+ + "class X {\n"
+ + " @JavaScriptBody(args={\"r\"}, body =\n"
+ + " \"return [ 1, 2 ];\"\n"
+ + " )\n"
+ + " private static native Double[] returnPrimitive(Object r);\n"
+ + "}\n";
+
+ Compile c = Compile.create("", code);
+ c.assertErrors();
+ c.assertError("Use Object[]");
+ }
+
+ @Test public void primitiveArrayCallbackGeneratesAnError() throws IOException {
+ String code = "package x.y.z;\n"
+ + "import net.java.html.js.JavaScriptBody;\n"
+ + "class X {\n"
+ + " @JavaScriptBody(args={\"r\"}, javacall = true, body =\n"
+ + " \"return @x.y.z.X::acceptDouble([D)([ 1, 2 ]);\"\n"
+ + " )\n"
+ + " private static native Object[] returnPrimitive(Object r);\n"
+ + " static double[] acceptDouble(double[] arr) {\n"
+ + " return arr;\n"
+ + " }\n"
+ + "}\n";
+
+ Compile c = Compile.create("", code);
+ c.assertErrors();
+ c.assertError("Use Object[]");
+ }
+
+ @Test public void nonObjectArrayCallbackGeneratesAnError() throws IOException {
+ String code = "package x.y.z;\n"
+ + "import net.java.html.js.JavaScriptBody;\n"
+ + "class X {\n"
+ + " @JavaScriptBody(args={\"r\"}, javacall = true, body =\n"
+ + " \"return @x.y.z.X::acceptDouble([Ljava/lang/Double;)([ 1, 2 ]);\"\n"
+ + " )\n"
+ + " private static native Object[] returnPrimitive(Object r);\n"
+ + " static Double[] acceptDouble(Double[] arr) {\n"
+ + " return arr;\n"
+ + " }\n"
+ + "}\n";
+
+ Compile c = Compile.create("", code);
+ c.assertErrors();
+ c.assertError("Use Object[]");
+ }
+
@Test public void misorderNotified() throws IOException {
String code = "package x.y.z;\n"
+ "import net.java.html.js.JavaScriptBody;\n"
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java b/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java
index 620459c..e37ffec 100644
--- a/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java
@@ -259,16 +259,4 @@ public class JsClassLoaderBase {
}
}
- @Test public void sumInts() throws Throwable {
- Method st = methodClass.getMethod("sumInts");
- java.lang.Object res = st.invoke(null);
- assertEquals(res, 3, "The right value");
- }
-
- @Test public void sumArr() throws Throwable {
- Method st = methodClass.getMethod("sumArr");
- java.lang.Object res = st.invoke(null);
- assertEquals(res, 3, "The right value");
- }
-
}
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java b/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java
index cbf5079..f5b2fe0 100644
--- a/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java
@@ -74,21 +74,10 @@ public class JsMethods {
@JavaScriptBody(args = {"r"}, javacall = true, body =
"var array = new Array();\n"
+ "array[0]=1; array[1]=2;\n"
- + "return r.@org.netbeans.html.boot.impl.Arithm::sumInts([I)(array);\n"
- )
- private static native int sumInts(Arithm r);
-
- @JavaScriptBody(args = {"r"}, javacall = true, body =
- "var array = new Array();\n"
- + "array[0]=1; array[1]=2;\n"
+ "return r.@org.netbeans.html.boot.impl.Arithm::sumArr([Ljava/lang/Object;)(array);\n"
)
private static native int sumArr(Arithm r);
- public static int sumInts() {
- return sumInts(new Arithm());
- }
-
public static int sumArr() {
return sumArr(new Arithm());
}
@@ -146,7 +135,7 @@ public class JsMethods {
public static native void callParamTypes(Map<String,Integer> map, int value);
@JavaScriptBody(args = { "a", "b" }, body = "return [ a, b ];")
- public static native double[] both(double a, double b);
+ public static native Object both(double a, double b);
enum Enm {
A, B;
--
To stop receiving notification emails like this one, please contact
"commits@netbeans.apache.org" <co...@netbeans.apache.org>.