diff --git a/pkl-core/src/main/java/org/pkl/core/ast/builder/SymbolTable.java b/pkl-core/src/main/java/org/pkl/core/ast/builder/SymbolTable.java index dc14c854a..a04e76fce 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/builder/SymbolTable.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/builder/SymbolTable.java @@ -357,8 +357,9 @@ public final class SymbolTable { var depth = -1; var lexicalScope = getLexicalScope(); while (lexicalScope.getConstLevel() == ConstLevel.ALL) { - // LambdaScope inherits constLevel but doesn't create a const scope barrier - if (!(lexicalScope instanceof LambdaScope)) { + // LambdaScope inherits constLevel but doesn't create a const scope barrier. + // Method scopes don't level up. + if (!(lexicalScope instanceof LambdaScope) && !(lexicalScope instanceof MethodScope)) { depth += 1; } var parent = lexicalScope.getParent(); diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod3.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod3.pkl new file mode 100644 index 000000000..1a2101631 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod3.pkl @@ -0,0 +1,5 @@ +x = 1 + +const function f() = x + +r = f() diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod4.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod4.pkl new file mode 100644 index 000000000..04ef4d3e9 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod4.pkl @@ -0,0 +1,5 @@ +obj { + x = 1 + local const function f() = x + r = f() +} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod5.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod5.pkl new file mode 100644 index 000000000..c91d1b618 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod5.pkl @@ -0,0 +1,5 @@ +const function a() = b() + +function b() = 3 + +res = a() diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod3.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod3.err new file mode 100644 index 000000000..1bed283cd --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod3.err @@ -0,0 +1,22 @@ +–– Pkl Error –– +Cannot reference property `x` from here because it is not `const`. + +x | const function f() = x + ^ +at constMethod3#f (file:///$snippetsDir/input/errors/const/constMethod3.pkl) + +To fix, do either of: +1. Add modifier `const` to property `x` +2. Self-import this module, and reference this property from the import. + +x | r = f() + ^^^ +at constMethod3#r (file:///$snippetsDir/input/errors/const/constMethod3.pkl) + +xxx | renderer.renderDocument(value) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +at pkl.base#Module.output.text (pkl:base) + +xxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes("UTF-8") + ^^^^ +at pkl.base#Module.output.bytes (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod4.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod4.err new file mode 100644 index 000000000..386c1aea1 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod4.err @@ -0,0 +1,22 @@ +–– Pkl Error –– +Cannot reference property `x` from here because it is not `const`. + +x | local const function f() = x + ^ +at constMethod4#obj.f (file:///$snippetsDir/input/errors/const/constMethod4.pkl) + +To fix, do either of: +1. Add modifier `const` to property `x` +2. Self-import this module, and reference this property from the import. + +x | r = f() + ^^^ +at constMethod4#obj.r (file:///$snippetsDir/input/errors/const/constMethod4.pkl) + +xxx | renderer.renderDocument(value) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +at pkl.base#Module.output.text (pkl:base) + +xxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes("UTF-8") + ^^^^ +at pkl.base#Module.output.bytes (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod5.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod5.err new file mode 100644 index 000000000..e382a7e3e --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod5.err @@ -0,0 +1,22 @@ +–– Pkl Error –– +Cannot call method `b` from here because it is not `const`. + +x | const function a() = b() + ^^^ +at constMethod5#a (file:///$snippetsDir/input/errors/const/constMethod5.pkl) + +To fix, do either of: +1. Add modifier `const` to method `b` +2. Self-import this module, and reference this method from the import. + +x | res = a() + ^^^ +at constMethod5#res (file:///$snippetsDir/input/errors/const/constMethod5.pkl) + +xxx | renderer.renderDocument(value) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +at pkl.base#Module.output.text (pkl:base) + +xxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes("UTF-8") + ^^^^ +at pkl.base#Module.output.bytes (pkl:base)