mirror of
https://github.com/apple/pkl.git
synced 2026-06-30 10:11:42 +02:00
Add support for const object members (#678)
This adds support for adding the `const` modifier to object members. Such object members are also required to have the `local` modifier applied. This follows SPICE-0011.
This commit is contained in:
@@ -72,7 +72,7 @@ public final class VmModifier {
|
||||
public static final int VALID_PROPERTY_MODIFIERS =
|
||||
ABSTRACT | LOCAL | HIDDEN | EXTERNAL | FIXED | CONST;
|
||||
|
||||
public static final int VALID_OBJECT_MEMBER_MODIFIERS = LOCAL;
|
||||
public static final int VALID_OBJECT_MEMBER_MODIFIERS = LOCAL | CONST;
|
||||
|
||||
public static final int TYPEALIAS_OBJECT_MEMBER = TYPE_ALIAS | CONST;
|
||||
|
||||
|
||||
@@ -721,12 +721,22 @@ public final class AstBuilder extends AbstractAstBuilder<Object> {
|
||||
@Nullable TypeAnnotationContext typeAnnCtx,
|
||||
@Nullable ExprContext exprCtx,
|
||||
@Nullable List<? extends ObjectBodyContext> bodyCtx) {
|
||||
|
||||
var modifiers =
|
||||
doVisitModifiers(
|
||||
modifierCtxs, VmModifier.VALID_OBJECT_MEMBER_MODIFIERS, "invalidObjectMemberModifier");
|
||||
if (VmModifier.isConst(modifiers) && !VmModifier.isLocal(modifiers)) {
|
||||
@SuppressWarnings("OptionalGetWithoutIsPresent")
|
||||
var constModifierCtx =
|
||||
modifierCtxs.stream().filter((it) -> it.CONST() != null).findFirst().get();
|
||||
throw exceptionBuilder()
|
||||
.evalError("invalidConstObjectMemberModifier")
|
||||
.withSourceSection(createSourceSection(constModifierCtx))
|
||||
.build();
|
||||
}
|
||||
return doVisitObjectProperty(
|
||||
createSourceSection(ctx),
|
||||
createSourceSection(propertyName),
|
||||
doVisitModifiers(
|
||||
modifierCtxs, VmModifier.VALID_OBJECT_MEMBER_MODIFIERS, "invalidObjectMemberModifier"),
|
||||
modifiers,
|
||||
propertyName.getText(),
|
||||
typeAnnCtx,
|
||||
exprCtx,
|
||||
|
||||
@@ -19,6 +19,9 @@ Modifier `{0}` is not applicable to properties.
|
||||
invalidObjectMemberModifier=\
|
||||
Modifier `{0}` is not applicable to object members.
|
||||
|
||||
invalidConstObjectMemberModifier=\
|
||||
Modifier `const` can only be applied to object members that are also `local`.
|
||||
|
||||
objectMethodMustBeLocal=\
|
||||
Method needs a `local` modifier because it is defined in an object, not a class.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user