diff --git a/pkl-core/src/main/java/org/pkl/core/runtime/VmReference.java b/pkl-core/src/main/java/org/pkl/core/runtime/VmReference.java index e9a7ea3e3..6e0a25798 100644 --- a/pkl-core/src/main/java/org/pkl/core/runtime/VmReference.java +++ b/pkl-core/src/main/java/org/pkl/core/runtime/VmReference.java @@ -297,7 +297,8 @@ public final class VmReference extends VmValue { var keyTypes = normalizeTypes(typeArgs[0], clazz, clazz.getModuleClass()); for (var kt : iterateTypes(keyTypes)) { if (kt == UnknownType.INSTANCE - || (kt instanceof VmType.ClassType klazz && klazz.getVmClass() == VmUtils.getClass(key)) + || (kt instanceof VmType.ClassType klazz + && klazz.getVmClass().isSuperclassOf(VmUtils.getClass(key))) || (kt instanceof VmType.StringLiteralType stringLiteral && stringLiteral.getLiteral().equals(key))) { normalizeTypes(typeArgs[1], clazz, clazz.getModuleClass(), result); diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl index 6cbcb80e8..37f2f00f3 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl @@ -125,6 +125,8 @@ aValuesJoined = k.aValues.join("\n") typeArgs = ref.Reference(d, TypeHolder, null).prop as Ref> class TypeHolder { prop: Listing + mappingAnyKey: Mapping + mappingTypeArgKey: Mapping, Int> } class BadResource extends Resource { @@ -137,6 +139,12 @@ badThisRef = test.catch(() -> new BadResource { name = "bad" }.$.toString()) // test that a bare function type toStrings/exports okay bareFunctionType = test.catch(() -> ref.Reference(d, Function4, null) as Ref) +mappingAnyKey = ref.Reference(d, TypeHolder, null).mappingAnyKey["foo"] + +// this one should be an editor error but can't be caught in the runtime +// because VmListing/VmMapping don't track their type args +mappingTypeArgKey = ref.Reference(d, TypeHolder, null).mappingTypeArgKey[new Listing { "foo" }] + output { renderer { converters { diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/api/reference.pcf b/pkl-core/src/test/files/LanguageSnippetTests/output/api/reference.pcf index a54c668ef..f5bf9150c 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/api/reference.pcf +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/api/reference.pcf @@ -62,3 +62,5 @@ aValuesJoined = """ typeArgs = "${null.prop}" badThisRef = "Expected value of type `pkl.ref#Reference`, but got type `pkl.ref#Reference`. Value: Reference(new reference#D {}, reference#A, new reference#BadResource { name =..." bareFunctionType = "Expected value of type `pkl.ref#Reference`, but got type `pkl.ref#Reference`. Value: Reference(new reference#D {}, Function4, null)" +mappingAnyKey = "${null.mappingAnyKey[foo]}" +mappingTypeArgKey = "${null.mappingTypeArgKey[new Listing { \"foo\" }]}"