{"record":{"id":"fd4f5ae99a0ddcc1","repo":"emberjs/ember.js","slug":"invalid-block-parameters-syntax-incomplete-parame","errorCode":null,"errorMessage":"Invalid block parameters syntax: incomplete parameters list, expecting \"|\" but the tag was closed prematurely","messagePattern":"Invalid block parameters syntax: incomplete parameters list, expecting \"\\|\" but the tag was closed prematurely","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/@glimmer/syntax/lib/parser/tokenizer-event-handlers.ts","lineNumber":430,"sourceCode":"              throw generateSyntaxError(\n                `Invalid block parameters syntax: expecting the tag to be closed with \">\" or \"/>\" after parameters list`,\n                as.start.until(loc)\n              );\n            },\n          };\n        } else if (next === '|') {\n          if (element.params.length === 0) {\n            // Following Handlebars and treat empty block params a syntax error\n            throw generateSyntaxError(\n              `Invalid block parameters syntax: empty parameters list, expecting at least one identifier`,\n              as.start.until(this.offset().move(1))\n            );\n          } else {\n            state = { state: 'AfterEndPipe' };\n            this.tokenizer.consume();\n          }\n        } else if (next === '>' || next === '/') {\n          throw generateSyntaxError(\n            `Invalid block parameters syntax: incomplete parameters list, expecting \"|\" but the tag was closed prematurely`,\n            as.start.until(this.offset().move(1))\n          );\n        } else {\n          // slurp up anything else into the name, validate later\n          state = {\n            state: 'BlockParamName',\n            name: next,\n            start: this.offset(),\n          };\n          this.tokenizer.consume();\n        }\n      },\n\n      BlockParamName: (next: string) => {\n        assert(state.state === 'BlockParamName', 'bug in block params parser');\n\n        if (next === '') {","sourceCodeStart":412,"sourceCodeEnd":448,"githubUrl":"https://github.com/emberjs/ember.js/blob/26f97246a8bf2e28edf26ac3093da2e86c04ffc5/packages/@glimmer/syntax/lib/parser/tokenizer-event-handlers.ts#L412-L448","documentation":"After at least one block param identifier was parsed, the parser expected the closing `|`, but instead hit `>` or `/` (tag close). This means the parameters list was left unclosed before the tag ended.","triggerScenarios":"parsePossibleBlockParams (via appendToAttributeName) when the next character is `>` or `/` while state is inside the parameters list — e.g. `<Foo as |a>` or `<Foo as |a/>`.","commonSituations":"Forgetting the closing pipe when writing `as |a`; deleting the second pipe during edits; mistaking the tag close for the list terminator.","solutions":["Add the closing pipe before the tag close: `<Foo as |a|>`","Check each opened `|` has a matching closing `|`"],"exampleFix":"// before\n<Foo as |a>\n// after\n<Foo as |a|>","handlingStrategy":"validation","validationCode":"// Each `as |` must have a matching closing `|` before `>` or `/`\nif (/<[^>]*\\bas\\s\\|[^|>]*[>\\/]/.test(template)) {\n  throw new Error('Block params list missing closing \"|\" before tag close');\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pair the opening pipe with a closing pipe before `>`","Use prettier/glimmer formatting to normalize block params"],"tags":["glimmer","handlebars","template-syntax","block-params"],"backgroundTag":"invalid-block-params-syntax","analyzedSha":"26f97246a8bf2e28edf26ac3093da2e86c04ffc5","analyzedAt":"2026-09-01T05:01:28.182Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}