mirror of
https://github.com/apple/pkl.git
synced 2026-02-26 04:14:57 +01: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());
|
||||
|
||||
|
||||
12
pkl-core/src/test/files/LanguageSnippetTests/input-helper/modules/Birds.pkl
vendored
Normal file
12
pkl-core/src/test/files/LanguageSnippetTests/input-helper/modules/Birds.pkl
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
module Birds
|
||||
|
||||
abstract class Bird {
|
||||
name: String
|
||||
}
|
||||
|
||||
class Pigeon extends Bird {
|
||||
name = "Pigeon"
|
||||
passenger: Boolean
|
||||
}
|
||||
|
||||
pidgy: Pigeon?
|
||||
1
pkl-core/src/test/files/LanguageSnippetTests/input/modules/amendModule6.pkl
vendored
Normal file
1
pkl-core/src/test/files/LanguageSnippetTests/input/modules/amendModule6.pkl
vendored
Normal file
@@ -0,0 +1 @@
|
||||
amends ".../input-helper/modules/Birds.pkl"
|
||||
1
pkl-core/src/test/files/LanguageSnippetTests/output/modules/amendModule6.pcf
vendored
Normal file
1
pkl-core/src/test/files/LanguageSnippetTests/output/modules/amendModule6.pcf
vendored
Normal file
@@ -0,0 +1 @@
|
||||
pidgy = null
|
||||
Reference in New Issue
Block a user