Fix qualified type resolution (#1915)
Fixes an issue where `GetModuleOwnerNode` resolves to levelsUp == 0, but its enclosing owner is a parse-time invisible scope.
This commit is contained in:
1 parent
78c0ebce9d
commit
97c73e7c28
4 files changed
+23
-4
No files matched your search
@@ -24,8 +24,6 @@ public final class GetEnclosingOwnerNode extends ExpressionNode {
|
||||
|
||||
public GetEnclosingOwnerNode(int levelsUp) {
|
||||
this.levelsUp = levelsUp;
|
||||
|
||||
assert levelsUp > 0 : "shouldn't be using GetEnclosingOwnerNode for levelsUp == 0";
|
||||
}
|
||||
|
||||
public Object executeGeneric(VirtualFrame frame) {
|
||||
|
||||
@@ -32,15 +32,21 @@ public final class GetModuleOwnerNode extends ExpressionNode {
|
||||
CompilerDirectives.transferToInterpreter();
|
||||
|
||||
var levelsUp = -1;
|
||||
var skippedInvisibleScopes = false;
|
||||
for (var current = VmUtils.getOwner(frame);
|
||||
current != null;
|
||||
current = current.getEnclosingOwner()) {
|
||||
if (!current.isParseTimeInvisibleScope()) {
|
||||
if (current.isParseTimeInvisibleScope()) {
|
||||
skippedInvisibleScopes = true;
|
||||
} else {
|
||||
levelsUp += 1;
|
||||
}
|
||||
}
|
||||
|
||||
return replace(levelsUp == 0 ? new GetOwnerNode() : new GetEnclosingOwnerNode(levelsUp))
|
||||
return replace(
|
||||
levelsUp == 0 && !skippedInvisibleScopes
|
||||
? new GetOwnerNode()
|
||||
: new GetEnclosingOwnerNode(levelsUp))
|
||||
.executeGeneric(frame);
|
||||
}
|
||||
}
|
||||
Vendored
+12
@@ -0,0 +1,12 @@
|
||||
import "pkl:semver"
|
||||
|
||||
local foo = () -> new Dynamic {}
|
||||
|
||||
// The `when` predicate is evaluated with the amended function (an invisible scope) as its owner.
|
||||
local bar = (foo) {
|
||||
when (new semver.Version {} is semver.Version) {
|
||||
x = 1
|
||||
}
|
||||
}
|
||||
|
||||
res = bar.apply()
|
||||
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
res {
|
||||
x = 1
|
||||
}
|
||||
Reference in new issue
Block a user