{"record":{"id":"3c54c564394104f7","repo":"apple/pkl","slug":"typealiasmustbelocal","errorCode":"typeAliasMustBeLocal","errorMessage":"typeAliasMustBeLocal","messagePattern":"typeAliasMustBeLocal","errorType":"error_code","errorClass":"VmException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java","lineNumber":1793,"sourceCode":"    for (var clazz : classes) {\n      ObjectMember member = visitClass(clazz);\n\n      if (moduleInfo.isAmend() && !member.isLocal()) {\n        throw exceptionBuilder()\n            .evalError(\"classMustBeLocal\")\n            .withSourceSection(member.getHeaderSection())\n            .build();\n      }\n\n      checkDuplicateMember(member.getName(), member.getHeaderSection(), propertyNames);\n      EconomicMaps.put(result, member.getName(), member);\n    }\n\n    for (var typeAlias : typeAliases) {\n      var member = visitTypeAlias(typeAlias);\n\n      if (moduleInfo.isAmend() && !member.isLocal()) {\n        throw exceptionBuilder()\n            .evalError(\"typeAliasMustBeLocal\")\n            .withSourceSection(member.getHeaderSection())\n            .build();\n      }\n\n      checkDuplicateMember(member.getName(), member.getHeaderSection(), propertyNames);\n      EconomicMaps.put(result, member.getName(), member);\n    }\n\n    for (var ctx : properties) {\n      var member =\n          doVisitObjectProperty(\n              ctx,\n              ctx.getModifiers(),\n              ctx.getName(),\n              ctx.getTypeAnnotation(),\n              ctx.getExpr(),\n              ctx.getBodyList());","sourceCodeStart":1775,"sourceCodeEnd":1811,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java#L1775-L1811","documentation":"Analogous to classMustBeLocal but for type aliases: type aliases inside a module or object amendment must be declared `local`, otherwise the amendment would introduce a new externally visible type name. AstBuilder raises typeAliasMustBeLocal with the alias header section when the amend check fails.","triggerScenarios":"Declaring `typealias Foo = ...` inside a module amendment (moduleInfo.isAmend()) without the `local` keyword.","commonSituations":"Adding shared type aliases to an override file that extends a base module; scaffolding amendment files by copying base-module boilerplate that contains typealias declarations.","solutions":["Add `local`: `local typealias Foo = ...`.","Move the typealias into the base module.","Inline the aliased type in the amendment if used only once."],"exampleFix":"// before (in an amendment)\ntypealias Port = Int(isBetween(1, 65535))\n\n// after\nlocal typealias Port = Int(isBetween(1, 65535))","handlingStrategy":"validation","validationCode":"// Verify typealiases declared in amendment files are local:\nif (isAmendmentFile(file) && line.matches(\"\\\\s*typealias\\\\s+\\\\w+.*\")) {\n  report(file, lineNo, \"typealiases in amendments must be `local`\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep type aliases in base modules; amendments should only override values.","Grep override files for `typealias` and add `local` where needed.","Inline single-use aliases instead of declaring them in amendments."],"tags":["pkl","ast","amendment","type-alias"],"backgroundTag":"invalid-config-value","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"}