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();