diff --git a/scripts/cn1playground/common/src/main/java/bsh/Reflect.java b/scripts/cn1playground/common/src/main/java/bsh/Reflect.java index f9f24b218a..f5b9442d68 100644 --- a/scripts/cn1playground/common/src/main/java/bsh/Reflect.java +++ b/scripts/cn1playground/common/src/main/java/bsh/Reflect.java @@ -64,15 +64,34 @@ public static Object invokeObjectMethod(Object object, String methodName, Object } } if (object instanceof Class) { + Class classObject = (Class) object; + if ("getName".equals(methodName) && (args == null || args.length == 0)) { + return classObject.getName(); + } + if ("getSimpleName".equals(methodName) && (args == null || args.length == 0)) { + return classObject.getSimpleName(); + } try { return invokeStaticMethod(interpreter == null ? null : interpreter.getClassManager(), - (Class) object, methodName, args, callerInfo, callstack); + classObject, methodName, args, callerInfo, callstack); } catch (ReflectError e) { throw new EvalError(e.getMessage(), callerInfo, callstack, e); } catch (UtilEvalError e) { throw e.toEvalError(callerInfo, callstack); } } + if ("getClass".equals(methodName) && (args == null || args.length == 0)) { + return object.getClass(); + } + if ("hashCode".equals(methodName) && (args == null || args.length == 0)) { + return Integer.valueOf(object.hashCode()); + } + if ("toString".equals(methodName) && (args == null || args.length == 0)) { + return object.toString(); + } + if ("equals".equals(methodName) && args != null && args.length == 1) { + return Boolean.valueOf(object.equals(args[0])); + } if (PlaygroundContext.interceptMethodInvocation(object, methodName, unwrapArgs(args))) { return Primitive.VOID; } diff --git a/scripts/cn1playground/common/src/main/java/com/codenameone/playground/PlaygroundRunner.java b/scripts/cn1playground/common/src/main/java/com/codenameone/playground/PlaygroundRunner.java index 4204386b3b..63452b2ec9 100644 --- a/scripts/cn1playground/common/src/main/java/com/codenameone/playground/PlaygroundRunner.java +++ b/scripts/cn1playground/common/src/main/java/com/codenameone/playground/PlaygroundRunner.java @@ -124,8 +124,8 @@ private void bindGlobals(Interpreter interpreter, PlaygroundContext context) thr interpreter.set("theme", context.getTheme()); interpreter.set("hostForm", context.getHostForm()); interpreter.set("previewRoot", context.getPreviewRoot()); - interpreter.set("Display", Display.getInstance()); - interpreter.set("UIManager", UIManager.getInstance()); + interpreter.set("display", Display.getInstance()); + interpreter.set("uiManager", UIManager.getInstance()); interpreter.set("FontImage", FontImage.class); interpreter.set("CN", com.codename1.ui.CN.class); interpreter.set("BoxLayout", BoxLayout.class); diff --git a/scripts/cn1playground/common/src/test/java/com/codenameone/playground/PlaygroundSmokeHarness.java b/scripts/cn1playground/common/src/test/java/com/codenameone/playground/PlaygroundSmokeHarness.java index f8fc5e2be0..c7ac006b9f 100644 --- a/scripts/cn1playground/common/src/test/java/com/codenameone/playground/PlaygroundSmokeHarness.java +++ b/scripts/cn1playground/common/src/test/java/com/codenameone/playground/PlaygroundSmokeHarness.java @@ -24,6 +24,7 @@ public static void main(String[] args) throws Exception { smokeRestScriptWithLambda(); smokeStringMethods(); smokeComponentTypeResolvesWithoutExplicitImport(); + smokeUIManagerClassImportDoesNotCollideWithGlobals(); System.out.println("Playground smoke tests passed."); } @@ -212,6 +213,40 @@ public void log(String message) { "Component type should resolve without explicit import: " + summarizeMessages(result)); } + + private static void smokeUIManagerClassImportDoesNotCollideWithGlobals() { + Display.init(null); + + Form host = new Form("Host", new BorderLayout()); + Container preview = new Container(new BorderLayout()); + host.add(BorderLayout.CENTER, preview); + host.show(); + + PlaygroundContext context = new PlaygroundContext(host, preview, null, + new PlaygroundContext.Logger() { + public void log(String message) { + } + }); + + PlaygroundRunner runner = new PlaygroundRunner(); + PlaygroundRunner.RunResult result = runner.run( + "import com.codename1.ui.plaf.Border;\n" + + "import com.codename1.ui.plaf.UIManager;\n" + + "Button top = new Button(\"Top\");\n" + + "String cls = top.getClass().getName();\n" + + "UIManager uim = UIManager.getInstance();\n" + + "boolean hasArrow = uim.isThemeConstant(\"PopupDialogArrowBool\", false);\n" + + "InteractionDialog it = new InteractionDialog();\n" + + "it.setUIID(\"PopupDialog\");\n" + + "Border b = it.getStyle().getBorder();\n" + + "Container c = BorderLayout.north(top);\n" + + "c.add(BorderLayout.CENTER, new Label(cls + \" \" + (hasArrow ? \"1\" : \"0\") + \" \" + (b == null ? \"null\" : b.getClass().getName())));\n" + + "c;\n", + context); + + require(result.getComponent() instanceof Container, + "UIManager import snippet should produce a Container: " + summarizeMessages(result)); + } private static void require(boolean condition, String message) { if (!condition) { throw new IllegalStateException(message);