You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ms...@apache.org on 2015/06/14 16:30:39 UTC

git commit: [flex-falcon] [refs/heads/develop] - Type inheritence test for supers and interface override replacements. - In JS you can overload methods, as ou can't. For now, all overriden/overloaded methods need to search for the top most definition a

Repository: flex-falcon
Updated Branches:
  refs/heads/develop 53ed68ef7 -> 631f43ec0


Type inheritence test for supers and interface override replacements.
- In JS you can overload methods, as ou can't. For now, all overriden/overloaded
  methods need to search for the top most definition and use it's signature.
  This is far from optimal but hackish works right now.


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

Branch: refs/heads/develop
Commit: 631f43ec00e1b3a911d190208b9dd6b870a5c9b9
Parents: 53ed68e
Author: Michael Schmalle <ms...@apache.org>
Authored: Sun Jun 14 10:29:49 2015 -0400
Committer: Michael Schmalle <ms...@apache.org>
Committed: Sun Jun 14 10:30:30 2015 -0400

----------------------------------------------------------------------
 .../codegen/externals/ExternalsTestUtils.java   |   6 +
 .../codegen/externals/TestTypeInheritence.java  |  87 +++++++
 .../externals_unit_tests/type_inheritence.js    |  62 +++++
 .../externals/emit/ReferenceEmitter.java        |  11 -
 .../externals/reference/ClassReference.java     | 239 ++++++++++++-------
 .../externals/reference/FieldReference.java     |   1 +
 .../externals/reference/MethodReference.java    |  25 +-
 .../externals/reference/ReferenceModel.java     |  15 +-
 .../codegen/externals/utils/FunctionUtils.java  |  25 +-
 9 files changed, 357 insertions(+), 114 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/631f43ec/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/ExternalsTestUtils.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/ExternalsTestUtils.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/ExternalsTestUtils.java
index 5caccc3..4f3092f 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/ExternalsTestUtils.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/ExternalsTestUtils.java
@@ -68,6 +68,12 @@ public class ExternalsTestUtils
         config.addExclude("IDBCursor", "continue");
         config.addExclude("IDBCursor", "delete");
         config.addExclude("IDBObjectStore", "delete");
+
+        // TODO method treated like field
+        config.addFieldExclude("Iterator", "next");
+        config.addExclude("Generator", "next");
+        config.addExclude("LinkStyle", "sheet");
+
     }
 
     public static void addTestExternalsFull(ExternCConfiguration config)

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/631f43ec/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestTypeInheritence.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestTypeInheritence.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestTypeInheritence.java
new file mode 100644
index 0000000..0f71102
--- /dev/null
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestTypeInheritence.java
@@ -0,0 +1,87 @@
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.flex.compiler.internal.codegen.externals;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.flex.compiler.clients.ExternCConfiguration;
+import org.apache.flex.compiler.internal.codegen.externals.reference.ClassReference;
+import org.junit.Test;
+
+public class TestTypeInheritence extends ExternalsTestBase
+{
+
+    @Test
+    public void test_superclasses() throws Exception
+    {
+        compile("type_inheritence.js");
+
+        ClassReference EventTarget = model.getInterfaceReference("EventTarget");
+
+        ClassReference Object = model.getClassReference("Object");
+        ClassReference Foo = model.getClassReference("Foo");
+        ClassReference Bar = model.getClassReference("Bar");
+        ClassReference Baz = model.getClassReference("Baz");
+
+        assertNotNull(Object);
+        assertNotNull(EventTarget);
+        assertNotNull(Foo);
+        assertNotNull(Bar);
+        assertNotNull(Baz);
+
+        assertSame(EventTarget, Foo.getImplementedInterfaces().get(0));
+        assertSame(Object, Foo.getSuperClass());
+        assertSame(Foo, Bar.getSuperClass());
+        assertSame(Bar, Baz.getSuperClass());
+
+        List<ClassReference> superClasses = Baz.getSuperClasses();
+        assertEquals(3, superClasses.size());
+        assertSame(Bar, superClasses.get(0));
+        assertSame(Foo, superClasses.get(1));
+        assertSame(Object, superClasses.get(2));
+
+        assertTrue(Foo.hasMethod("addEventListener"));
+
+        // TODO (mschmalle) need to revisit interface method overload
+        // XXX Since Foo implements EventTarget BUT changes it's signature, we have to
+        // use EventTargt.addEventListener()'s signature
+        String result = client.getEmitter().emit(
+                Foo.getMethod("addEventListener"));
+        assertEquals(
+                "    /**\n     "
+                        + "* @param opt_useCapture [(boolean|undefined)] \n     "
+                        + "* @see [type_inheritence]\n     */\n"
+                        + "    public function addEventListener(type:String, listener:Object, useCapture:Boolean):Object /* undefined */ "
+                        + "{  return null; }\n", result);
+    }
+
+    @Override
+    protected void configure(ExternCConfiguration config) throws IOException
+    {
+        config.setASRoot(ExternalsTestUtils.AS_ROOT_DIR);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/631f43ec/compiler.jx.tests/test-files/externals_unit_tests/type_inheritence.js
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/test-files/externals_unit_tests/type_inheritence.js b/compiler.jx.tests/test-files/externals_unit_tests/type_inheritence.js
new file mode 100644
index 0000000..f9ebe8e
--- /dev/null
+++ b/compiler.jx.tests/test-files/externals_unit_tests/type_inheritence.js
@@ -0,0 +1,62 @@
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+// type logic uses Object as the top of the tree
+/**
+ * @constructor
+ */
+function Object() {}
+
+/**
+ * @interface
+ */
+function EventTarget() {}
+
+/**
+ * @param {string} type
+ * @param {EventListener|function(!Event):(boolean|undefined)} listener
+ * @param {boolean} useCapture
+ * @return {undefined}
+ */
+EventTarget.prototype.addEventListener = function(type, listener, useCapture) {};
+
+/**
+ * @constructor
+ * @implements {EventTarget}
+ */
+function Foo () {}
+
+/**
+ * @param {boolean=} opt_useCapture
+ * @override
+ */
+Foo.prototype.addEventListener = function(type, listener, opt_useCapture) {};
+
+/**
+ * @constructor
+ * @extends {Foo}
+ */
+function Bar () {}
+
+
+/**
+ * @constructor
+ * @extends {Bar}
+ */
+function Baz () {}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/631f43ec/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/emit/ReferenceEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/emit/ReferenceEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/emit/ReferenceEmitter.java
index de531dd..d4046cc 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/emit/ReferenceEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/emit/ReferenceEmitter.java
@@ -108,17 +108,6 @@ public class ReferenceEmitter
             File sourceFile = reference.getFile(model.getConfiguration().getAsConstantRoot());
             FileUtils.write(sourceFile, sb.toString());
         }
-
-        //        StringBuilder sb = new StringBuilder();
-        //        sb.append("package {\n");
-        //        for (Entry<String, ConstantReference2> set : constants.entrySet())
-        //        {
-        //            ConstantReference2 reference = set.getValue();
-        //            emit(reference, sb);
-        //        }
-        //        sb.append("\n}");
-        //        File sourceFile = new File(asRoot, "constants.as");
-        //        FileUtils.write(sourceFile, sb.toString());
     }
 
     public void emit(BaseReference reference, StringBuilder sb)

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/631f43ec/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ClassReference.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ClassReference.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ClassReference.java
index 27947bf..df381c0 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ClassReference.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ClassReference.java
@@ -21,6 +21,7 @@ package org.apache.flex.compiler.internal.codegen.externals.reference;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -221,6 +222,25 @@ public class ClassReference extends BaseReference
         return false;
     }
 
+    public MethodReference getSuperMethod(String methodName)
+    {
+        List<ClassReference> list = getSuperClasses();
+        for (ClassReference reference : list)
+        {
+            if (reference.hasMethod(methodName))
+                return reference.getMethod(methodName);
+        }
+
+        list = getAllImplInterfaces(); // return all our interfaces and all superclass
+        for (ClassReference reference : list)
+        {
+            if (reference.hasMethod(methodName))
+                return reference.getMethod(methodName);
+        }
+
+        return null;
+    }
+
     public List<ClassReference> getSuperClasses()
     {
         ArrayList<ClassReference> result = new ArrayList<ClassReference>();
@@ -230,6 +250,54 @@ public class ClassReference extends BaseReference
             result.add(superClass);
             superClass = superClass.getSuperClass();
         }
+        //        ClassReference objectReference = getModel().getClassReference("Object");
+        //        // TODO tests
+        //        if (objectReference != null)
+        //            result.add(objectReference);
+        return result;
+    }
+
+    public List<ClassReference> getAllImplInterfaces()
+    {
+        ArrayList<ClassReference> result = new ArrayList<ClassReference>();
+        for (JSTypeExpression jsTypeExpression : getComment().getImplementedInterfaces())
+        {
+            String interfaceName = jsTypeExpression.evaluate(null,
+                    getModel().getJSCompiler().getTypeRegistry()).getDisplayName();
+            ClassReference classReference = getModel().getClassReference(
+                    interfaceName);
+            if (classReference != null)
+                result.add(classReference);
+        }
+
+        return result;
+    }
+
+    public List<ClassReference> getImplementedInterfaces()
+    {
+        ArrayList<ClassReference> result = new ArrayList<ClassReference>();
+        for (JSTypeExpression jsTypeExpression : getComment().getImplementedInterfaces())
+        {
+            String interfaceName = jsTypeExpression.evaluate(null,
+                    getModel().getJSCompiler().getTypeRegistry()).toAnnotationString();
+            //System.out.println("      !!!!!!!! [" + interfaceName + "]");
+            ClassReference reference = getModel().getClassReference(
+                    interfaceName);
+            if (reference != null)
+                result.add(reference);
+        }
+        return result;
+    }
+
+    public List<ClassReference> getSuperInterfaces()
+    {
+        ArrayList<ClassReference> result = new ArrayList<ClassReference>();
+        ClassReference superClass = getSuperClass();
+        while (superClass != null)
+        {
+            result.add(superClass);
+            superClass = superClass.getSuperClass();
+        }
         return result;
     }
 
@@ -353,20 +421,12 @@ public class ClassReference extends BaseReference
         sb.append("{\n");
         sb.append("\n");
 
-        printPackageAccess(sb);
-
         if (!isInterface)
         {
             printConstructor(sb);
             sb.append("\n");
         }
 
-        //        for (Entry<String, FieldReference> fieldSet : getStaticFields().entrySet())
-        //        {
-        //            fieldSet.getValue().emit(sb);
-        //            sb.append("\n");
-        //        }
-
         for (Entry<String, FieldReference> fieldSet : getFields().entrySet())
         {
             fieldSet.getValue().emit(sb);
@@ -385,21 +445,6 @@ public class ClassReference extends BaseReference
 
         sb.append("}\n");
         sb.append("}\n"); // package
-
-        //System.out.println(sb.toString());
-    }
-
-    private void printPackageAccess(StringBuilder sb)
-    {
-        if (!isQualifiedName())
-            return;
-
-        // get all classes that are @const AND object literal
-
-        // chrome.runtime
-        //        String packageName = getPackageName();
-        //        String[] split = packageName.split("\\.");
-        //        sb.append("    public static var " + split[split.length - 1] + ";\n");
     }
 
     private void printClass(StringBuilder sb)
@@ -425,12 +470,16 @@ public class ClassReference extends BaseReference
             printSuperClass(sb);
             sb.append(" ");
         }
-        //
-        //        if (TagUtils.hasTags(this, "implements"))
-        //        {
-        //            printImplements(sb);
-        //            sb.append(" ");
-        //        }
+        else
+        {
+            // XXX JSObject extends
+            //sb.append("extends JSObject ");
+        }
+
+        if (!isInterface())
+        {
+            printImplements(sb);
+        }
     }
 
     private void printInterface(StringBuilder sb)
@@ -439,11 +488,22 @@ public class ClassReference extends BaseReference
 
         sb.append(getQualifiedName() + " ");
 
-        //        if (TagUtils.hasTags(this, "extends"))
-        //        {
-        //            printSuperClass(sb);
-        //            sb.append(" ");
-        //        }
+        List<JSTypeExpression> extendedInterfaces = getComment().getExtendedInterfaces();
+        int len = extendedInterfaces.size();
+        int i = 0;
+        if (len > 0)
+        {
+            sb.append("extends ");
+            for (JSTypeExpression jsTypeExpression : extendedInterfaces)
+            {
+                String value = jsTypeExpression.evaluate(null,
+                        getModel().getJSCompiler().getTypeRegistry()).toAnnotationString();
+                sb.append(value);
+                if (i < len - 1)
+                    sb.append(", ");
+            }
+            sb.append(" ");
+        }
     }
 
     private void printSuperClass(StringBuilder sb)
@@ -454,22 +514,25 @@ public class ClassReference extends BaseReference
         sb.append(value);
     }
 
-    @SuppressWarnings("unused")
     private void printImplements(StringBuilder sb)
     {
-        //        if (TagUtils.hasTags(this, "implements"))
-        //        {
-        //            sb.append("implements ");
-        //            List<DocletTag> impls = TagUtils.getTags(this, "implements");
-        //            int len = impls.size();
-        //            for (int i = 0; i < len; i++)
-        //            {
-        //                String value = impls.get(0).getValue();
-        //                sb.append(value.substring(1, value.length() - 1));
-        //                if (i < len - 1)
-        //                    sb.append(", ");
-        //            }
-        //        }
+        List<JSTypeExpression> implementedInterfaces = getComment().getImplementedInterfaces();
+        if (implementedInterfaces.size() == 0)
+            return;
+
+        sb.append("implements ");
+
+        int len = implementedInterfaces.size();
+        for (int i = 0; i < len; i++)
+        {
+            String value = implementedInterfaces.get(i).evaluate(null,
+                    getModel().getJSCompiler().getTypeRegistry()).getDisplayName();
+            sb.append(value);
+            if (i < len - 1)
+                sb.append(", ");
+        }
+
+        sb.append(" ");
     }
 
     private void printConstructor(StringBuilder sb)
@@ -518,18 +581,18 @@ public class ClassReference extends BaseReference
 
     public boolean isMethodOverrideFromInterface(MethodReference reference)
     {
-        //        if (!hasImplementations())
-        //            return false;
-        //
-        //        List<DocletTag> impls = TagUtils.getTags(this, "implements");
-        //        for (DocletTag docletTag : impls)
-        //        {
-        //            String interfaceName = docletTag.getValue().trim();
-        //            interfaceName = interfaceName.substring(1,
-        //                    interfaceName.length() - 1);
-        //            ClassReference2 classReference = model.getClassReference(interfaceName);
-        //            return classReference.hasMethod(reference.getName());
-        //        }
+        if (!hasImplementations())
+            return false;
+
+        List<JSTypeExpression> implementedInterfaces = getComment().getImplementedInterfaces();
+        for (JSTypeExpression jsTypeExpression : implementedInterfaces)
+        {
+            String interfaceName = jsTypeExpression.evaluate(null,
+                    getModel().getJSCompiler().getTypeRegistry()).getDisplayName();
+            ClassReference classReference = getModel().getClassReference(
+                    interfaceName);
+            return classReference.hasSuperMethod(reference.getQualifiedName());
+        }
 
         return false;
     }
@@ -537,29 +600,33 @@ public class ClassReference extends BaseReference
     public MethodReference getMethodOverrideFromInterface(
             MethodReference reference)
     {
-        //        if (!hasImplementations())
-        //            return null;
-        //
-        //        List<DocletTag> impls = TagUtils.getTags(this, "implements");
-        //        for (DocletTag docletTag : impls)
-        //        {
-        //            String interfaceName = docletTag.getValue().trim();
-        //            interfaceName = interfaceName.substring(1,
-        //                    interfaceName.length() - 1);
-        //            ClassReference2 classReference = model.getClassReference(interfaceName);
-        //            return classReference.getMethods().get(reference.getName());
-        //        }
+        // get all super classes, reverse and search top down
+        List<ClassReference> superClasses = getSuperClasses();
+        superClasses.add(0, this);
+        Collections.reverse(superClasses);
+
+        // for each superclass, get all implemented interfaces
+        for (ClassReference classReference : superClasses)
+        {
+            List<ClassReference> interfaces = classReference.getImplementedInterfaces();
+            for (ClassReference interfaceReference : interfaces)
+            {
+                // check for the method on the interface
+                MethodReference method = interfaceReference.getMethod(reference.getBaseName());
+                if (method != null)
+                    return method;
+            }
+        }
 
         return null;
     }
 
-    @SuppressWarnings("unused")
     private boolean hasImplementations()
     {
         return getComment().getImplementedInterfaceCount() > 0;
     }
 
-    public boolean hasImplements(String interfaceName)
+    public boolean _hasImplements(String interfaceName)
     {
         //        boolean hasImplements = TagUtils.hasTags(this, "implements");
         //        if (hasImplements)
@@ -577,6 +644,9 @@ public class ClassReference extends BaseReference
 
     public ClassReference getSuperClass()
     {
+        if (getBaseName().equals("Object"))
+            return null;
+
         JSTypeExpression baseType = getComment().getBaseType();
         if (baseType != null)
         {
@@ -585,6 +655,11 @@ public class ClassReference extends BaseReference
             if (jsType != null)
                 return getModel().getClassReference(jsType.getDisplayName());
         }
+        else
+        {
+            return getModel().getObjectReference();
+        }
+
         return null;
     }
 
@@ -613,22 +688,6 @@ public class ClassReference extends BaseReference
         return false;
     }
 
-    @SuppressWarnings("unused")
-    private List<ClassReference> getSuperInterfaces()
-    {
-        ArrayList<ClassReference> result = new ArrayList<ClassReference>();
-        //        if (!TagUtils.hasTags(this, "implements"))
-        //            return result;
-        //
-        //        List<DocletTag> impls = TagUtils.getTags(this, "implements");
-        //        for (DocletTag tag : impls)
-        //        {
-        //            String type = TagUtils.getType(tag);
-        //            result.add(model.getClassReference(type));
-        //        }
-        return result;
-    }
-
     public boolean hasLocalMethodConflict(String functionName)
     {
         return methods.containsKey(functionName);

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/631f43ec/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/FieldReference.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/FieldReference.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/FieldReference.java
index 1a85ff4..e6e92cf 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/FieldReference.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/FieldReference.java
@@ -79,6 +79,7 @@ public class FieldReference extends MemberReference
         if (excluded != null)
         {
             excluded.print(sb);
+            return; // XXX (mschmalle) accessors are not treated right, need to exclude get/set
         }
 
         if (!getClassReference().isInterface() && !getComment().isOverride())

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/631f43ec/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/MethodReference.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/MethodReference.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/MethodReference.java
index 3c98137..fba7caf 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/MethodReference.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/MethodReference.java
@@ -87,9 +87,6 @@ public class MethodReference extends MemberReference
             return;
         }
 
-        if (isOverride())
-            return;
-
         if (getClassReference().hasSuperMethod(getQualifiedName()))
             return;
 
@@ -106,9 +103,20 @@ public class MethodReference extends MemberReference
             staticValue = "";
 
         String isOverride = "";
-        //        if (TagUtils.hasTags(this, "override"))
+
+        if (!getClassReference().isInterface())
+        {
+            MethodReference overrideFromInterface = getClassReference().getMethodOverrideFromInterface(
+                    this);
+            if (/*isOverride() && */overrideFromInterface != null)
+            {
+                override = overrideFromInterface;
+            }
+        }
+
+        //        if (isOverride())
         //        {
-        //            isOverride = "override ";
+        //            //isOverride = "override ";
         //            if (getClassReference().isMethodOverrideFromInterface(this))
         //            {
         //                override = getClassReference().getMethodOverrideFromInterface(
@@ -166,13 +174,14 @@ public class MethodReference extends MemberReference
 
     private String transformReturnString()
     {
-        return FunctionUtils.transformReturnString(getContext(), getComment());
+        return FunctionUtils.transformReturnString(getContext(),
+                getContext().getComment());
     }
 
     private String toPrameterString()
     {
-        return FunctionUtils.toPrameterString(getContext(), getComment(),
-                paramNode);
+        return FunctionUtils.toPrameterString(getContext(),
+                getContext().getComment(), paramNode);
     }
 
     public boolean isOverride()

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/631f43ec/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ReferenceModel.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ReferenceModel.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ReferenceModel.java
index b4ea9dd..229953f 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ReferenceModel.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ReferenceModel.java
@@ -61,6 +61,11 @@ public class ReferenceModel
         return configuration;
     }
 
+    public ClassReference getObjectReference()
+    {
+        return classes.get("Object");
+    }
+
     public Collection<String> getNamespaces()
     {
         return namespaces;
@@ -96,6 +101,14 @@ public class ReferenceModel
         return classes.get(qualifiedName);
     }
 
+    public ClassReference getInterfaceReference(String qualifiedName)
+    {
+        ClassReference reference = classes.get(qualifiedName);
+        if (reference != null && reference.isInterface())
+            return reference;
+        return null;
+    }
+
     public void addNamespace(Node node, String qualifiedName)
     {
         if (namespaces.contains(qualifiedName))
@@ -118,7 +131,6 @@ public class ReferenceModel
         }
 
         log("Model.addClass(" + qualifiedName + ")");
-
         ClassReference reference = new ClassReference(this, node, qualifiedName);
         classes.put(qualifiedName, reference);
     }
@@ -306,4 +318,5 @@ public class ReferenceModel
     {
         DebugLogUtils.err(message);
     }
+
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/631f43ec/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/utils/FunctionUtils.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/utils/FunctionUtils.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/utils/FunctionUtils.java
index e6a8a39..6a21cd4 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/utils/FunctionUtils.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/utils/FunctionUtils.java
@@ -63,7 +63,7 @@ public class FunctionUtils
         {
             int index = 0;
             int len = comment.getParameterCount();
-
+            //int childCount = paramNode.getChildCount();
             if (len == 0)
             {
                 len = paramNode.getChildCount();
@@ -79,6 +79,20 @@ public class FunctionUtils
                     }
                 }
             }
+            //            else if (len != childCount)
+            //            {
+            //                // XXX Match up existing @param tags with parameters
+            //                if (childCount > 0)
+            //                {
+            //                    for (Node param : paramNode.children())
+            //                    {
+            //                        sb.append(param.getString() + ":Object");
+            //                        if (index < childCount - 1)
+            //                            sb.append(", ");
+            //                        index++;
+            //                    }
+            //                }
+            //            }
             else
             {
                 for (String paramName : comment.getParameterNames())
@@ -101,13 +115,16 @@ public class FunctionUtils
     public static String toParameter(BaseReference reference,
             JSDocInfo comment, String paramName, JSTypeExpression parameterType)
     {
+        StringBuilder sb = new StringBuilder();
+
         if (parameterType == null)
         {
-            return "Object /* TODO is this correct? */";
+            sb.append(paramName);
+            sb.append(":");
+            sb.append("Object /* TODO is this correct? */");
+            return sb.toString();
         }
 
-        StringBuilder sb = new StringBuilder();
-
         //JSTypeExpression parameterType = comment.getParameterType(paramName);
 
         ImmutableList<String> names = comment.getTemplateTypeNames();