mirror of
https://github.com/apple/pkl.git
synced 2026-04-17 05:59:46 +02:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user