You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2025/09/15 23:04:38 UTC
(royale-compiler) branch develop updated (071c9ddf7 -> 485402cad)
This is an automated email from the ASF dual-hosted git repository.
joshtynjala pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
from 071c9ddf7 CSS.g: fix Decision can match input warnings for rgb() and rgba()
new 96ea15014 MXMLClassDirectiveProcessor: allow fx:RegExp declaration in MXML when targeting SWF
new 485402cad compiler-jx: add missing emit for fx:RegExp tags in MXML for JS targets
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../royale/compiler/codegen/mxml/IMXMLEmitter.java | 3 +
.../internal/codegen/mxml/MXMLBlockWalker.java | 9 ++
.../internal/codegen/mxml/MXMLEmitter.java | 8 ++
.../codegen/mxml/royale/MXMLRoyaleEmitter.java | 44 +++++++
.../internal/visitor/mxml/MXMLNodeSwitch.java | 5 +-
.../compiler/visitor/mxml/IMXMLBlockVisitor.java | 3 +
.../mxml/royale/TestRoyaleMXMLApplication.java | 140 +++++++++++++++++++++
...oyaleMXMLXML.java => TestRoyaleMXMLRegExp.java} | 74 +----------
.../as/codegen/MXMLClassDirectiveProcessor.java | 32 ++++-
.../test/java/mxml/tags/MXMLRegExpTagTests.java | 64 ++++++++++
.../internal/tree/mxml/MXMLRegExpNodeTests.java | 33 +++++
11 files changed, 343 insertions(+), 72 deletions(-)
copy compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/{TestRoyaleMXMLXML.java => TestRoyaleMXMLRegExp.java} (54%)
create mode 100644 compiler/src/test/java/mxml/tags/MXMLRegExpTagTests.java
(royale-compiler) 02/02: compiler-jx: add missing emit for fx:RegExp tags in MXML for JS targets
Posted by jo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit 485402cad211ab38c1836ea3917c3e64adf499af
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Mon Sep 15 16:04:23 2025 -0700
compiler-jx: add missing emit for fx:RegExp tags in MXML for JS targets
---
.../royale/compiler/codegen/mxml/IMXMLEmitter.java | 3 +
.../internal/codegen/mxml/MXMLBlockWalker.java | 9 ++
.../internal/codegen/mxml/MXMLEmitter.java | 8 ++
.../codegen/mxml/royale/MXMLRoyaleEmitter.java | 44 +++++++
.../internal/visitor/mxml/MXMLNodeSwitch.java | 5 +-
.../compiler/visitor/mxml/IMXMLBlockVisitor.java | 3 +
.../mxml/royale/TestRoyaleMXMLApplication.java | 140 +++++++++++++++++++++
.../codegen/mxml/royale/TestRoyaleMXMLRegExp.java | 89 +++++++++++++
8 files changed, 300 insertions(+), 1 deletion(-)
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/mxml/IMXMLEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/mxml/IMXMLEmitter.java
index 368473eb1..a4e934439 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/mxml/IMXMLEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/mxml/IMXMLEmitter.java
@@ -42,6 +42,7 @@ import org.apache.royale.compiler.tree.mxml.IMXMLMetadataNode;
import org.apache.royale.compiler.tree.mxml.IMXMLNumberNode;
import org.apache.royale.compiler.tree.mxml.IMXMLObjectNode;
import org.apache.royale.compiler.tree.mxml.IMXMLPropertySpecifierNode;
+import org.apache.royale.compiler.tree.mxml.IMXMLRegExpNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRemoteObjectMethodNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRemoteObjectNode;
import org.apache.royale.compiler.tree.mxml.IMXMLScriptNode;
@@ -112,6 +113,8 @@ public interface IMXMLEmitter extends IEmitter
void emitFunction(IMXMLFunctionNode node);
+ void emitRegExp(IMXMLRegExpNode node);
+
//--------------------------------------------------------------------------
void emitLiteral(IMXMLLiteralNode node);
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLBlockWalker.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLBlockWalker.java
index 455044481..1863c6ef1 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLBlockWalker.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLBlockWalker.java
@@ -52,6 +52,7 @@ import org.apache.royale.compiler.tree.mxml.IMXMLNode;
import org.apache.royale.compiler.tree.mxml.IMXMLNumberNode;
import org.apache.royale.compiler.tree.mxml.IMXMLObjectNode;
import org.apache.royale.compiler.tree.mxml.IMXMLPropertySpecifierNode;
+import org.apache.royale.compiler.tree.mxml.IMXMLRegExpNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRemoteObjectMethodNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRemoteObjectNode;
import org.apache.royale.compiler.tree.mxml.IMXMLScriptNode;
@@ -361,6 +362,14 @@ public class MXMLBlockWalker implements IMXMLBlockVisitor, IMXMLBlockWalker
mxmlEmitter.emitFunction(node);
}
+
+ @Override
+ public void visitRegExp(IMXMLRegExpNode node)
+ {
+ debug("visitRegExp()");
+
+ mxmlEmitter.emitRegExp(node);
+ }
//--------------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLEmitter.java
index 8d3fdc3af..e4e6479cc 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLEmitter.java
@@ -27,6 +27,7 @@ import org.apache.royale.compiler.internal.codegen.Emitter;
import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
import org.apache.royale.compiler.projects.ICompilerProject;
import org.apache.royale.compiler.tree.as.IASNode;
+import org.apache.royale.compiler.tree.as.IRegExpLiteralNode;
import org.apache.royale.compiler.tree.mxml.*;
import org.apache.royale.compiler.visitor.IBlockWalker;
import org.apache.royale.compiler.visitor.mxml.IMXMLBlockWalker;
@@ -307,6 +308,13 @@ public class MXMLEmitter extends Emitter implements IMXMLEmitter
emitInstance(node);
}
+ @Override
+ public void emitRegExp(IMXMLRegExpNode node)
+ {
+ IRegExpLiteralNode literalNode = (IRegExpLiteralNode)node.getExpressionNode();
+ write(literalNode.getValue(true));
+ }
+
//--------------------------------------------------------------------------
@Override
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
index 73000515b..ae3fb239e 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
@@ -3380,6 +3380,28 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements
}
}
+ @Override
+ public void emitRegExp(IMXMLRegExpNode node)
+ {
+ if (node.getParent().getNodeID() == ASTNodeID.MXMLDeclarationsID)
+ {
+ primitiveDeclarationNodes.add(node);
+ return;
+ }
+
+ IRegExpLiteralNode literalNode = (IRegExpLiteralNode)node.getExpressionNode();
+
+ MXMLDescriptorSpecifier currentDescriptor = getCurrentDescriptor("ps");
+ currentDescriptor.value = literalNode.getValue(true);
+
+ String id = node.getID();
+ String localId = node.getLocalID();
+ if (id != null || localId != null)
+ {
+ primitiveDeclarationNodes.add(node);
+ }
+ }
+
//--------------------------------------------------------------------------
@Override
@@ -3978,6 +4000,28 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements
write(ASEmitterTokens.SEMICOLON);
break;
}
+ case MXMLRegExpID:
+ {
+ IMXMLRegExpNode regExpNode = (IMXMLRegExpNode)declNode;
+ IASNode expressionNode = regExpNode.getExpressionNode();
+ // it might be a binding expression instead of a literal
+ if (expressionNode instanceof IRegExpLiteralNode)
+ {
+ IRegExpLiteralNode literalNode = (IRegExpLiteralNode) expressionNode;
+ varname = regExpNode.getEffectiveID();
+ writeNewline();
+ write(ASEmitterTokens.THIS);
+ write(ASEmitterTokens.MEMBER_ACCESS);
+ write(varname);
+ write(ASEmitterTokens.SPACE);
+ writeToken(ASEmitterTokens.EQUAL);
+ IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
+ .getASEmitter();
+ asEmitter.emitLiteral(literalNode);
+ write(ASEmitterTokens.SEMICOLON);
+ }
+ break;
+ }
default:
throw new IllegalStateException("Unknown primitive declaration node of type <"
+ declNode.getNodeID()
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/visitor/mxml/MXMLNodeSwitch.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/visitor/mxml/MXMLNodeSwitch.java
index b5c2188bb..57bfe33a2 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/visitor/mxml/MXMLNodeSwitch.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/visitor/mxml/MXMLNodeSwitch.java
@@ -42,6 +42,7 @@ import org.apache.royale.compiler.tree.mxml.IMXMLMetadataNode;
import org.apache.royale.compiler.tree.mxml.IMXMLNumberNode;
import org.apache.royale.compiler.tree.mxml.IMXMLObjectNode;
import org.apache.royale.compiler.tree.mxml.IMXMLPropertySpecifierNode;
+import org.apache.royale.compiler.tree.mxml.IMXMLRegExpNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRemoteObjectMethodNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRemoteObjectNode;
import org.apache.royale.compiler.tree.mxml.IMXMLScriptNode;
@@ -179,6 +180,9 @@ public class MXMLNodeSwitch implements IASNodeStrategy
case MXMLWebServiceOperationID:
visitor.visitWebServiceMethod((IMXMLWebServiceOperationNode) node);
break;
+ case MXMLRegExpID:
+ visitor.visitRegExp((IMXMLRegExpNode) node);
+ break;
case MXMLApplicationID:
case MXMLBindingAttributeID:
case MXMLClassDefinitionID:
@@ -192,7 +196,6 @@ public class MXMLNodeSwitch implements IASNodeStrategy
case MXMLModelPropertyID:
case MXMLModelRootID:
case MXMLPrivateID:
- case MXMLRegExpID:
case MXMLReparentID:
//case MXMLRepeaterID:
case MXMLResourceID:
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/visitor/mxml/IMXMLBlockVisitor.java b/compiler-jx/src/main/java/org/apache/royale/compiler/visitor/mxml/IMXMLBlockVisitor.java
index 55edcd34e..e79fb0b22 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/visitor/mxml/IMXMLBlockVisitor.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/visitor/mxml/IMXMLBlockVisitor.java
@@ -42,6 +42,7 @@ import org.apache.royale.compiler.tree.mxml.IMXMLMetadataNode;
import org.apache.royale.compiler.tree.mxml.IMXMLNumberNode;
import org.apache.royale.compiler.tree.mxml.IMXMLObjectNode;
import org.apache.royale.compiler.tree.mxml.IMXMLPropertySpecifierNode;
+import org.apache.royale.compiler.tree.mxml.IMXMLRegExpNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRemoteObjectMethodNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRemoteObjectNode;
import org.apache.royale.compiler.tree.mxml.IMXMLScriptNode;
@@ -110,6 +111,8 @@ public interface IMXMLBlockVisitor extends IBlockVisitor
void visitFunction(IMXMLFunctionNode node);
+ void visitRegExp(IMXMLRegExpNode node);
+
//--------------------------------------------------------------------------
void visitLiteral(IMXMLLiteralNode node);
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
index dcccaedda..cb049c305 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
@@ -3281,6 +3281,146 @@ public class TestRoyaleMXMLApplication extends RoyaleTestBase
assertOutMXMLPostProcess(outTemplate.replaceAll("AppName", appName), true);
}
+ @Test
+ public void testFXRegExpDeclaration()
+ {
+ String code = "<basic:Application xmlns:fx=\"http://ns.adobe.com/mxml/2009\" xmlns:basic=\"library://ns.apache.org/royale/basic\">"
+ + "<fx:Declarations><fx:RegExp id=\"foo\">/[a-z]{3,} \\d+(oz|g)/ig</fx:RegExp>"
+ + "</fx:Declarations><basic:initialView><basic:View><basic:DropDownList dataProvider=\"['Hello', 'World']\"/></basic:View></basic:initialView></basic:Application>";
+
+ IMXMLDocumentNode dnode = (IMXMLDocumentNode) getNode(code,
+ IMXMLDocumentNode.class, RoyaleTestBase.WRAP_LEVEL_NONE);
+
+ ((JSRoyaleEmitter)(mxmlBlockWalker.getASEmitter())).getModel().setCurrentClass(dnode.getDefinition());
+ mxmlBlockWalker.visitDocument(dnode);
+ String appName = dnode.getQualifiedName();
+ String outTemplate = "/**\n" +
+ " * AppName\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('AppName');\n" +
+ "\n" +
+ "goog.require('org.apache.royale.core.Application');\n" +
+ "goog.require('org.apache.royale.core.View');\n" +
+ "goog.require('org.apache.royale.html.DropDownList');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " * @extends {org.apache.royale.core.Application}\n" +
+ " */\n" +
+ "AppName = function() {\n" +
+ " AppName.base(this, 'constructor');\n" +
+ " \n" +
+ " this.foo = /[a-z]{3,}\\u0020\\d+(oz|g)/ig;\n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {org.apache.royale.core.View}\n" +
+ " */\n" +
+ " this.$ID_8_1;\n" +
+ " \n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {org.apache.royale.html.DropDownList}\n" +
+ " */\n" +
+ " this.$ID_8_0;\n" +
+ " \n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {Array}\n" +
+ " */\n" +
+ " this.mxmldd;\n" +
+ " \n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {Array}\n" +
+ " */\n" +
+ " this.mxmldp;\n" +
+ "\n" +
+ " this.generateMXMLAttributes([\n" +
+ " 1,\n" +
+ " 'initialView',\n" +
+ " false,\n" +
+ " [\n" +
+ " org.apache.royale.core.View,\n" +
+ " 1,\n" +
+ " '_id',\n" +
+ " true,\n" +
+ " '$ID_8_1',\n" +
+ " 0,\n" +
+ " 0,\n" +
+ " [\n" +
+ " org.apache.royale.html.DropDownList,\n" +
+ " 2,\n" +
+ " '_id',\n" +
+ " true,\n" +
+ " '$ID_8_0',\n" +
+ " 'dataProvider',\n" +
+ " true,\n" +
+ " ['Hello','World'],\n" +
+ " 0,\n" +
+ " 0,\n" +
+ " null\n" +
+ " ]\n" +
+ " ],\n" +
+ " 0,\n" +
+ " 0\n" +
+ " ]);\n" +
+ " \n" +
+ "};\n" +
+ "goog.inherits(AppName, org.apache.royale.core.Application);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @type {RegExp}\n" +
+ " */\n" +
+ "AppName.prototype.foo;\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "AppName.prototype.ROYALE_CLASS_INFO = { names: [{ name: 'AppName', qName: 'AppName', kind: 'class' }] };\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "AppName.prototype.ROYALE_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " 'foo': { type: 'RegExp', get_set: function (/** AppName */ inst, /** * */ v) {return v !== undefined ? inst.foo = v : inst.foo;}}\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'AppName': { type: '', declaredBy: 'AppName'}\n"+
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "/**\n" +
+ " * @const\n" +
+ " * @type {number}\n" +
+ " */\n" +
+ "AppName.prototype.ROYALE_COMPILE_FLAGS = 9;";
+
+ assertOutMXMLPostProcess(outTemplate.replaceAll("AppName", appName), true);
+ }
+
@Test
public void testFXArrayDeclaration()
{
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLRegExp.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLRegExp.java
new file mode 100644
index 000000000..b5efd3870
--- /dev/null
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLRegExp.java
@@ -0,0 +1,89 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.apache.royale.compiler.internal.codegen.mxml.royale;
+
+import org.apache.royale.compiler.internal.test.RoyaleTestBase;
+import org.apache.royale.compiler.tree.mxml.IMXMLDeclarationsNode;
+import org.apache.royale.compiler.tree.mxml.IMXMLDocumentNode;
+import org.junit.Test;
+
+public class TestRoyaleMXMLRegExp extends RoyaleTestBase
+{
+ @Test
+ public void testRegExpTag()
+ {
+ String code = "<fx:Declarations>\n"
+ + "\t<fx:RegExp id=\"regexp\">/[a-z]{3,} \\d+(oz|g)/ig</fx:RegExp>\n"
+ + "</fx:Declarations>";
+
+ IMXMLDeclarationsNode declNode = (IMXMLDeclarationsNode) getNode(code,
+ IMXMLDeclarationsNode.class, RoyaleTestBase.WRAP_LEVEL_DOCUMENT);
+ IMXMLDocumentNode docNode = (IMXMLDocumentNode) declNode.getAncestorOfType(IMXMLDocumentNode.class);
+ mxmlBlockWalker.visitDocument(docNode);
+
+ String appName = docNode.getQualifiedName();
+
+ String outTemplate = "/**\n" +
+ " * AppName\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('AppName');\n" +
+ "\n" +
+ "goog.require('org.apache.royale.core.Application');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " * @extends {org.apache.royale.core.Application}\n" +
+ " */\n" +
+ "AppName = function() {\n" +
+ " AppName.base(this, 'constructor');\n" +
+ " \n" +
+ " this.regexp = /[a-z]{3,}\\u0020\\d+(oz|g)/ig;\n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {Array}\n" +
+ " */\n" +
+ " this.mxmldd;\n" +
+ " \n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {Array}\n" +
+ " */\n" +
+ " this.mxmldp;\n" +
+ "};\n" +
+ "goog.inherits(AppName, org.apache.royale.core.Application);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @type {RegExp}\n" +
+ " */\n" +
+ "AppName.prototype.regexp;";
+
+ assertOut(outTemplate.replaceAll("AppName", appName), false);
+ }
+}
(royale-compiler) 01/02: MXMLClassDirectiveProcessor: allow fx:RegExp declaration in MXML when targeting SWF
Posted by jo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit 96ea15014627e6d5fbb0fef901d0e20ab6fff448
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Mon Sep 15 16:02:42 2025 -0700
MXMLClassDirectiveProcessor: allow fx:RegExp declaration in MXML when targeting SWF
---
.../as/codegen/MXMLClassDirectiveProcessor.java | 32 ++++++++++-
.../test/java/mxml/tags/MXMLRegExpTagTests.java | 64 ++++++++++++++++++++++
.../internal/tree/mxml/MXMLRegExpNodeTests.java | 33 +++++++++++
3 files changed, 126 insertions(+), 3 deletions(-)
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/MXMLClassDirectiveProcessor.java b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/MXMLClassDirectiveProcessor.java
index 1d930102e..2cb350516 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/MXMLClassDirectiveProcessor.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/MXMLClassDirectiveProcessor.java
@@ -3012,18 +3012,44 @@ public class MXMLClassDirectiveProcessor extends ClassDirectiveProcessor
// by the expression node being null.
if (isDataBindingNode(regexpNode))
return;
+
+ boolean childrenAsDataCodeGen = isChildrenAsDataCodeGen(regexpNode, context);
+
+ String id = null;
+ Context currentContext = context;
+
+ if (getProject().getTargetSettings().getMxmlChildrenAsData()
+ && regexpNode.getParent() != null
+ && regexpNode.getParent().getNodeID() == ASTNodeID.MXMLDeclarationsID)
+ {
+ id = regexpNode.getEffectiveID();
+ if (id != null)
+ {
+ currentContext = currentContext.parentContext;
+ currentContext.startUsing(IL.PROPERTIES);
+ currentContext.addInstruction(OP_pushstring, id);
+ }
+ }
+
+ if (childrenAsDataCodeGen)
+ currentContext.addInstruction(OP_pushtrue); // simple type
IExpressionNode expressionNode = (IExpressionNode)regexpNode.getExpressionNode();
if (expressionNode != null )
{
InstructionList init_expression = classScope.getGenerator().generateInstructions(
expressionNode, CmcEmitter.__expression_NT, this.classScope);
- context.addAll(init_expression);
+ currentContext.addAll(init_expression);
}
else
{
- context.addInstruction(OP_findpropstrict, ABCGeneratingReducer.regexType);
- context.addInstruction(OP_constructprop, new Object[] {ABCGeneratingReducer.regexType, 0});
+ currentContext.addInstruction(OP_findpropstrict, ABCGeneratingReducer.regexType);
+ currentContext.addInstruction(OP_constructprop, new Object[] {ABCGeneratingReducer.regexType, 0});
+ }
+
+ if (id != null)
+ {
+ currentContext.stopUsing(IL.PROPERTIES, 1);
}
}
diff --git a/compiler/src/test/java/mxml/tags/MXMLRegExpTagTests.java b/compiler/src/test/java/mxml/tags/MXMLRegExpTagTests.java
new file mode 100644
index 000000000..079f764ec
--- /dev/null
+++ b/compiler/src/test/java/mxml/tags/MXMLRegExpTagTests.java
@@ -0,0 +1,64 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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 mxml.tags;
+
+import org.junit.Test;
+
+/**
+ * Feature tests for the MXML {@code <RegExp>} tag.
+ */
+public class MXMLRegExpTagTests extends MXMLInstanceTagTestsBase
+{
+ @Test
+ public void MXMLRegExpTag_basic()
+ {
+ String[] declarations = new String[]
+ {
+ "<fx:RegExp id='r1'>/abc123/</fx:RegExp>",
+ "<fx:RegExp id='r2'>/xyz987/sxgim</fx:RegExp>",
+ "<fx:RegExp id='r3'>/[a-z]{3,} \\d+(oz|g)/ig</fx:RegExp>",
+ };
+ String[] asserts = new String[]
+ {
+ "assertEqual('r1', \"abc123\", r1.source);",
+ "assertEqual('r1', false, r1.dotall);",
+ "assertEqual('r1', false, r1.extended);",
+ "assertEqual('r1', false, r1.global);",
+ "assertEqual('r1', false, r1.ignoreCase);",
+ "assertEqual('r1', false, r1.multiline);",
+
+ "assertEqual('r2', \"xyz987\", r2.source);",
+ "assertEqual('r2', true, r2.dotall);",
+ "assertEqual('r2', true, r2.extended);",
+ "assertEqual('r2', true, r2.global);",
+ "assertEqual('r2', true, r2.ignoreCase);",
+ "assertEqual('r2', true, r2.multiline);",
+
+ "assertEqual('r3', \"[a-z]{3,} \\\\d+(oz|g)\", r3.source);",
+ "assertEqual('r3', false, r3.dotall);",
+ "assertEqual('r3', false, r3.extended);",
+ "assertEqual('r3', true, r3.global);",
+ "assertEqual('r3', true, r3.ignoreCase);",
+ "assertEqual('r3', false, r3.multiline);",
+ };
+ String mxml = getMXML(declarations, asserts);
+ compileAndRun(mxml);
+ }
+}
diff --git a/compiler/src/test/java/org/apache/royale/compiler/internal/tree/mxml/MXMLRegExpNodeTests.java b/compiler/src/test/java/org/apache/royale/compiler/internal/tree/mxml/MXMLRegExpNodeTests.java
index c5a7ea238..ce6572a51 100644
--- a/compiler/src/test/java/org/apache/royale/compiler/internal/tree/mxml/MXMLRegExpNodeTests.java
+++ b/compiler/src/test/java/org/apache/royale/compiler/internal/tree/mxml/MXMLRegExpNodeTests.java
@@ -24,6 +24,8 @@ import static org.junit.Assert.assertThat;
import org.apache.royale.compiler.tree.ASTNodeID;
import org.apache.royale.compiler.tree.as.IASNode;
+import org.apache.royale.compiler.tree.as.IRegExpLiteralNode;
+import org.apache.royale.compiler.tree.as.IRegExpLiteralNode.RegExpFlag;
import org.apache.royale.compiler.tree.mxml.IMXMLFileNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRegExpNode;
import org.junit.Ignore;
@@ -78,6 +80,37 @@ public class MXMLRegExpNodeTests extends MXMLExpressionNodeBaseTests
assertThat("getExpressionNode", node.getExpressionNode(), is((IASNode)null));
}
+ @Test
+ public void MXMLRegExpNode_empty4()
+ {
+ String[] code = new String[]
+ {
+ "<fx:RegExp>//</fx:RegExp>"
+ };
+ IMXMLRegExpNode node = getMXMLRegExpNode(code);
+ assertThat("getExpressionNode", node.getExpressionNode(), is((IASNode)null));
+ }
+
+ @Test
+ public void MXMLRegExpNode_expression()
+ {
+ String[] code = new String[]
+ {
+ "<fx:RegExp>/[a-z]{3,} \\d+(oz|g)/ig</fx:RegExp>"
+ };
+ IMXMLRegExpNode node = getMXMLRegExpNode(code);
+ assertThat("getExpressionNode", node.getExpressionNode().getNodeID(), is(ASTNodeID.LiteralRegexID));
+ testExpressionLocation(node, 11, 34);
+ IRegExpLiteralNode literalNode = (IRegExpLiteralNode) node.getExpressionNode();
+ assertThat("getValue", literalNode.getValue(), is("[a-z]{3,} \\d+(oz|g)"));
+ assertThat("getFlags().contains(s)", literalNode.getFlags().contains(RegExpFlag.DOTALL), is(false));
+ assertThat("getFlags().contains(x)", literalNode.getFlags().contains(RegExpFlag.EXTENDED), is(false));
+ assertThat("getFlags().contains(g)", literalNode.getFlags().contains(RegExpFlag.GLOBAL), is(true));
+ assertThat("getFlags().contains(i)", literalNode.getFlags().contains(RegExpFlag.IGNORECASE), is(true));
+ assertThat("getFlags().contains(m)", literalNode.getFlags().contains(RegExpFlag.MULTILINE), is(false));
+ assertThat("getValue(raw)", literalNode.getValue(true), is("/[a-z]{3,} \\d+(oz|g)/ig"));
+ }
+
@Ignore
@Test
public void MXMLRegExpNode_with_databinding()