mirror of
https://github.com/apple/pkl.git
synced 2026-06-08 23:02:45 +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 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
|
||||||
Reference in New Issue
Block a user