From 08f0c3781bcab931ef3b7a68fcdbfbe5ff77d32a Mon Sep 17 00:00:00 2001 From: Daniel Chao Date: Mon, 19 Oct 2026 12:34:04 -0700 Subject: [PATCH] Improve error messages when typealiases fail to check (#1914) This adds the typealias' usage site to the stack frame. --- .../java/org/pkl/core/ast/type/TypeNode.java | 27 ++++++++++++++++--- .../output/errors/analyzeInvalidModuleUri.err | 4 +++ .../errors/analyzeRelativeModuleUri.err | 4 +++ .../output/errors/reference1.err | 4 +++ .../output/errors/reference2.err | 4 +++ .../output/errors/reference3.err | 4 +++ .../output/errors/reference4.err | 4 +++ .../output/errors/reference5.err | 4 +++ .../output/projects/badPklProject4/bug.err | 4 +++ .../output/types/classTypeErr11.err | 4 +++ .../output/types/classTypeErr12.err | 4 +++ .../output/types/classTypeErr13.err | 4 +++ 12 files changed, 68 insertions(+), 3 deletions(-) diff --git a/pkl-core/src/main/java/org/pkl/core/ast/type/TypeNode.java b/pkl-core/src/main/java/org/pkl/core/ast/type/TypeNode.java index 308de04e1..06c951cfc 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/type/TypeNode.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/type/TypeNode.java @@ -2458,18 +2458,39 @@ public abstract class TypeNode extends PklNode { } protected Object executeLazily(VirtualFrame frame, Object value) { - return aliasedTypeNode.executeLazily(frame, value); + try { + return aliasedTypeNode.executeLazily(frame, value); + } catch (VmTypeMismatchException e) { + throw withInsertedStackFrame(e); + } } /** See docstring on {@link TypeAliasTypeNode#executeLazily}. */ @Override public Object executeEagerly(VirtualFrame frame, Object value) { - return aliasedTypeNode.executeEagerly(frame, value); + try { + return aliasedTypeNode.executeEagerly(frame, value); + } catch (VmTypeMismatchException e) { + throw withInsertedStackFrame(e); + } } @Override public Object executeAndSet(VirtualFrame frame, Object value) { - return aliasedTypeNode.executeAndSet(frame, value); + try { + return aliasedTypeNode.executeAndSet(frame, value); + } catch (VmTypeMismatchException e) { + throw withInsertedStackFrame(e); + } + } + + @TruffleBoundary + private VmTypeMismatchException withInsertedStackFrame(VmTypeMismatchException e) { + // include the typealias usage site in the call stack + e.putInsertedStackFrame( + getRootNode().getCallTarget(), + VmUtils.createStackFrame(sourceSection, getRootNode().getName())); + return e; } @TruffleBoundary diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeInvalidModuleUri.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeInvalidModuleUri.err index 9252d57e9..cce996f0a 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeInvalidModuleUri.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeInvalidModuleUri.err @@ -10,6 +10,10 @@ xxxx | typealias Uri = String(isValidUrl) ^^^^^^^^^^ at pkl.analyze#importGraph (pkl:base) +xx | external function importGraph(moduleUris: Set): ImportGraph + ^^^ +at pkl.analyze#importGraph (pkl:analyze) + x | result = analyze.importGraph(Set("foo <>")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at analyzeInvalidModuleUri#result (file:///$snippetsDir/input/errors/analyzeInvalidModuleUri.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeRelativeModuleUri.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeRelativeModuleUri.err index 5e7a6a677..b609a0376 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeRelativeModuleUri.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeRelativeModuleUri.err @@ -10,6 +10,10 @@ xxxx | typealias Uri = String(isValidUrl) ^^^^^^^^^^ at pkl.analyze#importGraph (pkl:base) +xx | external function importGraph(moduleUris: Set): ImportGraph + ^^^ +at pkl.analyze#importGraph (pkl:analyze) + x | result = analyze.importGraph(Set("foo.pkl")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at analyzeRelativeModuleUri#result (file:///$snippetsDir/input/errors/analyzeRelativeModuleUri.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference1.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference1.err index fd4c06932..eb46aa990 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference1.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference1.err @@ -6,6 +6,10 @@ x | typealias Ref = ref.Reference ^^^^^^^^^^^^^^^^^^^ at reference1#test (file:///$snippetsDir/input/errors/reference1.pkl) +x | test = ref.Reference(d, String, "") as Ref + ^^^^^^^^ +at reference1#test (file:///$snippetsDir/input/errors/reference1.pkl) + xxx | renderer.renderDocument(value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.base#Module.output.text (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference2.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference2.err index 33f801e09..adbffbceb 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference2.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference2.err @@ -6,6 +6,10 @@ x | typealias Ref = ref.Reference ^^^^^^^^^^^^^^^^^^^ at reference2#test (file:///$snippetsDir/input/errors/reference2.pkl) +x | test = ref.Reference(d, String, "") as Ref + ^^^^^^^^^^^^^^^^^^ +at reference2#test (file:///$snippetsDir/input/errors/reference2.pkl) + xxx | renderer.renderDocument(value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.base#Module.output.text (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference3.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference3.err index 07b83ce15..97a1c30d2 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference3.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference3.err @@ -6,6 +6,10 @@ x | typealias Ref = ref.Reference ^^^^^^^^^^^^^^^^^^^ at reference3#test (file:///$snippetsDir/input/errors/reference3.pkl) +x | test = ref.Reference(d, String, "") as Ref> + ^^^^^^^^^^^^^^^^^^^^ +at reference3#test (file:///$snippetsDir/input/errors/reference3.pkl) + xxx | renderer.renderDocument(value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.base#Module.output.text (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference4.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference4.err index 17d330e48..71ab9b99a 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference4.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference4.err @@ -6,6 +6,10 @@ x | typealias Ref = ref.Reference ^^^^^^^^^^^^^^^^^^^ at reference4#test (file:///$snippetsDir/input/errors/reference4.pkl) +x | test = ref.Reference(d, String, "") as Ref + ^^^^^^^^^^^ +at reference4#test (file:///$snippetsDir/input/errors/reference4.pkl) + xxx | renderer.renderDocument(value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.base#Module.output.text (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference5.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference5.err index a6997b04c..134ce5efd 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference5.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference5.err @@ -6,6 +6,10 @@ x | typealias Ref = ref.Reference ^^^^^^^^^^^^^^^^^^^ at reference5#test (file:///$snippetsDir/input/errors/reference5.pkl) +xx | test = ref.Reference(d2, String, "") as Ref + ^^^^^^^^^^^ +at reference5#test (file:///$snippetsDir/input/errors/reference5.pkl) + xxx | renderer.renderDocument(value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.base#Module.output.text (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/projects/badPklProject4/bug.err b/pkl-core/src/test/files/LanguageSnippetTests/output/projects/badPklProject4/bug.err index ed95eea35..731dda230 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/projects/badPklProject4/bug.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/projects/badPklProject4/bug.err @@ -10,6 +10,10 @@ xxxx | typealias Uri = String(isValidUrl) ^^^^^^^^^^ at pkl.EvaluatorSettings#resolve (pkl:base) +xxx | function resolve(enclosingUri: Uri): EvaluatorSettings = + ^^^ +at pkl.EvaluatorSettings#resolve (pkl:EvaluatorSettings) + xxx | fixed resolvedEvaluatorSettings: EvaluatorSettingsModule = evaluatorSettings.resolve(projectFileUri) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.Project#resolvedEvaluatorSettings (pkl:Project) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr11.err b/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr11.err index 2ceaefa1c..0cba85ae7 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr11.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr11.err @@ -7,6 +7,10 @@ at classTypeErr11#res22 (file:///$snippetsDir/input/types/classType.pkl) A `Class` type check can only succeed when its type argument is an un-parameterized class, `unknown`, `module`, `this`, or an alias to one of those types. +x | res22 = List(A, C) as F + ^^^^^^^^ +at classTypeErr11#res22 (file:///$snippetsDir/input/types/classTypeErr11.pkl) + xxx | renderer.renderDocument(value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.base#Module.output.text (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr12.err b/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr12.err index 3b4a528a1..de26396f0 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr12.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr12.err @@ -7,6 +7,10 @@ at classTypeErr12#res22 (file:///$snippetsDir/input/types/classType.pkl) A `Class` type check can only succeed when its type argument is an un-parameterized class, `unknown`, `module`, `this`, or an alias to one of those types. +x | res22 = List(A, C) as G + ^^^^^^^^ +at classTypeErr12#res22 (file:///$snippetsDir/input/types/classTypeErr12.pkl) + xxx | renderer.renderDocument(value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.base#Module.output.text (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr13.err b/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr13.err index 4b6339fb5..262a317be 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr13.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/types/classTypeErr13.err @@ -7,6 +7,10 @@ at classTypeErr13#res22 (file:///$snippetsDir/input/types/classType.pkl) A `Class` type check can only succeed when its type argument is an un-parameterized class, `unknown`, `module`, `this`, or an alias to one of those types. +x | res22 = List(A, C) as G + ^^^^ +at classTypeErr13#res22 (file:///$snippetsDir/input/types/classTypeErr13.pkl) + xxx | renderer.renderDocument(value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.base#Module.output.text (pkl:base)