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)) {
