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 392f5e381 externc: FieldReference needs to check if the field was
originally defined on an interface, similar to MethodReference
392f5e381 is described below
commit 392f5e3811ed0a7296fc382d0adcc9b57cfcd861
Author: Josh Tynjala <[email protected]>
AuthorDate: Wed Feb 18 09:30:09 2026 -0800
externc: FieldReference needs to check if the field was originally defined
on an interface, similar to MethodReference
Fields may have just an override jsdoc tag in this case, which was
defaulting to type Object instead of the type from the interface
---
.../codegen/typedefs/reference/ClassReference.java | 45 ++++++++++++++++++++++
.../codegen/typedefs/reference/FieldReference.java | 19 ++++++++-
2 files changed, 63 insertions(+), 1 deletion(-)
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 1bf634034..9db550cd1 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
@@ -678,6 +678,51 @@ public class ClassReference extends BaseReference
return method;
}
+ public boolean isFieldOverrideFromInterface(FieldReference reference)
+ {
+ boolean isFieldOverrideFromInterface = false;
+
+ if (!hasImplementations())
+ {
+ List<JSTypeExpression> implementedInterfaces =
getComment().getImplementedInterfaces();
+ for (JSTypeExpression jsTypeExpression : implementedInterfaces)
+ {
+ String interfaceName =
getModel().evaluate(jsTypeExpression).getDisplayName();
+ ClassReference classReference =
getModel().getClassReference(interfaceName);
+ if (classReference.hasSuperField(reference.getQualifiedName()))
+ {
+ isFieldOverrideFromInterface = true;
+ break;
+ }
+ }
+ }
+
+ return isFieldOverrideFromInterface;
+ }
+
+ 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)
+ {
+ 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;
+ }
+ }
+
+ return null;
+ }
+
public boolean isMethodOverrideFromInterface(MethodReference reference)
{
boolean isMethodOverrideFromInterface = false;
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 5b146dcfc..92801b890 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,10 +39,16 @@ public class FieldReference extends MemberReference
private boolean isStatic;
private boolean isConst;
+ private FieldReference override;
private String overrideStringType;
private Node constantValueNode;
private String constantValue;
+ private FieldReference getContext()
+ {
+ return override == null ? this : override;
+ }
+
public boolean isStatic()
{
return isStatic;
@@ -121,6 +127,15 @@ public class FieldReference extends MemberReference
excluded.print(sb);
return; // XXX (mschmalle) accessors are not treated right, need
to exclude get/set
}
+
+ if (!getClassReference().isInterface())
+ {
+ FieldReference overrideFromInterface =
getClassReference().getFieldOverrideFromInterface(this);
+ if (overrideFromInterface != null)
+ {
+ override = overrideFromInterface;
+ }
+ }
ReadOnlyMember readOnly = isReadOnly();
@@ -137,6 +152,8 @@ public class FieldReference extends MemberReference
{
emitAccessor(sb, (null != readOnly));
}
+
+ override = null;
}
private void emitAccessor(StringBuilder sb, boolean isReadOnly)
@@ -272,7 +289,7 @@ public class FieldReference extends MemberReference
{
if (overrideStringType != null)
return overrideStringType;
- String typeString = JSTypeUtils.toFieldTypeString(this);
+ String typeString = JSTypeUtils.toFieldTypeString(getContext());
if (FunctionUtils.hasTemplate(this)
&& FunctionUtils.containsTemplate(this, typeString))
{