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

View File

@@ -72,6 +72,14 @@ public final class VmModifier {
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) {
return (modifiers & LOCAL) != 0;
}

View File

@@ -305,11 +305,13 @@ public final class AstBuilder extends AbstractAstBuilder<Object> {
doVisitClassProperties(propertyCtxs, propertyNames),
doVisitMethodDefs(methodCtxs));
var isLocal = VmModifier.isLocal(modifiers);
var result =
new ObjectMember(
sourceSection,
headerSection,
modifiers | VmModifier.CONST,
isLocal ? VmModifier.LOCAL_CLASS_OBJECT_MEMBER : VmModifier.CLASS_OBJECT_MEMBER,
scope.getName(),
scope.getQualifiedName());
@@ -360,7 +362,9 @@ public final class AstBuilder extends AbstractAstBuilder<Object> {
new ObjectMember(
sourceSection,
headerSection,
modifiers | VmModifier.CONST,
isLocal
? VmModifier.LOCAL_TYPEALIAS_OBJECT_MEMBER
: VmModifier.TYPEALIAS_OBJECT_MEMBER,
scopeName,
scope.getQualifiedName());

View File

@@ -0,0 +1,12 @@
module Birds
abstract class Bird {
name: String
}
class Pigeon extends Bird {
name = "Pigeon"
passenger: Boolean
}
pidgy: Pigeon?

View File

@@ -0,0 +1 @@
amends ".../input-helper/modules/Birds.pkl"

View File

@@ -0,0 +1 @@
pidgy = null