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 1c76d573d93d1eecf7be0f5180b2a4c11986da3f
Author: Josh Tynjala <[email protected]>
AuthorDate: Thu Feb 18 11:30:44 2021 -0800

    playerglobal-source-gen: merge parameters when there are multiple 
constructors
---
 .../royale/playerglobal/PlayerglobalSourceGen.java | 181 ++++++++++++++++++---
 1 file changed, 160 insertions(+), 21 deletions(-)

diff --git 
a/playerglobal-source-gen/src/main/java/org/apache/royale/playerglobal/PlayerglobalSourceGen.java
 
b/playerglobal-source-gen/src/main/java/org/apache/royale/playerglobal/PlayerglobalSourceGen.java
index 8b0aa7a..e58e160 100644
--- 
a/playerglobal-source-gen/src/main/java/org/apache/royale/playerglobal/PlayerglobalSourceGen.java
+++ 
b/playerglobal-source-gen/src/main/java/org/apache/royale/playerglobal/PlayerglobalSourceGen.java
@@ -31,6 +31,7 @@ import java.util.Set;
 
 import org.apache.commons.io.FileUtils;
 import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 import org.dom4j.io.SAXReader;
 
@@ -285,7 +286,7 @@ class PlayerglobalSourceGen {
                        isDynamic = true;
                }
 
-               Element apiConstructorElement = 
apiClassifierElement.element("apiConstructor");
+               List<Element> apiConstructorElements = 
apiClassifierElement.elements("apiConstructor");
                List<Element> apiOperationElements = 
apiClassifierElement.elements("apiOperation");
                List<Element> apiValueElements = 
apiClassifierElement.elements("apiValue");
 
@@ -332,8 +333,8 @@ class PlayerglobalSourceGen {
                classBuilder.append(" ");
                classBuilder.append("{");
                classBuilder.append("\n");
-               if (apiConstructorElement != null) {
-                       parseConstructor(apiConstructorElement, className, 
classBuilder);
+               if (apiConstructorElements.size() > 0) {
+                       parseConstructor(apiConstructorElements, className, 
classBuilder);
                }
                for (Element apiOperationElement : apiOperationElements) {
                        parseFunction(apiOperationElement, className, false, 
classBuilder);
@@ -754,28 +755,34 @@ class PlayerglobalSourceGen {
                functionBuilder.append("\n");
        }
 
-       private void parseConstructor(Element apiConstructorElement, String 
contextClassName, StringBuilder functionBuilder)
-                       throws Exception {
-               String constructorName = contextClassName != null ? 
contextClassName
-                               : 
apiConstructorElement.element("apiName").getTextTrim();
-
+       private void parseConstructor(List<Element> apiConstructorElements, 
String contextClassName,
+                       StringBuilder functionBuilder) throws Exception {
+               String constructorName = contextClassName;
                String access = null;
+               List<Element> apiParamElements = null;
 
-               Element apiConstructorDetailElement = 
apiConstructorElement.element("apiConstructorDetail");
-               if (apiConstructorDetailElement == null) {
-                       throw new Exception("apiConstructorDetail not found 
for: " + constructorName);
-               }
-               Element apiConstructorDefElement = 
apiConstructorDetailElement.element("apiConstructorDef");
-               if (apiConstructorDefElement == null) {
-                       throw new Exception("apiConstructorDef not found for: " 
+ constructorName);
-               }
+               for (Element apiConstructorElement : apiConstructorElements) {
+                       if (constructorName == null) {
+                               constructorName = 
apiConstructorElement.element("apiName").getTextTrim();
+                       }
 
-               Element apiAccessElement = 
apiConstructorDefElement.element("apiAccess");
-               if (apiAccessElement != null) {
-                       access = apiAccessElement.attributeValue("value");
-               }
+                       Element apiConstructorDetailElement = 
apiConstructorElement.element("apiConstructorDetail");
+                       if (apiConstructorDetailElement == null) {
+                               throw new Exception("apiConstructorDetail not 
found for: " + constructorName);
+                       }
+                       Element apiConstructorDefElement = 
apiConstructorDetailElement.element("apiConstructorDef");
+                       if (apiConstructorDefElement == null) {
+                               throw new Exception("apiConstructorDef not 
found for: " + constructorName);
+                       }
 
-               List<Element> apiParamElements = 
apiConstructorDefElement.elements("apiParam");
+                       Element apiAccessElement = 
apiConstructorDefElement.element("apiAccess");
+                       if (apiAccessElement != null) {
+                               access = 
apiAccessElement.attributeValue("value");
+                       }
+
+                       List<Element> newApiParamElements = 
apiConstructorDefElement.elements("apiParam");
+                       apiParamElements = mergeParameters(apiParamElements, 
newApiParamElements);
+               }
 
                functionBuilder.append("\t");
                if (access != null && access.length() > 0) {
@@ -792,6 +799,138 @@ class PlayerglobalSourceGen {
                functionBuilder.append("\n");
        }
 
+       private List<Element> mergeParameters(List<Element> apiParamElements1, 
List<Element> apiParamElements2)
+                       throws Exception {
+               if (apiParamElements1 == null) {
+                       return apiParamElements2;
+               }
+               if (apiParamElements2 == null) {
+                       return apiParamElements1;
+               }
+               ArrayList<Element> result = new ArrayList<Element>();
+               for (int i = 0, count = Math.max(apiParamElements1.size(), 
apiParamElements2.size()); i < count; i++) {
+                       Element apiParamElement1 = (apiParamElements1.size() > 
i) ? apiParamElements1.get(i) : null;
+                       Element apiParamElement2 = (apiParamElements2.size() > 
i) ? apiParamElements2.get(i) : null;
+                       if (apiParamElement1 == null) {
+                               Element apiDataElement2 = 
apiParamElement2.element("apiData");
+                               if (apiDataElement2 == null) {
+                                       apiDataElement2 = 
DocumentHelper.createElement("apiData");
+                                       apiDataElement2.setText("null");
+                                       apiParamElement2.add(apiDataElement2);
+                               }
+                               boolean isRest = false;
+                               Element apiTypeElement2 = 
apiParamElement2.element("apiType");
+                               if (apiTypeElement2 != null) {
+                                       String apiTypeValue2 = 
apiTypeElement2.attributeValue("value");
+                                       if ("restParam".equals(apiTypeValue2)) {
+                                               isRest = true;
+                                       }
+                                       
apiParamElement2.remove(apiTypeElement2);
+                               }
+                               apiTypeElement2 = 
DocumentHelper.createElement("apiType");
+                               if (isRest) {
+                                       apiTypeElement2.addAttribute("value", 
"restParam");
+                               } else {
+                                       apiTypeElement2.addAttribute("value", 
"any");
+                               }
+                               apiParamElement2.add(apiTypeElement2);
+                               Element apiOperationClassifierElement2 = 
apiParamElement2.element("apiOperationClassifier");
+                               if (apiOperationClassifierElement2 != null) {
+                                       
apiParamElement2.remove(apiOperationClassifierElement2);
+                               }
+                               result.add(apiParamElement2);
+                               if (isRest) {
+                                       //nothing after rest
+                                       break;
+                               }
+                               continue;
+                       }
+                       if (apiParamElement2 == null) {
+                               Element apiDataElement1 = 
apiParamElement1.element("apiData");
+                               if (apiDataElement1 == null) {
+                                       apiDataElement1 = 
DocumentHelper.createElement("apiData");
+                                       apiDataElement1.setText("null");
+                                       apiParamElement1.add(apiDataElement1);
+                               }
+                               boolean isRest = false;
+                               Element apiTypeElement1 = 
apiParamElement1.element("apiType");
+                               if (apiTypeElement1 != null) {
+                                       String apiTypeValue1 = 
apiTypeElement1.attributeValue("value");
+                                       if ("restParam".equals(apiTypeValue1)) {
+                                               isRest = true;
+                                       }
+                                       
apiParamElement1.remove(apiTypeElement1);
+                               }
+                               apiTypeElement1 = 
DocumentHelper.createElement("apiType");
+                               if (isRest) {
+                                       apiTypeElement1.addAttribute("value", 
"restParam");
+                               } else {
+                                       apiTypeElement1.addAttribute("value", 
"any");
+                               }
+                               apiParamElement1.add(apiTypeElement1);
+                               Element apiOperationClassifierElement1 = 
apiParamElement1.element("apiOperationClassifier");
+                               if (apiOperationClassifierElement1 != null) {
+                                       
apiParamElement1.remove(apiOperationClassifierElement1);
+                               }
+                               result.add(apiParamElement1);
+                               if (isRest) {
+                                       //nothing after rest
+                                       break;
+                               }
+                               continue;
+                       }
+
+                       String paramName = "param" + i;
+                       boolean isRest = false;
+                       Element apiTypeElement1 = 
apiParamElement1.element("apiType");
+                       if (apiTypeElement1 != null) {
+                               String apiTypeValue1 = 
apiTypeElement1.attributeValue("value");
+                               if ("restParam".equals(apiTypeValue1)) {
+                                       isRest = true;
+                                       Element apiItemNameElement1 = 
apiParamElement1.element("apiItemName");
+                                       if (apiItemNameElement1 != null) {
+                                               //keep the existing name
+                                               paramName = 
apiItemNameElement1.getTextTrim();
+                                       }
+                               }
+                       }
+                       Element apiTypeElement2 = 
apiParamElement2.element("apiType");
+                       if (apiTypeElement2 != null) {
+                               String apiTypeValue2 = 
apiTypeElement2.attributeValue("value");
+                               if ("restParam".equals(apiTypeValue2)) {
+                                       isRest = true;
+                                       Element apiItemNameElement2 = 
apiParamElement2.element("apiItemName");
+                                       if (apiItemNameElement2 != null) {
+                                               //keep the existing name
+                                               paramName = 
apiItemNameElement2.getTextTrim();
+                                       }
+                               }
+                       }
+                       Element newApiParamElement = 
DocumentHelper.createElement("apiParam");
+                       Element apiItemNameElement = 
DocumentHelper.createElement("apiItemName");
+                       apiItemNameElement.setText(paramName);
+                       newApiParamElement.add(apiItemNameElement);
+                       Element newApiTypeElement = 
DocumentHelper.createElement("apiType");
+                       if (isRest) {
+                               newApiTypeElement.addAttribute("value", 
"restParam");
+                       } else {
+                               newApiTypeElement.addAttribute("value", "any");
+                       }
+                       newApiParamElement.add(newApiTypeElement);
+                       if (!isRest) {
+                               Element newApiDataElement = 
DocumentHelper.createElement("apiData");
+                               newApiDataElement.setText("null");
+                               newApiParamElement.add(newApiDataElement);
+                       }
+                       result.add(newApiParamElement);
+                       if (isRest) {
+                               //nothing after rest
+                               break;
+                       }
+               }
+               return result;
+       }
+
        private String parseReturnOrParamType(Element apiTypeElement, String 
contextClassName) throws Exception {
                String apiTypeValue = apiTypeElement.attributeValue("value");
                if ("restParam".equals(apiTypeValue)) {

Reply via email to