Fix amending module with abstract class (#319)

This fixes an assertion error that gets thrown if:
1. A module declares a class as abstract
2. An amending module does not use that abstract class as a type

Underneath the hood, the modifiers of the class/typelias object member
is considered different from the modifiers on the VmClass/VmTypeAlias
values.

The object model skips forcing any explicitly members that are explicitly
declared hidden, abstract, or local.
However, it _should_ evaluate any abstract classes found in a module.
So, it's incorrect to apply the same modifiers on the class to the object member.
This commit is contained in:
Daniel Chao
2024-03-15 07:53:09 -07:00
committed by GitHub
parent 9c1ae0d683
commit faa7ac69bb
5 changed files with 28 additions and 2 deletions
@@ -72,6 +72,14 @@ public final class VmModifier {
public static final int VALID_OBJECT_MEMBER_MODIFIERS = LOCAL; public static final int VALID_OBJECT_MEMBER_MODIFIERS = LOCAL;
public static final int TYPEALIAS_OBJECT_MEMBER = TYPE_ALIAS | CONST;
public static final int LOCAL_TYPEALIAS_OBJECT_MEMBER = LOCAL | TYPEALIAS_OBJECT_MEMBER;
public static final int CLASS_OBJECT_MEMBER = CLASS | CONST;
public static final int LOCAL_CLASS_OBJECT_MEMBER = LOCAL | CLASS_OBJECT_MEMBER;
public static boolean isLocal(int modifiers) { public static boolean isLocal(int modifiers) {
return (modifiers & LOCAL) != 0; return (modifiers & LOCAL) != 0;
} }
@@ -305,11 +305,13 @@ public final class AstBuilder extends AbstractAstBuilder<Object> {
doVisitClassProperties(propertyCtxs, propertyNames), doVisitClassProperties(propertyCtxs, propertyNames),
doVisitMethodDefs(methodCtxs)); doVisitMethodDefs(methodCtxs));
var isLocal = VmModifier.isLocal(modifiers);
var result = var result =
new ObjectMember( new ObjectMember(
sourceSection, sourceSection,
headerSection, headerSection,
modifiers | VmModifier.CONST, isLocal ? VmModifier.LOCAL_CLASS_OBJECT_MEMBER : VmModifier.CLASS_OBJECT_MEMBER,
scope.getName(), scope.getName(),
scope.getQualifiedName()); scope.getQualifiedName());
@@ -360,7 +362,9 @@ public final class AstBuilder extends AbstractAstBuilder<Object> {
new ObjectMember( new ObjectMember(
sourceSection, sourceSection,
headerSection, headerSection,
modifiers | VmModifier.CONST, isLocal
? VmModifier.LOCAL_TYPEALIAS_OBJECT_MEMBER
: VmModifier.TYPEALIAS_OBJECT_MEMBER,
scopeName, scopeName,
scope.getQualifiedName()); scope.getQualifiedName());
@@ -0,0 +1,12 @@
module Birds
abstract class Bird {
name: String
}
class Pigeon extends Bird {
name = "Pigeon"
passenger: Boolean
}
pidgy: Pigeon?
@@ -0,0 +1 @@
amends ".../input-helper/modules/Birds.pkl"
@@ -0,0 +1 @@
pidgy = null