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


The following commit(s) were added to refs/heads/develop by this push:
     new a3f12492b externc: more exhaustive search for field and method 
overrides from interfaces
a3f12492b is described below

commit a3f12492b6bd5bd66a6af5ff1f7025d3df8c584a
Author: Josh Tynjala <[email protected]>
AuthorDate: Wed Feb 18 14:31:41 2026 -0800

    externc: more exhaustive search for field and method overrides from 
interfaces
    
    Was searching directly implemented interfaces, but was not searching the 
interfaces that were extended by the first set of interfaces
---
 .../codegen/typedefs/reference/ClassReference.java | 106 +++++++++------------
 .../codegen/typedefs/reference/FieldReference.java |  16 ++--
 .../typedefs/reference/MethodReference.java        |  12 +--
 3 files changed, 54 insertions(+), 80 deletions(-)

diff --git 
a/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/ClassReference.java
 
b/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/ClassReference.java
index 9db550cd1..2cda66c2d 100644
--- 
a/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/ClassReference.java
+++ 
b/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/ClassReference.java
@@ -576,15 +576,38 @@ public class ClassReference extends BaseReference
 
     public List<ClassReference> getSuperInterfaces()
     {
-        ArrayList<ClassReference> result = new ArrayList<ClassReference>();
-        result.addAll(getInterfaces());
+        Set<ClassReference> allInterfaces = new HashSet<ClassReference>();
+        if (isInterface())
+        {
+            allInterfaces.addAll(getExtendedInterfaces());
+        }
+        else
+        {
+            allInterfaces.addAll(getInterfaces());
 
-        ClassReference superClass = getSuperClass();
-        while (superClass != null)
+            ClassReference superClass = getSuperClass();
+            while (superClass != null)
+            {
+                allInterfaces.addAll(superClass.getInterfaces());
+                superClass = superClass.getSuperClass();
+            }
+        }
+
+        int prevSize;
+        do
         {
-            result.addAll(superClass.getInterfaces());
-            superClass = superClass.getSuperClass();
+            prevSize = allInterfaces.size();
+            Set<ClassReference> extraInterfaces = new 
HashSet<ClassReference>();
+            for (ClassReference current : allInterfaces)
+            {
+                extraInterfaces.addAll(current.getSuperInterfaces());
+            }
+
+            allInterfaces.addAll(extraInterfaces);
         }
+        while (prevSize != allInterfaces.size());
+
+        List<ClassReference> result = new 
ArrayList<ClassReference>(allInterfaces);
         Collections.sort(result);
         return result;
     }
@@ -684,12 +707,9 @@ public class ClassReference extends BaseReference
 
         if (!hasImplementations())
         {
-            List<JSTypeExpression> implementedInterfaces = 
getComment().getImplementedInterfaces();
-            for (JSTypeExpression jsTypeExpression : implementedInterfaces)
+            for (ClassReference interfaceReference : getSuperInterfaces())
             {
-                String interfaceName = 
getModel().evaluate(jsTypeExpression).getDisplayName();
-                ClassReference classReference = 
getModel().getClassReference(interfaceName);
-                if (classReference.hasSuperField(reference.getQualifiedName()))
+                if 
(interfaceReference.hasSuperField(reference.getQualifiedName()))
                 {
                     isFieldOverrideFromInterface = true;
                     break;
@@ -702,22 +722,13 @@ public class ClassReference extends BaseReference
 
     public FieldReference getFieldOverrideFromInterface(FieldReference 
reference)
     {
-        // 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)
+        for (ClassReference interfaceReference : getSuperInterfaces())
         {
-            List<ClassReference> interfaces = 
classReference.getImplementedInterfaces();
-            for (ClassReference interfaceReference : interfaces)
-            {
-                // check for the field on the interface
-                FieldReference field = 
interfaceReference.getInstanceField(reference.getBaseName());
-                if (field != null)
-                    return field;
-            }
+            // check for the field on the interface
+            FieldReference field = 
interfaceReference.getInstanceField(reference.getBaseName());
+            if (field != null)
+                return field;
         }
 
         return null;
@@ -729,12 +740,9 @@ public class ClassReference extends BaseReference
 
         if (!hasImplementations())
         {
-            List<JSTypeExpression> implementedInterfaces = 
getComment().getImplementedInterfaces();
-            for (JSTypeExpression jsTypeExpression : implementedInterfaces)
+            for (ClassReference interfaceReference : getSuperInterfaces())
             {
-                String interfaceName = 
getModel().evaluate(jsTypeExpression).getDisplayName();
-                ClassReference classReference = 
getModel().getClassReference(interfaceName);
-                if 
(classReference.hasSuperMethod(reference.getQualifiedName()))
+                if 
(interfaceReference.hasSuperMethod(reference.getQualifiedName()))
                 {
                     isMethodOverrideFromInterface = true;
                     break;
@@ -746,23 +754,13 @@ public class ClassReference extends BaseReference
     }
 
     public MethodReference getMethodOverrideFromInterface(MethodReference 
reference)
-    {
-        // 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)
+{
+        for (ClassReference interfaceReference : getSuperInterfaces())
         {
-            List<ClassReference> interfaces = 
classReference.getImplementedInterfaces();
-            for (ClassReference interfaceReference : interfaces)
-            {
-                // check for the method on the interface
-                MethodReference method = 
interfaceReference.getInstanceMethod(reference.getBaseName());
-                if (method != null)
-                    return method;
-            }
+            // check for the method on the interface
+            MethodReference method = 
interfaceReference.getInstanceMethod(reference.getBaseName());
+            if (method != null)
+                return method;
         }
 
         return null;
@@ -797,22 +795,6 @@ public class ClassReference extends BaseReference
         return false;
     }
 
-    public boolean isPropertyInterfaceImplementation(String fieldName)
-    {
-        List<ClassReference> superInterfaces = getSuperInterfaces();
-        for (ClassReference interfaceRef : superInterfaces)
-        {
-            if (interfaceRef == null)
-            {
-                System.err.println("isPropertyInterfaceImplementation() null");
-                continue;
-            }
-            if (interfaceRef.hasInstanceField(fieldName))
-                return true;
-        }
-        return false;
-    }
-
     public boolean hasLocalMethodConflict(String functionName)
     {
         return instanceMethods.containsKey(functionName) || 
staticMethods.containsKey(functionName);
diff --git 
a/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/FieldReference.java
 
b/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/FieldReference.java
index 92801b890..2e52df0e9 100644
--- 
a/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/FieldReference.java
+++ 
b/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/FieldReference.java
@@ -39,14 +39,14 @@ public class FieldReference extends MemberReference
 
     private boolean isStatic;
     private boolean isConst;
-    private FieldReference override;
+    private FieldReference overrideFromInterface;
     private String overrideStringType;
     private Node constantValueNode;
     private String constantValue;
 
     private FieldReference getContext()
     {
-        return override == null ? this : override;
+        return overrideFromInterface == null ? this : overrideFromInterface;
     }
 
     public boolean isStatic()
@@ -130,18 +130,14 @@ public class FieldReference extends MemberReference
 
         if (!getClassReference().isInterface())
         {
-            FieldReference overrideFromInterface = 
getClassReference().getFieldOverrideFromInterface(this);
-            if (overrideFromInterface != null)
-            {
-                override = overrideFromInterface;
-            }
+            overrideFromInterface = 
getClassReference().getFieldOverrideFromInterface(this);
         }
         
         ReadOnlyMember readOnly = isReadOnly();
 
         if (!getClassReference().isInterface() && !getComment().isOverride()
-                && 
!getClassReference().isPropertyInterfaceImplementation(getBaseName())
-                && (null == readOnly))
+                && (null == readOnly)
+                && (null == overrideFromInterface))
         {
                if (isConst && constantValue == null)
                        emitAccessor(sb, true); // const is used for readOnly 
as well.  If there is an initial value assume it is const
@@ -153,7 +149,7 @@ public class FieldReference extends MemberReference
             emitAccessor(sb, (null != readOnly));
         }
 
-        override = null;
+        overrideFromInterface = null;
     }
 
     private void emitAccessor(StringBuilder sb, boolean isReadOnly)
diff --git 
a/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/MethodReference.java
 
b/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/MethodReference.java
index 45f8f4649..72ff02f29 100644
--- 
a/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/MethodReference.java
+++ 
b/compiler-externc/src/main/java/org/apache/royale/compiler/internal/codegen/typedefs/reference/MethodReference.java
@@ -37,14 +37,14 @@ public class MethodReference extends MemberReference
 {
 
     private boolean isStatic;
-    private MethodReference override;
+    private MethodReference overrideFromInterface;
     private Node paramNode;
 
     private List<ParameterReference> parameters;
 
     private MethodReference getContext()
     {
-        return override == null ? this : override;
+        return overrideFromInterface == null ? this : overrideFromInterface;
     }
 
     public boolean isStatic()
@@ -170,7 +170,7 @@ public class MethodReference extends MemberReference
 
         emitCode(sb);
 
-        override = null;
+        overrideFromInterface = null;
     }
 
     public void emitCode(StringBuilder sb)
@@ -183,11 +183,7 @@ public class MethodReference extends MemberReference
 
         if (!getClassReference().isInterface())
         {
-            MethodReference overrideFromInterface = 
getClassReference().getMethodOverrideFromInterface(this);
-            if (/*isOverride() && */overrideFromInterface != null)
-            {
-                override = overrideFromInterface;
-            }
+            overrideFromInterface = 
getClassReference().getMethodOverrideFromInterface(this);
         }
 
         String qName = getQualifiedName();

Reply via email to