{"record":{"id":"0f1acd73a83042b4","repo":"apple/pkl","slug":"duplicatetypeparameter","errorCode":"duplicateTypeParameter","errorMessage":"duplicateTypeParameter","messagePattern":"duplicateTypeParameter","errorType":"error_code","errorClass":"VmException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java","lineNumber":2321,"sourceCode":"    var params = ctx.getParameters();\n    var size = params.size();\n    var result = new ArrayList<TypeParameter>(size);\n    for (var i = 0; i < size; i++) {\n      var paramCtx = params.get(i);\n      Variance variance;\n      var nodeVariance = paramCtx.getVariance();\n      if (nodeVariance == null) {\n        variance = TypeParameter.Variance.INVARIANT;\n      } else {\n        variance =\n            switch (nodeVariance) {\n              case IN -> TypeParameter.Variance.CONTRAVARIANT;\n              case OUT -> TypeParameter.Variance.COVARIANT;\n            };\n      }\n      var parameterName = paramCtx.getIdentifier().getValue();\n      if (result.stream().anyMatch(it -> it.getName().equals(parameterName))) {\n        throw exceptionBuilder()\n            .evalError(\"duplicateTypeParameter\", parameterName)\n            .withSourceSection(createSourceSection(paramCtx))\n            .build();\n      }\n      result.add(new TypeParameter(variance, parameterName, i));\n    }\n    return result;\n  }\n\n  @Override\n  public @Nullable UnresolvedTypeNode visitTypeAnnotation(@Nullable TypeAnnotation typeAnnotation) {\n    return typeAnnotation == null ? null : visitType(typeAnnotation.getType());\n  }\n\n  @Override\n  public Pair<ExpressionNode[], Boolean> visitArgumentList(ArgumentList argumentList) {\n    var args = argumentList.getArguments();\n    var res = new ExpressionNode[args.size()];","sourceCodeStart":2303,"sourceCodeEnd":2339,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java#L2303-L2339","documentation":"Thrown when the same type parameter name appears twice in one type parameter list. Each type parameter in a list must be unique because it is stored by name and index (`new TypeParameter(variance, name, i)`).","triggerScenarios":"Declaring `typealias Foo<T, T> = ...` or `typealias M<K, V, K> = ...`; the duplicate is detected by scanning the already-collected `result` list for a matching name.","commonSituations":"Copy-pasting type parameters and forgetting to rename; long lists like `<K, V, K>` where a collision slips in; merging two aliases by hand.","solutions":["Rename the duplicate parameter to a distinct name, e.g. `typealias Foo<T, U> = ...`.","Remove the redundant parameter if it is unused or identical in intent."],"exampleFix":"// before\ntypealias MapLike<K, V, K> = Mapping<K, V>\n// after\ntypealias MapLike<K, V> = Mapping<K, V>","handlingStrategy":"validation","validationCode":"function hasDuplicateTypeParams(names) {\n  return new Set(names).size !== names.length;\n}\nif (hasDuplicateTypeParams(['K','V','K'])) throw new Error('duplicate type parameter name');","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep type parameter lists short and verify names are unique after copy-paste.","Name parameters by role (Key, Value) to avoid accidental collisions."],"tags":["pkl","generics","duplicate-declaration","compile-error"],"backgroundTag":"duplicate-type-parameter","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}