playerglobal-source-gen: special case for d...rest that isn't in docs
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 b24a11d..0dca4f1 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
@@ -25,8 +25,10 @@
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.io.FileUtils;
@@ -72,10 +74,24 @@
 			"propertyIsEnumerable", "setPropertyIsEnumerable", "toString", "toLocaleString", "valueOf");
 	private static final List<String> ANY_CONSTRUCTORS = Arrays.asList("Boolean", "Date", "int", "Number", "RegExp",
 			"String", "uint", "XML", "XMLList");
-	private static final List<String> XML_ANY_METHODS = Arrays.asList("addNamespace", "appendChild", "attribute",
+	private static final Map<String, List<String>> REST_METHODS = new HashMap<String, List<String>>();
+	{
+		REST_METHODS.put("Vector$object", Arrays.asList("sort"));
+		REST_METHODS.put("Vector$double", Arrays.asList("sort"));
+		REST_METHODS.put("Vector$int", Arrays.asList("sort"));
+		REST_METHODS.put("Vector$uint", Arrays.asList("sort"));
+	}
+	private static final Map<String, List<String>> ANY_METHODS = new HashMap<String, List<String>>();
+	{
+		REST_METHODS.put("XML", Arrays.asList("addNamespace", "appendChild", "attribute",
 			"child", "contains", "descendants", "elements", "insertChildAfter", "insertChildBefore", "namespace",
 			"prependChild", "processingInstructions", "removeNamespace", "replace", "setChildren", "setName",
-			"setNamespace");
+			"setNamespace"));
+		REST_METHODS.put("XMLList", Arrays.asList("addNamespace", "appendChild", "attribute",
+			"child", "contains", "descendants", "elements", "insertChildAfter", "insertChildBefore", "namespace",
+			"prependChild", "processingInstructions", "removeNamespace", "replace", "setChildren", "setName",
+			"setNamespace"));
+	}
 
 	private File sourceFolder;
 	private File targetFolder;
@@ -975,18 +991,26 @@
 		return ANY_CONSTRUCTORS.contains(contextFunctionName);
 	}
 
-	private boolean isXMLMethodThatNeedsParamsTypedAsAny(String contextClassName, String contextFunctionName) {
-		if (!"XML".equals(contextClassName) && !"XMLList".equals(contextClassName)) {
+	private boolean isMethodThatNeedsParamsTypedAsAny(String contextClassName, String contextFunctionName) {
+		if(!ANY_METHODS.containsKey(contextClassName)) {
 			return false;
 		}
-		return XML_ANY_METHODS.contains(contextFunctionName);
+		return ANY_METHODS.get(contextClassName).contains(contextFunctionName);
+	}
+
+	private boolean isMethodThatNeedsRestParamOnly(String contextClassName, String contextFunctionName) {
+		if(!REST_METHODS.containsKey(contextClassName)) {
+			return false;
+		}
+		return REST_METHODS.get(contextClassName).contains(contextFunctionName);
 	}
 
 	private void parseParameters(List<Element> apiParamElements, String contextClassName, String contextFunctionName,
 			StringBuilder functionBuilder) throws Exception {
 		boolean forceOptionalConstructor = isConstructorThatNeedsParamsTypedAsAny(contextClassName,
 				contextFunctionName);
-		boolean forceAnyType = isXMLMethodThatNeedsParamsTypedAsAny(contextClassName, contextFunctionName);
+		boolean forceRest = isMethodThatNeedsRestParamOnly(contextClassName, contextFunctionName);
+		boolean forceAnyType = isMethodThatNeedsParamsTypedAsAny(contextClassName, contextFunctionName);
 		for (int i = 0; i < apiParamElements.size(); i++) {
 			if (i > 0) {
 				functionBuilder.append(", ");
@@ -994,37 +1018,43 @@
 			Element apiParamElement = apiParamElements.get(i);
 			Element apiTypeElement = apiParamElement.element("apiType");
 			String paramType = null;
-			if (apiTypeElement != null) {
-				String apiTypeValue = apiTypeElement.attributeValue("value");
-				if ("restParam".equals(apiTypeValue)) {
-					functionBuilder.append("...");
-				}
-				paramType = parseReturnOrParamType(apiTypeElement, contextClassName);
+			if(forceRest) {
+				functionBuilder.append("...args");
+				break;
 			}
-			Element apiItemNameElement = apiParamElement.element("apiItemName");
-			if (apiItemNameElement == null) {
-				throw new Exception("apiItemName not found");
-			}
-			functionBuilder.append(apiItemNameElement.getTextTrim());
-			if (forceOptionalConstructor) {
-				//workaround for missing data in asdoc dita
-				functionBuilder.append(":* = null");
-			} else {
-				Element apiOperationClassifierElement = apiParamElement.element("apiOperationClassifier");
-				if (apiOperationClassifierElement != null) {
-					paramType = apiOperationClassifierElement.getTextTrim();
-					paramType = paramType.replace(":", ".");
+			else {
+				if (apiTypeElement != null) {
+					String apiTypeValue = apiTypeElement.attributeValue("value");
+					if ("restParam".equals(apiTypeValue)) {
+						functionBuilder.append("...");
+					}
+					paramType = parseReturnOrParamType(apiTypeElement, contextClassName);
 				}
-				if (forceAnyType) {
-					paramType = "*";
+				Element apiItemNameElement = apiParamElement.element("apiItemName");
+				if (apiItemNameElement == null) {
+					throw new Exception("apiItemName not found");
 				}
-				if (paramType != null) {
-					functionBuilder.append(":");
-					functionBuilder.append(paramType);
-				}
-				Element apiDataElement = apiParamElement.element("apiData");
-				if (apiDataElement != null) {
-					writeVariableOrParameterValue(apiDataElement, paramType, functionBuilder);
+				functionBuilder.append(apiItemNameElement.getTextTrim());
+				if (forceOptionalConstructor) {
+					//workaround for missing data in asdoc dita
+					functionBuilder.append(":* = null");
+				} else {
+					Element apiOperationClassifierElement = apiParamElement.element("apiOperationClassifier");
+					if (apiOperationClassifierElement != null) {
+						paramType = apiOperationClassifierElement.getTextTrim();
+						paramType = paramType.replace(":", ".");
+					}
+					if (forceAnyType) {
+						paramType = "*";
+					}
+					if (paramType != null) {
+						functionBuilder.append(":");
+						functionBuilder.append(paramType);
+					}
+					Element apiDataElement = apiParamElement.element("apiData");
+					if (apiDataElement != null) {
+						writeVariableOrParameterValue(apiDataElement, paramType, functionBuilder);
+					}
 				}
 			}
 		}