parameter overriding/overloading

Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/deb47fc8
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/deb47fc8
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/deb47fc8

Branch: refs/heads/develop
Commit: deb47fc800dcf6e08f3304af9f3acbe9febc8c61
Parents: 05054cf
Author: Alex Harui <[email protected]>
Authored: Fri Dec 2 12:08:44 2016 -0800
Committer: Alex Harui <[email protected]>
Committed: Mon Dec 5 09:12:17 2016 -0800

----------------------------------------------------------------------
 .../constants/IMetaAttributeConstants.java      |  1 +
 .../definitions/FunctionDefinition.java         |  5 +-
 .../internal/projects/CompilerProject.java      |  6 ++
 .../compiler/internal/projects/FlexProject.java | 39 +++++++++++++
 .../compiler/internal/targets/SWFTarget.java    | 60 ++++++++++++++++++++
 .../compiler/projects/ICompilerProject.java     | 11 ++++
 6 files changed, 121 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/deb47fc8/compiler/src/main/java/org/apache/flex/compiler/constants/IMetaAttributeConstants.java
----------------------------------------------------------------------
diff --git 
a/compiler/src/main/java/org/apache/flex/compiler/constants/IMetaAttributeConstants.java
 
b/compiler/src/main/java/org/apache/flex/compiler/constants/IMetaAttributeConstants.java
index 3d7913b..b30948c 100644
--- 
a/compiler/src/main/java/org/apache/flex/compiler/constants/IMetaAttributeConstants.java
+++ 
b/compiler/src/main/java/org/apache/flex/compiler/constants/IMetaAttributeConstants.java
@@ -199,6 +199,7 @@ public interface IMetaAttributeConstants
        // [SWFOverride]
     static final String ATTRIBUTE_SWFOVERRIDE = "SWFOverride";
     static final String NAME_SWFOVERRIDE_RETURNS = "returns";
+    static final String NAME_SWFOVERRIDE_PARAMS = "params";
     
        // [VisualContentHolder]
     static final String ATTRIBUTE_VISUALCONTENTHOLDER = "VisualContentHolder";

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/deb47fc8/compiler/src/main/java/org/apache/flex/compiler/internal/definitions/FunctionDefinition.java
----------------------------------------------------------------------
diff --git 
a/compiler/src/main/java/org/apache/flex/compiler/internal/definitions/FunctionDefinition.java
 
b/compiler/src/main/java/org/apache/flex/compiler/internal/definitions/FunctionDefinition.java
index b99c44e..0106213 100644
--- 
a/compiler/src/main/java/org/apache/flex/compiler/internal/definitions/FunctionDefinition.java
+++ 
b/compiler/src/main/java/org/apache/flex/compiler/internal/definitions/FunctionDefinition.java
@@ -479,7 +479,10 @@ public class FunctionDefinition extends 
ScopedDefinitionBase implements IFunctio
             ITypeDefinition type1 = param1.resolveType(project);
             ITypeDefinition type2 = param2.resolveType(project);
             if (type1 != type2)
-                return false;
+            {
+                if (!project.isCompatibleOverrideParameterType(this, type1, 
type2, i))
+                    return false;
+            }
 
             // Compare ith parameter 'rest' flag.
             boolean rest1 = param1.isRest();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/deb47fc8/compiler/src/main/java/org/apache/flex/compiler/internal/projects/CompilerProject.java
----------------------------------------------------------------------
diff --git 
a/compiler/src/main/java/org/apache/flex/compiler/internal/projects/CompilerProject.java
 
b/compiler/src/main/java/org/apache/flex/compiler/internal/projects/CompilerProject.java
index 328915e..8176060 100644
--- 
a/compiler/src/main/java/org/apache/flex/compiler/internal/projects/CompilerProject.java
+++ 
b/compiler/src/main/java/org/apache/flex/compiler/internal/projects/CompilerProject.java
@@ -1009,4 +1009,10 @@ public abstract class CompilerProject implements 
ICompilerProject
         return false;
     }
 
+       public boolean isCompatibleOverrideParameterType(IFunctionDefinition 
func,
+                       ITypeDefinition overrideDefinition, ITypeDefinition 
baseDefinition,
+                       int i) {
+        return (baseDefinition == overrideDefinition);
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/deb47fc8/compiler/src/main/java/org/apache/flex/compiler/internal/projects/FlexProject.java
----------------------------------------------------------------------
diff --git 
a/compiler/src/main/java/org/apache/flex/compiler/internal/projects/FlexProject.java
 
b/compiler/src/main/java/org/apache/flex/compiler/internal/projects/FlexProject.java
index 16246c9..602de21 100644
--- 
a/compiler/src/main/java/org/apache/flex/compiler/internal/projects/FlexProject.java
+++ 
b/compiler/src/main/java/org/apache/flex/compiler/internal/projects/FlexProject.java
@@ -2229,6 +2229,44 @@ public class FlexProject extends ASProject implements 
IFlexProject
     }
 
     @Override
+       public boolean isCompatibleOverrideParameterType(
+                       IFunctionDefinition func, ITypeDefinition 
overrideDefinition,
+                       ITypeDefinition baseDefinition, int i)
+    {
+        if (baseDefinition == overrideDefinition)
+            return true;
+        if (targetSettings != null && 
targetSettings.getAllowSubclassOverrides() && overrideDefinition != null && 
baseDefinition != null)
+        {
+               if 
(overrideDefinition.isInstanceOf(baseDefinition.getQualifiedName(), this))
+                       return true;
+               FunctionDefinition f = (FunctionDefinition)func;
+               IMetaTag[] metas = f.getAllMetaTags();
+               for (IMetaTag meta : metas)
+               {
+                       if 
(meta.getTagName().equals(IMetaAttributeConstants.ATTRIBUTE_SWFOVERRIDE))
+                       {
+                               IMetaTagAttribute attr = 
meta.getAttribute(IMetaAttributeConstants.NAME_SWFOVERRIDE_PARAMS);
+                               if (attr != null)
+                               {
+                                       String paramList = attr.getValue();
+                                       String[] parts;
+                                       if (paramList.contains(","))
+                                               parts = paramList.split(",");
+                                       else
+                                       {
+                                               parts = new String[1];
+                                               parts[0] = paramList;
+                                       }
+                                       if 
(parts[i].equals(baseDefinition.getQualifiedName()))
+                                               return true;
+                               }
+                       }
+               }
+        }
+        return false;
+    }
+
+    @Override
     public boolean isValidTypeConversion(IASNode node, IDefinition 
actualDefinition, IDefinition expectedDefinition, FunctionDefinition func)
     {
         if (actualDefinition.getBaseName().equals(IASLanguageConstants._int) &&
@@ -2247,4 +2285,5 @@ public class FlexProject extends ASProject implements 
IFlexProject
         }
         return false;
     }
+
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/deb47fc8/compiler/src/main/java/org/apache/flex/compiler/internal/targets/SWFTarget.java
----------------------------------------------------------------------
diff --git 
a/compiler/src/main/java/org/apache/flex/compiler/internal/targets/SWFTarget.java
 
b/compiler/src/main/java/org/apache/flex/compiler/internal/targets/SWFTarget.java
index 832c116..56df579 100644
--- 
a/compiler/src/main/java/org/apache/flex/compiler/internal/targets/SWFTarget.java
+++ 
b/compiler/src/main/java/org/apache/flex/compiler/internal/targets/SWFTarget.java
@@ -495,6 +495,66 @@ public abstract class SWFTarget extends Target implements 
ISWFTarget
                                                                        break 
metas;
                                                                        }
                                                                }
+                                                               else if 
(keys[i].equals(IMetaAttributeConstants.NAME_SWFOVERRIDE_PARAMS))
+                                                               {
+                                                                       String 
paramList = meta.getValues()[i];
+                                                                       
String[] parts;
+                                                                       if 
(paramList.contains(","))
+                                                                               
parts = paramList.split(",");
+                                                                       else
+                                                                       {
+                                                                               
parts = new String[1];
+                                                                               
parts[0] = paramList;
+                                                                       }
+                                                                       
Vector<Name> newList = new Vector<Name>();
+                                                                       for 
(String part : parts)
+                                                                       {
+                                                                               
int c = part.lastIndexOf(".");
+                                                                               
String packageName = "";
+                                                                               
String baseName = part;
+                                                                               
if (c != -1)
+                                                                               
{
+                                                                               
        packageName = part.substring(0, c);
+                                                                               
        baseName = part.substring(c + 1);
+                                                                               
}
+                                                                               
+                                                                               
Pool<Name> namePool = emitter.getNamePool();
+                                                                               
List<Name> nameList = namePool.getValues();
+                                                                               
boolean foundName = false;
+                                                                               
for (Name name : nameList)
+                                                                               
{
+                                                                               
        String base = name.getBaseName();
+                                                                               
        if (base == null) continue;
+                                                                               
        Namespace ns = name.getSingleQualifier();
+                                                                               
        if (ns == null) continue;
+                                                                               
        String nsName = ns.getName();
+                                                                               
        if (nsName == null) continue;
+                                                                               
        if (base.equals(baseName) &&
+                                                                               
                        nsName.equals(packageName))
+                                                                               
        {
+                                                                               
                newList.add(name);
+                                                                               
        foundName = true;
+                                                                               
        changedABC = true;
+                                                                               
        break;
+                                                                               
        }
+                                                                               
}
+                                                                               
if (!foundName)
+                                                                               
{
+                                                                               
Pool<String> stringPool = emitter.getStringPool();
+                                                                               
stringPool.add(packageName);// theoretically, it won't be added if already there
+                                                                               
stringPool.add(baseName);       // theoretically, it won't be added if already 
there
+                                                                               
        Namespace ns = new Namespace(ABCConstants.CONSTANT_PackageNs, 
packageName);
+                                                                               
        Pool<Namespace> nsPool = emitter.getNamespacePool();
+                                                                               
        nsPool.add(ns);
+                                                                               
        Name name = new Name(ns, baseName);
+                                                                               
        namePool.add(name);
+                                                                               
        newList.add(name);
+                                                                               
        changedABC = true;
+                                                                               
}
+                                                                       }
+                                                                       
method.setParamTypes(newList);
+                                                                       break 
metas;
+                                                               }
                                                        }
                                                }
                                         }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/deb47fc8/compiler/src/main/java/org/apache/flex/compiler/projects/ICompilerProject.java
----------------------------------------------------------------------
diff --git 
a/compiler/src/main/java/org/apache/flex/compiler/projects/ICompilerProject.java
 
b/compiler/src/main/java/org/apache/flex/compiler/projects/ICompilerProject.java
index 91bfea8..abe9588 100644
--- 
a/compiler/src/main/java/org/apache/flex/compiler/projects/ICompilerProject.java
+++ 
b/compiler/src/main/java/org/apache/flex/compiler/projects/ICompilerProject.java
@@ -243,4 +243,15 @@ public interface ICompilerProject
      */
     boolean isValidTypeConversion(IASNode node, IDefinition actualDefinition, 
IDefinition expectedDefinition, FunctionDefinition func);
 
+    /**
+     * @param functionDefinition 
+     * @param overrideDefinition The definition overriding the base 
definition.  
+     * @param baseDefinition The definition being overridden.
+     * @param zero-based index of parameter in list  
+     * @return True if compatible (default is if they are the same)
+     */
+       boolean isCompatibleOverrideParameterType(
+                       IFunctionDefinition functionDefinition, ITypeDefinition 
type1,
+                       ITypeDefinition type2, int i);
+
 }

Reply via email to