From 12bb214a7acc1ca9350f71b721271ac786cf2fb5 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Mon, 30 Mar 2026 12:26:33 +0300 Subject: [PATCH] Restore Component binding in playground interpreter --- .github/scripts/build_javadocs.sh | 22 +++++++ .../playground/PlaygroundRunner.java | 22 ++----- .../playground/PlaygroundSmokeHarness.java | 57 ++++++++----------- 3 files changed, 51 insertions(+), 50 deletions(-) diff --git a/.github/scripts/build_javadocs.sh b/.github/scripts/build_javadocs.sh index 1196320e42..fc257a64f8 100755 --- a/.github/scripts/build_javadocs.sh +++ b/.github/scripts/build_javadocs.sh @@ -13,6 +13,16 @@ else JAVADOC_CMD="javadoc" fi +run_with_timeout() { + local seconds="$1" + shift + if command -v timeout >/dev/null 2>&1; then + timeout "${seconds}" "$@" + return $? + fi + "$@" +} + rm -rf "$CN1_DIR/dist/javadoc" rm -rf "$CN1_DIR/build/tempJavaSources" @@ -21,6 +31,18 @@ mkdir -p "$CN1_DIR/dist/javadoc" cp -r "$CN1_DIR/src/"* "$CN1_DIR/build/tempJavaSources/" +VALIDATE_SNIPPETS_SCRIPT="${SCRIPT_DIR}/validate-extracted-javadoc-snippets.sh" +if [ -x "${VALIDATE_SNIPPETS_SCRIPT}" ]; then + echo "Validating JavaDoc snippets prior to JavaDoc generation..." >&2 + if ! run_with_timeout 300 "${VALIDATE_SNIPPETS_SCRIPT}"; then + status=$? + if [ "${status}" -eq 124 ]; then + echo "JavaDoc snippet validation timed out after 300 seconds." >&2 + fi + exit "${status}" + fi +fi + cat > "$CN1_DIR/build/tempJavaSources/com/codename1/impl/ImplementationFactory.java" <<'EOF' package com.codename1.impl; 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 80684b1e08..9c390df86b 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", resolveDisplayBinding()); - interpreter.set("UIManager", resolveUiManagerBinding()); + 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); @@ -134,29 +134,15 @@ private void bindGlobals(Interpreter interpreter, PlaygroundContext context) thr interpreter.set("GridLayout", GridLayout.class); interpreter.set("LayeredLayout", LayeredLayout.class); interpreter.set("Style", Style.class); + interpreter.set("Component", Component.class); namespace.importPackage("com.codename1.ui"); namespace.importPackage("com.codename1.ui.layouts"); namespace.importPackage("com.codename1.components"); namespace.importPackage("com.codename1.ui.geom"); + namespace.importClass("com.codename1.ui.Component"); namespace.importClass("com.codenameone.playground.PlaygroundContext"); } - private Object resolveDisplayBinding() { - try { - return Display.getInstance(); - } catch (Throwable ex) { - return Display.class; - } - } - - private Object resolveUiManagerBinding() { - try { - return UIManager.getInstance(); - } catch (Throwable ex) { - return UIManager.class; - } - } - private String adaptScript(String script) { String adapted = unwrapSingleTopLevelClass(script); String normalized = adapted == null ? script : adapted; 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 9b7db35539..31279d46b9 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 @@ -4,14 +4,9 @@ import com.codename1.ui.Container; import com.codename1.ui.Display; import com.codename1.ui.Form; -import com.codename1.ui.Button; -import com.codename1.ui.Label; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; import com.codename1.ui.plaf.Style; -import com.codename1.ui.css.CSSThemeCompiler; -import com.codename1.ui.util.MutableResource; -import java.util.Hashtable; import java.util.ArrayList; import java.util.List; @@ -27,36 +22,10 @@ public static void main(String[] args) throws Exception { smokeLifecycleDemo(); smokeRestScriptWithLambda(); smokeStringMethods(); - smokeCssUiidCollectionUsesPreviewOnly(); - smokeCssCompilerAcceptsBasicButtonRule(); + smokeComponentTypeResolvesWithoutExplicitImport(); System.out.println("Playground smoke tests passed."); } - private static void smokeCssUiidCollectionUsesPreviewOnly() { - Container preview = new Container(BoxLayout.y()); - Button button = new Button("Hello"); - Label label = new Label("World"); - preview.addAll(button, label); - - List uiids = PlaygroundCssSupport.collectVisibleUiids(preview); - require(uiids.contains("Button"), "Expected Button UIID completion from preview"); - require(uiids.contains("Label"), "Expected Label UIID completion from preview"); - require(!uiids.contains("BrowserComponent"), "Preview UIID collection must not include app shell/editor UIIDs"); - for (int i = 0; i < uiids.size(); i++) { - require(!uiids.get(i).startsWith("."), "UIID completions should be plain selector names, not dot-prefixed"); - } - } - - private static void smokeCssCompilerAcceptsBasicButtonRule() { - String normalized = PlaygroundCssSupport.normalizeCustomCss("Button {\n color: white;\n}"); - require("Button {\n color: white;\n}".equals(normalized), "Basic Button CSS should remain unchanged"); - CSSThemeCompiler compiler = new CSSThemeCompiler(); - MutableResource resource = new MutableResource(); - compiler.compile(normalized, resource, "PlaygroundCssSmokeTheme"); - Hashtable theme = resource.getTheme("PlaygroundCssSmokeTheme"); - require(theme != null && !theme.isEmpty(), "Compiled CSS theme should produce theme properties"); - } - private static void smokeGeneratedRegistry() throws Exception { GeneratedCN1Access access = GeneratedCN1Access.INSTANCE; require(access.findClass("com.codename1.ui.layouts.BoxLayout") == BoxLayout.class, @@ -218,6 +187,30 @@ public void log(String message) { "Loose script list snippet should log its completion"); } + private static void smokeComponentTypeResolvesWithoutExplicitImport() { + 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( + "Component c = new Label(\"Implicit import works\");\n" + + "c;\n", + context); + + require(result.getComponent() instanceof Label, + "Component type should resolve without explicit import: " + summarizeMessages(result)); + } + private static void require(boolean condition, String message) { if (!condition) { throw new IllegalStateException(message);