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


The following commit(s) were added to refs/heads/develop by this push:
     new d50913c14 MXMLTreeBuilder: fix CData handling with 
[CollapseWhiteSpace] metadata (closes #213)
d50913c14 is described below

commit d50913c14b5b998a82a14e6c14592ad24995e3e2
Author: Josh Tynjala <[email protected]>
AuthorDate: Wed Dec 7 14:18:34 2022 -0800

    MXMLTreeBuilder: fix CData handling with [CollapseWhiteSpace] metadata 
(closes #213)
---
 .../internal/tree/mxml/MXMLTreeBuilder.java        | 81 +++++++++++++++++-----
 1 file changed, 62 insertions(+), 19 deletions(-)

diff --git 
a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLTreeBuilder.java
 
b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLTreeBuilder.java
index 1b37da78b..2672b8b8e 100644
--- 
a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLTreeBuilder.java
+++ 
b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLTreeBuilder.java
@@ -38,6 +38,7 @@ import org.apache.royale.compiler.common.ISourceLocation;
 import org.apache.royale.compiler.common.SourceLocation;
 import org.apache.royale.compiler.config.CompilerDiagnosticsConstants;
 import org.apache.royale.compiler.constants.IASLanguageConstants;
+import org.apache.royale.compiler.constants.IMXMLCoreConstants;
 import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.definitions.ITypeDefinition;
 import org.apache.royale.compiler.definitions.IVariableDefinition;
@@ -474,29 +475,71 @@ public class MXMLTreeBuilder
                                               EnumSet<TextParsingFlags> flags,
                                               Object defaultValue)
     {
-        String text = SourceFragmentsReader.concatLogicalText(fragments);
-        if (propertyNode != null && propertyNode.getName().equals("innerHTML"))
-               text = SourceFragmentsReader.concatPhysicalText(fragments);
-
-        Object value = mxmlDialect.isWhitespace(text) ?
-                       defaultValue :
-                       parseValue(propertyNode, type, text, flags);
-
-        if (value == null)
+        Object value = null;
+        if (type.getQualifiedName().equals(IASLanguageConstants.String)
+                && flags.contains(TextParsingFlags.COLLAPSE_WHITE_SPACE))
         {
-            String typeName = type.getQualifiedName();
-            if (typeName.equals(IASLanguageConstants.String) ||
-                typeName.equals(IASLanguageConstants.Object) ||
-                typeName.equals(IASLanguageConstants.ANY_TYPE))
+            // special case for [CollapseWhiteSpace]
+            // CData should never be collapsed
+            StringBuilder valueSb = new StringBuilder();
+            StringBuilder currentSb = new StringBuilder();
+            EnumSet<TextParsingFlags> cdataFlags = flags.clone();
+            // don't collapse whitespace on CData!
+            cdataFlags.remove(TextParsingFlags.COLLAPSE_WHITE_SPACE);
+            for (ISourceFragment sourceFragment : fragments)
             {
-                value = "";
+                String physicalText = sourceFragment.getPhysicalText();
+                String logicalText = sourceFragment.getLogicalText();
+                if (physicalText.startsWith(IMXMLCoreConstants.cDataStart) && 
!logicalText.startsWith(IMXMLCoreConstants.cDataStart))
+                {
+                    // when encountering CData, parse any regular strings that
+                    // were already encountered
+                    valueSb.append(mxmlDialect.parseString(project, 
currentSb.toString(), flags));
+                    // start with a new builder after the CData
+                    currentSb = new StringBuilder();
+
+                    // parse the CData string separately, since it doesn't have
+                    // the flag to collapse whitespace
+                    valueSb.append(mxmlDialect.parseString(project, 
logicalText, cdataFlags));
+                }
+                else
+                {
+                    // not CData, so concat normally
+                    currentSb.append(logicalText);
+                }
             }
-            if (typeName.equals(IASLanguageConstants.Number) ||
-                typeName.equals(IASLanguageConstants._int) ||
-                typeName.equals(IASLanguageConstants.uint) ||
-                typeName.equals(IASLanguageConstants.Boolean))
+            // parse any regular strings that remain
+            valueSb.append(mxmlDialect.parseString(project, 
currentSb.toString(), flags));
+            value = valueSb.toString();
+        }
+        else
+        {
+            String text = SourceFragmentsReader.concatLogicalText(fragments);
+            if (propertyNode != null && 
propertyNode.getName().equals("innerHTML"))
             {
-                return null;
+                text = SourceFragmentsReader.concatPhysicalText(fragments);
+            }
+
+            value = mxmlDialect.isWhitespace(text) ?
+                        defaultValue :
+                        parseValue(propertyNode, type, text, flags);
+
+            if (value == null)
+            {
+                String typeName = type.getQualifiedName();
+                if (typeName.equals(IASLanguageConstants.String) ||
+                    typeName.equals(IASLanguageConstants.Object) ||
+                    typeName.equals(IASLanguageConstants.ANY_TYPE))
+                {
+                    value = "";
+                }
+                if (typeName.equals(IASLanguageConstants.Number) ||
+                    typeName.equals(IASLanguageConstants._int) ||
+                    typeName.equals(IASLanguageConstants.uint) ||
+                    typeName.equals(IASLanguageConstants.Boolean))
+                {
+                    return null;
+                }
             }
         }
         if (value == null)

Reply via email to