mirror of
https://github.com/apple/pkl.git
synced 2026-03-12 21:25:19 +01:00
Cannot assign property with fixed/const in spread (#428)
When using spread syntax with typed object, properties that are fixed or const cannot be assigned or amended. This should be checked in the checkTypedProperty() function.
This commit is contained in:
@@ -343,19 +343,39 @@ public abstract class GeneratorSpreadNode extends GeneratorMemberNode {
|
||||
}
|
||||
|
||||
protected void checkTypedProperty(VmClass clazz, ObjectMember member) {
|
||||
if (member.isLocal() || clazz.hasProperty(member.getName())) return;
|
||||
CompilerDirectives.transferToInterpreter();
|
||||
var exception =
|
||||
exceptionBuilder()
|
||||
.cannotFindProperty(clazz.getPrototype(), member.getName(), false, false)
|
||||
.build();
|
||||
if (member.getHeaderSection().isAvailable()) {
|
||||
exception
|
||||
.getInsertedStackFrames()
|
||||
.put(
|
||||
getRootNode().getCallTarget(),
|
||||
VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));
|
||||
if (member.isLocal()) return;
|
||||
|
||||
var memberName = member.getName();
|
||||
if (!clazz.hasProperty(memberName)) {
|
||||
CompilerDirectives.transferToInterpreter();
|
||||
var exception =
|
||||
exceptionBuilder()
|
||||
.cannotFindProperty(clazz.getPrototype(), memberName, false, false)
|
||||
.build();
|
||||
if (member.getHeaderSection().isAvailable()) {
|
||||
exception
|
||||
.getInsertedStackFrames()
|
||||
.put(
|
||||
getRootNode().getCallTarget(),
|
||||
VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));
|
||||
}
|
||||
throw exception;
|
||||
}
|
||||
|
||||
var classProperty = clazz.getProperty(memberName);
|
||||
if (classProperty != null && classProperty.isConstOrFixed()) {
|
||||
CompilerDirectives.transferToInterpreter();
|
||||
var errMsg =
|
||||
classProperty.isConst() ? "cannotAssignConstProperty" : "cannotAssignFixedProperty";
|
||||
var exception = exceptionBuilder().evalError(errMsg, memberName).build();
|
||||
if (member.getHeaderSection().isAvailable()) {
|
||||
exception
|
||||
.getInsertedStackFrames()
|
||||
.put(
|
||||
getRootNode().getCallTarget(),
|
||||
VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));
|
||||
}
|
||||
throw exception;
|
||||
}
|
||||
throw exception;
|
||||
}
|
||||
}
|
||||
|
||||
5
pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotAssignFixedProperty3.pkl
vendored
Normal file
5
pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotAssignFixedProperty3.pkl
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
amends "../basic/fixedProperty2.pkl"
|
||||
|
||||
p = new {
|
||||
...new Dynamic { name = "Osprey" }
|
||||
}
|
||||
14
pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotAssignFixedProperty3.err
vendored
Normal file
14
pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotAssignFixedProperty3.err
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
–– Pkl Error ––
|
||||
Cannot assign to fixed property `name`.
|
||||
|
||||
x | ...new Dynamic { name = "Osprey" }
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
at cannotAssignFixedProperty3#p (file:///$snippetsDir/input/errors/cannotAssignFixedProperty3.pkl)
|
||||
|
||||
x | ...new Dynamic { name = "Osprey" }
|
||||
^^^^
|
||||
at cannotAssignFixedProperty3#p.name (file:///$snippetsDir/input/errors/cannotAssignFixedProperty3.pkl)
|
||||
|
||||
xxx | text = renderer.renderDocument(value)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
at pkl.base#Module.output.text (pkl:base)
|
||||
Reference in New Issue
Block a user