@abapify/acds 0.4.14 → 0.4.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -14
- package/dist/index.d.mts +427 -8
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3091 -245
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/tokens.ts","../src/parser.ts","../src/visitor.ts","../src/errors.ts","../src/lib/ast/walker.ts","../src/lib/validate/cardinality.ts","../src/lib/validate/elements.ts","../src/lib/validate/index.ts","../src/lib/grammar/ddl.ts","../src/lib/grammar/dcl.ts","../src/lib/grammar/annotations.ts","../src/lib/grammar/associations.ts","../src/lib/grammar/parameters.ts","../src/lib/grammar/projections.ts","../src/lib/grammar/actions.ts","../src/lib/grammar/index.ts","../src/index.ts"],"sourcesContent":["/**\n * Chevrotain Token Definitions for ABAP CDS\n *\n * Token order matters: more specific patterns must come before general ones.\n * Keywords use `longer_alt` to avoid matching prefixes of identifiers.\n */\nimport { createToken, Lexer } from 'chevrotain';\n\n// ============================================\n// Whitespace & Comments\n// ============================================\n\nexport const WhiteSpace = createToken({\n name: 'WhiteSpace',\n pattern: /\\s+/,\n group: Lexer.SKIPPED,\n});\n\nexport const LineComment = createToken({\n name: 'LineComment',\n pattern: /\\/\\/[^\\n]*/,\n group: Lexer.SKIPPED,\n});\n\nexport const BlockComment = createToken({\n name: 'BlockComment',\n pattern: /\\/\\*[\\s\\S]*?\\*\\//,\n group: Lexer.SKIPPED,\n});\n\n// ============================================\n// Literals\n// ============================================\n\nexport const StringLiteral = createToken({\n name: 'StringLiteral',\n pattern: /'(?:[^'\\\\]|\\\\.)*'/,\n});\n\nexport const NumberLiteral = createToken({\n name: 'NumberLiteral',\n pattern: /\\d+(?:\\.\\d+)?/,\n});\n\n/** Hash-prefixed enum value: #TRANSPARENT, #NOT_EXTENSIBLE */\nexport const EnumLiteral = createToken({\n name: 'EnumLiteral',\n pattern: /#[A-Za-z_][A-Za-z0-9_]*/,\n});\n\n// ============================================\n// Identifier (must come AFTER all keywords)\n// ============================================\n\nexport const Identifier = createToken({\n name: 'Identifier',\n pattern: /[A-Za-z_][A-Za-z0-9_]*/,\n});\n\n// ============================================\n// Keywords (use longer_alt: Identifier)\n// ============================================\n\nexport const Define = createToken({\n name: 'Define',\n pattern: /define/,\n longer_alt: Identifier,\n});\n\nexport const Table = createToken({\n name: 'Table',\n pattern: /table/,\n longer_alt: Identifier,\n});\n\nexport const Structure = createToken({\n name: 'Structure',\n pattern: /structure/,\n longer_alt: Identifier,\n});\n\nexport const Type = createToken({\n name: 'Type',\n pattern: /type/,\n longer_alt: Identifier,\n});\n\nexport const Service = createToken({\n name: 'Service',\n pattern: /service/,\n longer_alt: Identifier,\n});\n\nexport const Expose = createToken({\n name: 'Expose',\n pattern: /expose/,\n longer_alt: Identifier,\n});\n\nexport const Annotate = createToken({\n name: 'Annotate',\n pattern: /annotate/,\n longer_alt: Identifier,\n});\n\nexport const Entity = createToken({\n name: 'Entity',\n pattern: /entity/,\n longer_alt: Identifier,\n});\n\nexport const With = createToken({\n name: 'With',\n pattern: /with/,\n longer_alt: Identifier,\n});\n\nexport const Key = createToken({\n name: 'Key',\n pattern: /key/,\n longer_alt: Identifier,\n});\n\nexport const Not = createToken({\n name: 'Not',\n pattern: /not/,\n longer_alt: Identifier,\n});\n\nexport const Null = createToken({\n name: 'Null',\n pattern: /null/,\n longer_alt: Identifier,\n});\n\nexport const As = createToken({\n name: 'As',\n pattern: /as/,\n longer_alt: Identifier,\n});\n\nexport const Include = createToken({\n name: 'Include',\n pattern: /include/,\n longer_alt: Identifier,\n});\n\nexport const Suffix = createToken({\n name: 'Suffix',\n pattern: /suffix/,\n longer_alt: Identifier,\n});\n\nexport const True = createToken({\n name: 'True',\n pattern: /true/,\n longer_alt: Identifier,\n});\n\nexport const False = createToken({\n name: 'False',\n pattern: /false/,\n longer_alt: Identifier,\n});\n\nexport const Abap = createToken({\n name: 'Abap',\n pattern: /abap/,\n longer_alt: Identifier,\n});\n\n// ---- Phase 2/3 additions ----\n\nexport const View = createToken({\n name: 'View',\n pattern: /view/,\n longer_alt: Identifier,\n});\n\nexport const Projection = createToken({\n name: 'Projection',\n pattern: /projection/,\n longer_alt: Identifier,\n});\n\nexport const Select = createToken({\n name: 'Select',\n pattern: /select/,\n longer_alt: Identifier,\n});\n\nexport const From = createToken({\n name: 'From',\n pattern: /from/,\n longer_alt: Identifier,\n});\n\nexport const On = createToken({\n name: 'On',\n pattern: /on/,\n longer_alt: Identifier,\n});\n\nexport const Association = createToken({\n name: 'Association',\n pattern: /association/,\n longer_alt: Identifier,\n});\n\nexport const Composition = createToken({\n name: 'Composition',\n pattern: /composition/,\n longer_alt: Identifier,\n});\n\nexport const To = createToken({\n name: 'To',\n pattern: /to/,\n longer_alt: Identifier,\n});\n\nexport const Many = createToken({\n name: 'Many',\n pattern: /many/,\n longer_alt: Identifier,\n});\n\nexport const One = createToken({\n name: 'One',\n pattern: /one/,\n longer_alt: Identifier,\n});\n\nexport const Of = createToken({\n name: 'Of',\n pattern: /of/,\n longer_alt: Identifier,\n});\n\nexport const Parameters = createToken({\n name: 'Parameters',\n pattern: /parameters/,\n longer_alt: Identifier,\n});\n\nexport const Role = createToken({\n name: 'Role',\n pattern: /role/,\n longer_alt: Identifier,\n});\n\nexport const Grant = createToken({\n name: 'Grant',\n pattern: /grant/,\n longer_alt: Identifier,\n});\n\nexport const Where = createToken({\n name: 'Where',\n pattern: /where/,\n longer_alt: Identifier,\n});\n\nexport const Abstract = createToken({\n name: 'Abstract',\n pattern: /abstract/,\n longer_alt: Identifier,\n});\n\nexport const Custom = createToken({\n name: 'Custom',\n pattern: /custom/,\n longer_alt: Identifier,\n});\n\nexport const Virtual = createToken({\n name: 'Virtual',\n pattern: /virtual/,\n longer_alt: Identifier,\n});\n\nexport const Redirected = createToken({\n name: 'Redirected',\n pattern: /redirected/,\n longer_alt: Identifier,\n});\n\nexport const Default = createToken({\n name: 'Default',\n pattern: /default/,\n longer_alt: Identifier,\n});\n\n// Operators for simple expressions inside where-clauses / associations\nexport const EqEq = createToken({ name: 'EqEq', pattern: /==/ });\nexport const Eq = createToken({ name: 'Eq', pattern: /=/ });\nexport const NotEq = createToken({ name: 'NotEq', pattern: /!=|<>/ });\nexport const LtEq = createToken({ name: 'LtEq', pattern: /<=/ });\nexport const GtEq = createToken({ name: 'GtEq', pattern: />=/ });\nexport const Lt = createToken({ name: 'Lt', pattern: /</ });\nexport const Gt = createToken({ name: 'Gt', pattern: />/ });\n\nexport const And = createToken({\n name: 'And',\n pattern: /and/,\n longer_alt: Identifier,\n});\n\nexport const Or = createToken({\n name: 'Or',\n pattern: /or/,\n longer_alt: Identifier,\n});\n\n// ============================================\n// Symbols\n// ============================================\n\nexport const At = createToken({ name: 'At', pattern: /@/ });\nexport const Colon = createToken({ name: 'Colon', pattern: /:/ });\nexport const Semicolon = createToken({ name: 'Semicolon', pattern: /;/ });\nexport const Dot = createToken({ name: 'Dot', pattern: /\\./ });\nexport const Comma = createToken({ name: 'Comma', pattern: /,/ });\nexport const LBrace = createToken({ name: 'LBrace', pattern: /\\{/ });\nexport const RBrace = createToken({ name: 'RBrace', pattern: /\\}/ });\nexport const LParen = createToken({ name: 'LParen', pattern: /\\(/ });\nexport const RParen = createToken({ name: 'RParen', pattern: /\\)/ });\nexport const LBracket = createToken({ name: 'LBracket', pattern: /\\[/ });\nexport const RBracket = createToken({ name: 'RBracket', pattern: /\\]/ });\nexport const Star = createToken({ name: 'Star', pattern: /\\*/ });\nexport const Plus = createToken({ name: 'Plus', pattern: /\\+/ });\nexport const Minus = createToken({ name: 'Minus', pattern: /-/ });\nexport const Slash = createToken({ name: 'Slash', pattern: /\\// });\n\n// ============================================\n// Token list (ORDER MATTERS)\n// Keywords must come before Identifier\n// ============================================\n\nexport const allTokens = [\n // Whitespace & comments (skipped)\n WhiteSpace,\n LineComment,\n BlockComment,\n\n // Literals\n StringLiteral,\n NumberLiteral,\n EnumLiteral,\n\n // Keywords (before Identifier!)\n // NOTE: longer keywords that share a prefix with shorter ones (e.g.\n // `association` starts with `as`, `one` starts with `on`) MUST be listed\n // before the shorter keyword otherwise Chevrotain's lexer will complain\n // that they are unreachable.\n Association,\n Composition,\n Abstract,\n Annotate,\n Define,\n Table,\n Structure,\n Type,\n Service,\n Expose,\n Entity,\n With,\n Key,\n Not,\n Null,\n As,\n Include,\n Suffix,\n True,\n False,\n Abap,\n One,\n View,\n Projection,\n Select,\n From,\n On,\n To,\n Many,\n Of,\n Parameters,\n Role,\n Grant,\n Where,\n Custom,\n Virtual,\n Redirected,\n Default,\n And,\n Or,\n\n // Identifier (catch-all for names)\n Identifier,\n\n // Multi-char symbols (before single-char equivalents)\n EqEq,\n NotEq,\n LtEq,\n GtEq,\n\n // Symbols\n At,\n Colon,\n Semicolon,\n Dot,\n Comma,\n LBrace,\n RBrace,\n LParen,\n RParen,\n LBracket,\n RBracket,\n Eq,\n Lt,\n Gt,\n Star,\n Plus,\n Minus,\n Slash,\n];\n\nexport const CdsLexer = new Lexer(allTokens);\n","/**\n * Chevrotain CstParser for ABAP CDS.\n *\n * Grammar coverage (see src/lib/grammar/*.ts for the per-topic index):\n * - DDL : table, structure, simple type, view entity, projection view,\n * abstract/custom entity\n * - DCL : role definitions (grant select on ... where ...)\n * - DDLX : metadata extensions (`annotate entity ... with { ... }`)\n * - SRVD : service definitions (`define service ... { expose ...; }`)\n * - Elements / associations / parameters / annotations\n *\n * Rules are kept in this single class (Chevrotain requirement). Logical\n * groupings are delimited with section banners and documented in\n * `src/lib/grammar/`.\n */\nimport { CstParser } from 'chevrotain';\nimport {\n allTokens,\n At,\n Colon,\n Semicolon,\n Dot,\n Comma,\n LBrace,\n RBrace,\n LParen,\n RParen,\n LBracket,\n RBracket,\n Define,\n Table,\n Structure,\n Type,\n Service,\n Expose,\n Annotate,\n Entity,\n With,\n Key,\n Not,\n Null,\n As,\n Include,\n Suffix,\n True,\n False,\n Abap,\n View,\n Projection,\n Select,\n From,\n On,\n Association,\n Composition,\n To,\n Many,\n One,\n Of,\n Parameters,\n Role,\n Grant,\n Where,\n Abstract,\n Custom,\n Virtual,\n Redirected,\n Default,\n And,\n Or,\n Identifier,\n StringLiteral,\n NumberLiteral,\n EnumLiteral,\n EqEq,\n Eq,\n NotEq,\n LtEq,\n GtEq,\n Lt,\n Gt,\n Star,\n} from './tokens';\n\nexport class CdsParser extends CstParser {\n constructor() {\n super(allTokens, {\n recoveryEnabled: true,\n maxLookahead: 4,\n });\n this.performSelfAnalysis();\n }\n\n // ============================================================\n // Root rule\n // ============================================================\n\n public sourceFile = this.RULE('sourceFile', () => {\n this.MANY(() => {\n this.SUBRULE(this.topLevelAnnotation);\n });\n this.SUBRULE(this.definition);\n });\n\n // ============================================================\n // Top-level definition dispatch\n // ============================================================\n\n private readonly definition = this.RULE('definition', () => {\n this.OR([\n { ALT: () => this.SUBRULE(this.defineStatement) },\n { ALT: () => this.SUBRULE(this.annotateStatement) },\n ]);\n });\n\n private readonly defineStatement = this.RULE('defineStatement', () => {\n this.CONSUME(Define);\n this.OR([\n { ALT: () => this.SUBRULE(this.tableDefinition) },\n { ALT: () => this.SUBRULE(this.structureDefinition) },\n { ALT: () => this.SUBRULE(this.viewEntityDefinition) },\n { ALT: () => this.SUBRULE(this.abstractEntityDefinition) },\n { ALT: () => this.SUBRULE(this.customEntityDefinition) },\n { ALT: () => this.SUBRULE(this.simpleTypeDefinition) },\n { ALT: () => this.SUBRULE(this.serviceDefinition) },\n { ALT: () => this.SUBRULE(this.roleDefinition) },\n ]);\n });\n\n // ============================================================\n // Table definition\n // ============================================================\n\n private readonly tableDefinition = this.RULE('tableDefinition', () => {\n this.CONSUME(Table);\n this.SUBRULE(this.cdsName);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.tableMember);\n });\n this.CONSUME(RBrace);\n });\n\n // ============================================================\n // Structure definition\n // ============================================================\n\n private readonly structureDefinition = this.RULE(\n 'structureDefinition',\n () => {\n this.CONSUME(Structure);\n this.SUBRULE(this.cdsName);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.tableMember);\n });\n this.CONSUME(RBrace);\n },\n );\n\n // ============================================================\n // View entity: `view entity <name> [with parameters ...] as select from ...`\n // or `as projection on ...`\n // ============================================================\n\n private readonly viewEntityDefinition = this.RULE(\n 'viewEntityDefinition',\n () => {\n this.CONSUME(View);\n this.CONSUME(Entity);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.SUBRULE(this.parametersClause);\n });\n this.CONSUME(As);\n this.OR([\n { ALT: () => this.SUBRULE(this.selectFromClause) },\n { ALT: () => this.SUBRULE(this.projectionOnClause) },\n ]);\n this.OPTION2(() => {\n this.SUBRULE(this.elementList);\n });\n // optional where at top-level of view (consume expression if present)\n this.OPTION3(() => {\n this.CONSUME(Where);\n this.SUBRULE(this.expression);\n });\n },\n );\n\n private readonly abstractEntityDefinition = this.RULE(\n 'abstractEntityDefinition',\n () => {\n this.CONSUME(Abstract);\n this.CONSUME(Entity);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.SUBRULE(this.parametersClause);\n });\n this.SUBRULE(this.elementList);\n },\n );\n\n private readonly customEntityDefinition = this.RULE(\n 'customEntityDefinition',\n () => {\n this.CONSUME(Custom);\n this.CONSUME(Entity);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.SUBRULE(this.parametersClause);\n });\n this.SUBRULE(this.elementList);\n },\n );\n\n private readonly selectFromClause = this.RULE('selectFromClause', () => {\n this.CONSUME(Select);\n this.OPTION(() => {\n this.CONSUME(From);\n });\n // CDS allows either \"select from X\" (view entity syntax) or \"select from X\".\n // To stay permissive the `from` is optional above.\n this.SUBRULE(this.dataSource);\n });\n\n private readonly projectionOnClause = this.RULE('projectionOnClause', () => {\n this.CONSUME(Projection);\n this.CONSUME(On);\n this.SUBRULE(this.dataSource);\n });\n\n private readonly dataSource = this.RULE('dataSource', () => {\n this.SUBRULE(this.qualifiedName);\n this.OPTION(() => {\n this.OPTION2(() => this.CONSUME(As));\n this.SUBRULE(this.cdsName);\n });\n });\n\n // ============================================================\n // Element list: `{ [key] [virtual] <expr> [as <alias>] ; ... }`\n // ============================================================\n\n private readonly elementList = this.RULE('elementList', () => {\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.elementMember);\n });\n this.CONSUME(RBrace);\n });\n\n private readonly elementMember = this.RULE('elementMember', () => {\n // Annotations are shared between projection elements and associations to\n // keep the LL(k) grammar unambiguous. The branch decision is made on the\n // `association` / `composition` keyword (or the absence thereof).\n this.MANY(() => this.SUBRULE(this.annotation));\n this.OR([\n { ALT: () => this.SUBRULE(this.associationTail) },\n { ALT: () => this.SUBRULE(this.viewElementTail) },\n ]);\n });\n\n private readonly viewElementTail = this.RULE('viewElementTail', () => {\n this.OPTION(() => this.CONSUME(Key));\n this.OPTION2(() => this.CONSUME(Virtual));\n this.OPTION3(() => this.CONSUME(Redirected));\n // Either a typed field `name : type` (valid for abstract/custom entities)\n // or a projection expression `expr [as alias]`.\n this.OR([\n {\n GATE: () => this.isTypedField(),\n ALT: () => this.SUBRULE(this.typedFieldTail),\n },\n { ALT: () => this.SUBRULE(this.projectionExpression) },\n ]);\n // Element terminator is optional for the trailing element.\n this.OPTION4(() => {\n this.OR2([\n { ALT: () => this.CONSUME(Semicolon) },\n { ALT: () => this.CONSUME(Comma) },\n ]);\n });\n });\n\n private readonly typedFieldTail = this.RULE('typedFieldTail', () => {\n this.SUBRULE(this.cdsName);\n this.CONSUME(Colon);\n this.SUBRULE(this.typeReference);\n this.OPTION(() => {\n this.CONSUME(Not);\n this.CONSUME(Null);\n });\n });\n\n /**\n * projection expression:\n * <qualified-name> [as <alias>]\n * Kept intentionally narrow — full SQL expression support is out of scope.\n */\n private readonly projectionExpression = this.RULE(\n 'projectionExpression',\n () => {\n this.SUBRULE(this.qualifiedName);\n this.OPTION(() => {\n this.CONSUME(As);\n this.SUBRULE(this.cdsName);\n });\n },\n );\n\n /** Cheap lookahead: `ident :` (optionally following `key`/`virtual`) → typed field. */\n private isTypedField(): boolean {\n // Look ahead: skip name token, expect Colon.\n // Both tokens should already be past the optional markers (handled by parser).\n const first = this.LA(1);\n const second = this.LA(2);\n if (!first || !second) return false;\n const isName = first.tokenType?.name === 'Identifier' || false;\n return isName && second.tokenType?.name === 'Colon';\n }\n\n // ============================================================\n // Associations\n // association[<card>] [of many|one]? to <target> [as _<alias>]\n // [on <expr>]\n // ============================================================\n\n private readonly associationTail = this.RULE('associationTail', () => {\n this.OR([\n { ALT: () => this.CONSUME(Association) },\n { ALT: () => this.CONSUME(Composition) },\n ]);\n this.OPTION(() => this.SUBRULE(this.cardinality));\n // connector: \"to [redirected to]? <target>\" (associations)\n // | \"of [many|one]? [to]? <target>\" (compositions / explicit)\n this.OR2([\n {\n ALT: () => {\n this.CONSUME(To);\n this.OPTION2(() => {\n this.CONSUME(Redirected);\n this.CONSUME2(To);\n });\n },\n },\n {\n ALT: () => {\n this.CONSUME(Of);\n this.OPTION3(() => {\n this.OR3([\n { ALT: () => this.CONSUME(Many) },\n { ALT: () => this.CONSUME(One) },\n ]);\n });\n this.OPTION4(() => this.CONSUME3(To));\n },\n },\n ]);\n this.SUBRULE(this.qualifiedName);\n this.OPTION5(() => {\n this.CONSUME(As);\n this.SUBRULE(this.cdsName);\n });\n this.OPTION6(() => {\n this.CONSUME(On);\n this.SUBRULE(this.expression);\n });\n this.OPTION7(() => {\n this.OR4([\n { ALT: () => this.CONSUME(Semicolon) },\n { ALT: () => this.CONSUME(Comma) },\n ]);\n });\n });\n\n /** `[<lower>..<upper>]`, `[<n>]`, `[*]`, `[<lower>..*]` */\n private readonly cardinality = this.RULE('cardinality', () => {\n this.CONSUME(LBracket);\n this.OR([\n { ALT: () => this.CONSUME(Star) },\n {\n ALT: () => {\n this.CONSUME(NumberLiteral);\n this.OPTION(() => {\n this.CONSUME(Dot);\n this.CONSUME2(Dot);\n this.OR2([\n { ALT: () => this.CONSUME2(NumberLiteral) },\n { ALT: () => this.CONSUME2(Star) },\n ]);\n });\n },\n },\n ]);\n this.CONSUME(RBracket);\n });\n\n // ============================================================\n // Parameters clause: `with parameters p1 : type, p2 : type`\n // ============================================================\n\n private readonly parametersClause = this.RULE('parametersClause', () => {\n this.CONSUME(With);\n this.CONSUME(Parameters);\n this.SUBRULE(this.parameterDefinition);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE2(this.parameterDefinition);\n });\n });\n\n private readonly parameterDefinition = this.RULE(\n 'parameterDefinition',\n () => {\n this.MANY(() => this.SUBRULE(this.annotation));\n this.SUBRULE(this.cdsName);\n this.CONSUME(Colon);\n this.SUBRULE(this.typeReference);\n this.OPTION(() => {\n this.CONSUME(Default);\n this.SUBRULE(this.literal);\n });\n },\n );\n\n // ============================================================\n // Simple type definition\n // ============================================================\n\n private readonly simpleTypeDefinition = this.RULE(\n 'simpleTypeDefinition',\n () => {\n this.CONSUME(Type);\n this.SUBRULE(this.cdsName);\n this.CONSUME(Colon);\n this.SUBRULE(this.typeReference);\n this.CONSUME(Semicolon);\n },\n );\n\n // ============================================================\n // Service definition\n // ============================================================\n\n private readonly serviceDefinition = this.RULE('serviceDefinition', () => {\n this.CONSUME(Service);\n this.SUBRULE(this.cdsName);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.exposeStatement);\n });\n this.CONSUME(RBrace);\n });\n\n private readonly exposeStatement = this.RULE('exposeStatement', () => {\n this.CONSUME(Expose);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.CONSUME(As);\n this.SUBRULE2(this.cdsName);\n });\n this.CONSUME(Semicolon);\n });\n\n // ============================================================\n // DCL — `define role X { grant select on Y where cond; }`\n // ============================================================\n\n private readonly roleDefinition = this.RULE('roleDefinition', () => {\n this.CONSUME(Role);\n this.SUBRULE(this.cdsName);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.grantStatement);\n });\n this.CONSUME(RBrace);\n });\n\n private readonly grantStatement = this.RULE('grantStatement', () => {\n this.CONSUME(Grant);\n this.CONSUME(Select);\n this.CONSUME(On);\n this.SUBRULE(this.qualifiedName);\n this.OPTION(() => {\n this.CONSUME(Where);\n this.SUBRULE(this.expression);\n });\n this.CONSUME(Semicolon);\n });\n\n // ============================================================\n // Table/structure members\n // ============================================================\n\n private readonly tableMember = this.RULE('tableMember', () => {\n this.OR([\n { ALT: () => this.SUBRULE(this.includeDirective) },\n { ALT: () => this.SUBRULE(this.fieldDefinition) },\n ]);\n });\n\n private readonly includeDirective = this.RULE('includeDirective', () => {\n this.CONSUME(Include);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.CONSUME(With);\n this.CONSUME(Suffix);\n this.SUBRULE2(this.cdsName);\n });\n this.CONSUME(Semicolon);\n });\n\n private readonly fieldDefinition = this.RULE('fieldDefinition', () => {\n this.MANY(() => {\n this.SUBRULE(this.annotation);\n });\n this.OPTION(() => {\n this.CONSUME(Key);\n });\n this.SUBRULE(this.cdsName);\n this.CONSUME(Colon);\n this.SUBRULE(this.typeReference);\n this.OPTION2(() => {\n this.CONSUME(Not);\n this.CONSUME(Null);\n });\n this.CONSUME(Semicolon);\n });\n\n // ============================================================\n // Metadata extension (annotate entity ... with { ... })\n // ============================================================\n\n private readonly annotateStatement = this.RULE('annotateStatement', () => {\n this.CONSUME(Annotate);\n this.CONSUME(Entity);\n this.SUBRULE(this.cdsName);\n this.CONSUME(With);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.annotatedElement);\n });\n this.CONSUME(RBrace);\n });\n\n private readonly annotatedElement = this.RULE('annotatedElement', () => {\n this.MANY(() => {\n this.SUBRULE(this.annotation);\n });\n this.SUBRULE(this.cdsName);\n this.CONSUME(Semicolon);\n });\n\n // ============================================================\n // Annotations\n // ============================================================\n\n private readonly topLevelAnnotation = this.RULE('topLevelAnnotation', () => {\n this.SUBRULE(this.annotation);\n });\n\n private readonly annotation = this.RULE('annotation', () => {\n this.CONSUME(At);\n this.SUBRULE(this.dottedName);\n this.OPTION(() => {\n this.CONSUME(Colon);\n this.SUBRULE(this.annotationValue);\n });\n });\n\n private readonly dottedName = this.RULE('dottedName', () => {\n this.SUBRULE(this.cdsName);\n this.MANY(() => {\n this.CONSUME(Dot);\n this.SUBRULE2(this.cdsName);\n });\n });\n\n private readonly annotationValue = this.RULE('annotationValue', () => {\n this.OR([\n { ALT: () => this.CONSUME(StringLiteral) },\n { ALT: () => this.CONSUME(EnumLiteral) },\n { ALT: () => this.CONSUME(True) },\n { ALT: () => this.CONSUME(False) },\n { ALT: () => this.CONSUME(NumberLiteral) },\n { ALT: () => this.SUBRULE(this.annotationArray) },\n { ALT: () => this.SUBRULE(this.annotationObject) },\n ]);\n });\n\n private readonly annotationArray = this.RULE('annotationArray', () => {\n this.CONSUME(LBracket);\n this.MANY_SEP({\n SEP: Comma,\n DEF: () => {\n this.SUBRULE(this.annotationValue);\n },\n });\n this.CONSUME(RBracket);\n });\n\n private readonly annotationObject = this.RULE('annotationObject', () => {\n this.CONSUME(LBrace);\n this.MANY_SEP({\n SEP: Comma,\n DEF: () => {\n this.SUBRULE(this.annotationProperty);\n },\n });\n this.CONSUME(RBrace);\n });\n\n private readonly annotationProperty = this.RULE('annotationProperty', () => {\n this.SUBRULE(this.dottedName);\n this.CONSUME(Colon);\n this.SUBRULE(this.annotationValue);\n });\n\n // ============================================================\n // Literals\n // ============================================================\n\n private readonly literal = this.RULE('literal', () => {\n this.OR([\n { ALT: () => this.CONSUME(StringLiteral) },\n { ALT: () => this.CONSUME(NumberLiteral) },\n { ALT: () => this.CONSUME(EnumLiteral) },\n { ALT: () => this.CONSUME(True) },\n { ALT: () => this.CONSUME(False) },\n ]);\n });\n\n // ============================================================\n // Expressions (narrow subset: operands + binary comparisons + AND/OR)\n // Used by `on` / `where` clauses. Expression trees are intentionally\n // kept opaque — consumers see a flat token list through the visitor.\n // ============================================================\n\n private readonly expression = this.RULE('expression', () => {\n this.SUBRULE(this.comparison);\n this.MANY(() => {\n this.OR([\n { ALT: () => this.CONSUME(And) },\n { ALT: () => this.CONSUME(Or) },\n ]);\n this.SUBRULE2(this.comparison);\n });\n });\n\n private readonly comparison = this.RULE('comparison', () => {\n this.SUBRULE(this.operand);\n this.OPTION(() => {\n this.OR([\n { ALT: () => this.CONSUME(EqEq) },\n { ALT: () => this.CONSUME(Eq) },\n { ALT: () => this.CONSUME(NotEq) },\n { ALT: () => this.CONSUME(LtEq) },\n { ALT: () => this.CONSUME(GtEq) },\n { ALT: () => this.CONSUME(Lt) },\n { ALT: () => this.CONSUME(Gt) },\n ]);\n this.SUBRULE2(this.operand);\n });\n });\n\n private readonly operand = this.RULE('operand', () => {\n this.OR([\n { ALT: () => this.SUBRULE(this.literal) },\n { ALT: () => this.SUBRULE(this.qualifiedName) },\n ]);\n });\n\n // ============================================================\n // Type references\n // ============================================================\n\n private readonly typeReference = this.RULE('typeReference', () => {\n this.OR([\n { ALT: () => this.SUBRULE(this.builtinType) },\n { ALT: () => this.SUBRULE(this.namedType) },\n ]);\n });\n\n /** `abap.char(10)` or `abap.dec(11,2)` */\n private readonly builtinType = this.RULE('builtinType', () => {\n this.CONSUME(Abap);\n this.CONSUME(Dot);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.CONSUME(LParen);\n this.CONSUME(NumberLiteral);\n this.OPTION2(() => {\n this.CONSUME(Comma);\n this.CONSUME2(NumberLiteral);\n });\n this.CONSUME(RParen);\n });\n });\n\n /** Data element or other named type reference */\n private readonly namedType = this.RULE('namedType', () => {\n this.SUBRULE(this.qualifiedName);\n });\n\n // ============================================================\n // Name helpers\n // ============================================================\n\n /** An identifier that may also be a keyword used as a name. */\n private readonly cdsName = this.RULE('cdsName', () => {\n this.OR([\n { ALT: () => this.CONSUME(Identifier) },\n // Keywords permitted as names (common CDS identifier collisions).\n { ALT: () => this.CONSUME(Table) },\n { ALT: () => this.CONSUME(Structure) },\n { ALT: () => this.CONSUME(Type) },\n { ALT: () => this.CONSUME(Service) },\n { ALT: () => this.CONSUME(Entity) },\n { ALT: () => this.CONSUME(Key) },\n { ALT: () => this.CONSUME(Expose) },\n { ALT: () => this.CONSUME(View) },\n { ALT: () => this.CONSUME(Role) },\n { ALT: () => this.CONSUME(Association) },\n { ALT: () => this.CONSUME(Composition) },\n { ALT: () => this.CONSUME(Abstract) },\n { ALT: () => this.CONSUME(Custom) },\n { ALT: () => this.CONSUME(Virtual) },\n { ALT: () => this.CONSUME(Redirected) },\n { ALT: () => this.CONSUME(Default) },\n { ALT: () => this.CONSUME(Parameters) },\n { ALT: () => this.CONSUME(Grant) },\n { ALT: () => this.CONSUME(Many) },\n { ALT: () => this.CONSUME(One) },\n { ALT: () => this.CONSUME(Of) },\n { ALT: () => this.CONSUME(Projection) },\n { ALT: () => this.CONSUME(Select) },\n { ALT: () => this.CONSUME(From) },\n { ALT: () => this.CONSUME(To) },\n { ALT: () => this.CONSUME(Where) },\n ]);\n });\n\n /** Dot-separated qualified name: foo.bar.baz */\n private readonly qualifiedName = this.RULE('qualifiedName', () => {\n this.SUBRULE(this.cdsName);\n this.MANY(() => {\n this.CONSUME(Dot);\n this.SUBRULE2(this.cdsName);\n });\n });\n}\n\n/** Singleton parser instance (Chevrotain parsers are reusable) */\nexport const cdsParser = new CdsParser();\n","/**\n * CST → AST Visitor\n *\n * Transforms Chevrotain's Concrete Syntax Tree into our typed AST.\n */\nimport type { CstNode, IToken } from 'chevrotain';\nimport { cdsParser } from './parser';\nimport type {\n AbstractEntityDefinition,\n Annotation,\n AnnotationValue,\n AnnotationProperty,\n AnnotatedElement,\n AssociationDeclaration,\n AssociationKind,\n BuiltinTypeRef,\n Cardinality,\n CdsDefinition,\n CdsSourceFile,\n CustomEntityDefinition,\n DataSource,\n DataSourceKind,\n Expression,\n ExposeStatement,\n FieldDefinition,\n GrantStatement,\n IncludeDirective,\n MetadataExtension,\n NamedTypeRef,\n ParameterDefinition,\n RoleDefinition,\n ServiceDefinition,\n SimpleTypeDefinition,\n StructureDefinition,\n TableDefinition,\n TableMember,\n TypeRef,\n ViewElement,\n ViewEntityDefinition,\n ViewMember,\n} from './ast';\n\n// Generate the base visitor class from the parser's grammar\nconst BaseCstVisitor = cdsParser.getBaseCstVisitorConstructor<\n unknown,\n unknown\n>();\n\ntype Ctx = Record<string, CstNode[] | IToken[] | undefined>;\n\nfunction asNodes(v: CstNode[] | IToken[] | undefined): CstNode[] {\n return (v as CstNode[]) ?? [];\n}\n\nfunction asTokens(v: CstNode[] | IToken[] | undefined): IToken[] {\n return (v as IToken[]) ?? [];\n}\n\nfunction collectTokenImages(node: CstNode | undefined): IToken[] {\n if (!node) return [];\n const out: IToken[] = [];\n const walk = (n: CstNode) => {\n for (const children of Object.values(n.children)) {\n for (const child of children) {\n if ('tokenType' in child) {\n out.push(child as IToken);\n } else {\n walk(child as CstNode);\n }\n }\n }\n };\n walk(node);\n out.sort((a, b) => (a.startOffset ?? 0) - (b.startOffset ?? 0));\n return out;\n}\n\nfunction toExpression(node: CstNode | undefined): Expression {\n const toks = collectTokenImages(node);\n return {\n source: toks.map((t) => t.image).join(' '),\n tokens: toks.map((t) => t.image),\n };\n}\n\nexport class CdsVisitor extends BaseCstVisitor {\n constructor() {\n super();\n this.validateVisitor();\n }\n\n sourceFile(ctx: Ctx): CdsSourceFile {\n const annotations: Annotation[] = asNodes(ctx.topLevelAnnotation).map(\n (node) => this.visit(node) as Annotation,\n );\n const def = this.visit(asNodes(ctx.definition)[0]) as CdsDefinition;\n\n // Attach top-level annotations to the definition\n if ('annotations' in def) {\n (def as { annotations: Annotation[] }).annotations = [\n ...annotations,\n ...(def as { annotations: Annotation[] }).annotations,\n ];\n }\n\n return { definitions: [def] };\n }\n\n definition(ctx: Ctx): CdsDefinition {\n if (ctx.defineStatement) {\n return this.visit(asNodes(ctx.defineStatement)[0]) as CdsDefinition;\n }\n return this.visit(asNodes(ctx.annotateStatement)[0]) as CdsDefinition;\n }\n\n defineStatement(ctx: Ctx): CdsDefinition {\n const dispatch: Array<[string, undefined | CstNode]> = [\n ['tableDefinition', asNodes(ctx.tableDefinition)[0]],\n ['structureDefinition', asNodes(ctx.structureDefinition)[0]],\n ['viewEntityDefinition', asNodes(ctx.viewEntityDefinition)[0]],\n ['abstractEntityDefinition', asNodes(ctx.abstractEntityDefinition)[0]],\n ['customEntityDefinition', asNodes(ctx.customEntityDefinition)[0]],\n ['simpleTypeDefinition', asNodes(ctx.simpleTypeDefinition)[0]],\n ['serviceDefinition', asNodes(ctx.serviceDefinition)[0]],\n ['roleDefinition', asNodes(ctx.roleDefinition)[0]],\n ];\n for (const [, node] of dispatch) {\n if (node) return this.visit(node) as CdsDefinition;\n }\n // should not happen\n return { kind: 'table', name: '', annotations: [], members: [] };\n }\n\n tableDefinition(ctx: Ctx): TableDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const members = asNodes(ctx.tableMember).map(\n (node) => this.visit(node) as TableMember,\n );\n return { kind: 'table', name, annotations: [], members };\n }\n\n structureDefinition(ctx: Ctx): StructureDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const members = asNodes(ctx.tableMember).map(\n (node) => this.visit(node) as TableMember,\n );\n return { kind: 'structure', name, annotations: [], members };\n }\n\n // ---- View entities ----------------------------------------\n\n viewEntityDefinition(ctx: Ctx): ViewEntityDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const parameters = ctx.parametersClause\n ? (this.visit(asNodes(ctx.parametersClause)[0]) as ParameterDefinition[])\n : [];\n\n let sourceKind: DataSourceKind = 'select';\n let source: DataSource = { name: '' };\n if (ctx.selectFromClause) {\n sourceKind = 'select';\n source = this.visit(asNodes(ctx.selectFromClause)[0]) as DataSource;\n } else if (ctx.projectionOnClause) {\n sourceKind = 'projection';\n source = this.visit(asNodes(ctx.projectionOnClause)[0]) as DataSource;\n }\n\n const members = ctx.elementList\n ? (this.visit(asNodes(ctx.elementList)[0]) as ViewMember[])\n : [];\n\n const where = ctx.expression\n ? toExpression(asNodes(ctx.expression)[0])\n : undefined;\n\n return {\n kind: 'viewEntity',\n name,\n annotations: [],\n sourceKind,\n source,\n parameters,\n members,\n ...(where && { where }),\n };\n }\n\n abstractEntityDefinition(ctx: Ctx): AbstractEntityDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const parameters = ctx.parametersClause\n ? (this.visit(asNodes(ctx.parametersClause)[0]) as ParameterDefinition[])\n : [];\n const members = this.visit(asNodes(ctx.elementList)[0]) as ViewMember[];\n return {\n kind: 'abstractEntity',\n name,\n annotations: [],\n parameters,\n members,\n };\n }\n\n customEntityDefinition(ctx: Ctx): CustomEntityDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const parameters = ctx.parametersClause\n ? (this.visit(asNodes(ctx.parametersClause)[0]) as ParameterDefinition[])\n : [];\n const members = this.visit(asNodes(ctx.elementList)[0]) as ViewMember[];\n return {\n kind: 'customEntity',\n name,\n annotations: [],\n parameters,\n members,\n };\n }\n\n selectFromClause(ctx: Ctx): DataSource {\n return this.visit(asNodes(ctx.dataSource)[0]) as DataSource;\n }\n\n projectionOnClause(ctx: Ctx): DataSource {\n return this.visit(asNodes(ctx.dataSource)[0]) as DataSource;\n }\n\n dataSource(ctx: Ctx): DataSource {\n const name = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const aliasNode = asNodes(ctx.cdsName)[0];\n const alias = aliasNode ? (this.visit(aliasNode) as string) : undefined;\n return { name, ...(alias && { alias }) };\n }\n\n elementList(ctx: Ctx): ViewMember[] {\n return asNodes(ctx.elementMember).map(\n (node) => this.visit(node) as ViewMember,\n );\n }\n\n elementMember(ctx: Ctx): ViewMember {\n const annotations = asNodes(ctx.annotation).map(\n (n) => this.visit(n) as Annotation,\n );\n if (ctx.associationTail) {\n const decl = this.visit(\n asNodes(ctx.associationTail)[0],\n ) as AssociationDeclaration;\n decl.annotations = annotations;\n return decl;\n }\n const el = this.visit(asNodes(ctx.viewElementTail)[0]) as ViewElement;\n el.annotations = annotations;\n return el;\n }\n\n viewElementTail(ctx: Ctx): ViewElement {\n const isKey = !!asTokens(ctx.Key).length;\n const isVirtual = !!asTokens(ctx.Virtual).length;\n const isRedirected = !!asTokens(ctx.Redirected).length;\n\n if (ctx.typedFieldTail) {\n const tail = this.visit(asNodes(ctx.typedFieldTail)[0]) as {\n name: string;\n type: TypeRef;\n notNull: boolean;\n };\n return {\n annotations: [],\n isKey,\n isVirtual,\n isRedirected,\n expression: tail.name,\n type: tail.type,\n notNull: tail.notNull,\n };\n }\n const proj = this.visit(asNodes(ctx.projectionExpression)[0]) as {\n expression: string;\n alias?: string;\n };\n return {\n annotations: [],\n isKey,\n isVirtual,\n isRedirected,\n expression: proj.expression,\n ...(proj.alias && { alias: proj.alias }),\n };\n }\n\n typedFieldTail(ctx: Ctx): {\n name: string;\n type: TypeRef;\n notNull: boolean;\n } {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const type = this.visit(asNodes(ctx.typeReference)[0]) as TypeRef;\n const notNull = !!asTokens(ctx.Not).length;\n return { name, type, notNull };\n }\n\n projectionExpression(ctx: Ctx): { expression: string; alias?: string } {\n const expression = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const aliasNode = asNodes(ctx.cdsName)[0];\n const alias = aliasNode ? (this.visit(aliasNode) as string) : undefined;\n return { expression, ...(alias && { alias }) };\n }\n\n // ---- Associations -----------------------------------------\n\n associationTail(ctx: Ctx): AssociationDeclaration {\n const associationKind: AssociationKind = asTokens(ctx.Association).length\n ? 'association'\n : 'composition';\n\n const cardinality = ctx.cardinality\n ? (this.visit(asNodes(ctx.cardinality)[0]) as Cardinality)\n : undefined;\n\n let targetMultiplicity: 'many' | 'one' | undefined;\n if (asTokens(ctx.Many).length) targetMultiplicity = 'many';\n else if (asTokens(ctx.One).length) targetMultiplicity = 'one';\n\n const redirected = !!asTokens(ctx.Redirected).length;\n\n const target = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const aliasNode = asNodes(ctx.cdsName)[0];\n const alias = aliasNode ? (this.visit(aliasNode) as string) : undefined;\n const on = ctx.expression\n ? toExpression(asNodes(ctx.expression)[0])\n : undefined;\n\n return {\n kind: 'association',\n associationKind,\n annotations: [], // populated by elementMember()\n ...(cardinality && { cardinality }),\n ...(targetMultiplicity && { targetMultiplicity }),\n target,\n ...(redirected && { redirected: true }),\n ...(alias && { alias }),\n ...(on && { on }),\n };\n }\n\n cardinality(ctx: Ctx): Cardinality {\n const nums = asTokens(ctx.NumberLiteral);\n const stars = asTokens(ctx.Star);\n if (nums.length === 0 && stars.length >= 1) {\n // `[*]`\n return { max: '*' };\n }\n if (nums.length === 1) {\n const dotCount = asTokens(ctx.Dot).length;\n if (dotCount === 0) {\n return { max: Number.parseInt(nums[0].image, 10) };\n }\n // `[N..*]` (Star present as second operand) or `[N..M]` (handled below)\n if (stars.length >= 1) {\n return { min: Number.parseInt(nums[0].image, 10), max: '*' };\n }\n // Fallback — shouldn't happen if grammar is consistent.\n return { min: Number.parseInt(nums[0].image, 10), max: '*' };\n }\n if (nums.length === 2) {\n return {\n min: Number.parseInt(nums[0].image, 10),\n max: Number.parseInt(nums[1].image, 10),\n };\n }\n return { max: '*' };\n }\n\n // ---- Parameters -------------------------------------------\n\n parametersClause(ctx: Ctx): ParameterDefinition[] {\n return asNodes(ctx.parameterDefinition).map(\n (n) => this.visit(n) as ParameterDefinition,\n );\n }\n\n parameterDefinition(ctx: Ctx): ParameterDefinition {\n const annotations = asNodes(ctx.annotation).map(\n (n) => this.visit(n) as Annotation,\n );\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const type = this.visit(asNodes(ctx.typeReference)[0]) as TypeRef;\n const defaultValue = ctx.literal\n ? (this.visit(asNodes(ctx.literal)[0]) as AnnotationValue)\n : undefined;\n return {\n annotations,\n name,\n type,\n ...(defaultValue && { defaultValue }),\n };\n }\n\n // ---- Tables / structures ----------------------------------\n\n tableMember(ctx: Ctx): TableMember {\n if (ctx.includeDirective) {\n return this.visit(asNodes(ctx.includeDirective)[0]) as IncludeDirective;\n }\n return this.visit(asNodes(ctx.fieldDefinition)[0]) as FieldDefinition;\n }\n\n includeDirective(ctx: Ctx): IncludeDirective {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const suffix = asNodes(ctx.cdsName)[1]\n ? (this.visit(asNodes(ctx.cdsName)[1]) as string)\n : undefined;\n return { kind: 'include', name, ...(suffix !== undefined && { suffix }) };\n }\n\n fieldDefinition(ctx: Ctx): FieldDefinition {\n const annotations: Annotation[] = asNodes(ctx.annotation).map(\n (node) => this.visit(node) as Annotation,\n );\n const isKey = !!asTokens(ctx.Key).length;\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const type = this.visit(asNodes(ctx.typeReference)[0]) as TypeRef;\n const notNull = !!asTokens(ctx.Not).length;\n return { annotations, name, type, isKey, notNull };\n }\n\n simpleTypeDefinition(ctx: Ctx): SimpleTypeDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const type = this.visit(asNodes(ctx.typeReference)[0]) as TypeRef;\n return { kind: 'simpleType', name, annotations: [], type };\n }\n\n serviceDefinition(ctx: Ctx): ServiceDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const exposes = asNodes(ctx.exposeStatement).map(\n (node) => this.visit(node) as ExposeStatement,\n );\n return { kind: 'service', name, annotations: [], exposes };\n }\n\n exposeStatement(ctx: Ctx): ExposeStatement {\n const names = asNodes(ctx.cdsName).map((n) => this.visit(n) as string);\n const entity = names[0];\n const alias = names.length > 1 ? names[1] : undefined;\n return { entity, ...(alias && { alias }) };\n }\n\n // ---- DCL / roles ------------------------------------------\n\n roleDefinition(ctx: Ctx): RoleDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const grants = asNodes(ctx.grantStatement).map(\n (n) => this.visit(n) as GrantStatement,\n );\n return { kind: 'role', name, annotations: [], grants };\n }\n\n grantStatement(ctx: Ctx): GrantStatement {\n const entity = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const where = ctx.expression\n ? toExpression(asNodes(ctx.expression)[0])\n : undefined;\n return { privilege: 'select', entity, ...(where && { where }) };\n }\n\n // ---- Metadata extensions ----------------------------------\n\n annotateStatement(ctx: Ctx): MetadataExtension {\n const entity = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const elements = asNodes(ctx.annotatedElement).map(\n (node) => this.visit(node) as AnnotatedElement,\n );\n return { kind: 'metadataExtension', entity, annotations: [], elements };\n }\n\n annotatedElement(ctx: Ctx): AnnotatedElement {\n const annotations = asNodes(ctx.annotation).map(\n (node) => this.visit(node) as Annotation,\n );\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n return { annotations, name };\n }\n\n // ---- Annotations ------------------------------------------\n\n topLevelAnnotation(ctx: Ctx): Annotation {\n return this.visit(asNodes(ctx.annotation)[0]) as Annotation;\n }\n\n annotation(ctx: Ctx): Annotation {\n const key = this.visit(asNodes(ctx.dottedName)[0]) as string;\n const value: AnnotationValue = ctx.annotationValue\n ? (this.visit(asNodes(ctx.annotationValue)[0]) as AnnotationValue)\n : { kind: 'boolean', value: true };\n return { key, value };\n }\n\n dottedName(ctx: Ctx): string {\n return asNodes(ctx.cdsName)\n .map((node) => this.visit(node) as string)\n .join('.');\n }\n\n annotationValue(ctx: Ctx): AnnotationValue {\n if (ctx.StringLiteral) {\n const raw = asTokens(ctx.StringLiteral)[0].image;\n return { kind: 'string', value: raw.slice(1, -1) };\n }\n if (ctx.EnumLiteral) {\n const raw = asTokens(ctx.EnumLiteral)[0].image;\n return { kind: 'enum', value: raw.slice(1) };\n }\n if (ctx.True) return { kind: 'boolean', value: true };\n if (ctx.False) return { kind: 'boolean', value: false };\n if (ctx.NumberLiteral) {\n return {\n kind: 'number',\n value: Number.parseFloat(asTokens(ctx.NumberLiteral)[0].image),\n };\n }\n if (ctx.annotationArray) {\n return this.visit(asNodes(ctx.annotationArray)[0]) as AnnotationValue;\n }\n return this.visit(asNodes(ctx.annotationObject)[0]) as AnnotationValue;\n }\n\n annotationArray(ctx: Ctx): AnnotationValue {\n const items = asNodes(ctx.annotationValue).map(\n (node) => this.visit(node) as AnnotationValue,\n );\n return { kind: 'array', items };\n }\n\n annotationObject(ctx: Ctx): AnnotationValue {\n const properties = asNodes(ctx.annotationProperty).map(\n (node) => this.visit(node) as AnnotationProperty,\n );\n return { kind: 'object', properties };\n }\n\n annotationProperty(ctx: Ctx): AnnotationProperty {\n const key = this.visit(asNodes(ctx.dottedName)[0]) as string;\n const value = this.visit(\n asNodes(ctx.annotationValue)[0],\n ) as AnnotationValue;\n return { key, value };\n }\n\n // ---- Literals ---------------------------------------------\n\n literal(ctx: Ctx): AnnotationValue {\n if (ctx.StringLiteral) {\n const raw = asTokens(ctx.StringLiteral)[0].image;\n return { kind: 'string', value: raw.slice(1, -1) };\n }\n if (ctx.EnumLiteral) {\n const raw = asTokens(ctx.EnumLiteral)[0].image;\n return { kind: 'enum', value: raw.slice(1) };\n }\n if (ctx.True) return { kind: 'boolean', value: true };\n if (ctx.False) return { kind: 'boolean', value: false };\n return {\n kind: 'number',\n value: Number.parseFloat(asTokens(ctx.NumberLiteral)[0].image),\n };\n }\n\n // ---- Expressions (opaque) ---------------------------------\n\n expression(): unknown {\n // Visitor never called directly — expressions are captured via\n // `toExpression()` on the raw CstNode to keep them opaque.\n return null;\n }\n\n comparison(): unknown {\n return null;\n }\n\n operand(): unknown {\n return null;\n }\n\n // ---- Type references --------------------------------------\n\n typeReference(ctx: Ctx): TypeRef {\n if (ctx.builtinType) {\n return this.visit(asNodes(ctx.builtinType)[0]) as BuiltinTypeRef;\n }\n return this.visit(asNodes(ctx.namedType)[0]) as NamedTypeRef;\n }\n\n builtinType(ctx: Ctx): BuiltinTypeRef {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const numberTokens = asTokens(ctx.NumberLiteral);\n const length = numberTokens[0]\n ? Number.parseInt(numberTokens[0].image, 10)\n : undefined;\n const decimals = numberTokens[1]\n ? Number.parseInt(numberTokens[1].image, 10)\n : undefined;\n return { kind: 'builtin', name, length, decimals };\n }\n\n namedType(ctx: Ctx): NamedTypeRef {\n const name = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n return { kind: 'named', name };\n }\n\n cdsName(ctx: Ctx): string {\n const t = ctx as Record<string, IToken[] | undefined>;\n // cdsName accepts many keyword tokens as names — return the image of\n // whichever token matched (only one key in `ctx` will be populated).\n for (const key of Object.keys(t)) {\n const tok = t[key]?.[0];\n if (tok && 'image' in tok) return tok.image;\n }\n return '';\n }\n\n qualifiedName(ctx: Ctx): string {\n return asNodes(ctx.cdsName)\n .map((node) => this.visit(node) as string)\n .join('.');\n }\n}\n\n/** Singleton visitor instance */\nexport const cdsVisitor = new CdsVisitor();\n","/**\n * Parse error types for ABAP CDS\n */\nimport type { ILexingError, IRecognitionException } from 'chevrotain';\n\nexport interface CdsParseError {\n message: string;\n line: number;\n column: number;\n offset: number;\n length: number;\n}\n\nexport function fromLexError(err: ILexingError): CdsParseError {\n return {\n message: err.message,\n line: err.line ?? 1,\n column: err.column ?? 1,\n offset: err.offset,\n length: err.length,\n };\n}\n\nexport function fromParseError(err: IRecognitionException): CdsParseError {\n const token = err.token;\n return {\n message: err.message,\n line: token.startLine ?? 1,\n column: token.startColumn ?? 1,\n offset: token.startOffset,\n length: (token.endOffset ?? token.startOffset) - token.startOffset + 1,\n };\n}\n","/**\n * AST walker utilities.\n *\n * Traversal helpers for the CDS AST. The visitor pattern here is intentionally\n * light — most downstream consumers just need to iterate over definitions,\n * elements, associations, or annotations without wiring a full Chevrotain\n * visitor.\n */\nimport type {\n AbstractEntityDefinition,\n Annotation,\n AssociationDeclaration,\n CdsDefinition,\n CdsSourceFile,\n CustomEntityDefinition,\n FieldDefinition,\n ParameterDefinition,\n StructureDefinition,\n TableDefinition,\n ViewElement,\n ViewEntityDefinition,\n ViewMember,\n} from '../../ast';\n\nexport type WithMembers =\n | ViewEntityDefinition\n | AbstractEntityDefinition\n | CustomEntityDefinition;\n\nexport type WithFields = TableDefinition | StructureDefinition;\n\nexport type WithParameters =\n | ViewEntityDefinition\n | AbstractEntityDefinition\n | CustomEntityDefinition;\n\n/** True when the definition has a `members` array (view-like entities). */\nexport function hasMembers(def: CdsDefinition): def is WithMembers {\n return (\n def.kind === 'viewEntity' ||\n def.kind === 'abstractEntity' ||\n def.kind === 'customEntity'\n );\n}\n\n/** True when the definition has a `members` array of typed fields (TABL/structure). */\nexport function hasFields(def: CdsDefinition): def is WithFields {\n return def.kind === 'table' || def.kind === 'structure';\n}\n\nexport function hasParameters(def: CdsDefinition): def is WithParameters {\n return (\n def.kind === 'viewEntity' ||\n def.kind === 'abstractEntity' ||\n def.kind === 'customEntity'\n );\n}\n\n/** Yield every definition in the file (currently one, future-proofed). */\nexport function* walkDefinitions(file: CdsSourceFile): Iterable<CdsDefinition> {\n for (const def of file.definitions) yield def;\n}\n\n/**\n * Yield every annotation attached anywhere in the AST (definitions,\n * elements/fields, parameters, associations).\n */\nexport function* walkAnnotations(file: CdsSourceFile): Iterable<Annotation> {\n for (const def of walkDefinitions(file)) {\n for (const a of getAnnotations(def)) yield a;\n if (hasFields(def)) {\n for (const m of def.members) {\n if ('annotations' in m) {\n for (const a of m.annotations) yield a;\n }\n }\n }\n if (hasMembers(def)) {\n for (const m of def.members) {\n for (const a of m.annotations) yield a;\n }\n }\n if (hasParameters(def)) {\n for (const p of def.parameters) {\n for (const a of p.annotations) yield a;\n }\n }\n }\n}\n\n/** Safe accessor — returns an empty array if the definition carries none. */\nexport function getAnnotations(def: CdsDefinition): Annotation[] {\n return 'annotations' in def ? def.annotations : [];\n}\n\n/** Yield every element (`ViewElement`) across all view-like definitions. */\nexport function* walkViewElements(\n file: CdsSourceFile,\n): Iterable<{ owner: WithMembers; element: ViewElement }> {\n for (const def of walkDefinitions(file)) {\n if (!hasMembers(def)) continue;\n for (const m of def.members) {\n if (isAssociation(m)) continue;\n yield { owner: def, element: m };\n }\n }\n}\n\n/** Yield every association declaration across view-like definitions. */\nexport function* walkAssociations(\n file: CdsSourceFile,\n): Iterable<{ owner: WithMembers; association: AssociationDeclaration }> {\n for (const def of walkDefinitions(file)) {\n if (!hasMembers(def)) continue;\n for (const m of def.members) {\n if (!isAssociation(m)) continue;\n yield { owner: def, association: m };\n }\n }\n}\n\n/** Yield every field definition from tables and structures. */\nexport function* walkFields(\n file: CdsSourceFile,\n): Iterable<{ owner: WithFields; field: FieldDefinition }> {\n for (const def of walkDefinitions(file)) {\n if (!hasFields(def)) continue;\n for (const m of def.members) {\n if ('kind' in m && m.kind === 'include') continue;\n yield { owner: def, field: m as FieldDefinition };\n }\n }\n}\n\n/** Yield every parameter definition across view-like entities. */\nexport function* walkParameters(\n file: CdsSourceFile,\n): Iterable<{ owner: WithParameters; parameter: ParameterDefinition }> {\n for (const def of walkDefinitions(file)) {\n if (!hasParameters(def)) continue;\n for (const p of def.parameters) yield { owner: def, parameter: p };\n }\n}\n\nexport function isAssociation(m: ViewMember): m is AssociationDeclaration {\n return 'kind' in m && m.kind === 'association';\n}\n\n/** Look up an annotation by its dotted key. Returns the first match. */\nexport function findAnnotation(\n annotations: readonly Annotation[],\n key: string,\n): Annotation | undefined {\n return annotations.find((a) => a.key === key);\n}\n","/**\n * Cardinality validator.\n *\n * Ensures `[lower..upper]` bounds are consistent:\n * - lower >= 0\n * - upper >= 1 (unless `*`)\n * - lower <= upper (when both numeric)\n */\nimport type { CdsSourceFile } from '../../ast';\nimport { walkAssociations } from '../ast/walker';\nimport type { SemanticDiagnostic } from './index';\n\nexport function validateCardinality(file: CdsSourceFile): SemanticDiagnostic[] {\n const diagnostics: SemanticDiagnostic[] = [];\n for (const { association } of walkAssociations(file)) {\n const card = association.cardinality;\n if (!card) continue;\n\n const { min, max } = card;\n const name = association.alias ?? association.target;\n\n if (min !== undefined && min < 0) {\n diagnostics.push({\n code: 'ACDS001',\n severity: 'error',\n message: `Association '${name}': lower bound (${min}) must be >= 0.`,\n target: name,\n });\n }\n\n if (typeof max === 'number' && max < 1) {\n diagnostics.push({\n code: 'ACDS002',\n severity: 'error',\n message: `Association '${name}': upper bound (${max}) must be >= 1.`,\n target: name,\n });\n }\n\n if (min !== undefined && typeof max === 'number' && min > max) {\n diagnostics.push({\n code: 'ACDS003',\n severity: 'error',\n message: `Association '${name}': lower bound (${min}) exceeds upper bound (${max}).`,\n target: name,\n });\n }\n }\n return diagnostics;\n}\n","/**\n * View element validator.\n *\n * - A typed field cannot also be marked `virtual` (nonsensical combination).\n * - A `key` element must not be `virtual` (virtual columns are never keys).\n */\nimport type { CdsSourceFile } from '../../ast';\nimport { walkViewElements } from '../ast/walker';\nimport type { SemanticDiagnostic } from './index';\n\nexport function validateViewElements(\n file: CdsSourceFile,\n): SemanticDiagnostic[] {\n const diagnostics: SemanticDiagnostic[] = [];\n for (const { element } of walkViewElements(file)) {\n const name = element.alias ?? element.expression;\n\n if (element.isVirtual && element.type) {\n diagnostics.push({\n code: 'ACDS010',\n severity: 'error',\n message: `View element '${name}' cannot be virtual and typed at the same time.`,\n target: name,\n });\n }\n\n if (element.isKey && element.isVirtual) {\n diagnostics.push({\n code: 'ACDS011',\n severity: 'error',\n message: `View element '${name}' cannot be both 'key' and 'virtual'.`,\n target: name,\n });\n }\n }\n return diagnostics;\n}\n","/**\n * Semantic validators that operate on a parsed `CdsSourceFile`.\n *\n * These do NOT replace the parser's syntactic error recovery — they catch\n * constraints that the grammar cannot easily encode (e.g. cardinality must\n * be `lower <= upper`, a typed field cannot simultaneously be `key` and\n * `virtual`, etc.).\n */\nimport type { CdsSourceFile } from '../../ast';\nimport { validateCardinality } from './cardinality';\nimport { validateViewElements } from './elements';\n\nexport interface SemanticDiagnostic {\n /** Stable machine-readable code. */\n code: string;\n severity: 'error' | 'warning';\n message: string;\n /** Optional location hint (e.g. element name, association alias). */\n target?: string;\n}\n\n/** Run all validators. */\nexport function validate(file: CdsSourceFile): SemanticDiagnostic[] {\n return [...validateCardinality(file), ...validateViewElements(file)];\n}\n\nexport { validateCardinality } from './cardinality';\nexport { validateViewElements } from './elements';\n","/**\n * DDL grammar coverage.\n *\n * Entities implemented by `CdsParser`:\n * - `define table <name> { ... }`\n * - `define structure <name> { ... }`\n * - `define type <name> : <type>;`\n * - `define view entity <name> [with parameters ...]\n * as (select from | projection on) <source> [{ ... }] [where ...]`\n * - `define abstract entity <name> [with parameters ...] { ... }`\n * - `define custom entity <name> [with parameters ...] { ... }`\n * - `define service <name> { expose ...; }` (SRVD)\n * - `annotate entity <name> with { ... }` (DDLX)\n *\n * Not yet implemented (tracked as open questions in the E09 epic):\n * - Joins (`inner join`, `left outer join ...`)\n * - CASE / CAST / arithmetic expressions in projection lists\n * - GROUP BY / HAVING / UNION\n * - `define aspect` (DRAS), `define hierarchy`, cache definitions (DTDC/DTSC)\n * - `define scalar function` (DSFD)\n */\nimport type { GrammarCoverage } from './index';\n\nexport const ddlCoverage: GrammarCoverage = {\n topic: 'ddl',\n constructs: [\n 'define table',\n 'define structure',\n 'define type',\n 'define view entity',\n 'define abstract entity',\n 'define custom entity',\n 'define service',\n 'annotate entity',\n 'include directive',\n 'builtin type (abap.char, abap.dec, ...)',\n 'named type reference',\n ],\n};\n","/**\n * DCL (access control) grammar coverage.\n *\n * define role <name> {\n * grant select on <entity> [where <expression>] ;\n * ...\n * }\n *\n * Expressions inside `where` are captured as opaque `Expression` tokens —\n * downstream consumers can inspect the `source` / `tokens` arrays but the\n * parser does not interpret them further.\n *\n * Not yet implemented:\n * - `inherit` / `redefinition` clauses\n * - `select distinct`, `grant update|delete|...`\n * - `privileges`, pfcg-mapped roles\n */\nimport type { GrammarCoverage } from './index';\n\nexport const dclCoverage: GrammarCoverage = {\n topic: 'dcl',\n constructs: [\n 'define role <name> { ... }',\n 'grant select on <entity>',\n 'grant select on <entity> where <expression>',\n ],\n};\n","/**\n * Annotation grammar coverage.\n *\n * CDS annotations can appear in several scopes:\n * - Top of a source file (attached to the following definition).\n * - Element of a table / structure / view / abstract / custom entity.\n * - Parameter definition.\n * - Associated element inside `annotate entity ... with { ... }` (DDLX).\n *\n * Value forms:\n * - string literal: `'text'`\n * - enum literal : `#TRANSPARENT`\n * - boolean : `true` / `false`\n * - number : `42`, `3.14`\n * - array : `[ <value>, <value>, ... ]`\n * - object : `{ prop: <value>, prop.sub: <value> }`\n * - bare `@Anno` (equivalent to `@Anno : true`)\n *\n * Not yet implemented:\n * - `@Scope:[#...]` scope restriction enforcement.\n * - Macro substitution / includes within annotation bodies.\n */\nimport type { GrammarCoverage } from './index';\n\nexport const annotationsCoverage: GrammarCoverage = {\n topic: 'annotations',\n constructs: [\n '@Key : value',\n '@Key.path : value',\n 'array value',\n 'object value',\n 'nested objects',\n 'bare boolean (@Key)',\n ],\n};\n","/**\n * Association and composition grammar coverage.\n *\n * association[<cardinality>] [of (many|one)]? to [redirected to]? <target>\n * [as <alias>] [on <expression>] ;|,\n * composition[<cardinality>] [of (many|one)]? to [redirected to]? <target>\n * [as <alias>] [on <expression>] ;|,\n *\n * Cardinality forms:\n * - `[N]` upper bound = N, lower implicit 0\n * - `[L..U]` lower = L, upper = U\n * - `[L..*]` lower = L, upper unbounded\n * - `[*]` unbounded (fallback; Chevrotain receives `*` via ident)\n *\n * `redirected to` introduces projection-view re-targeting for associations\n * defined on the underlying view.\n *\n * Not yet implemented:\n * - inline `@Consumption.filter` macros.\n * - `with default filter <cond>`.\n */\nimport type { GrammarCoverage } from './index';\n\nexport const associationsCoverage: GrammarCoverage = {\n topic: 'associations',\n constructs: [\n 'association to <target>',\n 'association[cardinality] to <target>',\n 'association[L..U] to <target>',\n 'association of (many|one) to <target>',\n 'composition to <target>',\n 'association to redirected to <target>',\n 'association ... as <alias>',\n 'association ... on <expression>',\n ],\n};\n","/**\n * Parameter grammar coverage.\n *\n * with parameters\n * <name> : <type> [default <literal>]\n * [, <name> : <type> [default <literal>] ] ...\n *\n * Parameters may carry per-parameter annotations.\n * Consumed by view entities, abstract entities, and custom entities.\n */\nimport type { GrammarCoverage } from './index';\n\nexport const parametersCoverage: GrammarCoverage = {\n topic: 'parameters',\n constructs: [\n 'with parameters <p>: <type>',\n 'with parameters <p>: <type> default <literal>',\n 'annotated parameters',\n ],\n};\n","/**\n * Projection / view grammar coverage.\n *\n * View body element (per member):\n * [annotation*] [key] [virtual] [redirected] (\n * <name> : <type> [not null] -- typed field (abstract/custom entities)\n * | <qualified-name> [as <alias>] -- projection element\n * ) ;|,\n *\n * Plus any association declarations (see `associations.ts`).\n *\n * Not yet implemented:\n * - Cast expressions (`cast( ... as ... )`).\n * - Case / when / else expressions.\n * - Aggregate functions (`sum`, `min`, ...).\n * - Window functions.\n * - Unions / selects combined in element bodies.\n */\nimport type { GrammarCoverage } from './index';\n\nexport const projectionsCoverage: GrammarCoverage = {\n topic: 'projections',\n constructs: [\n 'view element (qualified name)',\n 'view element with alias',\n 'view element with key modifier',\n 'view element with virtual modifier',\n 'typed field (abstract/custom entity)',\n 'view where clause',\n 'projection view (as projection on <source>)',\n ],\n};\n","/**\n * Action / function grammar coverage.\n *\n * NOTE: CDS-level `define action` / `define function` declarations live inside\n * RAP behavior definitions (`.bdef`) and are the responsibility of E10 (BDEF).\n * This module is a placeholder that currently **does not** parse action\n * signatures — it documents what E10 is expected to layer on top of the\n * CDS parser.\n *\n * Expected coverage for downstream:\n * - `define action <name> [parameter <p> : <type>] returns <type>`\n * - `define function <name>(<params>) returns <type>`\n * - Behavior implementation bindings (handled entirely in E10).\n */\nimport type { GrammarCoverage } from './index';\n\nexport const actionsCoverage: GrammarCoverage = {\n topic: 'actions',\n constructs: [\n // intentionally empty — populated by E10.\n ],\n};\n","/**\n * Grammar coverage index.\n *\n * Each topic module in this directory documents a slice of the CDS grammar\n * implemented by the single Chevrotain parser in `../../parser.ts`. They are\n * intentionally documentation-first: Chevrotain's `CstParser` requires all\n * rules to live on one class, so we keep them together and split the docs\n * into focused files. Each module re-exports a `COVERED` array listing the\n * grammar constructs currently implemented — useful for downstream tools\n * (E10/E11/E12) to know what they can rely on.\n */\nexport type GrammarCoverage = {\n readonly topic: string;\n readonly constructs: readonly string[];\n};\n\nexport { ddlCoverage } from './ddl';\nexport { dclCoverage } from './dcl';\nexport { annotationsCoverage } from './annotations';\nexport { associationsCoverage } from './associations';\nexport { parametersCoverage } from './parameters';\nexport { projectionsCoverage } from './projections';\nexport { actionsCoverage } from './actions';\n\nimport { ddlCoverage } from './ddl';\nimport { dclCoverage } from './dcl';\nimport { annotationsCoverage } from './annotations';\nimport { associationsCoverage } from './associations';\nimport { parametersCoverage } from './parameters';\nimport { projectionsCoverage } from './projections';\nimport { actionsCoverage } from './actions';\n\nexport const GRAMMAR_COVERAGE: readonly GrammarCoverage[] = [\n ddlCoverage,\n dclCoverage,\n annotationsCoverage,\n associationsCoverage,\n parametersCoverage,\n projectionsCoverage,\n actionsCoverage,\n];\n","/**\n * @abapify/acds — ABAP CDS Source Parser\n *\n * Parses ABAP CDS DDL source (.acds) files into a typed AST.\n *\n * @example\n * ```typescript\n * import { parse } from '@abapify/acds';\n *\n * const result = parse(`\n * @AbapCatalog.tableCategory : #TRANSPARENT\n * define table ztable {\n * key field1 : abap.char(10) not null;\n * field2 : some_data_element;\n * }\n * `);\n *\n * if (result.errors.length === 0) {\n * const table = result.ast.definitions[0]; // TableDefinition\n * }\n * ```\n */\n\nimport { CdsLexer } from './tokens';\nimport { cdsParser } from './parser';\nimport { cdsVisitor } from './visitor';\nimport type { CdsSourceFile } from './ast';\nimport type { CdsParseError } from './errors';\nimport { fromLexError, fromParseError } from './errors';\n\n/** Result of parsing a CDS source file */\nexport interface ParseResult {\n /** The parsed AST (may be partial if there are errors) */\n ast: CdsSourceFile;\n /** Lexing and parsing errors */\n errors: CdsParseError[];\n}\n\n/**\n * Parse an ABAP CDS source string into a typed AST.\n *\n * @param source - The CDS source code to parse\n * @returns Parse result with AST and any errors\n */\nexport function parse(source: string): ParseResult {\n // Step 1: Tokenize\n const lexResult = CdsLexer.tokenize(source);\n const errors: CdsParseError[] = lexResult.errors.map(fromLexError);\n\n // Step 2: Parse tokens → CST\n cdsParser.input = lexResult.tokens;\n const cst = cdsParser.sourceFile();\n errors.push(...cdsParser.errors.map(fromParseError));\n\n // Step 3: CST → AST\n let ast: CdsSourceFile = { definitions: [] };\n if (cst) {\n try {\n ast = cdsVisitor.visit(cst) as CdsSourceFile;\n } catch {\n // Visitor may fail on severely malformed CST\n // Errors already captured from parser\n }\n }\n\n return { ast, errors };\n}\n\n// Re-export types\nexport type {\n CdsSourceFile,\n CdsDefinition,\n TableDefinition,\n StructureDefinition,\n SimpleTypeDefinition,\n ServiceDefinition,\n MetadataExtension,\n ViewEntityDefinition,\n AbstractEntityDefinition,\n CustomEntityDefinition,\n RoleDefinition,\n GrantStatement,\n FieldDefinition,\n IncludeDirective,\n TableMember,\n ViewElement,\n ViewMember,\n DataSource,\n DataSourceKind,\n ParameterDefinition,\n AssociationDeclaration,\n AssociationKind,\n Cardinality,\n Expression,\n ExposeStatement,\n AnnotatedElement,\n Annotation,\n AnnotationValue,\n StringLiteral,\n EnumValue,\n BooleanLiteral,\n NumberLiteral,\n AnnotationArray,\n AnnotationObject,\n AnnotationProperty,\n TypeRef,\n BuiltinTypeRef,\n NamedTypeRef,\n SourceLocation,\n AstNode,\n} from './ast';\n\nexport type { CdsParseError } from './errors';\n\n// AST walker helpers\nexport {\n walkDefinitions,\n walkAnnotations,\n walkAssociations,\n walkFields,\n walkParameters,\n walkViewElements,\n findAnnotation,\n hasFields,\n hasMembers,\n hasParameters,\n isAssociation,\n} from './lib/ast/walker';\n\n// Semantic validators\nexport {\n validate,\n validateCardinality,\n validateViewElements,\n} from './lib/validate';\nexport type { SemanticDiagnostic } from './lib/validate';\n\n// Grammar coverage metadata (useful for tooling / test reports)\nexport {\n GRAMMAR_COVERAGE,\n ddlCoverage,\n dclCoverage,\n annotationsCoverage,\n associationsCoverage,\n parametersCoverage,\n projectionsCoverage,\n actionsCoverage,\n} from './lib/grammar';\nexport type { GrammarCoverage } from './lib/grammar';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/tokens.ts","../src/parser.ts","../src/visitor.ts","../src/errors.ts","../src/lib/ast/walker.ts","../src/lib/validate/cardinality.ts","../src/lib/validate/elements.ts","../src/lib/validate/index.ts","../src/lib/grammar/ddl.ts","../src/lib/grammar/dcl.ts","../src/lib/grammar/annotations.ts","../src/lib/grammar/associations.ts","../src/lib/grammar/joins.ts","../src/lib/grammar/parameters.ts","../src/lib/grammar/projections.ts","../src/lib/grammar/actions.ts","../src/lib/grammar/index.ts","../src/index.ts"],"sourcesContent":["/**\n * Chevrotain Token Definitions for ABAP CDS\n *\n * Token order matters: more specific patterns must come before general ones.\n * Keywords use `longer_alt` to avoid matching prefixes of identifiers.\n */\nimport { createToken, Lexer } from 'chevrotain';\n\n// ============================================\n// Whitespace & Comments\n// ============================================\n\nexport const WhiteSpace = createToken({\n name: 'WhiteSpace',\n pattern: /\\s+/,\n group: Lexer.SKIPPED,\n});\n\nexport const LineComment = createToken({\n name: 'LineComment',\n pattern: /\\/\\/[^\\n]*/,\n group: Lexer.SKIPPED,\n});\n\nexport const BlockComment = createToken({\n name: 'BlockComment',\n pattern: /\\/\\*[\\s\\S]*?\\*\\//,\n group: Lexer.SKIPPED,\n});\n\n/**\n * SQL-style line comment: `-- some text`.\n *\n * ABAP CDS sources (especially the classic `define view` ones) use SQL\n * comments. The pattern is tried before the `Minus` token, so `--` always\n * wins over two minus signs.\n */\nexport const SqlLineComment = createToken({\n name: 'SqlLineComment',\n pattern: /--[^\\n]*/,\n group: Lexer.SKIPPED,\n});\n\n// ============================================\n// Literals\n// ============================================\n\nexport const StringLiteral = createToken({\n name: 'StringLiteral',\n pattern: /'(?:[^'\\\\]|\\\\.)*'/,\n});\n\nexport const NumberLiteral = createToken({\n name: 'NumberLiteral',\n pattern: /\\d+(?:\\.\\d+)?/,\n});\n\n/** Hash-prefixed enum value: #TRANSPARENT, #NOT_EXTENSIBLE */\nexport const EnumLiteral = createToken({\n name: 'EnumLiteral',\n pattern: /#[A-Za-z_][A-Za-z0-9_]*/,\n});\n\n// ============================================\n// Identifier (must come AFTER all keywords)\n// ============================================\n\nexport const Identifier = createToken({\n name: 'Identifier',\n pattern: /[A-Za-z_][A-Za-z0-9_]*/,\n});\n\n// ============================================\n// Keywords (use longer_alt: Identifier)\n// ============================================\n\n// Keyword patterns are case-insensitive `/…/i` literals — CDS sources are\n// written in upper, lower or mixed case, and the token image keeps the\n// original spelling so identifiers keep their case in the AST.\n\nexport const Define = createToken({\n name: 'Define',\n pattern: /define/i,\n longer_alt: Identifier,\n});\n\nexport const Table = createToken({\n name: 'Table',\n pattern: /table/i,\n longer_alt: Identifier,\n});\n\nexport const Structure = createToken({\n name: 'Structure',\n pattern: /structure/i,\n longer_alt: Identifier,\n});\n\nexport const Type = createToken({\n name: 'Type',\n pattern: /type/i,\n longer_alt: Identifier,\n});\n\nexport const Service = createToken({\n name: 'Service',\n pattern: /service/i,\n longer_alt: Identifier,\n});\n\nexport const Expose = createToken({\n name: 'Expose',\n pattern: /expose/i,\n longer_alt: Identifier,\n});\n\nexport const Annotate = createToken({\n name: 'Annotate',\n pattern: /annotate/i,\n longer_alt: Identifier,\n});\n\nexport const Entity = createToken({\n name: 'Entity',\n pattern: /entity/i,\n longer_alt: Identifier,\n});\n\nexport const With = createToken({\n name: 'With',\n pattern: /with/i,\n longer_alt: Identifier,\n});\n\nexport const Key = createToken({\n name: 'Key',\n pattern: /key/i,\n longer_alt: Identifier,\n});\n\nexport const Not = createToken({\n name: 'Not',\n pattern: /not/i,\n longer_alt: Identifier,\n});\n\nexport const Null = createToken({\n name: 'Null',\n pattern: /null/i,\n longer_alt: Identifier,\n});\n\nexport const As = createToken({\n name: 'As',\n pattern: /as/i,\n longer_alt: Identifier,\n});\n\nexport const Include = createToken({\n name: 'Include',\n pattern: /include/i,\n longer_alt: Identifier,\n});\n\nexport const Suffix = createToken({\n name: 'Suffix',\n pattern: /suffix/i,\n longer_alt: Identifier,\n});\n\nexport const True = createToken({\n name: 'True',\n pattern: /true/i,\n longer_alt: Identifier,\n});\n\nexport const False = createToken({\n name: 'False',\n pattern: /false/i,\n longer_alt: Identifier,\n});\n\nexport const Abap = createToken({\n name: 'Abap',\n pattern: /abap/i,\n longer_alt: Identifier,\n});\n\n// ---- Phase 2/3 additions ----\n\nexport const View = createToken({\n name: 'View',\n pattern: /view/i,\n longer_alt: Identifier,\n});\n\nexport const Projection = createToken({\n name: 'Projection',\n pattern: /projection/i,\n longer_alt: Identifier,\n});\n\nexport const Select = createToken({\n name: 'Select',\n pattern: /select/i,\n longer_alt: Identifier,\n});\n\nexport const From = createToken({\n name: 'From',\n pattern: /from/i,\n longer_alt: Identifier,\n});\n\nexport const On = createToken({\n name: 'On',\n pattern: /on/i,\n longer_alt: Identifier,\n});\n\nexport const Association = createToken({\n name: 'Association',\n pattern: /association/i,\n longer_alt: Identifier,\n});\n\nexport const Composition = createToken({\n name: 'Composition',\n pattern: /composition/i,\n longer_alt: Identifier,\n});\n\nexport const To = createToken({\n name: 'To',\n pattern: /to/i,\n longer_alt: Identifier,\n});\n\nexport const Many = createToken({\n name: 'Many',\n pattern: /many/i,\n longer_alt: Identifier,\n});\n\nexport const One = createToken({\n name: 'One',\n pattern: /one/i,\n longer_alt: Identifier,\n});\n\nexport const Of = createToken({\n name: 'Of',\n pattern: /of/i,\n longer_alt: Identifier,\n});\n\nexport const Parameters = createToken({\n name: 'Parameters',\n pattern: /parameters/i,\n longer_alt: Identifier,\n});\n\nexport const Role = createToken({\n name: 'Role',\n pattern: /role/i,\n longer_alt: Identifier,\n});\n\nexport const Grant = createToken({\n name: 'Grant',\n pattern: /grant/i,\n longer_alt: Identifier,\n});\n\nexport const Where = createToken({\n name: 'Where',\n pattern: /where/i,\n longer_alt: Identifier,\n});\n\nexport const Abstract = createToken({\n name: 'Abstract',\n pattern: /abstract/i,\n longer_alt: Identifier,\n});\n\nexport const Custom = createToken({\n name: 'Custom',\n pattern: /custom/i,\n longer_alt: Identifier,\n});\n\nexport const Virtual = createToken({\n name: 'Virtual',\n pattern: /virtual/i,\n longer_alt: Identifier,\n});\n\nexport const Redirected = createToken({\n name: 'Redirected',\n pattern: /redirected/i,\n longer_alt: Identifier,\n});\n\nexport const Default = createToken({\n name: 'Default',\n pattern: /default/i,\n longer_alt: Identifier,\n});\n\n// ---- JOIN keywords ----------------------------------------------------\n//\n// ABAP CDS supports `JOIN` (= INNER JOIN), `INNER JOIN`, `LEFT [OUTER] JOIN`,\n// `RIGHT [OUTER] JOIN` and `CROSS JOIN`. The SQL-standard `FULL [OUTER] JOIN`\n// is supported as well, so that HANA CDS / CAP CDS sources (which use the\n// standard SQL join syntax) can be read with the same grammar.\n//\n// The keywords are tokenized separately so the parser can normalize the\n// different spellings.\n\nexport const Join = createToken({\n name: 'Join',\n pattern: /join/i,\n longer_alt: Identifier,\n});\n\nexport const Inner = createToken({\n name: 'Inner',\n pattern: /inner/i,\n longer_alt: Identifier,\n});\n\nexport const Left = createToken({\n name: 'Left',\n pattern: /left/i,\n longer_alt: Identifier,\n});\n\nexport const Right = createToken({\n name: 'Right',\n pattern: /right/i,\n longer_alt: Identifier,\n});\n\nexport const Cross = createToken({\n name: 'Cross',\n pattern: /cross/i,\n longer_alt: Identifier,\n});\n\nexport const Full = createToken({\n name: 'Full',\n pattern: /full/i,\n longer_alt: Identifier,\n});\n\n/**\n * `OUTER` — must be listed BEFORE `Or`, because `or` is a prefix of `outer`\n * and the lexer resolves the first matching token in list order.\n */\nexport const Outer = createToken({\n name: 'Outer',\n pattern: /outer/i,\n longer_alt: Identifier,\n});\n\n// ---- SELECT clauses & set operators -------------------------------------\n\nexport const Distinct = createToken({\n name: 'Distinct',\n pattern: /distinct/i,\n longer_alt: Identifier,\n});\n\nexport const Union = createToken({\n name: 'Union',\n pattern: /union/i,\n longer_alt: Identifier,\n});\n\nexport const Intersect = createToken({\n name: 'Intersect',\n pattern: /intersect/i,\n longer_alt: Identifier,\n});\n\nexport const Except = createToken({\n name: 'Except',\n pattern: /except/i,\n longer_alt: Identifier,\n});\n\nexport const Allowed = createToken({\n name: 'Allowed',\n pattern: /allowed/i,\n longer_alt: Identifier,\n});\n\n/** NOTE: `allowed` must precede `all` (`all` is a prefix of `allowed`). */\nexport const All = createToken({\n name: 'All',\n pattern: /all/i,\n longer_alt: Identifier,\n});\n\nexport const Group = createToken({\n name: 'Group',\n pattern: /group/i,\n longer_alt: Identifier,\n});\n\nexport const Having = createToken({\n name: 'Having',\n pattern: /having/i,\n longer_alt: Identifier,\n});\n\n// ---- Entity modifiers ----------------------------------------------------\n\nexport const Root = createToken({\n name: 'Root',\n pattern: /root/i,\n longer_alt: Identifier,\n});\n\nexport const Writable = createToken({\n name: 'Writable',\n pattern: /writable/i,\n longer_alt: Identifier,\n});\n\nexport const Switchable = createToken({\n name: 'Switchable',\n pattern: /switchable/i,\n longer_alt: Identifier,\n});\n\n// ---- Cardinality words & association flavours ----------------------------\n\nexport const Exact = createToken({\n name: 'Exact',\n pattern: /exact/i,\n longer_alt: Identifier,\n});\n\nexport const Parents = createToken({\n name: 'Parents',\n pattern: /parents/i,\n longer_alt: Identifier,\n});\n\nexport const Parent = createToken({\n name: 'Parent',\n pattern: /parent/i,\n longer_alt: Identifier,\n});\n\nexport const Child = createToken({\n name: 'Child',\n pattern: /child/i,\n longer_alt: Identifier,\n});\n\nexport const Localized = createToken({\n name: 'Localized',\n pattern: /localized/i,\n longer_alt: Identifier,\n});\n\nexport const Redefine = createToken({\n name: 'Redefine',\n pattern: /redefine/i,\n longer_alt: Identifier,\n});\n\nexport const Redefinition = createToken({\n name: 'Redefinition',\n pattern: /redefinition/i,\n longer_alt: Identifier,\n});\n\nexport const Filter = createToken({\n name: 'Filter',\n pattern: /filter/i,\n longer_alt: Identifier,\n});\n\nexport const Bind = createToken({\n name: 'Bind',\n pattern: /bind/i,\n longer_alt: Identifier,\n});\n\n// ---- Functions -----------------------------------------------------------\n\nexport const FunctionKeyword = createToken({\n name: 'Function',\n pattern: /function/i,\n longer_alt: Identifier,\n});\n\nexport const Returns = createToken({\n name: 'Returns',\n pattern: /returns/i,\n longer_alt: Identifier,\n});\n\nexport const Implemented = createToken({\n name: 'Implemented',\n pattern: /implemented/i,\n longer_alt: Identifier,\n});\n\nexport const Method = createToken({\n name: 'Method',\n pattern: /method/i,\n longer_alt: Identifier,\n});\n\nexport const Scalar = createToken({\n name: 'Scalar',\n pattern: /scalar/i,\n longer_alt: Identifier,\n});\n\n// ---- Further entity kinds ------------------------------------------------\n\nexport const Hierarchy = createToken({\n name: 'Hierarchy',\n pattern: /hierarchy/i,\n longer_alt: Identifier,\n});\n\nexport const Aspect = createToken({\n name: 'Aspect',\n pattern: /aspect/i,\n longer_alt: Identifier,\n});\n\nexport const AnnotationKeyword = createToken({\n name: 'AnnotationKeyword',\n pattern: /annotation/i,\n longer_alt: Identifier,\n});\n\nexport const Extend = createToken({\n name: 'Extend',\n pattern: /extend/i,\n longer_alt: Identifier,\n});\n\nexport const Accesspolicy = createToken({\n name: 'Accesspolicy',\n pattern: /accesspolicy/i,\n longer_alt: Identifier,\n});\n\nexport const External = createToken({\n name: 'External',\n pattern: /external/i,\n longer_alt: Identifier,\n});\n\nexport const Provider = createToken({\n name: 'Provider',\n pattern: /provider/i,\n longer_alt: Identifier,\n});\n\nexport const Contract = createToken({\n name: 'Contract',\n pattern: /contract/i,\n longer_alt: Identifier,\n});\n\nexport const Name = createToken({\n name: 'Name',\n pattern: /name/i,\n longer_alt: Identifier,\n});\n\nexport const Federated = createToken({\n name: 'Federated',\n pattern: /federated/i,\n longer_alt: Identifier,\n});\n\nexport const Data = createToken({\n name: 'Data',\n pattern: /data/i,\n longer_alt: Identifier,\n});\n\nexport const Provided = createToken({\n name: 'Provided',\n pattern: /provided/i,\n longer_alt: Identifier,\n});\n\nexport const AtKeyword = createToken({\n name: 'AtKeyword',\n pattern: /at/i,\n longer_alt: Identifier,\n});\n\nexport const Runtime = createToken({\n name: 'Runtime',\n pattern: /runtime/i,\n longer_alt: Identifier,\n});\n\n// ---- CASE expressions ----------------------------------------------------\n\nexport const Case = createToken({\n name: 'Case',\n pattern: /case/i,\n longer_alt: Identifier,\n});\n\nexport const When = createToken({\n name: 'When',\n pattern: /when/i,\n longer_alt: Identifier,\n});\n\nexport const Then = createToken({\n name: 'Then',\n pattern: /then/i,\n longer_alt: Identifier,\n});\n\nexport const Else = createToken({\n name: 'Else',\n pattern: /else/i,\n longer_alt: Identifier,\n});\n\nexport const End = createToken({\n name: 'End',\n pattern: /end/i,\n longer_alt: Identifier,\n});\n\n// ---- Condition operators -------------------------------------------------\n\nexport const Like = createToken({\n name: 'Like',\n pattern: /like/i,\n longer_alt: Identifier,\n});\n\nexport const Between = createToken({\n name: 'Between',\n pattern: /between/i,\n longer_alt: Identifier,\n});\n\nexport const Over = createToken({\n name: 'Over',\n pattern: /over/i,\n longer_alt: Identifier,\n});\n\nexport const Partition = createToken({\n name: 'Partition',\n pattern: /partition/i,\n longer_alt: Identifier,\n});\n\n// ---- Hierarchy clauses ----------------------------------------------------\n\nexport const Siblings = createToken({\n name: 'Siblings',\n pattern: /siblings/i,\n longer_alt: Identifier,\n});\n\nexport const Order = createToken({\n name: 'Order',\n pattern: /order/i,\n longer_alt: Identifier,\n});\n\nexport const Start = createToken({\n name: 'Start',\n pattern: /start/i,\n longer_alt: Identifier,\n});\n\nexport const Source = createToken({\n name: 'Source',\n pattern: /source/i,\n longer_alt: Identifier,\n});\n\nexport const Directory = createToken({\n name: 'Directory',\n pattern: /directory/i,\n longer_alt: Identifier,\n});\n\nexport const Period = createToken({\n name: 'Period',\n pattern: /period/i,\n longer_alt: Identifier,\n});\n\nexport const Valid = createToken({\n name: 'Valid',\n pattern: /valid/i,\n longer_alt: Identifier,\n});\n\nexport const Depth = createToken({\n name: 'Depth',\n pattern: /depth/i,\n longer_alt: Identifier,\n});\n\nexport const Nodetype = createToken({\n name: 'Nodetype',\n pattern: /nodetype/i,\n longer_alt: Identifier,\n});\n\nexport const Load = createToken({\n name: 'Load',\n pattern: /load/i,\n longer_alt: Identifier,\n});\n\nexport const Multiple = createToken({\n name: 'Multiple',\n pattern: /multiple/i,\n longer_alt: Identifier,\n});\n\nexport const Orphans = createToken({\n name: 'Orphans',\n pattern: /orphans/i,\n longer_alt: Identifier,\n});\n\nexport const Cycles = createToken({\n name: 'Cycles',\n pattern: /cycles/i,\n longer_alt: Identifier,\n});\n\nexport const Generate = createToken({\n name: 'Generate',\n pattern: /generate/i,\n longer_alt: Identifier,\n});\n\nexport const Spantree = createToken({\n name: 'Spantree',\n pattern: /spantree/i,\n longer_alt: Identifier,\n});\n\nexport const Cache = createToken({\n name: 'Cache',\n pattern: /cache/i,\n longer_alt: Identifier,\n});\n\nexport const Bulk = createToken({\n name: 'Bulk',\n pattern: /bulk/i,\n longer_alt: Identifier,\n});\n\nexport const Incremental = createToken({\n name: 'Incremental',\n pattern: /incremental/i,\n longer_alt: Identifier,\n});\n\nexport const Leaves = createToken({\n name: 'Leaves',\n pattern: /leaves/i,\n longer_alt: Identifier,\n});\n\nexport const Only = createToken({\n name: 'Only',\n pattern: /only/i,\n longer_alt: Identifier,\n});\n\nexport const Ascending = createToken({\n name: 'Ascending',\n pattern: /ascending/i,\n longer_alt: Identifier,\n});\n\nexport const Descending = createToken({\n name: 'Descending',\n pattern: /descending/i,\n longer_alt: Identifier,\n});\n\nexport const ErrorKeyword = createToken({\n name: 'Error',\n pattern: /error/i,\n longer_alt: Identifier,\n});\n\nexport const Ignore = createToken({\n name: 'Ignore',\n pattern: /ignore/i,\n longer_alt: Identifier,\n});\n\nexport const Breakup = createToken({\n name: 'Breakup',\n pattern: /breakup/i,\n longer_alt: Identifier,\n});\n\nexport const Force = createToken({\n name: 'Force',\n pattern: /force/i,\n longer_alt: Identifier,\n});\n\n/** `FOR` — must be listed AFTER `Force` (`for` is a prefix of `force`). */\nexport const For = createToken({\n name: 'For',\n pattern: /for/i,\n longer_alt: Identifier,\n});\n\nexport const By = createToken({\n name: 'By',\n pattern: /by/i,\n longer_alt: Identifier,\n});\n\n/** `OFF` — must be listed BEFORE `Of` (`of` is a prefix of `off`). */\nexport const Off = createToken({\n name: 'Off',\n pattern: /off/i,\n longer_alt: Identifier,\n});\n\n// ---- DCL additions ---------------------------------------------------------\n\nexport const Inheriting = createToken({\n name: 'Inheriting',\n pattern: /inheriting/i,\n longer_alt: Identifier,\n});\n\nexport const Inherit = createToken({\n name: 'Inherit',\n pattern: /inherit/i,\n longer_alt: Identifier,\n});\n\nexport const Conditions = createToken({\n name: 'Conditions',\n pattern: /conditions/i,\n longer_alt: Identifier,\n});\n\nexport const Super = createToken({\n name: 'Super',\n pattern: /super/i,\n longer_alt: Identifier,\n});\n\nexport const Void = createToken({\n name: 'Void',\n pattern: /void/i,\n longer_alt: Identifier,\n});\n\nexport const Combination = createToken({\n name: 'Combination',\n pattern: /combination/i,\n longer_alt: Identifier,\n});\n\nexport const Mode = createToken({\n name: 'Mode',\n pattern: /mode/i,\n longer_alt: Identifier,\n});\n\nexport const Optional = createToken({\n name: 'Optional',\n pattern: /optional/i,\n longer_alt: Identifier,\n});\n\nexport const Elements = createToken({\n name: 'Elements',\n pattern: /elements/i,\n longer_alt: Identifier,\n});\n\n/**\n * `IN` — must be listed AFTER every `in*` keyword (`inner`, `intersect`,\n * `include`, `inherit`, `inheriting`, `incremental`), because `in` is a\n * prefix of all of them.\n */\nexport const In = createToken({\n name: 'In',\n pattern: /in/i,\n longer_alt: Identifier,\n});\n\n// Operators for simple expressions inside where-clauses / associations\nexport const EqEq = createToken({ name: 'EqEq', pattern: /==/ });\nexport const FatArrow = createToken({ name: 'FatArrow', pattern: /=>/ });\nexport const Eq = createToken({ name: 'Eq', pattern: /=/ });\nexport const NotEq = createToken({ name: 'NotEq', pattern: /!=|<>/ });\nexport const LtEq = createToken({ name: 'LtEq', pattern: /<=/ });\nexport const GtEq = createToken({ name: 'GtEq', pattern: />=/ });\nexport const Lt = createToken({ name: 'Lt', pattern: /</ });\nexport const Gt = createToken({ name: 'Gt', pattern: />/ });\nexport const Quest = createToken({ name: 'Quest', pattern: /\\?/ });\n\nexport const And = createToken({\n name: 'And',\n pattern: /and/i,\n longer_alt: Identifier,\n});\n\nexport const Or = createToken({\n name: 'Or',\n pattern: /or/i,\n longer_alt: Identifier,\n});\n\n// ============================================\n// Symbols\n// ============================================\n\nexport const At = createToken({ name: 'At', pattern: /@/ });\nexport const Colon = createToken({ name: 'Colon', pattern: /:/ });\n/** `$` — prefix of system variables such as `$session`, `$parameters`, `$projection`. */\nexport const Dollar = createToken({ name: 'Dollar', pattern: /\\$/ });\nexport const Semicolon = createToken({ name: 'Semicolon', pattern: /;/ });\nexport const Dot = createToken({ name: 'Dot', pattern: /\\./ });\nexport const Comma = createToken({ name: 'Comma', pattern: /,/ });\nexport const LBrace = createToken({ name: 'LBrace', pattern: /\\{/ });\nexport const RBrace = createToken({ name: 'RBrace', pattern: /\\}/ });\nexport const LParen = createToken({ name: 'LParen', pattern: /\\(/ });\nexport const RParen = createToken({ name: 'RParen', pattern: /\\)/ });\nexport const LBracket = createToken({ name: 'LBracket', pattern: /\\[/ });\nexport const RBracket = createToken({ name: 'RBracket', pattern: /\\]/ });\nexport const Star = createToken({ name: 'Star', pattern: /\\*/ });\nexport const Plus = createToken({ name: 'Plus', pattern: /\\+/ });\nexport const Minus = createToken({ name: 'Minus', pattern: /-/ });\nexport const Slash = createToken({ name: 'Slash', pattern: /\\// });\n\n// ============================================\n// Token list (ORDER MATTERS)\n// Keywords must come before Identifier\n// ============================================\n\n/**\n * All keyword tokens. Exported so the parser can derive its name-token set\n * (every keyword may legally appear as an identifier in CDS).\n */\nexport const keywordTokens = [\n // NOTE: longer keywords that share a prefix with shorter ones (e.g.\n // `association` starts with `as`, `one` starts with `on`, `in` is a\n // prefix of `inner`) MUST be listed before the shorter keyword otherwise\n // Chevrotain's lexer will complain that they are unreachable.\n Association,\n Composition,\n Abstract,\n Annotate,\n AnnotationKeyword,\n Accesspolicy,\n Ascending,\n Aspect,\n Allowed,\n As,\n Define,\n Table,\n Structure,\n Type,\n Service,\n Expose,\n Entity,\n With,\n Key,\n Not,\n Null,\n Include,\n Suffix,\n True,\n False,\n Abap,\n One,\n // NOTE: `Only` must precede `On` (`on` is a prefix of `only`).\n Only,\n View,\n Projection,\n Select,\n From,\n On,\n To,\n Many,\n // NOTE: `Off` must precede `Of` (`of` is a prefix of `off`).\n Off,\n Of,\n Parameters,\n Role,\n Grant,\n Where,\n Custom,\n Virtual,\n Redirected,\n Redefinition,\n Redefine,\n Default,\n Distinct,\n Union,\n Intersect,\n Except,\n All,\n Group,\n Having,\n Root,\n Writable,\n Switchable,\n Exact,\n Parents,\n Parent,\n Child,\n Localized,\n Filter,\n Bind,\n FunctionKeyword,\n Returns,\n Implemented,\n Method,\n Scalar,\n Hierarchy,\n Extend,\n External,\n Provider,\n Provided,\n Contract,\n Name,\n Federated,\n Data,\n AtKeyword,\n Runtime,\n Case,\n When,\n Then,\n Else,\n End,\n Like,\n Between,\n Over,\n Partition,\n Siblings,\n Order,\n Orphans,\n Optional,\n Start,\n Source,\n Directory,\n Period,\n Valid,\n Depth,\n Nodetype,\n Load,\n Multiple,\n Cycles,\n Generate,\n Spantree,\n Cache,\n Bulk,\n Incremental,\n Leaves,\n Descending,\n ErrorKeyword,\n Ignore,\n Breakup,\n Force,\n For,\n By,\n Conditions,\n Inheriting,\n Inherit,\n Super,\n Void,\n Combination,\n Mode,\n Elements,\n Join,\n Inner,\n Left,\n Right,\n Cross,\n Full,\n // NOTE: `Outer`/`Order`/`Orphans`/`Optional` must precede `Or`.\n Outer,\n And,\n Or,\n // NOTE: `In` must come after every `in*` keyword.\n In,\n];\n\nexport const allTokens = [\n // Whitespace & comments (skipped)\n WhiteSpace,\n LineComment,\n BlockComment,\n SqlLineComment,\n\n // Literals\n StringLiteral,\n NumberLiteral,\n EnumLiteral,\n\n // Keywords (before Identifier!)\n ...keywordTokens,\n\n // Identifier (catch-all for names)\n Identifier,\n\n // Multi-char symbols (before single-char equivalents)\n EqEq,\n NotEq,\n LtEq,\n GtEq,\n FatArrow,\n\n // Symbols\n At,\n Colon,\n Dollar,\n Semicolon,\n Dot,\n Comma,\n LBrace,\n RBrace,\n LParen,\n RParen,\n LBracket,\n RBracket,\n Eq,\n Lt,\n Gt,\n Quest,\n Star,\n Plus,\n Minus,\n Slash,\n];\n\nexport const CdsLexer = new Lexer(allTokens);\n","/**\n * Chevrotain CstParser for ABAP CDS.\n *\n * Grammar coverage (see src/lib/grammar/*.ts for the per-topic index):\n * - DDL : table, table entity, structure, simple type, view entity\n * (select / projection, `root` / `writable`, provider contract),\n * abstract/custom/external entity, service, hierarchy, aspect,\n * table function, scalar function, annotation (DDLA), accesspolicy\n * - DCL : role definitions (grant select on ... where ..., inherit rules)\n * - DDLX : metadata extensions (`annotate entity|view ... with { ... }`)\n * - EXT : `extend view [entity]`, `extend abstract|custom entity`\n * - SRVD : service definitions (`define service ... { expose ...; }`)\n * - Elements / associations / parameters / annotations / conditions\n *\n * Conditions (`on` / `where` / `having` / filters) are kept as opaque\n * `Expression { source, tokens }` nodes — the parser validates the grammar\n * shape but does not build an expression tree.\n *\n * Rules are kept in this single class (Chevrotain requirement). Logical\n * groupings are delimited with section banners and documented in\n * `src/lib/grammar/`.\n */\nimport { CstParser, EOF } from 'chevrotain';\nimport type { IToken, TokenType } from 'chevrotain';\nimport {\n allTokens,\n keywordTokens,\n At,\n Colon,\n Semicolon,\n Dot,\n Comma,\n LBrace,\n RBrace,\n LParen,\n RParen,\n LBracket,\n RBracket,\n Define,\n Table,\n Structure,\n Type,\n Service,\n Expose,\n Annotate,\n Entity,\n With,\n Key,\n Not,\n Null,\n As,\n Include,\n Suffix,\n True,\n False,\n Abap,\n View,\n Projection,\n Select,\n From,\n On,\n Association,\n Composition,\n To,\n Many,\n One,\n Of,\n Parameters,\n Role,\n Grant,\n Where,\n Abstract,\n Custom,\n Virtual,\n Redirected,\n Default,\n Join,\n Inner,\n Left,\n Right,\n Cross,\n Full,\n Outer,\n And,\n Or,\n Distinct,\n Union,\n Intersect,\n Except,\n All,\n Group,\n By,\n Having,\n Root,\n Writable,\n Switchable,\n Exact,\n Parent,\n Parents,\n Child,\n Localized,\n Redefine,\n Redefinition,\n Filter,\n Bind,\n FunctionKeyword,\n Returns,\n Implemented,\n Method,\n Scalar,\n Hierarchy,\n Aspect,\n AnnotationKeyword,\n Extend,\n Accesspolicy,\n External,\n Provider,\n Contract,\n Name,\n Federated,\n Data,\n Provided,\n AtKeyword,\n Runtime,\n Case,\n When,\n Then,\n Else,\n End,\n Like,\n Between,\n In,\n Over,\n Partition,\n Siblings,\n Order,\n Start,\n Source,\n Directory,\n Period,\n Valid,\n Depth,\n Nodetype,\n Load,\n Multiple,\n Orphans,\n Cycles,\n Generate,\n Spantree,\n Cache,\n Bulk,\n Incremental,\n Leaves,\n Only,\n Allowed,\n Ascending,\n Descending,\n ErrorKeyword,\n Ignore,\n Breakup,\n Force,\n Off,\n For,\n Inherit,\n Inheriting,\n Conditions,\n Super,\n Combination,\n Mode,\n Optional,\n Elements,\n Identifier,\n StringLiteral,\n NumberLiteral,\n EnumLiteral,\n EqEq,\n Eq,\n NotEq,\n LtEq,\n GtEq,\n Lt,\n Gt,\n Star,\n Plus,\n Minus,\n Slash,\n Dollar,\n FatArrow,\n} from './tokens';\n\nexport class CdsParser extends CstParser {\n /**\n * All token types that may be used as a CDS name.\n *\n * Every keyword may legally appear as an identifier in CDS (`A.on`,\n * `type : abap.char(1)`, `as select`, …), so the name set is derived from\n * the keyword list in `tokens.ts`. The list is the single source of truth\n * for the `cdsName` rule and for the bare-alias rule — the latter removes\n * the FROM-region starters.\n */\n private static readonly NAME_TOKENS: readonly TokenType[] = [\n Identifier,\n ...keywordTokens,\n ];\n\n private static readonly NAME_TOKEN_SET: ReadonlySet<TokenType> = new Set(\n CdsParser.NAME_TOKENS,\n );\n\n /** Comparison operators that end a parenthesized *operand*. */\n private static readonly COMPARISON_TOKEN_SET: ReadonlySet<TokenType> =\n new Set<TokenType>([\n Eq,\n EqEq,\n NotEq,\n Lt,\n LtEq,\n Gt,\n GtEq,\n Like,\n Between,\n In,\n ]);\n\n /** Paren depth delta for `matchingParen`. */\n private static readonly PAREN_DELTA: ReadonlyMap<TokenType, number> = new Map<\n TokenType,\n number\n >([\n [LParen, 1],\n [RParen, -1],\n ]);\n\n /** Bracket depth delta per token for the case-expression scan. */\n private static readonly DEPTH_DELTA: ReadonlyMap<TokenType, number> = new Map<\n TokenType,\n number\n >([\n [LParen, 1],\n [LBracket, 1],\n [RParen, -1],\n [RBracket, -1],\n ]);\n\n /** Tokens that mark a parenthesized group as a *condition*. */\n private static readonly CONDITION_MARKER_SET: ReadonlySet<TokenType> =\n new Set<TokenType>([\n Eq,\n EqEq,\n NotEq,\n Lt,\n LtEq,\n Gt,\n GtEq,\n Like,\n Between,\n In,\n And,\n Or,\n Not,\n ]);\n\n /**\n * Tokens that must not be read as a *bare* (implicit) source alias — they\n * start whatever may follow a data source in the FROM region (joins,\n * associations, aspect bindings, the `where`/`group by`/`having` clauses\n * and the set operators). An explicit `as <alias>` stays unrestricted.\n *\n * `one`/`many`/`exact`/`to` are excluded because they may start a join\n * cardinality (`many to one join`, `to one join`).\n */\n private static readonly FROM_REGION_STARTERS: ReadonlySet<TokenType> =\n new Set<TokenType>([\n Association,\n Composition,\n Join,\n Inner,\n Left,\n Right,\n Cross,\n Full,\n One,\n Many,\n Exact,\n To,\n Union,\n Intersect,\n Except,\n Group,\n Having,\n Where,\n On,\n As,\n And,\n Or,\n Not,\n By,\n Bind,\n Redefine,\n ]);\n\n /**\n * Tokens allowed inside a DCL `where` condition — everything except the\n * terminating semicolon. DCL conditions (literal / pfcg / aspect / user /\n * inherit / `if-then-else` / `void`) are captured opaquely.\n */\n private static readonly DCL_TOKENS: readonly TokenType[] = allTokens.filter(\n (t) =>\n ![\n 'WhiteSpace',\n 'LineComment',\n 'BlockComment',\n 'SqlLineComment',\n 'Semicolon',\n ].includes(t.name),\n );\n\n /** Tokens allowed inside a `{ … }` free-form block (DDLA / accesspolicy). */\n private static readonly BLOCK_TOKENS: readonly TokenType[] = allTokens.filter(\n (t) =>\n ![\n 'WhiteSpace',\n 'LineComment',\n 'BlockComment',\n 'SqlLineComment',\n 'LBrace',\n 'RBrace',\n ].includes(t.name),\n );\n\n constructor() {\n super(allTokens, {\n recoveryEnabled: true,\n // LL(2) suffices: every deeper disambiguation (`entity` modifier,\n // `to parent` vs `to <card>`, typed fields, `cast`/`case`/`is`\n // forms, …) is resolved by an explicit GATE instead.\n maxLookahead: 2,\n });\n this.performSelfAnalysis();\n }\n\n // ============================================================\n // Root rule\n // ============================================================\n\n public sourceFile = this.RULE('sourceFile', () => {\n this.MANY(() => {\n this.SUBRULE(this.topLevelAnnotation);\n });\n this.SUBRULE(this.definition);\n });\n\n // ============================================================\n // Top-level definition dispatch\n // ============================================================\n\n private readonly definition = this.RULE('definition', () => {\n this.OR([\n { ALT: () => this.SUBRULE(this.defineStatement) },\n { ALT: () => this.SUBRULE(this.annotateStatement) },\n { ALT: () => this.SUBRULE(this.extendStatement) },\n ]);\n });\n\n private readonly defineStatement = this.RULE('defineStatement', () => {\n this.CONSUME(Define);\n this.OR([\n // `[root]` / `[writable]` prefixes — `root view entity`,\n // `root table entity`, `writable view entity`, `writable external entity`\n { ALT: () => this.SUBRULE(this.prefixedDefinition) },\n { ALT: () => this.SUBRULE(this.tableDefinition) },\n { ALT: () => this.SUBRULE(this.structureDefinition) },\n { ALT: () => this.SUBRULE(this.viewEntityDefinition) },\n { ALT: () => this.SUBRULE(this.abstractEntityDefinition) },\n { ALT: () => this.SUBRULE(this.customEntityDefinition) },\n { ALT: () => this.SUBRULE(this.simpleTypeDefinition) },\n { ALT: () => this.SUBRULE(this.serviceDefinition) },\n { ALT: () => this.SUBRULE(this.roleDefinition) },\n { ALT: () => this.SUBRULE(this.hierarchyDefinition) },\n { ALT: () => this.SUBRULE(this.aspectDefinition) },\n { ALT: () => this.SUBRULE(this.externalEntityDefinition) },\n { ALT: () => this.SUBRULE(this.scalarFunctionDefinition) },\n { ALT: () => this.SUBRULE(this.annotationDefinition) },\n { ALT: () => this.SUBRULE(this.accessPolicyDefinition) },\n ]);\n });\n\n /**\n * `define (writable|root)+ …` — view entities, external entities and root\n * table entities carry leading modifiers between `define` and the entity\n * keyword.\n */\n private readonly prefixedDefinition = this.RULE('prefixedDefinition', () => {\n this.AT_LEAST_ONE(() => {\n this.OR([\n { ALT: () => this.CONSUME(Writable) },\n { ALT: () => this.CONSUME(Root) },\n ]);\n });\n this.OR2([\n { ALT: () => this.SUBRULE(this.viewEntityDefinition) },\n { ALT: () => this.SUBRULE(this.externalEntityDefinition) },\n { ALT: () => this.SUBRULE(this.rootTableEntityDefinition) },\n ]);\n });\n\n /** `table entity <name> { … }` — reachable via `define [root] table entity`. */\n private readonly rootTableEntityDefinition = this.RULE(\n 'rootTableEntityDefinition',\n () => {\n this.CONSUME(Table);\n this.CONSUME(Entity);\n this.SUBRULE(this.cdsName);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.tableMember);\n });\n this.CONSUME(RBrace);\n },\n );\n\n // ============================================================\n // Table definition / table entity / table function\n // define table <name> { … }\n // define table entity <name> { … }\n // define table function <name> … returns { … } implemented by method cls=>m\n // ============================================================\n\n private readonly tableDefinition = this.RULE('tableDefinition', () => {\n this.CONSUME(Table);\n this.OR([\n {\n // `table function` vs a table named `function`: only the function\n // form when a name follows (`table function f …`).\n GATE: () =>\n this.LA(1).tokenType === FunctionKeyword &&\n this.isNameToken(this.LA(2)),\n ALT: () => this.SUBRULE(this.tableFunctionTail),\n },\n {\n GATE: () =>\n this.LA(1).tokenType === Entity && this.isNameToken(this.LA(2)),\n ALT: () => {\n this.CONSUME(Entity);\n this.SUBRULE(this.cdsName);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.tableMember);\n });\n this.CONSUME(RBrace);\n },\n },\n {\n ALT: () => {\n this.SUBRULE2(this.cdsName);\n this.CONSUME2(LBrace);\n this.MANY2(() => {\n this.SUBRULE2(this.tableMember);\n });\n this.CONSUME2(RBrace);\n },\n },\n ]);\n });\n\n private readonly tableFunctionTail = this.RULE('tableFunctionTail', () => {\n this.CONSUME(FunctionKeyword);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.SUBRULE(this.parametersClause);\n });\n this.CONSUME(Returns);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.fieldDefinition);\n });\n this.CONSUME(RBrace);\n this.CONSUME(Implemented);\n this.CONSUME(By);\n this.CONSUME(Method);\n this.SUBRULE(this.qualifiedName);\n this.CONSUME(FatArrow);\n this.SUBRULE2(this.cdsName);\n this.OPTION2(() => this.CONSUME(Semicolon));\n });\n\n // ============================================================\n // Structure definition\n // ============================================================\n\n private readonly structureDefinition = this.RULE(\n 'structureDefinition',\n () => {\n this.CONSUME(Structure);\n this.SUBRULE(this.cdsName);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.tableMember);\n });\n this.CONSUME(RBrace);\n },\n );\n\n // ============================================================\n // View entity: `view [entity] <name> [with parameters …] [provider contract …]\n // as select … | as projection on …`\n // ============================================================\n\n private readonly viewEntityDefinition = this.RULE(\n 'viewEntityDefinition',\n () => {\n this.CONSUME(View);\n // `define view entity <name>` (CDS view entity) vs legacy\n // `define view <name>` (classic SQL view). `entity` is the modifier only\n // when followed by another name — a legacy view may itself be called\n // `entity` (`define view entity as select …`).\n this.OPTION({\n GATE: () => this.isEntityModifier(),\n DEF: () => this.CONSUME(Entity),\n });\n this.SUBRULE(this.cdsName);\n this.OPTION2(() => {\n this.SUBRULE(this.parametersClause);\n });\n this.OPTION3(() => {\n this.CONSUME(Provider);\n this.CONSUME(Contract);\n this.SUBRULE2(this.cdsName);\n });\n this.CONSUME(As);\n this.OR([\n { ALT: () => this.SUBRULE(this.selectStatement) },\n { ALT: () => this.SUBRULE(this.projectionTail) },\n ]);\n },\n );\n\n /**\n * `true` when the `entity` after `view` is the view-entity modifier rather\n * than the view name — it is a modifier iff the following token is a name\n * other than `as`/`with`/`provider` (the tokens that may directly follow a\n * view name).\n */\n private isEntityModifier(): boolean {\n if (this.LA(1).tokenType !== Entity) return false;\n const next = this.LA(2);\n if (!this.isNameToken(next)) return false;\n return ![As, With, Provider, Select, Projection].includes(next.tokenType);\n }\n\n private readonly abstractEntityDefinition = this.RULE(\n 'abstractEntityDefinition',\n () => {\n this.CONSUME(Abstract);\n this.CONSUME(Entity);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.SUBRULE(this.parametersClause);\n });\n this.memberContext = 'entity';\n try {\n this.SUBRULE(this.elementList);\n } finally {\n this.memberContext = 'view';\n }\n },\n );\n\n private readonly customEntityDefinition = this.RULE(\n 'customEntityDefinition',\n () => {\n this.CONSUME(Custom);\n this.CONSUME(Entity);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.SUBRULE(this.parametersClause);\n });\n this.memberContext = 'entity';\n try {\n this.SUBRULE(this.elementList);\n } finally {\n this.memberContext = 'view';\n }\n },\n );\n\n /**\n * `external entity <name> [external name <obj>] [with parameters …] { … }\n * with federated data provided at runtime [;]`\n */\n private readonly externalEntityDefinition = this.RULE(\n 'externalEntityDefinition',\n () => {\n this.CONSUME(External);\n this.CONSUME(Entity);\n this.SUBRULE(this.cdsName);\n this.OPTION({\n // `external name <obj>` — `external` is also a legal name, so gate\n // on the following `name` keyword.\n GATE: () =>\n this.LA(1).tokenType === External && this.LA(2).tokenType === Name,\n DEF: () => {\n this.CONSUME2(External);\n this.CONSUME(Name);\n this.SUBRULE2(this.cdsName);\n },\n });\n this.OPTION2(() => {\n this.SUBRULE(this.parametersClause);\n });\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.fieldDefinition);\n });\n this.CONSUME(RBrace);\n this.CONSUME(With);\n this.CONSUME(Federated);\n this.CONSUME(Data);\n this.CONSUME(Provided);\n this.CONSUME(AtKeyword);\n this.CONSUME(Runtime);\n this.OPTION3(() => this.CONSUME(Semicolon));\n },\n );\n\n // ============================================================\n // SELECT statement\n // select [distinct] from <source>\n // [joins | associations | bind aspect …]*\n // { element list }\n // [where …] [group by …] [having …]\n // [union|intersect|except [all] select …]*\n // ============================================================\n\n private readonly selectStatement = this.RULE('selectStatement', () => {\n this.CONSUME(Select);\n this.OPTION(() => this.CONSUME(Distinct));\n this.CONSUME(From);\n this.SUBRULE(this.dataSource);\n // FROM region: an ordered chain of joins, association declarations and\n // aspect bindings. Associations are usually written after the join chain.\n this.MANY(() => {\n this.OR([\n { ALT: () => this.SUBRULE(this.joinClause) },\n { ALT: () => this.SUBRULE(this.associationTail) },\n { ALT: () => this.SUBRULE(this.bindAspect) },\n ]);\n });\n this.SUBRULE(this.elementList);\n this.SUBRULE(this.selectClauses);\n });\n\n private readonly selectClauses = this.RULE('selectClauses', () => {\n this.OPTION(() => {\n this.CONSUME(Where);\n this.SUBRULE(this.condition);\n });\n this.OPTION2(() => {\n this.CONSUME(Group);\n this.CONSUME(By);\n this.SUBRULE(this.qualifiedName);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE2(this.qualifiedName);\n });\n });\n this.OPTION3(() => {\n this.CONSUME(Having);\n this.SUBRULE2(this.condition);\n });\n this.MANY2(() => {\n this.SUBRULE(this.setOperation);\n });\n });\n\n /** `union [all]|intersect|except select …` — nested set operation. */\n private readonly setOperation = this.RULE('setOperation', () => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Union);\n this.OPTION(() => this.CONSUME(All));\n },\n },\n { ALT: () => this.CONSUME(Intersect) },\n { ALT: () => this.CONSUME(Except) },\n ]);\n this.SUBRULE(this.selectStatement);\n });\n\n /**\n * `as projection on <source> [bind aspect] [associations]\n * [redefined associations] { projection list } [where …]`\n */\n private readonly projectionTail = this.RULE('projectionTail', () => {\n this.CONSUME(Projection);\n this.CONSUME(On);\n this.SUBRULE(this.dataSource);\n this.MANY(() => {\n this.OR([\n { ALT: () => this.SUBRULE(this.associationTail) },\n { ALT: () => this.SUBRULE(this.redefinedAssociation) },\n { ALT: () => this.SUBRULE(this.bindAspect) },\n ]);\n });\n this.SUBRULE(this.elementList);\n this.OPTION(() => {\n this.CONSUME(Where);\n this.SUBRULE(this.condition);\n });\n });\n\n /**\n * A data source: `<name> [ ( <parameter bindings> ) ] [ as <alias> ]`.\n *\n * The parameter list precedes the alias, e.g.\n * `ZP_MM_PR_DOC_TF( mandt: $session.client ) as _PRDocList`.\n */\n private readonly dataSource = this.RULE('dataSource', () => {\n this.SUBRULE(this.dataSourcePath);\n this.OPTION(() => {\n this.SUBRULE(this.dataSourceParameters);\n });\n this.OPTION2(() => {\n this.OR([\n {\n // An explicit alias is never ambiguous.\n ALT: () => {\n this.CONSUME(As);\n this.SUBRULE(this.cdsName);\n },\n },\n {\n // A bare (implicit) alias — the FROM-region starters are excluded,\n // see FROM_REGION_STARTERS.\n ALT: () => this.SUBRULE(this.bareAliasName),\n },\n ]);\n });\n });\n\n /**\n * `<name>[<attr>].<name>…` — a FROM data-source path. Path segments may\n * carry `[ … ]` association filters/attribute bindings (captured opaquely),\n * e.g. `_order._items[1:currency = 'EUR']`.\n */\n private readonly dataSourcePath = this.RULE('dataSourcePath', () => {\n this.SUBRULE(this.pathSegment);\n this.MANY(() => {\n this.CONSUME(Dot);\n this.SUBRULE2(this.pathSegment);\n });\n });\n\n /**\n * `( <param> : <value> , … )` — parameter bindings of a data source.\n * At least one binding is required; `source()` is rejected.\n */\n private readonly dataSourceParameters = this.RULE(\n 'dataSourceParameters',\n () => {\n this.CONSUME(LParen);\n this.SUBRULE(this.dataSourceParameter);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE2(this.dataSourceParameter);\n });\n this.CONSUME(RParen);\n },\n );\n\n /** `<name> : <value>` — a single parameter binding. */\n private readonly dataSourceParameter = this.RULE(\n 'dataSourceParameter',\n () => {\n this.SUBRULE(this.qualifiedName);\n this.CONSUME(Colon);\n this.SUBRULE(this.parameterBinding);\n },\n );\n\n /**\n * The value bound to a source parameter. Kept as written in the source:\n * - `:P_Param` — parameter of the consuming view\n * - `$session.client`, `$parameters.P_X` — system variable\n * - `'X'`, `42`, `abap.dats'20200101'` — literal\n */\n private readonly parameterBinding = this.RULE('parameterBinding', () => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Colon);\n this.SUBRULE(this.qualifiedName);\n },\n },\n { ALT: () => this.SUBRULE(this.systemVariable) },\n { ALT: () => this.SUBRULE(this.literal) },\n ]);\n });\n\n // ============================================================\n // Joins\n //\n // [INNER] [[card]] JOIN <source> ON <cond> -- ON is mandatory\n // LEFT [OUTER] [[card]] JOIN <source> ON <cond> -- ON is mandatory\n // RIGHT [OUTER] [[card]] JOIN <source> ON <cond> -- ON is mandatory\n // FULL [OUTER] JOIN <source> ON <cond> -- ON is mandatory\n // CROSS JOIN <source> -- ON is not allowed\n //\n // `card` is the word-form join cardinality:\n // `to one|exact one|many` or `one|exact one|many to one|exact one|many`\n //\n // The `OUTER` keyword is optional for the outer join types, and the syntax\n // does not depend on the view flavour — a view entity and a legacy\n // `define view` accept the same join spellings.\n // ============================================================\n\n private readonly joinClause = this.RULE('joinClause', () => {\n this.OR([\n {\n // A cross join must not carry an ON condition — it consumes the\n // data source itself.\n ALT: () => {\n this.CONSUME(Cross);\n this.CONSUME(Join);\n this.SUBRULE(this.joinOperand);\n },\n },\n {\n // Every other join type requires an ON condition.\n ALT: () => {\n this.SUBRULE(this.joinPrefix);\n this.CONSUME2(Join);\n this.SUBRULE2(this.joinOperand);\n this.CONSUME(On);\n this.SUBRULE(this.condition);\n },\n },\n ]);\n });\n\n /**\n * Optional join-type words and the optional word-form cardinality, both\n * preceding the `JOIN` keyword:\n * `left [outer]`, `right [outer]`, `inner`, `full [outer]`, `<empty>`\n * then `[exact one|one|many] to [exact] one|many` | `to [exact] one|many`.\n */\n private readonly joinPrefix = this.RULE('joinPrefix', () => {\n this.OPTION(() => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Left);\n this.OPTION2(() => this.CONSUME(Outer));\n },\n },\n {\n ALT: () => {\n this.CONSUME(Right);\n this.OPTION3(() => this.CONSUME2(Outer));\n },\n },\n { ALT: () => this.CONSUME(Inner) },\n {\n ALT: () => {\n this.CONSUME(Full);\n this.OPTION4(() => this.CONSUME3(Outer));\n },\n },\n ]);\n });\n this.OPTION5({\n GATE: () => this.isJoinCardinality(),\n DEF: () => this.SUBRULE(this.joinCardinality),\n });\n });\n\n /**\n * `[exact one|one|many] to (exact one|one|many)` or `to (exact one|one|many)`\n * — the word-form join cardinality, e.g. `many to one join`, `to one join`.\n */\n private readonly joinCardinality = this.RULE('joinCardinality', () => {\n this.OPTION(() => this.SUBRULE(this.cardinalWord));\n this.CONSUME(To);\n this.SUBRULE2(this.cardinalWord);\n });\n\n /** `exact one` | `one` | `many` — a cardinality bound written in words. */\n private readonly cardinalWord = this.RULE('cardinalWord', () => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Exact);\n this.CONSUME(One);\n },\n },\n { ALT: () => this.CONSUME2(One) },\n { ALT: () => this.CONSUME(Many) },\n ]);\n });\n\n /**\n * Cheap lookahead for the word-form join cardinality: it ends with the\n * `JOIN` keyword. Matches `[src] to tgt` where\n * src ∈ {`exact one`,`one`,`many`} (optional) and\n * tgt ∈ {`exact one`,`one`,`many`}.\n */\n private isJoinCardinality(): boolean {\n let i = 1;\n const typeAt = (n: number) => this.LA(n).tokenType;\n if (typeAt(i) === Exact && typeAt(i + 1) === One) i += 2;\n else if (typeAt(i) === One || typeAt(i) === Many) i += 1;\n if (typeAt(i) !== To) return false;\n i += 1;\n if (typeAt(i) === Exact && typeAt(i + 1) === One) i += 2;\n else if (typeAt(i) === One || typeAt(i) === Many) i += 1;\n else return false;\n return typeAt(i) === Join;\n }\n\n /**\n * A join source: a data source or a parenthesized join group\n * (`join (A join B on …) on …`).\n */\n private readonly joinOperand = this.RULE('joinOperand', () => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(LParen);\n this.SUBRULE(this.joinGroup);\n this.CONSUME(RParen);\n },\n },\n { ALT: () => this.SUBRULE(this.dataSource) },\n ]);\n });\n\n /** `<source> [joins…]` — the content of a parenthesized join group. */\n private readonly joinGroup = this.RULE('joinGroup', () => {\n this.SUBRULE(this.joinOperand);\n this.MANY(() => {\n this.SUBRULE(this.joinClause);\n });\n });\n\n // ============================================================\n // Element list: `{ [key] [virtual] <expr> [as <alias>] … ; … }`\n // ============================================================\n\n private readonly elementList = this.RULE('elementList', () => {\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.elementMember);\n });\n this.CONSUME(RBrace);\n });\n\n private readonly elementMember = this.RULE('elementMember', () => {\n // Annotations are shared between projection elements and associations to\n // keep the LL(k) grammar unambiguous. The branch decision is made on the\n // `association` / `composition` keyword (or the absence thereof).\n this.MANY(() => this.SUBRULE(this.annotation));\n this.OR([\n {\n // `association`/`composition` are also legal element names — the\n // declaration form applies only when association syntax follows.\n GATE: () => this.isAssociationDeclaration(),\n ALT: () => this.SUBRULE(this.associationTail),\n },\n { ALT: () => this.SUBRULE(this.viewElementTail) },\n ]);\n });\n\n private readonly viewElementTail = this.RULE('viewElementTail', () => {\n // `key`/`virtual`/`redirected` are element flags only when an element\n // follows — they are legal element names themselves (`{ key }`,\n // `key : abap.char(1)`).\n this.OPTION({\n GATE: () => this.isElementStart(this.LA(2)),\n DEF: () => this.CONSUME(Key),\n });\n this.OPTION2({\n GATE: () => this.isElementStart(this.LA(2)),\n DEF: () => this.CONSUME(Virtual),\n });\n this.OPTION3({\n GATE: () => this.isElementStart(this.LA(2)),\n DEF: () => this.CONSUME(Redirected),\n });\n // Either a typed field `name : type` (abstract/custom entities, virtual\n // elements) or an element expression `expr [as alias] [: suffix]`.\n this.OR([\n {\n GATE: () => this.isTypedField(),\n ALT: () => this.SUBRULE(this.typedFieldTail),\n },\n { ALT: () => this.SUBRULE(this.elementExpression) },\n ]);\n // Element terminator is optional for the trailing element.\n this.OPTION4(() => {\n this.OR2([\n { ALT: () => this.CONSUME(Semicolon) },\n { ALT: () => this.CONSUME(Comma) },\n ]);\n });\n });\n\n private readonly typedFieldTail = this.RULE('typedFieldTail', () => {\n this.SUBRULE(this.cdsName);\n this.CONSUME(Colon);\n this.SUBRULE(this.typeReference);\n this.OPTION(() => {\n this.CONSUME(Not);\n this.CONSUME(Null);\n });\n });\n\n /**\n * Element expression — everything allowed in a select/projection list:\n * paths (`_assoc.field`, `_a[inner].f`), calls (`sum(x)`, `div(a,b,c)`),\n * window functions (`… over (partition by … order by …)`), casts, case\n * distinctions, arithmetic, literals, parameters (`:P_X`) and system\n * variables (`$session.client`, `$parameters.x`, `$projection.f`).\n *\n * Followed by an optional `as <alias>` and an optional element suffix\n * (`: localized`, `: redirected to [composition child|parent] <target>`).\n */\n private readonly elementExpression = this.RULE('elementExpression', () => {\n this.SUBRULE(this.operand);\n this.OPTION(() => {\n this.CONSUME(As);\n this.SUBRULE(this.cdsName);\n });\n this.OPTION2(() => {\n this.CONSUME(Colon);\n this.OR([\n { ALT: () => this.CONSUME(Localized) },\n { ALT: () => this.SUBRULE(this.redirection) },\n ]);\n });\n });\n\n /**\n * `redirected to [composition child|parent] <target>` — association\n * redirection in projection views.\n */\n private readonly redirection = this.RULE('redirection', () => {\n this.CONSUME(Redirected);\n this.CONSUME(To);\n this.OPTION(() => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Composition);\n this.CONSUME(Child);\n },\n },\n { ALT: () => this.CONSUME(Parent) },\n ]);\n });\n this.SUBRULE(this.qualifiedName);\n });\n\n /**\n * `redefine association|composition <name> [[card:] <filter>] [as <alias>]\n * [redirected to …]` — redefined association of a projection view,\n * declared before the projection list.\n */\n private readonly redefinedAssociation = this.RULE(\n 'redefinedAssociation',\n () => {\n this.CONSUME(Redefine);\n this.OR([\n { ALT: () => this.CONSUME(Association) },\n { ALT: () => this.CONSUME(Composition) },\n ]);\n this.SUBRULE(this.qualifiedName);\n this.OPTION(() => {\n this.SUBRULE(this.bracketTokens);\n });\n this.OPTION2(() => {\n this.CONSUME(As);\n this.SUBRULE(this.cdsName);\n });\n this.OPTION3(() => {\n this.SUBRULE(this.redirection);\n });\n },\n );\n\n /**\n * `bind aspect <aspect> ( <element> => <target>, … ) [as <alias>]`\n * — aspect binding in the FROM region or projection view header.\n */\n private readonly bindAspect = this.RULE('bindAspect', () => {\n this.CONSUME(Bind);\n this.CONSUME(Aspect);\n this.SUBRULE(this.qualifiedName);\n this.CONSUME(LParen);\n this.SUBRULE(this.bindMapping);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE2(this.bindMapping);\n });\n this.CONSUME(RParen);\n this.OPTION(() => {\n this.CONSUME(As);\n this.SUBRULE(this.cdsName);\n });\n });\n\n /** `<aspect element> => <target>` — one aspect binding mapping. */\n private readonly bindMapping = this.RULE('bindMapping', () => {\n this.SUBRULE(this.cdsName);\n this.CONSUME(FatArrow);\n this.SUBRULE(this.operand);\n });\n\n /** Cheap lookahead: `cast (` — the cast form of a projection element. */\n private isCastExpression(): boolean {\n const first = this.LA(1);\n const second = this.LA(2);\n if (!first || !second) return false;\n return (\n first.tokenType?.name === 'Identifier' &&\n first.image.toLowerCase() === 'cast' &&\n second.tokenType?.name === 'LParen'\n );\n }\n\n /**\n * `view` — the element list allows projection suffixes (`: localized`,\n * `: redirected to`); `entity` — abstract/custom entity bodies where a\n * token after `:` is always a type name.\n */\n private memberContext: 'view' | 'entity' = 'view';\n\n /**\n * Cheap lookahead: `name :` → typed field. Any keyword may be a name\n * (`Type : abap.char(1)`), but `name : localized` / `name : redirected …`\n * are projection-element suffixes, not typed fields.\n */\n private isTypedField(): boolean {\n const first = this.LA(1);\n const second = this.LA(2);\n const third = this.LA(3);\n if (!this.isNameToken(first) || second.tokenType !== Colon) return false;\n // In entity bodies there are no projection suffixes — `localized` and\n // `redirected` are ordinary keyword-spelled type names.\n if (this.memberContext === 'entity') return true;\n return ![Localized, Redirected].includes(third.tokenType);\n }\n\n // `LA()` returns the EOF token past the end of input — never `undefined`.\n private isNameToken(token: IToken): boolean {\n return CdsParser.NAME_TOKEN_SET.has(token.tokenType);\n }\n\n /**\n * `association|composition` in an element list is a declaration only when\n * association syntax follows: `[`, `to`, `of`, or a name (the target).\n * `association :`, `association,`, `association ;` … are elements named\n * `association`.\n */\n private isAssociationDeclaration(): boolean {\n const first = this.LA(1).tokenType;\n if (first !== Association && first !== Composition) return false;\n const second = this.LA(2);\n if ([To, Of, LBracket].includes(second.tokenType)) return true;\n // `association as <alias>` is an element *named* `association` — `as`\n // only starts a declaration's alias after a target was parsed.\n if (second.tokenType === As) return false;\n return this.isNameToken(second);\n }\n\n /**\n * `true` when the token may begin an element expression — used to decide\n * whether `key`/`virtual`/`redirected` are element flags or the element\n * name itself.\n */\n private isElementStart(token: IToken): boolean {\n if (this.isNameToken(token)) return true;\n return [\n StringLiteral,\n NumberLiteral,\n EnumLiteral,\n Minus,\n Plus,\n LParen,\n Dollar,\n ].includes(token.tokenType);\n }\n\n /** `true` when `LA(1)` begins a literal (incl. typed `abap.x'…'`). */\n private isLiteralStart(): boolean {\n const t = this.LA(1).tokenType;\n if (\n [\n StringLiteral,\n NumberLiteral,\n EnumLiteral,\n True,\n False,\n Null,\n Minus,\n ].includes(t)\n ) {\n return true;\n }\n return this.isTypedLiteral();\n }\n\n /**\n * `( … )` in a condition operand — `true` when the parenthesized group is\n * itself a condition (contains a predicate-ish token at depth ≥ 1 and is\n * not immediately followed by a comparison operator, which would make the\n * group an operand of a comparison like `(a + b) = 1`).\n */\n private isParenCondition(): boolean {\n if (this.LA(1).tokenType !== LParen) return false;\n const close = this.matchingParen(1);\n if (close < 0) return false;\n // A comparison operator directly after `)` → the group is an operand.\n if (this.isComparisonToken(this.LA(close + 1))) return false;\n // Predicate-ish token inside the parens (any depth) → condition.\n for (let i = 2; i < close; i += 1) {\n if (this.isConditionMarker(this.LA(i))) return true;\n }\n return false;\n }\n\n /** Index of the `)` matching the `(` at `from`, or -1 (EOF/unbalanced). */\n private matchingParen(from: number): number {\n let depth = 0;\n for (let i = from; i < from + 400; i += 1) {\n const t = this.LA(i).tokenType;\n if (t === EOF) return -1;\n depth += CdsParser.PAREN_DELTA.get(t) ?? 0;\n if (t === RParen && depth === 0) return i;\n }\n return -1;\n }\n\n private isConditionMarker(tok: IToken): boolean {\n return (\n CdsParser.CONDITION_MARKER_SET.has(tok.tokenType) || this.isIsKeyword(tok)\n );\n }\n\n private isComparisonToken(tok: IToken): boolean {\n return (\n CdsParser.COMPARISON_TOKEN_SET.has(tok.tokenType) || this.isIsKeyword(tok)\n );\n }\n\n private isIsKeyword(tok: IToken): boolean {\n return tok.tokenType === Identifier && tok.image.toLowerCase() === 'is';\n }\n\n /**\n * `case` is a legal element name — treat it as a case expression only\n * when a `when` follows before the element ends.\n */\n private isCaseExpression(): boolean {\n if (this.LA(1).tokenType !== Case) return false;\n let depth = 0;\n // Scans until `when`, an element terminator or EOF — the cap only guards\n // against pathological inputs; a `case` element far before its first\n // `when` is still a case expression.\n for (let i = 2; i < 500; i += 1) {\n const t = this.LA(i).tokenType;\n if (this.caseScanEnds(t, depth)) return false;\n if (depth === 0 && t === When) return true;\n depth += CdsParser.DEPTH_DELTA.get(t) ?? 0;\n }\n return false;\n }\n\n private caseScanEnds(t: TokenType, depth: number): boolean {\n if (t === EOF) return true;\n if (depth !== 0) return false;\n return [RBrace, Semicolon, Comma, RParen, RBracket].includes(t);\n }\n\n // ============================================================\n // Associations\n // association [<card>] [of <src> to <tgt>]?\n // [to [parent|<tgt-card>] [redirected to]]? <target>\n // [as _<alias>] [on <cond>] [with default filter <cond>]\n // ============================================================\n\n private readonly associationTail = this.RULE('associationTail', () => {\n this.OR([\n { ALT: () => this.CONSUME(Association) },\n { ALT: () => this.CONSUME(Composition) },\n ]);\n this.OPTION(() => this.SUBRULE(this.cardinality));\n this.OR2([\n {\n // `of X`, `of many X`, `of many to X`, `of to X` —\n // `to` is a connector before the target, not a second cardinality.\n ALT: () => {\n this.CONSUME(Of);\n this.OPTION2(() => this.SUBRULE(this.cardinalWord));\n this.OPTION3(() => this.CONSUME(To));\n this.SUBRULE(this.qualifiedName);\n },\n },\n {\n // `to parent X` — `parent` is also a legal target name, so this is\n // the to-parent form only when a name follows `parent`.\n GATE: () =>\n this.LA(1).tokenType === To &&\n this.LA(2).tokenType === Parent &&\n this.isNameToken(this.LA(3)),\n ALT: () => {\n this.CONSUME2(To);\n this.CONSUME(Parent);\n this.SUBRULE2(this.qualifiedName);\n },\n },\n {\n // `to X`, `to many X`, `to exact one X`, `to redirected to X`,\n // `to many redirected to X`\n ALT: () => {\n this.CONSUME3(To);\n this.OPTION4(() => this.SUBRULE3(this.cardinalWord));\n this.OPTION5(() => {\n this.CONSUME(Redirected);\n this.CONSUME4(To);\n });\n this.SUBRULE3(this.qualifiedName);\n },\n },\n {\n // `association <target>` — `to` is optional in view entities. The\n // gate excludes `to`/`of`, which are connector keywords here.\n GATE: () => ![To, Of].includes(this.LA(1).tokenType),\n ALT: () => {\n this.SUBRULE4(this.qualifiedName);\n },\n },\n ]);\n this.OPTION6(() => {\n this.CONSUME(As);\n this.SUBRULE(this.cdsName);\n });\n this.OPTION7(() => {\n this.CONSUME(On);\n this.SUBRULE(this.condition);\n });\n this.OPTION8(() => {\n this.CONSUME(With);\n this.CONSUME(Default);\n this.CONSUME(Filter);\n this.SUBRULE2(this.condition);\n });\n this.OPTION9(() => {\n this.OR3([\n { ALT: () => this.CONSUME(Semicolon) },\n { ALT: () => this.CONSUME(Comma) },\n ]);\n });\n });\n\n /** `[<lower>..<upper>]`, `[<n>]`, `[*]`, `[<lower>..*]` */\n private readonly cardinality = this.RULE('cardinality', () => {\n this.CONSUME(LBracket);\n this.OR([\n { ALT: () => this.CONSUME(Star) },\n {\n ALT: () => {\n this.CONSUME(NumberLiteral);\n this.OPTION(() => {\n this.CONSUME(Dot);\n this.CONSUME2(Dot);\n this.OR2([\n { ALT: () => this.CONSUME2(NumberLiteral) },\n { ALT: () => this.CONSUME2(Star) },\n ]);\n });\n },\n },\n ]);\n this.CONSUME(RBracket);\n });\n\n // ============================================================\n // Parameters clause: `with parameters p1 : type, p2 : type`\n // ============================================================\n\n private readonly parametersClause = this.RULE('parametersClause', () => {\n this.CONSUME(With);\n this.CONSUME(Parameters);\n this.SUBRULE(this.parameterDefinition);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE2(this.parameterDefinition);\n });\n });\n\n private readonly parameterDefinition = this.RULE(\n 'parameterDefinition',\n () => {\n this.MANY(() => this.SUBRULE(this.annotation));\n this.SUBRULE(this.cdsName);\n this.CONSUME(Colon);\n this.SUBRULE(this.typeReference);\n this.OPTION(() => {\n this.CONSUME(Default);\n this.SUBRULE(this.literal);\n });\n },\n );\n\n // ============================================================\n // Simple type definition\n // ============================================================\n\n private readonly simpleTypeDefinition = this.RULE(\n 'simpleTypeDefinition',\n () => {\n this.CONSUME(Type);\n this.SUBRULE(this.cdsName);\n this.CONSUME(Colon);\n this.SUBRULE(this.typeReference);\n this.CONSUME(Semicolon);\n },\n );\n\n // ============================================================\n // Service definition\n // ============================================================\n\n private readonly serviceDefinition = this.RULE('serviceDefinition', () => {\n this.CONSUME(Service);\n this.SUBRULE(this.cdsName);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.exposeStatement);\n });\n this.CONSUME(RBrace);\n });\n\n private readonly exposeStatement = this.RULE('exposeStatement', () => {\n this.CONSUME(Expose);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.CONSUME(As);\n this.SUBRULE2(this.cdsName);\n });\n this.CONSUME(Semicolon);\n });\n\n // ============================================================\n // Scalar function: `define scalar function <name> [with parameters …]\n // returns <type> [;]`\n // ============================================================\n\n private readonly scalarFunctionDefinition = this.RULE(\n 'scalarFunctionDefinition',\n () => {\n this.CONSUME(Scalar);\n this.CONSUME(FunctionKeyword);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.SUBRULE(this.parametersClause);\n });\n this.CONSUME(Returns);\n this.SUBRULE(this.typeReference);\n this.OPTION2(() => this.CONSUME(Semicolon));\n },\n );\n\n // ============================================================\n // Hierarchy: `define hierarchy <name> [with parameters …]\n // as parent child hierarchy( … ) { … }`\n // ============================================================\n\n private readonly hierarchyDefinition = this.RULE(\n 'hierarchyDefinition',\n () => {\n this.CONSUME(Hierarchy);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.SUBRULE(this.parametersClause);\n });\n this.CONSUME(As);\n this.CONSUME(Parent);\n this.CONSUME(Child);\n this.CONSUME2(Hierarchy);\n this.CONSUME(LParen);\n // Mandatory: `source <entity>` and `child to parent association <name>`\n this.CONSUME(Source);\n this.SUBRULE(this.qualifiedName);\n this.CONSUME2(Child);\n this.CONSUME(To);\n this.CONSUME2(Parent);\n this.CONSUME(Association);\n this.SUBRULE2(this.cdsName);\n // Optional pre-clauses: `period …`, `directory … filter by …`,\n // `start where …` (order-tolerant).\n this.MANY(() => {\n this.OR([\n { ALT: () => this.SUBRULE(this.hierarchyPeriod) },\n { ALT: () => this.SUBRULE(this.hierarchyDirectory) },\n { ALT: () => this.SUBRULE(this.hierarchyStart) },\n ]);\n });\n // Mandatory: `siblings order by <items>`\n this.CONSUME(Siblings);\n this.CONSUME(Order);\n this.CONSUME(By);\n this.SUBRULE(this.sortItem);\n this.MANY2(() => {\n this.CONSUME(Comma);\n this.SUBRULE2(this.sortItem);\n });\n // Optional trailing clauses (order-tolerant).\n this.MANY3(() => {\n this.OR2([\n { ALT: () => this.SUBRULE(this.hierarchyDepth) },\n { ALT: () => this.SUBRULE(this.hierarchyNodetype) },\n { ALT: () => this.SUBRULE(this.hierarchyLoad) },\n { ALT: () => this.SUBRULE(this.hierarchyMultiple) },\n { ALT: () => this.SUBRULE(this.hierarchyOrphans) },\n { ALT: () => this.SUBRULE(this.hierarchyCycles) },\n { ALT: () => this.SUBRULE(this.hierarchyGenerate) },\n { ALT: () => this.SUBRULE(this.hierarchyCache) },\n ]);\n });\n this.CONSUME(RParen);\n this.SUBRULE(this.elementList);\n },\n );\n\n /** `period from <f> to <f> [valid from <f> to <f>]` */\n private readonly hierarchyPeriod = this.RULE('hierarchyPeriod', () => {\n this.CONSUME(Period);\n this.CONSUME(From);\n this.SUBRULE(this.qualifiedName);\n this.CONSUME(To);\n this.SUBRULE2(this.qualifiedName);\n this.OPTION(() => {\n this.CONSUME(Valid);\n this.CONSUME2(From);\n this.SUBRULE3(this.qualifiedName);\n this.CONSUME2(To);\n this.SUBRULE4(this.qualifiedName);\n });\n });\n\n /** `directory <entity> filter by <cond>` */\n private readonly hierarchyDirectory = this.RULE('hierarchyDirectory', () => {\n this.CONSUME(Directory);\n this.SUBRULE(this.qualifiedName);\n this.CONSUME(Filter);\n this.CONSUME(By);\n this.SUBRULE(this.condition);\n });\n\n /** `start where <cond>` */\n private readonly hierarchyStart = this.RULE('hierarchyStart', () => {\n this.CONSUME(Start);\n this.CONSUME(Where);\n this.SUBRULE(this.condition);\n });\n\n /** `depth <field>|<number>` */\n private readonly hierarchyDepth = this.RULE('hierarchyDepth', () => {\n this.CONSUME(Depth);\n this.OR([\n { ALT: () => this.SUBRULE(this.qualifiedName) },\n { ALT: () => this.CONSUME(NumberLiteral) },\n ]);\n });\n\n /** `nodetype <field>` */\n private readonly hierarchyNodetype = this.RULE('hierarchyNodetype', () => {\n this.CONSUME(Nodetype);\n this.SUBRULE(this.qualifiedName);\n });\n\n /** `load bulk|incremental|<sysvar>|<field>` */\n private readonly hierarchyLoad = this.RULE('hierarchyLoad', () => {\n this.CONSUME(Load);\n this.OR([\n {\n GATE: () => this.LA(1).tokenType === Bulk,\n ALT: () => this.CONSUME(Bulk),\n },\n {\n GATE: () => this.LA(1).tokenType === Incremental,\n ALT: () => this.CONSUME(Incremental),\n },\n { ALT: () => this.SUBRULE(this.systemVariable) },\n { ALT: () => this.SUBRULE(this.qualifiedName) },\n ]);\n });\n\n /** `multiple parents not allowed|leaves only|allowed` */\n private readonly hierarchyMultiple = this.RULE('hierarchyMultiple', () => {\n this.CONSUME(Multiple);\n this.CONSUME(Parents);\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Not);\n this.CONSUME(Allowed);\n },\n },\n {\n ALT: () => {\n this.CONSUME(Leaves);\n this.CONSUME(Only);\n },\n },\n { ALT: () => this.CONSUME2(Allowed) },\n ]);\n });\n\n /** `orphans ignore|error|root` */\n private readonly hierarchyOrphans = this.RULE('hierarchyOrphans', () => {\n this.CONSUME(Orphans);\n this.OR([\n { ALT: () => this.CONSUME(Ignore) },\n { ALT: () => this.CONSUME(ErrorKeyword) },\n { ALT: () => this.CONSUME(Root) },\n ]);\n });\n\n /** `cycles error|breakup` */\n private readonly hierarchyCycles = this.RULE('hierarchyCycles', () => {\n this.CONSUME(Cycles);\n this.OR([\n { ALT: () => this.CONSUME(ErrorKeyword) },\n { ALT: () => this.CONSUME(Breakup) },\n ]);\n });\n\n /** `generate spantree` */\n private readonly hierarchyGenerate = this.RULE('hierarchyGenerate', () => {\n this.CONSUME(Generate);\n this.CONSUME(Spantree);\n });\n\n /** `cache on|off|force` */\n private readonly hierarchyCache = this.RULE('hierarchyCache', () => {\n this.CONSUME(Cache);\n this.OR([\n { ALT: () => this.CONSUME(On) },\n { ALT: () => this.CONSUME(Off) },\n { ALT: () => this.CONSUME(Force) },\n ]);\n });\n\n /** `<field> [ascending|descending]` — one ORDER BY item. */\n private readonly sortItem = this.RULE('sortItem', () => {\n this.SUBRULE(this.qualifiedName);\n this.OPTION(() => {\n this.OR([\n { ALT: () => this.CONSUME(Ascending) },\n { ALT: () => this.CONSUME(Descending) },\n ]);\n });\n });\n\n // ============================================================\n // Aspect: `define aspect <name> { [key] <elem> : <type|expr>; … }`\n // ============================================================\n\n private readonly aspectDefinition = this.RULE('aspectDefinition', () => {\n this.CONSUME(Aspect);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.aspectElement);\n });\n this.CONSUME(RBrace);\n });\n });\n\n private readonly aspectElement = this.RULE('aspectElement', () => {\n this.MANY(() => this.SUBRULE(this.annotation));\n this.OPTION({\n // `key` is also a legal element name (`key : type`).\n GATE: () => this.isNameToken(this.LA(2)),\n DEF: () => this.CONSUME(Key),\n });\n this.SUBRULE(this.cdsName);\n this.CONSUME(Colon);\n // `name : typing;` or `name : arith_expr|case_expr|builtin_func;`\n this.OR([\n {\n GATE: () => this.isAspectTypedValue(),\n ALT: () => this.SUBRULE(this.typeReference),\n },\n { ALT: () => this.SUBRULE(this.operand) },\n ]);\n this.CONSUME(Semicolon);\n });\n\n /**\n * Lookahead for `name : <typing>;` inside an aspect element — true when the\n * token sequence after the colon is a type reference followed by `;`.\n */\n private isAspectTypedValue(): boolean {\n const typeAt = (n: number) => this.LA(n).tokenType;\n if (typeAt(1) === Abap) return this.abapTypeEndsAtSemicolon();\n if (!this.isNameToken(this.LA(1))) return false;\n let i = 2;\n while (typeAt(i) === Dot && this.isNameToken(this.LA(i + 1))) i += 2;\n // A `(` after a non-`abap` name is a function call, not a type.\n return typeAt(i) === Semicolon;\n }\n\n /** `abap.x[(n[,m])]` followed by `;` — a builtin aspect type. */\n private abapTypeEndsAtSemicolon(): boolean {\n const typeAt = (n: number) => this.LA(n).tokenType;\n if (typeAt(2) !== Dot || !this.isNameToken(this.LA(3))) return false;\n let i = 4;\n if (typeAt(i) === LParen) {\n // `LA()` returns the EOF token past the end of input — the loop\n // must stop on it or a truncated `abap.char(` scans forever.\n while (typeAt(i) !== RParen && typeAt(i) !== EOF) i += 1;\n i += 1;\n }\n return typeAt(i) === Semicolon;\n }\n\n // ============================================================\n // Annotation definition (DDLA) / access policy\n // define annotation <name> { … }\n // define accesspolicy <name> { … }\n //\n // Their bodies nest `{ … }` blocks freely (subannotations, pfcg mappings),\n // so the content is captured as a balanced-brace token block.\n // ============================================================\n\n private readonly annotationDefinition = this.RULE(\n 'annotationDefinition',\n () => {\n this.CONSUME(AnnotationKeyword);\n this.SUBRULE(this.cdsName);\n this.OR([\n {\n ALT: () => {\n this.CONSUME(LBrace);\n this.SUBRULE(this.tokenBlock);\n this.CONSUME(RBrace);\n },\n },\n {\n ALT: () => {\n this.CONSUME(Colon);\n this.SUBRULE(this.simpleTail);\n },\n },\n ]);\n },\n );\n\n /** `: <anything>;` — a colon-led definition tail terminated by `;`. */\n private readonly simpleTail = this.RULE('simpleTail', () => {\n this.MANY(() => {\n this.OR(\n CdsParser.DCL_TOKENS.map((tokenType) => ({\n ALT: () => this.CONSUME(tokenType),\n })),\n );\n });\n this.CONSUME(Semicolon);\n });\n\n private readonly accessPolicyDefinition = this.RULE(\n 'accessPolicyDefinition',\n () => {\n this.CONSUME(Accesspolicy);\n this.SUBRULE(this.cdsName);\n this.CONSUME(LBrace);\n this.SUBRULE(this.tokenBlock);\n this.CONSUME(RBrace);\n },\n );\n\n /**\n * Balanced `{ … }` block content — any tokens, with nested brace groups.\n * Used for DDLA annotation bodies and access policy definitions.\n */\n private readonly tokenBlock = this.RULE('tokenBlock', () => {\n this.MANY(() => {\n this.OR([\n { ALT: () => this.SUBRULE(this.tokenGroup) },\n {\n ALT: () => {\n this.OR2(\n CdsParser.BLOCK_TOKENS.map((tokenType) => ({\n ALT: () => this.CONSUME(tokenType),\n })),\n );\n },\n },\n ]);\n });\n });\n\n private readonly tokenGroup = this.RULE('tokenGroup', () => {\n this.CONSUME(LBrace);\n this.SUBRULE(this.tokenBlock);\n this.CONSUME(RBrace);\n });\n\n // ============================================================\n // DCL — `define role X [switchable] { grant …; inherit …; }`\n // ============================================================\n\n private readonly roleDefinition = this.RULE('roleDefinition', () => {\n this.CONSUME(Role);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => this.CONSUME(Switchable));\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.roleMember);\n });\n this.CONSUME(RBrace);\n });\n\n private readonly roleMember = this.RULE('roleMember', () => {\n this.OR([\n { ALT: () => this.SUBRULE(this.grantStatement) },\n { ALT: () => this.SUBRULE(this.inheritStatement) },\n { ALT: () => this.SUBRULE(this.inheritingStatement) },\n ]);\n });\n\n /**\n * `grant select on <entity> [with optional elements ( … )]\n * [combination mode or|and | redefinition] [inherit <role> [and|or <cond>]]\n * [where <dcl_cond>] ;`\n */\n private readonly grantStatement = this.RULE('grantStatement', () => {\n this.CONSUME(Grant);\n this.CONSUME(Select);\n this.CONSUME(On);\n this.SUBRULE(this.qualifiedName);\n // Order-tolerant clause chain — the official grammar lists the clauses\n // as alternatives; a source may carry `inherit`, `where`, both or none.\n this.MANY(() => {\n this.SUBRULE(this.grantClause);\n });\n this.CONSUME(Semicolon);\n });\n\n /** One trailing clause of `grant select on <entity>`: with-optional-elements | combination-mode/redefinition | inherit | where. */\n private readonly grantClause = this.RULE('grantClause', () => {\n this.OR([\n { ALT: () => this.SUBRULE(this.grantOptionalElements) },\n { ALT: () => this.SUBRULE(this.grantCombination) },\n { ALT: () => this.SUBRULE(this.grantInherit) },\n { ALT: () => this.SUBRULE(this.grantWhere) },\n ]);\n });\n\n /** `with optional elements ( <name> [default true|false], … )` */\n private readonly grantOptionalElements = this.RULE(\n 'grantOptionalElements',\n () => {\n this.CONSUME(With);\n this.CONSUME(Optional);\n this.CONSUME(Elements);\n this.CONSUME(LParen);\n this.SUBRULE(this.optionalElement);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE2(this.optionalElement);\n });\n this.CONSUME(RParen);\n },\n );\n\n /** `combination mode or|and` | `redefinition` */\n private readonly grantCombination = this.RULE('grantCombination', () => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Combination);\n this.CONSUME(Mode);\n this.OR2([\n { ALT: () => this.CONSUME(Or) },\n { ALT: () => this.CONSUME(And) },\n ]);\n },\n },\n { ALT: () => this.CONSUME(Redefinition) },\n ]);\n });\n\n /** `inherit <role> [and|or <dcl_cond>]` */\n private readonly grantInherit = this.RULE('grantInherit', () => {\n this.CONSUME(Inherit);\n this.SUBRULE(this.qualifiedName);\n this.OPTION(() => {\n this.OR([\n { ALT: () => this.CONSUME(And) },\n { ALT: () => this.CONSUME(Or) },\n ]);\n this.SUBRULE(this.dclCondition);\n });\n });\n\n /** `where <dcl_cond>` */\n private readonly grantWhere = this.RULE('grantWhere', () => {\n this.CONSUME(Where);\n this.SUBRULE(this.dclCondition);\n });\n\n /** One entry of `with optional elements ( … )`: `name [default true|false]`. */\n private readonly optionalElement = this.RULE('optionalElement', () => {\n this.SUBRULE(this.qualifiedName);\n this.OPTION(() => {\n this.CONSUME(Default);\n this.OR([\n { ALT: () => this.CONSUME(True) },\n { ALT: () => this.CONSUME(False) },\n ]);\n });\n });\n\n /**\n * `inherit <role> for grant select on <entity> [where …] ;`\n * — the standalone inherit rule of a role body.\n */\n private readonly inheritStatement = this.RULE('inheritStatement', () => {\n this.CONSUME(Inherit);\n this.SUBRULE(this.qualifiedName);\n this.OPTION(() => {\n this.CONSUME(For);\n this.CONSUME(Grant);\n this.CONSUME(Select);\n this.CONSUME(On);\n this.SUBRULE2(this.qualifiedName);\n });\n this.OPTION2(() => {\n this.CONSUME(Where);\n this.SUBRULE(this.dclCondition);\n });\n this.CONSUME(Semicolon);\n });\n\n /**\n * `inheriting conditions from entity <name>|super [default true|false] … ;`\n */\n private readonly inheritingStatement = this.RULE(\n 'inheritingStatement',\n () => {\n this.CONSUME(Inheriting);\n this.CONSUME(Conditions);\n this.CONSUME(From);\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Entity);\n this.SUBRULE(this.qualifiedName);\n },\n },\n { ALT: () => this.CONSUME(Super) },\n ]);\n this.OPTION(() => {\n this.CONSUME(Default);\n this.OR2([\n { ALT: () => this.CONSUME(True) },\n { ALT: () => this.CONSUME(False) },\n ]);\n });\n this.OPTION2(() => {\n this.SUBRULE(this.dclCondition);\n });\n this.CONSUME(Semicolon);\n },\n );\n\n /**\n * A DCL access condition — captured opaquely until the terminating `;`.\n * Covers literal, pfcg, aspect, user, inherit and `if-then-else` conditions\n * plus `true`/`false`/`void` and `and`/`or`/`not` combinations.\n */\n private readonly dclCondition = this.RULE('dclCondition', () => {\n // At least one token — `where ;` is malformed DCL, not an empty filter.\n this.AT_LEAST_ONE(() => {\n this.OR(\n CdsParser.DCL_TOKENS.map((tokenType) => ({\n ALT: () => this.CONSUME(tokenType),\n })),\n );\n });\n });\n\n // ============================================================\n // Extension: `extend view [entity] <name> with [assocs] { elems }\n // [group by …] [union|intersect|except [all] { … }]* [;]`\n // also: `extend abstract entity <name> …`, `extend custom entity <name> …`\n // ============================================================\n\n private readonly extendStatement = this.RULE('extendStatement', () => {\n this.CONSUME(Extend);\n this.OR([\n {\n ALT: () => {\n this.CONSUME(View);\n this.OPTION({\n GATE: () => this.isEntityModifier(),\n DEF: () => this.CONSUME(Entity),\n });\n this.SUBRULE(this.qualifiedName);\n },\n },\n {\n ALT: () => {\n this.CONSUME(Abstract);\n this.CONSUME2(Entity);\n this.SUBRULE2(this.qualifiedName);\n },\n },\n {\n ALT: () => {\n this.CONSUME(Custom);\n this.CONSUME3(Entity);\n this.SUBRULE3(this.qualifiedName);\n },\n },\n ]);\n this.CONSUME(With);\n this.MANY(() => {\n this.SUBRULE(this.associationTail);\n });\n this.SUBRULE(this.elementList);\n this.OPTION2(() => {\n this.CONSUME(Group);\n this.CONSUME(By);\n this.SUBRULE4(this.qualifiedName);\n this.MANY2(() => {\n this.CONSUME(Comma);\n this.SUBRULE5(this.qualifiedName);\n });\n });\n this.MANY3(() => {\n this.SUBRULE(this.extendSetOperation);\n });\n this.OPTION3(() => this.CONSUME(Semicolon));\n });\n\n /** `union [all]|intersect|except { … }` — extension-level set operation. */\n private readonly extendSetOperation = this.RULE('extendSetOperation', () => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Union);\n this.OPTION(() => this.CONSUME(All));\n },\n },\n { ALT: () => this.CONSUME(Intersect) },\n { ALT: () => this.CONSUME(Except) },\n ]);\n this.SUBRULE(this.elementList);\n });\n\n // ============================================================\n // Table/structure members\n // ============================================================\n\n private readonly tableMember = this.RULE('tableMember', () => {\n this.OR([\n {\n // `include <name>` vs a field named `include` — the directive form\n // applies only when a name follows (`include x;` vs `include : t;`).\n GATE: () =>\n this.LA(1).tokenType === Include && this.isNameToken(this.LA(2)),\n ALT: () => this.SUBRULE(this.includeDirective),\n },\n { ALT: () => this.SUBRULE(this.fieldDefinition) },\n ]);\n });\n\n private readonly includeDirective = this.RULE('includeDirective', () => {\n this.CONSUME(Include);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.CONSUME(With);\n this.CONSUME(Suffix);\n this.SUBRULE2(this.cdsName);\n });\n this.CONSUME(Semicolon);\n });\n\n private readonly fieldDefinition = this.RULE('fieldDefinition', () => {\n this.MANY(() => {\n this.SUBRULE(this.annotation);\n });\n this.OPTION({\n // `key` is also a legal field name (`key : type`).\n GATE: () => this.isNameToken(this.LA(2)),\n DEF: () => this.CONSUME(Key),\n });\n this.SUBRULE(this.cdsName);\n this.CONSUME(Colon);\n this.SUBRULE(this.typeReference);\n this.OPTION2(() => {\n this.CONSUME(Not);\n this.CONSUME(Null);\n });\n this.CONSUME(Semicolon);\n });\n\n // ============================================================\n // Metadata extension (annotate entity|view ... with { ... })\n // ============================================================\n\n private readonly annotateStatement = this.RULE('annotateStatement', () => {\n this.CONSUME(Annotate);\n this.OR([\n { ALT: () => this.CONSUME(Entity) },\n { ALT: () => this.CONSUME(View) },\n ]);\n this.SUBRULE(this.cdsName);\n this.CONSUME(With);\n this.CONSUME(LBrace);\n this.MANY(() => {\n this.SUBRULE(this.annotatedElement);\n });\n this.CONSUME(RBrace);\n });\n\n private readonly annotatedElement = this.RULE('annotatedElement', () => {\n this.MANY(() => {\n this.SUBRULE(this.annotation);\n });\n this.SUBRULE(this.qualifiedName);\n this.CONSUME(Semicolon);\n });\n\n // ============================================================\n // Annotations\n // ============================================================\n\n private readonly topLevelAnnotation = this.RULE('topLevelAnnotation', () => {\n this.SUBRULE(this.annotation);\n });\n\n private readonly annotation = this.RULE('annotation', () => {\n this.CONSUME(At);\n this.SUBRULE(this.dottedName);\n this.OPTION(() => {\n this.CONSUME(Colon);\n this.SUBRULE(this.annotationValue);\n });\n });\n\n private readonly dottedName = this.RULE('dottedName', () => {\n this.SUBRULE(this.cdsName);\n this.MANY(() => {\n this.CONSUME(Dot);\n this.SUBRULE2(this.cdsName);\n });\n });\n\n private readonly annotationValue = this.RULE('annotationValue', () => {\n this.OR([\n { ALT: () => this.CONSUME(StringLiteral) },\n { ALT: () => this.CONSUME(EnumLiteral) },\n { ALT: () => this.CONSUME(True) },\n { ALT: () => this.CONSUME(False) },\n { ALT: () => this.CONSUME(NumberLiteral) },\n { ALT: () => this.SUBRULE(this.annotationArray) },\n { ALT: () => this.SUBRULE(this.annotationObject) },\n ]);\n });\n\n private readonly annotationArray = this.RULE('annotationArray', () => {\n this.CONSUME(LBracket);\n this.MANY_SEP({\n SEP: Comma,\n DEF: () => {\n this.SUBRULE(this.annotationValue);\n },\n });\n this.CONSUME(RBracket);\n });\n\n private readonly annotationObject = this.RULE('annotationObject', () => {\n this.CONSUME(LBrace);\n this.MANY_SEP({\n SEP: Comma,\n DEF: () => {\n this.SUBRULE(this.annotationProperty);\n },\n });\n this.CONSUME(RBrace);\n });\n\n private readonly annotationProperty = this.RULE('annotationProperty', () => {\n this.SUBRULE(this.dottedName);\n this.CONSUME(Colon);\n this.SUBRULE(this.annotationValue);\n });\n\n // ============================================================\n // Literals\n // 'str' | 42 | #ENUM | true | false | null | -7 | abap.dats'20200101'\n // ============================================================\n\n private readonly literal = this.RULE('literal', () => {\n this.OPTION(() => this.CONSUME(Minus));\n this.OR([\n { ALT: () => this.CONSUME(StringLiteral) },\n { ALT: () => this.CONSUME(NumberLiteral) },\n { ALT: () => this.CONSUME(EnumLiteral) },\n { ALT: () => this.CONSUME(True) },\n { ALT: () => this.CONSUME(False) },\n { ALT: () => this.CONSUME(Null) },\n {\n // typed literal: `abap.dats'20200101'`, `abap.char'Meier'`\n GATE: () => this.isTypedLiteral(),\n ALT: () => {\n this.CONSUME(Abap);\n this.CONSUME(Dot);\n this.SUBRULE(this.cdsName);\n this.CONSUME2(StringLiteral);\n },\n },\n ]);\n });\n\n /** Cheap lookahead: `abap.<type>'…'` — a typed literal. */\n private isTypedLiteral(): boolean {\n return (\n this.LA(1).tokenType === Abap &&\n this.LA(2).tokenType === Dot &&\n this.isNameToken(this.LA(3)) &&\n this.LA(4).tokenType === StringLiteral\n );\n }\n\n // ============================================================\n // Conditions & expressions\n //\n // `condition` is the strict form used in `on` / `where` / `having` /\n // `with default filter` / `start where` — it requires a predicate\n // (comparison, `like`, `between`, `in`, `is [not] null|initial`) in every\n // operand position, so `on A.k` alone is rejected.\n //\n // `expression` is the relaxed form used inside call arguments and\n // `case … when` operands, where a bare operand is legal.\n //\n // Both are captured opaquely as `Expression { source, tokens }`.\n // ============================================================\n\n private readonly condition = this.RULE('condition', () => {\n this.SUBRULE(this.conditionOperand);\n this.MANY(() => {\n this.OR([\n { ALT: () => this.CONSUME(And) },\n { ALT: () => this.CONSUME(Or) },\n ]);\n this.SUBRULE2(this.conditionOperand);\n });\n });\n\n private readonly conditionOperand = this.RULE('conditionOperand', () => {\n this.OPTION(() => this.CONSUME(Not));\n this.OR([\n {\n // `(a = b)` vs `(a + b) = 1` — both start with `(`; the gate looks\n // inside the group for predicate-ish tokens.\n GATE: () => this.isParenCondition(),\n ALT: () => {\n this.CONSUME(LParen);\n this.SUBRULE(this.condition);\n this.CONSUME(RParen);\n },\n },\n {\n ALT: () => {\n this.SUBRULE(this.operand);\n this.SUBRULE(this.predicate);\n },\n },\n ]);\n });\n\n /** The mandatory predicate part of a strict condition operand. */\n private readonly predicate = this.RULE('predicate', () => {\n this.OR([\n {\n ALT: () => {\n this.OR2([\n { ALT: () => this.CONSUME(EqEq) },\n { ALT: () => this.CONSUME(Eq) },\n { ALT: () => this.CONSUME(NotEq) },\n { ALT: () => this.CONSUME(LtEq) },\n { ALT: () => this.CONSUME(GtEq) },\n { ALT: () => this.CONSUME(Lt) },\n { ALT: () => this.CONSUME(Gt) },\n ]);\n this.SUBRULE(this.operand);\n },\n },\n {\n ALT: () => {\n this.CONSUME(Like);\n this.SUBRULE2(this.operand);\n this.OPTION({\n // `<operand> like 'p%' escape 'e'`\n GATE: () =>\n this.LA(1).tokenType === Identifier &&\n this.LA(1).image.toLowerCase() === 'escape',\n DEF: () => {\n this.CONSUME(Identifier); // `escape`\n this.SUBRULE3(this.operand);\n },\n });\n },\n },\n {\n ALT: () => {\n this.CONSUME(Between);\n this.SUBRULE4(this.operand);\n this.CONSUME(And);\n this.SUBRULE5(this.operand);\n },\n },\n {\n ALT: () => {\n this.CONSUME(In);\n this.OR3([\n {\n ALT: () => {\n this.CONSUME(LParen);\n this.OPTION2(() => {\n this.SUBRULE6(this.operand);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE7(this.operand);\n });\n });\n this.CONSUME(RParen);\n },\n },\n // `<operand> in :P_SET` — parameter reference (CAP-style).\n // Gate: `( … )` is always the list form; an operand starting\n // with `(` would be ambiguous.\n {\n GATE: () => this.LA(1).tokenType !== LParen,\n ALT: () => this.SUBRULE8(this.operand),\n },\n ]);\n },\n },\n {\n // `is null` / `is not null` / `is initial` / `is not initial`\n GATE: () => this.isIsPredicate(),\n ALT: () => {\n this.CONSUME2(Identifier); // `is`\n this.OPTION3(() => this.CONSUME(Not));\n this.OR4([\n { ALT: () => this.CONSUME(Null) },\n { ALT: () => this.CONSUME3(Identifier) }, // `initial`\n ]);\n },\n },\n ]);\n });\n\n /** Cheap lookahead: `is` — the `is null` / `is initial` predicate. */\n private isIsPredicate(): boolean {\n const first = this.LA(1);\n if (!first) return false;\n return (\n first.tokenType?.name === 'Identifier' &&\n first.image.toLowerCase() === 'is'\n );\n }\n\n /**\n * Relaxed expression — operands with optional predicates and AND/OR\n * chains. Used for call arguments and `case … when` branches, where a\n * bare operand is legal.\n */\n private readonly expression = this.RULE('expression', () => {\n this.SUBRULE(this.comparison);\n this.MANY(() => {\n this.OR([\n { ALT: () => this.CONSUME(And) },\n { ALT: () => this.CONSUME(Or) },\n ]);\n this.SUBRULE2(this.comparison);\n });\n });\n\n private readonly comparison = this.RULE('comparison', () => {\n this.SUBRULE(this.operand);\n this.OPTION(() => {\n this.SUBRULE(this.predicate);\n });\n });\n\n /**\n * An operand — a primary expression optionally chained with arithmetic\n * operators: `a.b`, `f(x)`, `a + b * c`, `case … end`, `cast(…)`.\n */\n private readonly operand = this.RULE('operand', () => {\n this.SUBRULE(this.primary);\n this.MANY(() => {\n this.OR([\n { ALT: () => this.CONSUME(Plus) },\n { ALT: () => this.CONSUME(Minus) },\n { ALT: () => this.CONSUME(Star) },\n { ALT: () => this.CONSUME(Slash) },\n ]);\n this.SUBRULE2(this.primary);\n });\n });\n\n private readonly primary = this.RULE('primary', () => {\n this.OPTION(() => {\n this.OR([\n { ALT: () => this.CONSUME(Minus) },\n { ALT: () => this.CONSUME(Plus) },\n ]);\n });\n this.OR2([\n { ALT: () => this.SUBRULE(this.parenthesizedExpression) },\n {\n GATE: () => this.isCaseExpression(),\n ALT: () => this.SUBRULE(this.caseExpression),\n },\n {\n GATE: () => this.isCastExpression(),\n ALT: () => this.SUBRULE(this.castExpression),\n },\n { ALT: () => this.SUBRULE(this.systemVariable) },\n { ALT: () => this.SUBRULE(this.parameterRef) },\n {\n // `true`/`false`/`null`/… are legal names — literal wins only when a\n // literal token actually appears.\n GATE: () => this.isLiteralStart(),\n ALT: () => this.SUBRULE(this.literal),\n },\n { ALT: () => this.SUBRULE(this.pathOperand) },\n ]);\n });\n\n /**\n * A path or call operand: `<name>[<attr>].<name>…` optionally followed by\n * an argument list and a window `over (…)`.\n * - `a.b`, `_assoc.field`, `_a[to exact one: f = 1].g`\n * - `coalesce(a, b)`, `sum(x)`, `count(*)`, `count(distinct x)`\n * - `row_number() over (partition by a order by b descending)`\n */\n private readonly pathOperand = this.RULE('pathOperand', () => {\n this.SUBRULE(this.pathSegment);\n this.MANY(() => {\n this.CONSUME(Dot);\n this.SUBRULE2(this.pathSegment);\n });\n this.OPTION(() => {\n this.CONSUME(LParen);\n this.OPTION2(() => {\n this.SUBRULE(this.callArgument);\n this.MANY2(() => {\n this.CONSUME(Comma);\n this.SUBRULE2(this.callArgument);\n });\n });\n this.CONSUME(RParen);\n this.OPTION3(() => this.SUBRULE(this.overClause));\n });\n });\n\n /** One path segment: `<name>` plus optional `[…]` attributes. */\n private readonly pathSegment = this.RULE('pathSegment', () => {\n this.SUBRULE(this.cdsName);\n this.MANY(() => {\n this.SUBRULE(this.bracketTokens);\n });\n });\n\n /**\n * `[ … ]` — square-bracketed path attribute or association filter.\n * Contents (`cardinality`, `inner|left outer`, `where <cond>`,\n * `<card>:<cond>`, parameter bindings) are captured opaquely.\n */\n private readonly bracketTokens = this.RULE('bracketTokens', () => {\n this.CONSUME(LBracket);\n this.MANY(() => {\n this.OR(\n allTokens\n .filter(\n (t) =>\n ![\n 'WhiteSpace',\n 'LineComment',\n 'BlockComment',\n 'SqlLineComment',\n 'LBracket',\n 'RBracket',\n ].includes(t.name),\n )\n .map((tokenType) => ({ ALT: () => this.CONSUME(tokenType) })),\n );\n });\n this.CONSUME(RBracket);\n });\n\n /**\n * One call argument: `*`, `distinct <operand>` or a relaxed expression\n * (bare operands are legal inside argument lists).\n */\n private readonly callArgument = this.RULE('callArgument', () => {\n this.OR([\n { ALT: () => this.CONSUME(Star) },\n {\n // `distinct <operand>` — `distinct` alone is a legal argument name.\n GATE: () =>\n this.LA(1).tokenType === Distinct && this.isElementStart(this.LA(2)),\n ALT: () => {\n this.CONSUME(Distinct);\n this.SUBRULE(this.operand);\n },\n },\n { ALT: () => this.SUBRULE(this.expression) },\n ]);\n });\n\n /**\n * `over (partition by <fields> [order by <sort items>])` — window function\n * clause.\n */\n private readonly overClause = this.RULE('overClause', () => {\n this.CONSUME(Over);\n this.CONSUME(LParen);\n this.OPTION(() => {\n this.CONSUME(Partition);\n this.CONSUME(By);\n this.SUBRULE(this.qualifiedName);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE2(this.qualifiedName);\n });\n });\n this.OPTION2(() => {\n this.CONSUME(Order);\n this.CONSUME2(By);\n this.SUBRULE(this.sortItem);\n this.MANY2(() => {\n this.CONSUME2(Comma);\n this.SUBRULE2(this.sortItem);\n });\n });\n this.CONSUME(RParen);\n });\n\n /** `( <expression> )` — a parenthesized sub-expression. */\n private readonly parenthesizedExpression = this.RULE(\n 'parenthesizedExpression',\n () => {\n this.CONSUME(LParen);\n this.SUBRULE(this.expression);\n this.CONSUME(RParen);\n },\n );\n\n /** `cast( <value> as <type> [preserving type] )` */\n private readonly castExpression = this.RULE('castExpression', () => {\n this.CONSUME(Identifier); // `cast`\n this.CONSUME(LParen);\n this.SUBRULE(this.operand);\n this.CONSUME(As);\n this.SUBRULE(this.typeReference);\n this.OPTION({\n GATE: () =>\n this.LA(1).tokenType === Identifier &&\n this.LA(1).image.toLowerCase() === 'preserving',\n DEF: () => {\n this.CONSUME2(Identifier); // `preserving`\n this.CONSUME(Type); // `type`\n },\n });\n this.CONSUME(RParen);\n });\n\n /**\n * `case [operand] when … then … [else …|else null] end`\n * — simple case: `case f when 'a' then 1 …`\n * — searched case: `case when f = 1 then 'x' …`\n */\n private readonly caseExpression = this.RULE('caseExpression', () => {\n this.CONSUME(Case);\n // `case <operand> when …` (simple case) vs `case when …` (searched) —\n // `when` is a legal operand name, so gate on it.\n this.OPTION({\n GATE: () => this.LA(1).tokenType !== When,\n DEF: () => this.SUBRULE(this.operand),\n });\n this.AT_LEAST_ONE(() => {\n this.CONSUME(When);\n this.SUBRULE(this.expression);\n this.CONSUME(Then);\n this.SUBRULE2(this.operand);\n });\n this.OPTION2(() => {\n this.CONSUME(Else);\n this.SUBRULE3(this.operand);\n });\n this.CONSUME(End);\n });\n\n /** `$session.client`, `$parameters.P_X`, `$projection.Field`, `$node.x`. */\n private readonly systemVariable = this.RULE('systemVariable', () => {\n this.CONSUME(Dollar);\n this.SUBRULE(this.qualifiedName);\n });\n\n /** `:P_Param` — a parameter reference of the consuming view. */\n private readonly parameterRef = this.RULE('parameterRef', () => {\n this.CONSUME(Colon);\n this.SUBRULE(this.qualifiedName);\n });\n\n // ============================================================\n // Type references\n // ============================================================\n\n private readonly typeReference = this.RULE('typeReference', () => {\n this.OR([\n {\n // `abap.<type>` is the builtin namespace — `x : abap` (named type\n // `abap`) stays a named type.\n GATE: () =>\n this.LA(1).tokenType === Abap && this.LA(2).tokenType === Dot,\n ALT: () => this.SUBRULE(this.builtinType),\n },\n { ALT: () => this.SUBRULE(this.namedType) },\n ]);\n });\n\n /** `abap.char(10)` or `abap.dec(11,2)` */\n private readonly builtinType = this.RULE('builtinType', () => {\n this.CONSUME(Abap);\n this.CONSUME(Dot);\n this.SUBRULE(this.cdsName);\n this.OPTION(() => {\n this.CONSUME(LParen);\n this.CONSUME(NumberLiteral);\n this.OPTION2(() => {\n this.CONSUME(Comma);\n this.CONSUME2(NumberLiteral);\n });\n this.CONSUME(RParen);\n });\n });\n\n /** Data element or other named type reference */\n private readonly namedType = this.RULE('namedType', () => {\n this.SUBRULE(this.qualifiedName);\n });\n\n // ============================================================\n // Name helpers\n // ============================================================\n\n /** An identifier that may also be a keyword used as a name. */\n private readonly cdsName = this.RULE('cdsName', () => {\n this.OR(\n CdsParser.NAME_TOKENS.map((tokenType) => ({\n ALT: () => this.CONSUME(tokenType),\n })),\n );\n });\n\n /**\n * A name usable as an *implicit* (bare) source alias.\n *\n * It is `cdsName` without the FROM-region starters — those tokens belong\n * to the next item of the FROM region and must not be read as an alias.\n */\n private readonly bareAliasName = this.RULE('bareAliasName', () => {\n this.OR(\n CdsParser.NAME_TOKENS.filter(\n (tokenType) => !CdsParser.FROM_REGION_STARTERS.has(tokenType),\n ).map((tokenType) => ({\n ALT: () => this.CONSUME(tokenType),\n })),\n );\n });\n\n /** Dot-separated qualified name: foo.bar.baz */\n private readonly qualifiedName = this.RULE('qualifiedName', () => {\n this.SUBRULE(this.cdsName);\n this.MANY(() => {\n this.CONSUME(Dot);\n this.SUBRULE2(this.cdsName);\n });\n });\n}\n\n/** Singleton parser instance (Chevrotain parsers are reusable) */\nexport const cdsParser = new CdsParser();\n","/**\n * CST → AST Visitor\n *\n * Transforms Chevrotain's Concrete Syntax Tree into our typed AST.\n */\nimport type { CstNode, IToken } from 'chevrotain';\nimport { cdsParser } from './parser';\nimport type {\n AbstractEntityDefinition,\n AccessPolicyDefinition,\n Annotation,\n AnnotationDefinition,\n AnnotationProperty,\n AnnotationValue,\n AnnotatedElement,\n AspectBinding,\n AspectBindingMapping,\n AspectDefinition,\n AspectElement,\n AssociationDeclaration,\n AssociationKind,\n AssociationRedirection,\n BuiltinTypeRef,\n Cardinality,\n CardinalityWord,\n CdsDefinition,\n CdsSourceFile,\n CustomEntityDefinition,\n DataSource,\n DataSourceKind,\n DataSourceParameter,\n DclOptionalElement,\n Expression,\n ExposeStatement,\n ExtensionDefinition,\n ExtendSetOperation,\n ExternalEntityDefinition,\n FieldDefinition,\n GrantStatement,\n HierarchyDefinition,\n HierarchyPeriod,\n IncludeDirective,\n InheritStatement,\n InheritingConditionsStatement,\n JoinClause,\n JoinGroup,\n JoinSource,\n JoinType,\n MetadataExtension,\n NamedTypeRef,\n ParameterDefinition,\n RedefinedAssociation,\n RoleDefinition,\n RoleMember,\n ScalarFunctionDefinition,\n SelectStatement,\n ServiceDefinition,\n SetOperation,\n SimpleTypeDefinition,\n SortItem,\n StructureDefinition,\n TableDefinition,\n TableFunctionDefinition,\n TableMember,\n TypeRef,\n ViewElement,\n ViewEntityDefinition,\n ViewMember,\n WordCardinality,\n} from './ast';\n\n// Generate the base visitor class from the parser's grammar\nconst BaseCstVisitor = cdsParser.getBaseCstVisitorConstructor<\n unknown,\n unknown\n>();\n\ntype Ctx = Record<string, CstNode[] | IToken[] | undefined>;\n\nfunction asNodes(v: CstNode[] | IToken[] | undefined): CstNode[] {\n return (v as CstNode[]) ?? [];\n}\n\nfunction asTokens(v: CstNode[] | IToken[] | undefined): IToken[] {\n return (v as IToken[]) ?? [];\n}\n\nfunction collectTokenImages(node: CstNode | undefined): IToken[] {\n if (!node) return [];\n const out: IToken[] = [];\n const walk = (n: CstNode) => {\n for (const children of Object.values(n.children)) {\n for (const child of children) {\n if ('tokenType' in child) {\n out.push(child as IToken);\n } else {\n walk(child as CstNode);\n }\n }\n }\n };\n walk(node);\n out.sort((a, b) => (a.startOffset ?? 0) - (b.startOffset ?? 0));\n return out;\n}\n\n/** All tokens of a rule context, in source order. */\nfunction ctxTokens(ctx: Ctx): IToken[] {\n const out: IToken[] = [];\n for (const value of Object.values(ctx)) {\n for (const child of (value ?? []) as Array<CstNode | IToken>) {\n if ('tokenType' in child) out.push(child as IToken);\n else out.push(...collectTokenImages(child as CstNode));\n }\n }\n out.sort((a, b) => (a.startOffset ?? 0) - (b.startOffset ?? 0));\n return out;\n}\n\n/**\n * Format tokens as source-like text: no space before `(` `,` `)` `]` `.`,\n * and none after `(` `[` `.` `$` `:` `@` — e.g. `coalesce(a.b, c)`,\n * `$session.client`, `:P_Param`, `@Anno.value`.\n */\nfunction formatTokens(toks: IToken[]): string {\n let out = '';\n for (let i = 0; i < toks.length; i += 1) {\n const img = toks[i].image;\n if (!out) {\n out = img;\n continue;\n }\n // Typed literals spell `abap.dats'20200101'` — no space before the quote.\n const typedLiteral =\n img.startsWith(\"'\") &&\n i >= 2 &&\n toks[i - 2].image === '.' &&\n /^[A-Za-z_]\\w*$/.test(toks[i - 1].image);\n const tight =\n typedLiteral ||\n ['(', ',', ')', ']', '.', ':'].includes(img) ||\n out.endsWith('(') ||\n out.endsWith('[') ||\n out.endsWith('.') ||\n out.endsWith('$') ||\n out.endsWith(':') ||\n out.endsWith('@');\n out += tight ? img : ` ${img}`;\n }\n return out;\n}\n\nfunction toExpression(node: CstNode | undefined): Expression {\n const toks = collectTokenImages(node);\n return {\n source: formatTokens(toks),\n tokens: toks.map((t) => t.image),\n };\n}\n\n/**\n * Raw text of a CST node — the token images concatenated without separators.\n * Used for parameter bindings, where the original spelling matters\n * (`:P_Param`, `$session.client`, `'X'`).\n */\nfunction toRawText(node: CstNode | undefined): string {\n return collectTokenImages(node)\n .map((t) => t.image)\n .join('');\n}\n\n/**\n * The pieces gathered from a `projection on …` header — folded onto the\n * view's own AST fields.\n */\ninterface ProjectionTail {\n source: DataSource;\n associations: AssociationDeclaration[];\n redefinedAssociations: RedefinedAssociation[];\n aspectBindings: AspectBinding[];\n members: ViewMember[];\n where?: Expression;\n}\n\nexport class CdsVisitor extends BaseCstVisitor {\n constructor() {\n super();\n this.validateVisitor();\n }\n\n sourceFile(ctx: Ctx): CdsSourceFile {\n const annotations: Annotation[] = asNodes(ctx.topLevelAnnotation).map(\n (node) => this.visit(node) as Annotation,\n );\n const def = this.visit(asNodes(ctx.definition)[0]) as CdsDefinition;\n\n // Attach top-level annotations to the definition\n if ('annotations' in def) {\n (def as { annotations: Annotation[] }).annotations = [\n ...annotations,\n ...(def as { annotations: Annotation[] }).annotations,\n ];\n }\n\n return { definitions: [def] };\n }\n\n definition(ctx: Ctx): CdsDefinition {\n if (ctx.defineStatement) {\n return this.visit(asNodes(ctx.defineStatement)[0]) as CdsDefinition;\n }\n if (ctx.extendStatement) {\n return this.visit(asNodes(ctx.extendStatement)[0]) as ExtensionDefinition;\n }\n return this.visit(asNodes(ctx.annotateStatement)[0]) as CdsDefinition;\n }\n\n defineStatement(ctx: Ctx): CdsDefinition {\n const dispatch: Array<undefined | CstNode> = [\n asNodes(ctx.prefixedDefinition)[0],\n asNodes(ctx.tableDefinition)[0],\n asNodes(ctx.structureDefinition)[0],\n asNodes(ctx.viewEntityDefinition)[0],\n asNodes(ctx.abstractEntityDefinition)[0],\n asNodes(ctx.customEntityDefinition)[0],\n asNodes(ctx.simpleTypeDefinition)[0],\n asNodes(ctx.serviceDefinition)[0],\n asNodes(ctx.roleDefinition)[0],\n asNodes(ctx.hierarchyDefinition)[0],\n asNodes(ctx.aspectDefinition)[0],\n asNodes(ctx.externalEntityDefinition)[0],\n asNodes(ctx.scalarFunctionDefinition)[0],\n asNodes(ctx.annotationDefinition)[0],\n asNodes(ctx.accessPolicyDefinition)[0],\n ];\n for (const node of dispatch) {\n if (node) return this.visit(node) as CdsDefinition;\n }\n // should not happen\n return { kind: 'table', name: '', annotations: [], members: [] };\n }\n\n /**\n * `define (writable|root)+ <view|external entity|table entity>` — applies\n * the leading modifiers to whichever entity form followed them.\n */\n prefixedDefinition(ctx: Ctx): CdsDefinition {\n const writable = !!asTokens(ctx.Writable).length;\n const root = !!asTokens(ctx.Root).length;\n const node =\n asNodes(ctx.viewEntityDefinition)[0] ??\n asNodes(ctx.externalEntityDefinition)[0] ??\n asNodes(ctx.rootTableEntityDefinition)[0];\n const def = this.visit(node) as CdsDefinition;\n if (root) {\n (def as { root?: boolean }).root = true;\n }\n if (writable) {\n (def as { writable?: boolean }).writable = true;\n }\n return def;\n }\n\n rootTableEntityDefinition(ctx: Ctx): TableDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const members = asNodes(ctx.tableMember).map(\n (node) => this.visit(node) as TableMember,\n );\n // `root` is applied by prefixedDefinition when a Root token is present —\n // `define writable table entity` must not inherit it.\n return {\n kind: 'table',\n name,\n annotations: [],\n entity: true,\n members,\n };\n }\n\n // ---- Tables / table entities / table functions -------------\n\n tableDefinition(ctx: Ctx): TableDefinition | TableFunctionDefinition {\n if (ctx.tableFunctionTail) {\n return this.visit(\n asNodes(ctx.tableFunctionTail)[0],\n ) as TableFunctionDefinition;\n }\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const members = asNodes(ctx.tableMember).map(\n (node) => this.visit(node) as TableMember,\n );\n const entity = !!asTokens(ctx.Entity).length;\n return {\n kind: 'table',\n name,\n annotations: [],\n ...(entity && { entity: true }),\n members,\n };\n }\n\n tableFunctionTail(ctx: Ctx): TableFunctionDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const parameters = ctx.parametersClause\n ? (this.visit(asNodes(ctx.parametersClause)[0]) as ParameterDefinition[])\n : [];\n const members = asNodes(ctx.fieldDefinition).map(\n (node) => this.visit(node) as FieldDefinition,\n );\n const implementingClass = this.visit(\n asNodes(ctx.qualifiedName)[0],\n ) as string;\n const implementingMethod = asNodes(ctx.cdsName)[1]\n ? (this.visit(asNodes(ctx.cdsName)[1]) as string)\n : undefined;\n return {\n kind: 'tableFunction',\n name,\n annotations: [],\n parameters,\n members,\n implementingClass,\n ...(implementingMethod && { implementingMethod }),\n };\n }\n\n structureDefinition(ctx: Ctx): StructureDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const members = asNodes(ctx.tableMember).map(\n (node) => this.visit(node) as TableMember,\n );\n return { kind: 'structure', name, annotations: [], members };\n }\n\n // ---- View entities ----------------------------------------\n\n viewEntityDefinition(ctx: Ctx): ViewEntityDefinition {\n // `define view <name>` (legacy classic SQL view) vs\n // `define view entity <name>` — `entity` is the modifier iff followed by\n // another name (the parser disambiguates); a missing Entity token means\n // the legacy form.\n const legacy = asTokens(ctx.Entity).length === 0;\n const names = asNodes(ctx.cdsName).map((n) => this.visit(n) as string);\n const name = names[0] ?? '';\n const providerContract = ctx.Contract ? names[1] : undefined;\n const parameters = ctx.parametersClause\n ? (this.visit(asNodes(ctx.parametersClause)[0]) as ParameterDefinition[])\n : [];\n\n const tail = this.viewTail(ctx);\n\n return {\n kind: 'viewEntity',\n name,\n annotations: [],\n sourceKind: tail.sourceKind,\n source: tail.source,\n joins: tail.joins,\n parameters,\n members: tail.members,\n ...(legacy && { legacy: true }),\n ...(tail.distinct && { distinct: true }),\n ...(providerContract && { providerContract }),\n ...(tail.fromAssociations.length > 0 && {\n fromAssociations: tail.fromAssociations,\n }),\n ...(tail.redefinedAssociations.length > 0 && {\n redefinedAssociations: tail.redefinedAssociations,\n }),\n ...(tail.aspectBindings.length > 0 && {\n aspectBindings: tail.aspectBindings,\n }),\n ...(tail.where && { where: tail.where }),\n ...(tail.groupBy && { groupBy: tail.groupBy }),\n ...(tail.having && { having: tail.having }),\n ...(tail.setOperations &&\n tail.setOperations.length > 0 && {\n setOperations: tail.setOperations,\n }),\n };\n }\n\n /** Reduce the `as select …` / `as projection …` tail to a shared shape. */\n private viewTail(ctx: Ctx): {\n sourceKind: DataSourceKind;\n distinct: boolean;\n source: DataSource;\n joins: JoinClause[];\n fromAssociations: AssociationDeclaration[];\n redefinedAssociations: RedefinedAssociation[];\n aspectBindings: AspectBinding[];\n members: ViewMember[];\n where?: Expression;\n groupBy?: string[];\n having?: Expression;\n setOperations?: SetOperation[];\n } {\n const empty = {\n sourceKind: 'select' as DataSourceKind,\n distinct: false,\n source: { name: '' },\n joins: [],\n fromAssociations: [],\n redefinedAssociations: [],\n aspectBindings: [],\n members: [],\n };\n if (ctx.selectStatement) {\n const select = this.visit(\n asNodes(ctx.selectStatement)[0],\n ) as SelectStatement;\n return {\n ...empty,\n sourceKind: 'select',\n distinct: !!select.distinct,\n source: select.source,\n joins: select.joins,\n fromAssociations: select.fromAssociations ?? [],\n aspectBindings: select.aspectBindings ?? [],\n members: select.members,\n where: select.where,\n groupBy: select.groupBy,\n having: select.having,\n setOperations: select.setOperations,\n };\n }\n if (ctx.projectionTail) {\n const proj = this.visit(asNodes(ctx.projectionTail)[0]) as ProjectionTail;\n return {\n ...empty,\n sourceKind: 'projection',\n source: proj.source,\n fromAssociations: proj.associations,\n redefinedAssociations: proj.redefinedAssociations,\n aspectBindings: proj.aspectBindings,\n members: proj.members,\n where: proj.where,\n };\n }\n return empty;\n }\n\n abstractEntityDefinition(ctx: Ctx): AbstractEntityDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const parameters = ctx.parametersClause\n ? (this.visit(asNodes(ctx.parametersClause)[0]) as ParameterDefinition[])\n : [];\n const members = this.visit(asNodes(ctx.elementList)[0]) as ViewMember[];\n return {\n kind: 'abstractEntity',\n name,\n annotations: [],\n parameters,\n members,\n };\n }\n\n customEntityDefinition(ctx: Ctx): CustomEntityDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const parameters = ctx.parametersClause\n ? (this.visit(asNodes(ctx.parametersClause)[0]) as ParameterDefinition[])\n : [];\n const members = this.visit(asNodes(ctx.elementList)[0]) as ViewMember[];\n return {\n kind: 'customEntity',\n name,\n annotations: [],\n parameters,\n members,\n };\n }\n\n externalEntityDefinition(ctx: Ctx): ExternalEntityDefinition {\n const names = asNodes(ctx.cdsName).map((n) => this.visit(n) as string);\n const name = names[0] ?? '';\n const externalName = ctx.Name ? names[1] : undefined;\n const parameters = ctx.parametersClause\n ? (this.visit(asNodes(ctx.parametersClause)[0]) as ParameterDefinition[])\n : [];\n const members = asNodes(ctx.fieldDefinition).map(\n (node) => this.visit(node) as FieldDefinition,\n );\n return {\n kind: 'externalEntity',\n name,\n annotations: [],\n parameters,\n members,\n ...(externalName && { externalName }),\n };\n }\n\n // ---- SELECT / projection tails ----------------------------\n\n selectStatement(ctx: Ctx): SelectStatement {\n const distinct = !!asTokens(ctx.Distinct).length;\n const source = this.visit(asNodes(ctx.dataSource)[0]) as DataSource;\n const joins = asNodes(ctx.joinClause).map(\n (node) => this.visit(node) as JoinClause,\n );\n const fromAssociations = asNodes(ctx.associationTail).map(\n (node) => this.visit(node) as AssociationDeclaration,\n );\n const aspectBindings = asNodes(ctx.bindAspect).map(\n (node) => this.visit(node) as AspectBinding,\n );\n const members = ctx.elementList\n ? (this.visit(asNodes(ctx.elementList)[0]) as ViewMember[])\n : [];\n const clauses = ctx.selectClauses\n ? (this.visit(asNodes(ctx.selectClauses)[0]) as {\n where?: Expression;\n groupBy?: string[];\n having?: Expression;\n setOperations?: SetOperation[];\n })\n : {};\n return {\n kind: 'selectStatement',\n ...(distinct && { distinct: true }),\n source,\n joins,\n ...(fromAssociations.length > 0 && { fromAssociations }),\n ...(aspectBindings.length > 0 && { aspectBindings }),\n members,\n ...(clauses.where && { where: clauses.where }),\n ...(clauses.groupBy && { groupBy: clauses.groupBy }),\n ...(clauses.having && { having: clauses.having }),\n ...(clauses.setOperations &&\n clauses.setOperations.length > 0 && {\n setOperations: clauses.setOperations,\n }),\n };\n }\n\n selectClauses(ctx: Ctx): {\n where?: Expression;\n groupBy?: string[];\n having?: Expression;\n setOperations?: SetOperation[];\n } {\n const conditions = asNodes(ctx.condition);\n const groupBy = asNodes(ctx.qualifiedName).map(\n (n) => this.visit(n) as string,\n );\n // `where` is the first condition, `having` the second (when present).\n const where = ctx.Where ? toExpression(conditions[0]) : undefined;\n let having: Expression | undefined;\n if (ctx.Having) {\n const havingIndex = ctx.Where ? 1 : 0;\n having = toExpression(conditions[havingIndex]);\n }\n const setOperations = asNodes(ctx.setOperation).map(\n (n) => this.visit(n) as SetOperation,\n );\n return {\n ...(where && { where }),\n ...(groupBy.length > 0 && { groupBy }),\n ...(having && { having }),\n ...(setOperations.length > 0 && { setOperations }),\n };\n }\n\n setOperation(ctx: Ctx): SetOperation {\n const statement = this.visit(\n asNodes(ctx.selectStatement)[0],\n ) as SelectStatement;\n return {\n kind: 'setOperation',\n operator: this.setOperator(ctx),\n statement,\n };\n }\n\n /** Shared `union [all]|intersect|except` operator mapping. */\n private setOperator(ctx: Ctx): SetOperation['operator'] {\n if (ctx.Intersect) return 'intersect';\n if (ctx.Except) return 'except';\n return asTokens(ctx.All).length ? 'unionAll' : 'union';\n }\n\n /** Visit `ctx[key][0]` when the optional subrule fired, else `undefined`. */\n private optional<T>(ctx: Ctx, key: string): T | undefined {\n const nodes = asNodes(ctx[key]);\n return nodes.length ? (this.visit(nodes[0]) as T) : undefined;\n }\n\n projectionTail(ctx: Ctx): ProjectionTail {\n const source = this.visit(asNodes(ctx.dataSource)[0]) as DataSource;\n const associations = asNodes(ctx.associationTail).map(\n (node) => this.visit(node) as AssociationDeclaration,\n );\n const redefinedAssociations = asNodes(ctx.redefinedAssociation).map(\n (node) => this.visit(node) as RedefinedAssociation,\n );\n const aspectBindings = asNodes(ctx.bindAspect).map(\n (node) => this.visit(node) as AspectBinding,\n );\n const members = ctx.elementList\n ? (this.visit(asNodes(ctx.elementList)[0]) as ViewMember[])\n : [];\n const where = ctx.condition\n ? toExpression(asNodes(ctx.condition)[0])\n : undefined;\n return {\n source,\n associations,\n redefinedAssociations,\n aspectBindings,\n members,\n ...(where && { where }),\n };\n }\n\n dataSource(ctx: Ctx): DataSource {\n const name = this.visit(asNodes(ctx.dataSourcePath)[0]) as string;\n const aliasNode = asNodes(ctx.cdsName)[0] ?? asNodes(ctx.bareAliasName)[0];\n const alias = aliasNode ? (this.visit(aliasNode) as string) : undefined;\n const parameters = ctx.dataSourceParameters\n ? (this.visit(\n asNodes(ctx.dataSourceParameters)[0],\n ) as DataSourceParameter[])\n : undefined;\n return {\n name,\n ...(alias && { alias }),\n ...(parameters && { parameters }),\n };\n }\n\n /** `<seg>[<attr>].<seg>…` — data-source path with raw bracket text kept. */\n dataSourcePath(ctx: Ctx): string {\n return asNodes(ctx.pathSegment)\n .map((segment) => {\n const segCtx = segment.children as Ctx;\n const seg = this.visit(asNodes(segCtx.cdsName)[0]) as string;\n const brackets = asNodes(segCtx.bracketTokens)\n .map((b) => toRawText(b))\n .join('');\n return seg + brackets;\n })\n .join('.');\n }\n\n dataSourceParameters(ctx: Ctx): DataSourceParameter[] {\n return asNodes(ctx.dataSourceParameter).map(\n (node) => this.visit(node) as DataSourceParameter,\n );\n }\n\n dataSourceParameter(ctx: Ctx): DataSourceParameter {\n const name = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const value = toRawText(asNodes(ctx.parameterBinding)[0]);\n return { name, value };\n }\n\n parameterBinding(): unknown {\n // The raw binding text is read directly from the CST node.\n return null;\n }\n\n // ---- Joins -------------------------------------------------\n\n joinClause(ctx: Ctx): JoinClause {\n if (ctx.Cross) {\n // A cross join never carries an ON condition.\n const source = this.visit(asNodes(ctx.joinOperand)[0]) as JoinSource;\n return { kind: 'join', joinType: 'cross', source };\n }\n const prefix = this.visit(asNodes(ctx.joinPrefix)[0]) as {\n joinType: JoinType;\n cardinality?: WordCardinality;\n };\n const source = this.visit(asNodes(ctx.joinOperand)[0]) as JoinSource;\n const on = toExpression(asNodes(ctx.condition)[0]);\n return {\n kind: 'join',\n joinType: prefix.joinType,\n source,\n on,\n ...(prefix.cardinality && { cardinality: prefix.cardinality }),\n } as JoinClause;\n }\n\n joinPrefix(ctx: Ctx): {\n joinType: JoinType;\n cardinality?: WordCardinality;\n } {\n let joinType: JoinType = 'inner';\n if (asTokens(ctx.Full).length) joinType = 'fullOuter';\n else if (asTokens(ctx.Left).length) joinType = 'leftOuter';\n else if (asTokens(ctx.Right).length) joinType = 'rightOuter';\n const cardinality = ctx.joinCardinality\n ? (this.visit(asNodes(ctx.joinCardinality)[0]) as WordCardinality)\n : undefined;\n return { joinType, ...(cardinality && { cardinality }) };\n }\n\n joinCardinality(ctx: Ctx): WordCardinality {\n const words = asNodes(ctx.cardinalWord).map(\n (n) => this.visit(n) as CardinalityWord,\n );\n // `[src] to tgt` — two words means a source bound was given.\n if (words.length === 2) {\n return { source: words[0], target: words[1] };\n }\n return { target: words[0] };\n }\n\n cardinalWord(ctx: Ctx): CardinalityWord {\n if (asTokens(ctx.Exact).length) return 'exactOne';\n if (asTokens(ctx.Many).length) return 'many';\n return 'one';\n }\n\n joinOperand(ctx: Ctx): JoinSource {\n if (ctx.joinGroup) {\n return this.visit(asNodes(ctx.joinGroup)[0]) as JoinGroup;\n }\n return this.visit(asNodes(ctx.dataSource)[0]) as DataSource;\n }\n\n joinGroup(ctx: Ctx): JoinGroup {\n const source = this.visit(asNodes(ctx.joinOperand)[0]) as JoinSource;\n const joins = asNodes(ctx.joinClause).map(\n (node) => this.visit(node) as JoinClause,\n );\n return { kind: 'joinGroup', source, joins };\n }\n\n // ---- Elements ----------------------------------------------\n\n elementList(ctx: Ctx): ViewMember[] {\n return asNodes(ctx.elementMember).map(\n (node) => this.visit(node) as ViewMember,\n );\n }\n\n elementMember(ctx: Ctx): ViewMember {\n const annotations = asNodes(ctx.annotation).map(\n (n) => this.visit(n) as Annotation,\n );\n if (ctx.associationTail) {\n const decl = this.visit(\n asNodes(ctx.associationTail)[0],\n ) as AssociationDeclaration;\n decl.annotations = annotations;\n return decl;\n }\n const el = this.visit(asNodes(ctx.viewElementTail)[0]) as ViewElement;\n el.annotations = annotations;\n return el;\n }\n\n viewElementTail(ctx: Ctx): ViewElement {\n const isKey = !!asTokens(ctx.Key).length;\n const isVirtual = !!asTokens(ctx.Virtual).length;\n const isRedirected = !!asTokens(ctx.Redirected).length;\n\n if (ctx.typedFieldTail) {\n const tail = this.visit(asNodes(ctx.typedFieldTail)[0]) as {\n name: string;\n type: TypeRef;\n notNull: boolean;\n };\n return {\n annotations: [],\n isKey,\n isVirtual,\n isRedirected,\n expression: tail.name,\n type: tail.type,\n notNull: tail.notNull,\n };\n }\n const proj = this.visit(asNodes(ctx.elementExpression)[0]) as {\n expression: string;\n alias?: string;\n localized?: boolean;\n redirectedTo?: AssociationRedirection;\n };\n return {\n annotations: [],\n isKey,\n isVirtual,\n isRedirected,\n expression: proj.expression,\n ...(proj.alias && { alias: proj.alias }),\n ...(proj.localized && { localized: true }),\n ...(proj.redirectedTo && { redirectedTo: proj.redirectedTo }),\n };\n }\n\n typedFieldTail(ctx: Ctx): {\n name: string;\n type: TypeRef;\n notNull: boolean;\n } {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const type = this.visit(asNodes(ctx.typeReference)[0]) as TypeRef;\n const notNull = !!asTokens(ctx.Not).length;\n return { name, type, notNull };\n }\n\n elementExpression(ctx: Ctx): {\n expression: string;\n alias?: string;\n localized?: boolean;\n redirectedTo?: AssociationRedirection;\n } {\n // The expression text is everything of the operand — formatted from its\n // own tokens so aliases/suffixes are excluded.\n const expression = formatTokens(\n collectTokenImages(asNodes(ctx.operand)[0]),\n );\n const aliasNode = asNodes(ctx.cdsName)[0];\n const alias = aliasNode ? (this.visit(aliasNode) as string) : undefined;\n const localized = !!asTokens(ctx.Localized).length;\n const redirectedTo = ctx.redirection\n ? (this.visit(asNodes(ctx.redirection)[0]) as AssociationRedirection)\n : undefined;\n return {\n expression,\n ...(alias && { alias }),\n ...(localized && { localized: true }),\n ...(redirectedTo && { redirectedTo }),\n };\n }\n\n redirection(ctx: Ctx): AssociationRedirection {\n let mode: AssociationRedirection['mode'] = 'default';\n if (ctx.Composition) mode = 'compositionChild';\n else if (ctx.Parent) mode = 'parent';\n const target = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n return { mode, target };\n }\n\n redefinedAssociation(ctx: Ctx): RedefinedAssociation {\n const associationKind: AssociationKind = asTokens(ctx.Association).length\n ? 'association'\n : 'composition';\n const name = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const aliasNode = asNodes(ctx.cdsName)[0];\n const alias = aliasNode ? (this.visit(aliasNode) as string) : undefined;\n const filter = ctx.bracketTokens\n ? toExpression(asNodes(ctx.bracketTokens)[0])\n : undefined;\n const redirectedTo = ctx.redirection\n ? (this.visit(asNodes(ctx.redirection)[0]) as AssociationRedirection)\n : undefined;\n return {\n kind: 'redefinedAssociation',\n associationKind,\n name,\n ...(filter && { filter }),\n ...(alias && { alias }),\n ...(redirectedTo && { redirectedTo }),\n };\n }\n\n bindAspect(ctx: Ctx): AspectBinding {\n const aspect = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const mappings = asNodes(ctx.bindMapping).map(\n (n) => this.visit(n) as AspectBindingMapping,\n );\n const aliasNode = asNodes(ctx.cdsName)[0];\n const alias = aliasNode ? (this.visit(aliasNode) as string) : undefined;\n return {\n kind: 'aspectBinding',\n aspect,\n mappings,\n ...(alias && { alias }),\n };\n }\n\n bindMapping(ctx: Ctx): AspectBindingMapping {\n const element = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const target = formatTokens(collectTokenImages(asNodes(ctx.operand)[0]));\n return { element, target };\n }\n\n // ---- Associations -------------------------------------------\n\n associationTail(ctx: Ctx): AssociationDeclaration {\n const associationKind: AssociationKind = asTokens(ctx.Association).length\n ? 'association'\n : 'composition';\n\n const cardinality = this.optional<Cardinality>(ctx, 'cardinality');\n const { wordCardinality, targetMultiplicity } = this.associationWords(ctx);\n const { on, withDefaultFilter } = this.associationConditions(ctx);\n\n const toParent = !!asTokens(ctx.Parent).length;\n const redirected = !!asTokens(ctx.Redirected).length;\n\n const target = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const aliasNode = asNodes(ctx.cdsName)[0];\n const alias = aliasNode ? (this.visit(aliasNode) as string) : undefined;\n\n return {\n kind: 'association',\n associationKind,\n annotations: [], // populated by elementMember()\n ...(cardinality && { cardinality }),\n ...(wordCardinality && { wordCardinality }),\n ...(targetMultiplicity && { targetMultiplicity }),\n ...(toParent && { toParent: true }),\n target,\n ...(redirected && { redirected: true }),\n ...(alias && { alias }),\n ...(on && { on }),\n ...(withDefaultFilter && { withDefaultFilter }),\n };\n }\n\n /**\n * Word-form cardinality — at most one `cardinalWord` per branch:\n * `of <w> X`, `of <w> to X`, `to <w> X` all give a single target word.\n */\n private associationWords(ctx: Ctx): {\n wordCardinality?: WordCardinality;\n targetMultiplicity?: 'many' | 'one';\n } {\n const words = asNodes(ctx.cardinalWord).map(\n (n) => this.visit(n) as CardinalityWord,\n );\n if (words.length !== 1) return {};\n const word = words[0];\n return {\n wordCardinality: { target: word },\n ...((word === 'many' || word === 'one') && {\n targetMultiplicity: word,\n }),\n };\n }\n\n /**\n * `on` and `with default filter` are both optional and share\n * `ctx.condition` — select by their keyword token, not by index.\n */\n private associationConditions(ctx: Ctx): {\n on?: Expression;\n withDefaultFilter?: Expression;\n } {\n const conditions = asNodes(ctx.condition);\n const hasOn = asTokens(ctx.On).length > 0;\n const on = hasOn ? toExpression(conditions[0]) : undefined;\n let withDefaultFilter: Expression | undefined;\n if (asTokens(ctx.Filter).length > 0) {\n withDefaultFilter = toExpression(conditions[hasOn ? 1 : 0]);\n }\n return { on, withDefaultFilter };\n }\n\n cardinality(ctx: Ctx): Cardinality {\n const nums = asTokens(ctx.NumberLiteral);\n const stars = asTokens(ctx.Star);\n if (nums.length === 0 && stars.length >= 1) {\n // `[*]`\n return { max: '*' };\n }\n if (nums.length === 1) {\n const dotCount = asTokens(ctx.Dot).length;\n if (dotCount === 0) {\n return { max: Number.parseInt(nums[0].image, 10) };\n }\n // `[N..*]` or `[N..M]` (M handled below)\n if (stars.length >= 1) {\n return { min: Number.parseInt(nums[0].image, 10), max: '*' };\n }\n return { min: Number.parseInt(nums[0].image, 10), max: '*' };\n }\n if (nums.length === 2) {\n return {\n min: Number.parseInt(nums[0].image, 10),\n max: Number.parseInt(nums[1].image, 10),\n };\n }\n return { max: '*' };\n }\n\n // ---- Parameters ---------------------------------------------\n\n parametersClause(ctx: Ctx): ParameterDefinition[] {\n return asNodes(ctx.parameterDefinition).map(\n (n) => this.visit(n) as ParameterDefinition,\n );\n }\n\n parameterDefinition(ctx: Ctx): ParameterDefinition {\n const annotations = asNodes(ctx.annotation).map(\n (n) => this.visit(n) as Annotation,\n );\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const type = this.visit(asNodes(ctx.typeReference)[0]) as TypeRef;\n const defaultValue = ctx.literal\n ? (this.visit(asNodes(ctx.literal)[0]) as AnnotationValue)\n : undefined;\n return {\n annotations,\n name,\n type,\n ...(defaultValue && { defaultValue }),\n };\n }\n\n // ---- Tables / structures ------------------------------------\n\n tableMember(ctx: Ctx): TableMember {\n if (ctx.includeDirective) {\n return this.visit(asNodes(ctx.includeDirective)[0]) as IncludeDirective;\n }\n return this.visit(asNodes(ctx.fieldDefinition)[0]) as FieldDefinition;\n }\n\n includeDirective(ctx: Ctx): IncludeDirective {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const suffix = asNodes(ctx.cdsName)[1]\n ? (this.visit(asNodes(ctx.cdsName)[1]) as string)\n : undefined;\n return { kind: 'include', name, ...(suffix !== undefined && { suffix }) };\n }\n\n fieldDefinition(ctx: Ctx): FieldDefinition {\n const annotations: Annotation[] = asNodes(ctx.annotation).map(\n (node) => this.visit(node) as Annotation,\n );\n const isKey = !!asTokens(ctx.Key).length;\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const type = this.visit(asNodes(ctx.typeReference)[0]) as TypeRef;\n const notNull = !!asTokens(ctx.Not).length;\n return { annotations, name, type, isKey, notNull };\n }\n\n simpleTypeDefinition(ctx: Ctx): SimpleTypeDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const type = this.visit(asNodes(ctx.typeReference)[0]) as TypeRef;\n return { kind: 'simpleType', name, annotations: [], type };\n }\n\n serviceDefinition(ctx: Ctx): ServiceDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const exposes = asNodes(ctx.exposeStatement).map(\n (node) => this.visit(node) as ExposeStatement,\n );\n return { kind: 'service', name, annotations: [], exposes };\n }\n\n exposeStatement(ctx: Ctx): ExposeStatement {\n const names = asNodes(ctx.cdsName).map((n) => this.visit(n) as string);\n const entity = names[0];\n const alias = names.length > 1 ? names[1] : undefined;\n return { entity, ...(alias && { alias }) };\n }\n\n scalarFunctionDefinition(ctx: Ctx): ScalarFunctionDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const parameters = ctx.parametersClause\n ? (this.visit(asNodes(ctx.parametersClause)[0]) as ParameterDefinition[])\n : [];\n const returnType = this.visit(asNodes(ctx.typeReference)[0]) as TypeRef;\n return {\n kind: 'scalarFunction',\n name,\n annotations: [],\n parameters,\n returnType,\n };\n }\n\n // ---- Hierarchy ----------------------------------------------\n\n hierarchyDefinition(ctx: Ctx): HierarchyDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const parameters = ctx.parametersClause\n ? (this.visit(asNodes(ctx.parametersClause)[0]) as ParameterDefinition[])\n : [];\n const source = (this.visit(asNodes(ctx.qualifiedName)[0]) as string) ?? '';\n const childToParentAssociation = asNodes(ctx.cdsName)[1]\n ? (this.visit(asNodes(ctx.cdsName)[1]) as string)\n : undefined;\n\n const period = this.optional<HierarchyPeriod>(ctx, 'hierarchyPeriod');\n const directory = this.optional<{ entity: string; filter: Expression }>(\n ctx,\n 'hierarchyDirectory',\n );\n const startWhere = this.optional<Expression>(ctx, 'hierarchyStart');\n\n const siblingsOrderBy = asNodes(ctx.sortItem).map(\n (n) => this.visit(n) as SortItem,\n );\n\n const depth = this.optional<string>(ctx, 'hierarchyDepth');\n const nodetype = this.optional<string>(ctx, 'hierarchyNodetype');\n const load = this.optional<string>(ctx, 'hierarchyLoad');\n const multipleParents = this.optional<\n HierarchyDefinition['multipleParents']\n >(ctx, 'hierarchyMultiple');\n const orphans = this.optional<HierarchyDefinition['orphans']>(\n ctx,\n 'hierarchyOrphans',\n );\n const cycles = this.optional<HierarchyDefinition['cycles']>(\n ctx,\n 'hierarchyCycles',\n );\n const cache = this.optional<HierarchyDefinition['cache']>(\n ctx,\n 'hierarchyCache',\n );\n\n const members = ctx.elementList\n ? (this.visit(asNodes(ctx.elementList)[0]) as ViewMember[])\n : [];\n\n return {\n kind: 'hierarchy',\n name,\n annotations: [],\n parameters,\n source,\n siblingsOrderBy,\n members,\n ...(childToParentAssociation && { childToParentAssociation }),\n ...this.hierarchyOptionals(ctx, {\n period,\n directory,\n startWhere,\n depth,\n nodetype,\n load,\n multipleParents,\n orphans,\n cycles,\n cache,\n }),\n };\n }\n\n /** The clause-dependent optional fields of a hierarchy definition. */\n private hierarchyOptionals(\n ctx: Ctx,\n c: Partial<HierarchyDefinition>,\n ): Partial<HierarchyDefinition> {\n return {\n ...(c.period && { period: c.period }),\n ...(c.directory && { directory: c.directory }),\n ...(c.startWhere && { startWhere: c.startWhere }),\n ...(c.depth !== undefined && { depth: c.depth }),\n ...(c.nodetype && { nodetype: c.nodetype }),\n ...(c.load && { load: c.load }),\n ...(c.multipleParents && { multipleParents: c.multipleParents }),\n ...(c.orphans && { orphans: c.orphans }),\n ...(c.cycles && { cycles: c.cycles }),\n ...(ctx.hierarchyGenerate && { generateSpantree: true }),\n ...(c.cache && { cache: c.cache }),\n };\n }\n\n hierarchyPeriod(ctx: Ctx): HierarchyPeriod {\n const names = asNodes(ctx.qualifiedName).map(\n (n) => this.visit(n) as string,\n );\n const period: HierarchyPeriod = {\n from: names[0] ?? '',\n to: names[1] ?? '',\n };\n if (ctx.Valid) {\n period.validFrom = names[2] ?? '';\n period.validTo = names[3] ?? '';\n }\n return period;\n }\n\n hierarchyDirectory(ctx: Ctx): { entity: string; filter: Expression } {\n const entity = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const filter = toExpression(asNodes(ctx.condition)[0]);\n return { entity, filter };\n }\n\n hierarchyStart(ctx: Ctx): Expression {\n return toExpression(asNodes(ctx.condition)[0]);\n }\n\n hierarchyDepth(ctx: Ctx): string {\n const num = asTokens(ctx.NumberLiteral)[0];\n if (num) return num.image;\n return this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n }\n\n hierarchyNodetype(ctx: Ctx): string {\n return this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n }\n\n hierarchyLoad(ctx: Ctx): string {\n if (asTokens(ctx.Bulk).length) return 'bulk';\n if (asTokens(ctx.Incremental).length) return 'incremental';\n if (ctx.systemVariable) {\n return formatTokens(collectTokenImages(asNodes(ctx.systemVariable)[0]));\n }\n return this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n }\n\n hierarchyMultiple(ctx: Ctx): HierarchyDefinition['multipleParents'] {\n if (asTokens(ctx.Not).length) return 'notAllowed';\n if (asTokens(ctx.Leaves).length) return 'leavesOnly';\n return 'allowed';\n }\n\n hierarchyOrphans(ctx: Ctx): HierarchyDefinition['orphans'] {\n if (asTokens(ctx.Ignore).length) return 'ignore';\n if (asTokens(ctx.Error).length) return 'error';\n return 'root';\n }\n\n hierarchyCycles(ctx: Ctx): HierarchyDefinition['cycles'] {\n return asTokens(ctx.Breakup).length ? 'breakup' : 'error';\n }\n\n hierarchyGenerate(): unknown {\n return null;\n }\n\n hierarchyCache(ctx: Ctx): HierarchyDefinition['cache'] {\n if (asTokens(ctx.Off).length) return 'off';\n if (asTokens(ctx.Force).length) return 'force';\n return 'on';\n }\n\n sortItem(ctx: Ctx): SortItem {\n const name = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n let direction: SortItem['direction'];\n if (asTokens(ctx.Descending).length) direction = 'descending';\n else if (asTokens(ctx.Ascending).length) direction = 'ascending';\n return { name, ...(direction && { direction }) };\n }\n\n // ---- Aspect -------------------------------------------------\n\n aspectDefinition(ctx: Ctx): AspectDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const members = asNodes(ctx.aspectElement).map(\n (n) => this.visit(n) as AspectElement,\n );\n return { kind: 'aspect', name, annotations: [], members };\n }\n\n aspectElement(ctx: Ctx): AspectElement {\n const annotations = asNodes(ctx.annotation).map(\n (n) => this.visit(n) as Annotation,\n );\n const isKey = !!asTokens(ctx.Key).length;\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n if (ctx.typeReference) {\n const type = this.visit(asNodes(ctx.typeReference)[0]) as TypeRef;\n return { annotations, name, isKey, type };\n }\n const expression = formatTokens(\n collectTokenImages(asNodes(ctx.operand)[0]),\n );\n return { annotations, name, isKey, expression };\n }\n\n // ---- DDLA / access policy (opaque blocks) -------------------\n\n annotationDefinition(ctx: Ctx): AnnotationDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const bodyNode = asNodes(ctx.tokenBlock)[0] ?? asNodes(ctx.simpleTail)[0];\n const body = formatTokens(collectTokenImages(bodyNode));\n return { kind: 'annotationDefinition', name, annotations: [], body };\n }\n\n accessPolicyDefinition(ctx: Ctx): AccessPolicyDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const body = formatTokens(collectTokenImages(asNodes(ctx.tokenBlock)[0]));\n return { kind: 'accessPolicy', name, annotations: [], body };\n }\n\n tokenBlock(): unknown {\n // Body is captured via collectTokenImages at the definition level.\n return null;\n }\n\n tokenGroup(): unknown {\n return null;\n }\n\n simpleTail(): unknown {\n return null;\n }\n\n // ---- DCL / roles ---------------------------------------------\n\n roleDefinition(ctx: Ctx): RoleDefinition {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const switchable = !!asTokens(ctx.Switchable).length;\n const members = asNodes(ctx.roleMember).map(\n (n) => this.visit(n) as RoleMember,\n );\n const grants = members.filter((m): m is GrantStatement => 'privilege' in m);\n return {\n kind: 'role',\n name,\n annotations: [],\n ...(switchable && { switchable: true }),\n grants,\n members,\n };\n }\n\n roleMember(ctx: Ctx): RoleMember {\n if (ctx.inheritStatement) {\n return this.visit(asNodes(ctx.inheritStatement)[0]) as InheritStatement;\n }\n if (ctx.inheritingStatement) {\n return this.visit(\n asNodes(ctx.inheritingStatement)[0],\n ) as InheritingConditionsStatement;\n }\n return this.visit(asNodes(ctx.grantStatement)[0]) as GrantStatement;\n }\n\n grantStatement(ctx: Ctx): GrantStatement {\n const entity = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const result: GrantStatement = { privilege: 'select', entity };\n for (const clauseNode of asNodes(ctx.grantClause)) {\n const clause = this.visit(clauseNode) as {\n optionalElements?: DclOptionalElement[];\n combinationMode?: 'or' | 'and' | 'redefinition';\n inheritRole?: string;\n inheritConditionConnector?: 'and' | 'or';\n inheritCondition?: Expression;\n where?: Expression;\n };\n if (clause.optionalElements) {\n result.optionalElements = clause.optionalElements;\n }\n if (clause.combinationMode) {\n result.combinationMode = clause.combinationMode;\n }\n if (clause.inheritRole) {\n result.inheritRole = clause.inheritRole;\n }\n if (clause.inheritConditionConnector) {\n result.inheritConditionConnector = clause.inheritConditionConnector;\n result.inheritCondition = clause.inheritCondition;\n }\n if (clause.where) {\n result.where = clause.where;\n }\n }\n return result;\n }\n\n grantClause(ctx: Ctx): Record<string, unknown> {\n for (const key of Object.keys(ctx)) {\n const node = asNodes(ctx[key])[0];\n if (node) return this.visit(node) as Record<string, unknown>;\n }\n return {};\n }\n\n grantOptionalElements(ctx: Ctx): { optionalElements: DclOptionalElement[] } {\n return {\n optionalElements: asNodes(ctx.optionalElement).map(\n (n) => this.visit(n) as DclOptionalElement,\n ),\n };\n }\n\n grantCombination(ctx: Ctx): {\n combinationMode: 'or' | 'and' | 'redefinition';\n } {\n let combinationMode: 'or' | 'and' | 'redefinition' = 'and';\n if (ctx.Redefinition) combinationMode = 'redefinition';\n else if (ctx.Or) combinationMode = 'or';\n return { combinationMode };\n }\n\n grantInherit(ctx: Ctx): {\n inheritRole: string;\n inheritConditionConnector?: 'and' | 'or';\n inheritCondition?: Expression;\n } {\n const inheritRole = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n let inheritConditionConnector: 'and' | 'or' | undefined;\n if (ctx.dclCondition) {\n inheritConditionConnector = asTokens(ctx.And).length ? 'and' : 'or';\n }\n return {\n inheritRole,\n ...(inheritConditionConnector && { inheritConditionConnector }),\n ...(ctx.dclCondition && {\n inheritCondition: toExpression(asNodes(ctx.dclCondition)[0]),\n }),\n };\n }\n\n grantWhere(ctx: Ctx): { where: Expression } {\n return { where: toExpression(asNodes(ctx.dclCondition)[0]) };\n }\n\n optionalElement(ctx: Ctx): DclOptionalElement {\n const name = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n const def = ctx.Default ? asTokens(ctx.True).length > 0 : undefined;\n return { name, ...(def !== undefined && { default: def }) };\n }\n\n inheritStatement(ctx: Ctx): InheritStatement {\n const names = asNodes(ctx.qualifiedName).map(\n (n) => this.visit(n) as string,\n );\n const where = ctx.dclCondition\n ? toExpression(asNodes(ctx.dclCondition)[0])\n : undefined;\n return {\n role: names[0] ?? '',\n ...(names.length > 1 && { entity: names[1] }),\n ...(where && { where }),\n };\n }\n\n inheritingStatement(ctx: Ctx): InheritingConditionsStatement {\n const sourceKind = ctx.Entity ? 'entity' : 'super';\n const entity = ctx.Entity\n ? (this.visit(asNodes(ctx.qualifiedName)[0]) as string)\n : undefined;\n const def = ctx.Default ? asTokens(ctx.True).length > 0 : undefined;\n const condition = ctx.dclCondition\n ? toExpression(asNodes(ctx.dclCondition)[0])\n : undefined;\n return {\n sourceKind,\n ...(entity && { entity }),\n ...(def !== undefined && { default: def }),\n ...(condition && { condition }),\n };\n }\n\n dclCondition(): unknown {\n // Captured via toExpression() on the raw CstNode.\n return null;\n }\n\n // ---- Extensions ----------------------------------------------\n\n extendStatement(ctx: Ctx): ExtensionDefinition {\n const names = asNodes(ctx.qualifiedName).map(\n (n) => this.visit(n) as string,\n );\n let targetKind: ExtensionDefinition['targetKind'] = 'custom';\n if (ctx.View) targetKind = 'view';\n else if (ctx.Abstract) targetKind = 'abstract';\n const isViewEntity = !!asTokens(ctx.Entity).length;\n const name = names[0] ?? '';\n const associations = asNodes(ctx.associationTail).map(\n (node) => this.visit(node) as AssociationDeclaration,\n );\n const members = ctx.elementList\n ? (this.visit(asNodes(ctx.elementList)[0]) as ViewMember[])\n : [];\n const groupBy = ctx.Group ? names.slice(1) : undefined;\n const setOperations = asNodes(ctx.extendSetOperation).map(\n (n) => this.visit(n) as ExtendSetOperation,\n );\n return {\n kind: 'extension',\n name,\n annotations: [],\n targetKind,\n ...(isViewEntity && { isViewEntity: true }),\n associations,\n members,\n ...(groupBy && groupBy.length > 0 && { groupBy }),\n ...(setOperations.length > 0 && { setOperations }),\n };\n }\n\n extendSetOperation(ctx: Ctx): ExtendSetOperation {\n const members = ctx.elementList\n ? (this.visit(asNodes(ctx.elementList)[0]) as ViewMember[])\n : [];\n return {\n kind: 'extendSetOperation',\n operator: this.setOperator(ctx),\n members,\n };\n }\n\n // ---- Metadata extensions --------------------------------------\n\n annotateStatement(ctx: Ctx): MetadataExtension {\n const targetKind = ctx.View ? 'view' : 'entity';\n const entity = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const elements = asNodes(ctx.annotatedElement).map(\n (node) => this.visit(node) as AnnotatedElement,\n );\n return {\n kind: 'metadataExtension',\n targetKind,\n entity,\n annotations: [],\n elements,\n };\n }\n\n annotatedElement(ctx: Ctx): AnnotatedElement {\n const annotations = asNodes(ctx.annotation).map(\n (node) => this.visit(node) as Annotation,\n );\n const name = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n return { annotations, name };\n }\n\n // ---- Annotations ----------------------------------------------\n\n topLevelAnnotation(ctx: Ctx): Annotation {\n return this.visit(asNodes(ctx.annotation)[0]) as Annotation;\n }\n\n annotation(ctx: Ctx): Annotation {\n const key = this.visit(asNodes(ctx.dottedName)[0]) as string;\n const value: AnnotationValue = ctx.annotationValue\n ? (this.visit(asNodes(ctx.annotationValue)[0]) as AnnotationValue)\n : { kind: 'boolean', value: true };\n return { key, value };\n }\n\n dottedName(ctx: Ctx): string {\n return asNodes(ctx.cdsName)\n .map((node) => this.visit(node) as string)\n .join('.');\n }\n\n annotationValue(ctx: Ctx): AnnotationValue {\n if (ctx.StringLiteral) {\n const raw = asTokens(ctx.StringLiteral)[0].image;\n return { kind: 'string', value: raw.slice(1, -1) };\n }\n if (ctx.EnumLiteral) {\n const raw = asTokens(ctx.EnumLiteral)[0].image;\n return { kind: 'enum', value: raw.slice(1) };\n }\n if (ctx.True) return { kind: 'boolean', value: true };\n if (ctx.False) return { kind: 'boolean', value: false };\n if (ctx.NumberLiteral) {\n return {\n kind: 'number',\n value: Number.parseFloat(asTokens(ctx.NumberLiteral)[0].image),\n };\n }\n if (ctx.annotationArray) {\n return this.visit(asNodes(ctx.annotationArray)[0]) as AnnotationValue;\n }\n return this.visit(asNodes(ctx.annotationObject)[0]) as AnnotationValue;\n }\n\n annotationArray(ctx: Ctx): AnnotationValue {\n const items = asNodes(ctx.annotationValue).map(\n (node) => this.visit(node) as AnnotationValue,\n );\n return { kind: 'array', items };\n }\n\n annotationObject(ctx: Ctx): AnnotationValue {\n const properties = asNodes(ctx.annotationProperty).map(\n (node) => this.visit(node) as AnnotationProperty,\n );\n return { kind: 'object', properties };\n }\n\n annotationProperty(ctx: Ctx): AnnotationProperty {\n const key = this.visit(asNodes(ctx.dottedName)[0]) as string;\n const value = this.visit(\n asNodes(ctx.annotationValue)[0],\n ) as AnnotationValue;\n return { key, value };\n }\n\n // ---- Literals ------------------------------------------------\n\n literal(ctx: Ctx): AnnotationValue {\n const negative = !!asTokens(ctx.Minus).length;\n if (ctx.StringLiteral) {\n const raw = asTokens(ctx.StringLiteral)[0].image;\n // A typed literal (`abap.dats'…'`) keeps its raw text.\n if (ctx.Abap) {\n return { kind: 'string', value: formatTokens(ctxTokens(ctx)) };\n }\n return { kind: 'string', value: raw.slice(1, -1) };\n }\n if (ctx.EnumLiteral) {\n const raw = asTokens(ctx.EnumLiteral)[0].image;\n return { kind: 'enum', value: raw.slice(1) };\n }\n if (ctx.True) return { kind: 'boolean', value: true };\n if (ctx.False) return { kind: 'boolean', value: false };\n if (ctx.Null) return { kind: 'string', value: 'null' };\n const num = Number.parseFloat(asTokens(ctx.NumberLiteral)[0].image);\n return { kind: 'number', value: negative ? -num : num };\n }\n\n // ---- Expressions (opaque) -------------------------------------\n\n condition(): unknown {\n // Captured via toExpression() on the raw CstNode.\n return null;\n }\n\n conditionOperand(): unknown {\n return null;\n }\n\n predicate(): unknown {\n return null;\n }\n\n expression(): unknown {\n return null;\n }\n\n comparison(): unknown {\n return null;\n }\n\n operand(): unknown {\n return null;\n }\n\n primary(): unknown {\n return null;\n }\n\n pathOperand(): unknown {\n return null;\n }\n\n pathSegment(): unknown {\n return null;\n }\n\n bracketTokens(): unknown {\n return null;\n }\n\n callArgument(): unknown {\n return null;\n }\n\n overClause(): unknown {\n return null;\n }\n\n parenthesizedExpression(): unknown {\n return null;\n }\n\n castExpression(): unknown {\n return null;\n }\n\n caseExpression(): unknown {\n return null;\n }\n\n systemVariable(): unknown {\n return null;\n }\n\n parameterRef(): unknown {\n return null;\n }\n\n // ---- Type references -------------------------------------------\n\n typeReference(ctx: Ctx): TypeRef {\n if (ctx.builtinType) {\n return this.visit(asNodes(ctx.builtinType)[0]) as BuiltinTypeRef;\n }\n return this.visit(asNodes(ctx.namedType)[0]) as NamedTypeRef;\n }\n\n builtinType(ctx: Ctx): BuiltinTypeRef {\n const name = this.visit(asNodes(ctx.cdsName)[0]) as string;\n const numberTokens = asTokens(ctx.NumberLiteral);\n const length = numberTokens[0]\n ? Number.parseInt(numberTokens[0].image, 10)\n : undefined;\n const decimals = numberTokens[1]\n ? Number.parseInt(numberTokens[1].image, 10)\n : undefined;\n return { kind: 'builtin', name, length, decimals };\n }\n\n namedType(ctx: Ctx): NamedTypeRef {\n const name = this.visit(asNodes(ctx.qualifiedName)[0]) as string;\n return { kind: 'named', name };\n }\n\n cdsName(ctx: Ctx): string {\n const t = ctx as Record<string, IToken[] | undefined>;\n // cdsName accepts many keyword tokens as names — return the image of\n // whichever token matched (only one key in `ctx` will be populated).\n for (const key of Object.keys(t)) {\n const tok = t[key]?.[0];\n if (tok && 'image' in tok) return tok.image;\n }\n return '';\n }\n\n bareAliasName(ctx: Ctx): string {\n return this.cdsName(ctx);\n }\n\n qualifiedName(ctx: Ctx): string {\n return asNodes(ctx.cdsName)\n .map((node) => this.visit(node) as string)\n .join('.');\n }\n}\n\n/** Singleton visitor instance */\nexport const cdsVisitor = new CdsVisitor();\n","/**\n * Parse error types for ABAP CDS\n */\nimport type { ILexingError, IRecognitionException } from 'chevrotain';\n\nexport interface CdsParseError {\n message: string;\n line: number;\n column: number;\n offset: number;\n length: number;\n}\n\nexport function fromLexError(err: ILexingError): CdsParseError {\n return {\n message: err.message,\n line: err.line ?? 1,\n column: err.column ?? 1,\n offset: err.offset,\n length: err.length,\n };\n}\n\nexport function fromParseError(err: IRecognitionException): CdsParseError {\n const token = err.token;\n return {\n message: err.message,\n line: token.startLine ?? 1,\n column: token.startColumn ?? 1,\n offset: token.startOffset,\n length: (token.endOffset ?? token.startOffset) - token.startOffset + 1,\n };\n}\n","/**\n * AST walker utilities.\n *\n * Traversal helpers for the CDS AST. The visitor pattern here is intentionally\n * light — most downstream consumers just need to iterate over definitions,\n * elements, associations, or annotations without wiring a full Chevrotain\n * visitor.\n */\nimport type {\n AbstractEntityDefinition,\n Annotation,\n AssociationDeclaration,\n CdsDefinition,\n CdsSourceFile,\n CustomEntityDefinition,\n ExtensionDefinition,\n ExternalEntityDefinition,\n FieldDefinition,\n HierarchyDefinition,\n JoinClause,\n JoinSource,\n ParameterDefinition,\n SelectStatement,\n ScalarFunctionDefinition,\n StructureDefinition,\n TableDefinition,\n TableFunctionDefinition,\n ViewElement,\n ViewEntityDefinition,\n ViewMember,\n} from '../../ast';\n\nexport type WithMembers =\n | ViewEntityDefinition\n | AbstractEntityDefinition\n | CustomEntityDefinition\n | HierarchyDefinition\n | ExtensionDefinition;\n\nexport type WithFields =\n | TableDefinition\n | StructureDefinition\n | ExternalEntityDefinition\n | TableFunctionDefinition;\n\nexport type WithParameters =\n | ViewEntityDefinition\n | AbstractEntityDefinition\n | CustomEntityDefinition\n | ExternalEntityDefinition\n | TableFunctionDefinition\n | ScalarFunctionDefinition\n | HierarchyDefinition;\n\n/** True when the definition has a `members` array (view-like entities). */\nexport function hasMembers(def: CdsDefinition): def is WithMembers {\n return (\n def.kind === 'viewEntity' ||\n def.kind === 'abstractEntity' ||\n def.kind === 'customEntity' ||\n def.kind === 'hierarchy' ||\n def.kind === 'extension'\n );\n}\n\n/** True when the definition has a `members` array of typed fields (TABL/structure). */\nexport function hasFields(def: CdsDefinition): def is WithFields {\n return (\n def.kind === 'table' ||\n def.kind === 'structure' ||\n def.kind === 'externalEntity' ||\n def.kind === 'tableFunction'\n );\n}\n\nexport function hasParameters(def: CdsDefinition): def is WithParameters {\n return (\n def.kind === 'viewEntity' ||\n def.kind === 'abstractEntity' ||\n def.kind === 'customEntity' ||\n def.kind === 'externalEntity' ||\n def.kind === 'tableFunction' ||\n def.kind === 'scalarFunction' ||\n def.kind === 'hierarchy'\n );\n}\n\n/** Yield every definition in the file (currently one, future-proofed). */\nexport function* walkDefinitions(file: CdsSourceFile): Iterable<CdsDefinition> {\n for (const def of file.definitions) yield def;\n}\n\n/**\n * Yield every annotation attached anywhere in the AST (definitions,\n * elements/fields, parameters, associations).\n */\nexport function* walkAnnotations(file: CdsSourceFile): Iterable<Annotation> {\n for (const def of walkDefinitions(file)) {\n for (const a of getAnnotations(def)) yield a;\n // Member pools that can carry annotations: fields/members (whichever the\n // definition supports), parameters, and extension-level associations.\n const pools: ReadonlyArray<readonly unknown[]> = [];\n if (hasFields(def)) pools.push(def.members);\n if (hasMembers(def)) pools.push(def.members);\n if (def.kind === 'aspect') pools.push(def.members);\n if (hasParameters(def)) pools.push(def.parameters);\n if (def.kind === 'extension') pools.push(def.associations);\n for (const pool of pools) {\n for (const m of pool) {\n if (typeof m === 'object' && m !== null && 'annotations' in m) {\n for (const a of m.annotations as Annotation[]) yield a;\n }\n }\n }\n }\n}\n\n/** Safe accessor — returns an empty array if the definition carries none. */\nexport function getAnnotations(def: CdsDefinition): Annotation[] {\n return 'annotations' in def ? def.annotations : [];\n}\n\n/** Yield every element (`ViewElement`) across all view-like definitions. */\nexport function* walkViewElements(\n file: CdsSourceFile,\n): Iterable<{ owner: WithMembers; element: ViewElement }> {\n for (const def of walkDefinitions(file)) {\n if (!hasMembers(def)) continue;\n for (const m of def.members) {\n if (isAssociation(m)) continue;\n yield { owner: def, element: m };\n }\n }\n}\n\n/** Yield every association declaration across view-like definitions. */\nexport function* walkAssociations(\n file: CdsSourceFile,\n): Iterable<{ owner: WithMembers; association: AssociationDeclaration }> {\n for (const def of walkDefinitions(file)) {\n if (!hasMembers(def)) continue;\n const pools: AssociationDeclaration[][] = [\n def.members.filter(isAssociation),\n ];\n if (def.kind === 'extension') pools.push(def.associations);\n for (const association of pools.flat()) {\n yield { owner: def, association };\n }\n }\n}\n\n/**\n * Yield every association declared in the FROM region of a view entity.\n *\n * FROM associations are declared next to the data source (before the element\n * list) and are therefore kept apart from the associations inside\n * `members`.\n */\nexport function* walkFromAssociations(file: CdsSourceFile): Iterable<{\n owner: ViewEntityDefinition;\n association: AssociationDeclaration;\n}> {\n for (const def of walkDefinitions(file)) {\n if (def.kind !== 'viewEntity') continue;\n yield* fromAssocOfSelect(def, def);\n // Set-operation branches (`union … select …`) carry their own FROM\n // associations.\n for (const op of def.setOperations ?? []) {\n yield* fromAssocOfSelect(def, op.statement);\n }\n }\n}\n\nfunction* fromAssocOfSelect(\n owner: ViewEntityDefinition,\n select: {\n fromAssociations?: AssociationDeclaration[];\n setOperations?: { statement: SelectStatement }[];\n },\n): Iterable<{\n owner: ViewEntityDefinition;\n association: AssociationDeclaration;\n}> {\n for (const a of select.fromAssociations ?? []) {\n yield { owner, association: a };\n }\n for (const op of select.setOperations ?? []) {\n yield* fromAssocOfSelect(owner, op.statement);\n }\n}\n\n/** Yield every join of every view entity, in source order. */\nexport function* walkJoins(\n file: CdsSourceFile,\n): Iterable<{ owner: ViewEntityDefinition; join: JoinClause }> {\n for (const def of walkDefinitions(file)) {\n if (def.kind !== 'viewEntity') continue;\n yield* walkJoinChain(def, def.joins ?? []);\n // Set-operation branches (`union … select …`) carry their own joins.\n for (const op of def.setOperations ?? []) {\n yield* walkSelectJoins(def, op.statement);\n }\n }\n}\n\nfunction* walkSelectJoins(\n owner: ViewEntityDefinition,\n select: {\n joins?: JoinClause[];\n setOperations?: { statement: SelectStatement }[];\n },\n): Iterable<{ owner: ViewEntityDefinition; join: JoinClause }> {\n yield* walkJoinChain(owner, select.joins ?? []);\n for (const op of select.setOperations ?? []) {\n yield* walkSelectJoins(owner, op.statement);\n }\n}\n\nfunction* walkJoinChain(\n owner: ViewEntityDefinition,\n joins: JoinClause[],\n): Iterable<{ owner: ViewEntityDefinition; join: JoinClause }> {\n for (const join of joins) {\n yield { owner, join };\n yield* walkJoinSource(owner, join.source);\n }\n}\n\n/** Descend into a grouped join source (`join (A join B on …) on …`). */\nfunction* walkJoinSource(\n owner: ViewEntityDefinition,\n source: JoinSource,\n): Iterable<{ owner: ViewEntityDefinition; join: JoinClause }> {\n if (source.kind !== 'joinGroup') return;\n yield* walkJoinSource(owner, source.source);\n yield* walkJoinChain(owner, source.joins);\n}\n\n/** Yield every field definition from tables and structures. */\nexport function* walkFields(\n file: CdsSourceFile,\n): Iterable<{ owner: WithFields; field: FieldDefinition }> {\n for (const def of walkDefinitions(file)) {\n if (!hasFields(def)) continue;\n for (const m of def.members) {\n if ('kind' in m && m.kind === 'include') continue;\n yield { owner: def, field: m as FieldDefinition };\n }\n }\n}\n\n/** Yield every parameter definition across view-like entities. */\nexport function* walkParameters(\n file: CdsSourceFile,\n): Iterable<{ owner: WithParameters; parameter: ParameterDefinition }> {\n for (const def of walkDefinitions(file)) {\n if (!hasParameters(def)) continue;\n for (const p of def.parameters) yield { owner: def, parameter: p };\n }\n}\n\nexport function isAssociation(m: ViewMember): m is AssociationDeclaration {\n return 'kind' in m && m.kind === 'association';\n}\n\n/** Look up an annotation by its dotted key. Returns the first match. */\nexport function findAnnotation(\n annotations: readonly Annotation[],\n key: string,\n): Annotation | undefined {\n return annotations.find((a) => a.key === key);\n}\n","/**\n * Cardinality validator.\n *\n * Ensures `[lower..upper]` bounds are consistent:\n * - lower >= 0\n * - upper >= 1 (unless `*`)\n * - lower <= upper (when both numeric)\n */\nimport type { CdsSourceFile } from '../../ast';\nimport { walkAssociations, walkFromAssociations } from '../ast/walker';\nimport type { SemanticDiagnostic } from './index';\n\nexport function validateCardinality(file: CdsSourceFile): SemanticDiagnostic[] {\n const diagnostics: SemanticDiagnostic[] = [];\n const associations = [\n ...walkAssociations(file),\n ...walkFromAssociations(file),\n ];\n for (const { association } of associations) {\n const card = association.cardinality;\n if (!card) continue;\n\n const { min, max } = card;\n const name = association.alias ?? association.target;\n\n if (min !== undefined && min < 0) {\n diagnostics.push({\n code: 'ACDS001',\n severity: 'error',\n message: `Association '${name}': lower bound (${min}) must be >= 0.`,\n target: name,\n });\n }\n\n if (typeof max === 'number' && max < 1) {\n diagnostics.push({\n code: 'ACDS002',\n severity: 'error',\n message: `Association '${name}': upper bound (${max}) must be >= 1.`,\n target: name,\n });\n }\n\n if (min !== undefined && typeof max === 'number' && min > max) {\n diagnostics.push({\n code: 'ACDS003',\n severity: 'error',\n message: `Association '${name}': lower bound (${min}) exceeds upper bound (${max}).`,\n target: name,\n });\n }\n }\n return diagnostics;\n}\n","/**\n * View element validator.\n *\n * - A typed field cannot also be marked `virtual` (nonsensical combination).\n * - A `key` element must not be `virtual` (virtual columns are never keys).\n */\nimport type { CdsSourceFile } from '../../ast';\nimport { walkViewElements } from '../ast/walker';\nimport type { SemanticDiagnostic } from './index';\n\nexport function validateViewElements(\n file: CdsSourceFile,\n): SemanticDiagnostic[] {\n const diagnostics: SemanticDiagnostic[] = [];\n for (const { element } of walkViewElements(file)) {\n const name = element.alias ?? element.expression;\n\n if (element.isVirtual && element.type) {\n diagnostics.push({\n code: 'ACDS010',\n severity: 'error',\n message: `View element '${name}' cannot be virtual and typed at the same time.`,\n target: name,\n });\n }\n\n if (element.isKey && element.isVirtual) {\n diagnostics.push({\n code: 'ACDS011',\n severity: 'error',\n message: `View element '${name}' cannot be both 'key' and 'virtual'.`,\n target: name,\n });\n }\n }\n return diagnostics;\n}\n","/**\n * Semantic validators that operate on a parsed `CdsSourceFile`.\n *\n * These do NOT replace the parser's syntactic error recovery — they catch\n * constraints that the grammar cannot easily encode (e.g. cardinality must\n * be `lower <= upper`, a typed field cannot simultaneously be `key` and\n * `virtual`, etc.).\n */\nimport type { CdsSourceFile } from '../../ast';\nimport { validateCardinality } from './cardinality';\nimport { validateViewElements } from './elements';\n\nexport interface SemanticDiagnostic {\n /** Stable machine-readable code. */\n code: string;\n severity: 'error' | 'warning';\n message: string;\n /** Optional location hint (e.g. element name, association alias). */\n target?: string;\n}\n\n/** Run all validators. */\nexport function validate(file: CdsSourceFile): SemanticDiagnostic[] {\n return [...validateCardinality(file), ...validateViewElements(file)];\n}\n\nexport { validateCardinality } from './cardinality';\nexport { validateViewElements } from './elements';\n","/**\n * DDL grammar coverage.\n *\n * Entities implemented by `CdsParser`:\n * - `define table <name> { ... }`\n * - `define structure <name> { ... }`\n * - `define type <name> : <type>;`\n * - `define [root] view entity <name> [with parameters ...]\n * as select [distinct] from <source> [<joins>] [<associations>]\n * { ... } [where ...] [group by ...] [having ...]\n * [union|intersect|except [all] select ...]`\n * - `define [root] view entity <name> [provider contract transactional_query]\n * as projection on <source> [<assoc redefinitions>] { ... }`\n * - `define view <name> ...` — legacy classic SQL view (same body, flagged\n * with `legacy: true` in the AST)\n * - `define abstract entity <name> [with parameters ...] { ... }`\n * - `define custom entity <name> [with parameters ...] { ... }`\n * - `define [root] table entity <name> { ... }` (TABLE ENTITY / DTEL body)\n * - `define [writable] external entity <name> [external name <obj>]\n * { ... } with federated data provided at runtime`\n * - `define table function <name> [with parameters ...]\n * returns { ... } implemented by method <class>=><method>`\n * - `define scalar function <name> [with parameters ...] returns <type>`\n * - `define hierarchy <name> [with parameters ...]\n * as parent child hierarchy( <clauses> ) { ... }`\n * - `define aspect <name> { ... }`\n * - `define annotation <name> { ... }` (DDLA — body kept opaque)\n * - `define accesspolicy <name> { ... }` (body kept opaque)\n * - `define service <name> { expose ...; }` (SRVD)\n * - `annotate entity <name> with { ... }` (DDLX)\n * - `extend view [entity] <name> with ...`\n * / `extend abstract|custom entity <name> with { ... }`\n *\n * Data sources in the FROM region also accept path expressions\n * (`<source>._assoc[ <card>:<cond> ]` style attribute bindings) — the bracket\n * contents are captured opaquely.\n */\nimport type { GrammarCoverage } from './index';\n\nexport const ddlCoverage: GrammarCoverage = {\n topic: 'ddl',\n constructs: [\n 'define table',\n 'define structure',\n 'define type',\n 'define view entity',\n 'define root view entity',\n 'define view (legacy classic SQL view)',\n 'define view entity as projection on (projection view)',\n 'provider contract transactional_query',\n 'define abstract entity',\n 'define custom entity',\n 'define table entity',\n 'define external entity',\n 'define writable external entity',\n 'define table function',\n 'define scalar function',\n 'define hierarchy',\n 'define aspect',\n 'define annotation',\n 'define accesspolicy',\n 'define service',\n 'annotate entity',\n 'extend view entity / extend view / extend abstract|custom entity',\n 'select distinct',\n 'where / group by / having',\n 'union [all] / intersect / except',\n 'bind aspect <aspect>(<bindings>)',\n 'include directive',\n 'builtin type (abap.char, abap.dec, ...)',\n 'named type reference',\n \"typed literal (abap.dats'20200101')\",\n ],\n};\n","/**\n * DCL (access control) grammar coverage.\n *\n * define role <name> [switchable] {\n * grant select on <entity>\n * [with optional elements ( <elem> [default true|false] , ... )]\n * [combination mode and|or]\n * [where <expression>] ;\n * inherit <role> [for grant select on <entity>] [where <expression>] ;\n * inheriting conditions from entity <name>|super\n * [default true|false] [replacing|adding ...] ;\n * ...\n * }\n *\n * Expressions inside `where` are captured as opaque `Expression` tokens —\n * downstream consumers can inspect the `source` / `tokens` arrays but the\n * parser does not interpret them further.\n *\n * Clause order inside a grant is only partially free: `with optional\n * elements`, `combination mode` and `where` may appear in any order, but a\n * trailing `where`/`inherit`-condition is captured greedily up to `;`, so a\n * condition clause must be the last clause of its statement.\n */\nimport type { GrammarCoverage } from './index';\n\nexport const dclCoverage: GrammarCoverage = {\n topic: 'dcl',\n constructs: [\n 'define role <name> { ... }',\n 'define role <name> switchable { ... }',\n 'grant select on <entity>',\n 'grant select on <entity> where <expression>',\n 'grant select on <entity> with optional elements ( ... )',\n 'grant ... combination mode and|or|redefinition',\n 'inherit <role> [for grant select on <entity>] [where ...]',\n 'inheriting conditions from entity <name>|super [default ...]',\n ],\n};\n","/**\n * Annotation grammar coverage.\n *\n * CDS annotations can appear in several scopes:\n * - Top of a source file (attached to the following definition).\n * - Element of a table / structure / view / abstract / custom entity.\n * - Parameter definition.\n * - Associated element inside `annotate entity ... with { ... }` (DDLX).\n *\n * Value forms:\n * - string literal: `'text'`\n * - enum literal : `#TRANSPARENT`\n * - boolean : `true` / `false`\n * - number : `42`, `3.14`\n * - array : `[ <value>, <value>, ... ]`\n * - object : `{ prop: <value>, prop.sub: <value> }`\n * - bare `@Anno` (equivalent to `@Anno : true`)\n *\n * Not yet implemented:\n * - `@Scope:[#...]` scope restriction enforcement.\n * - Macro substitution / includes within annotation bodies.\n */\nimport type { GrammarCoverage } from './index';\n\nexport const annotationsCoverage: GrammarCoverage = {\n topic: 'annotations',\n constructs: [\n '@Key : value',\n '@Key.path : value',\n 'array value',\n 'object value',\n 'nested objects',\n 'bare boolean (@Key)',\n ],\n};\n","/**\n * Association and composition grammar coverage.\n *\n * association[<cardinality>]\n * [ of [<tgt-card>] [to <tgt-card>]? <target>\n * | to [parent|<tgt-card>]? [redirected to]? <target>\n * | <target> ] -- `to` is optional\n * [as <alias>] [on <expression>]\n * [with default filter <expression>] ;|,\n * composition[<cardinality>] (same tail forms)\n *\n * Cardinality forms:\n * - `[N]` upper bound = N, lower implicit 0\n * - `[L..U]` lower = L, upper = U\n * - `[L..*]` lower = L, upper unbounded\n * - `[*]` unbounded\n *\n * `to parent` marks the child→parent direction of a composition pair.\n * `redirected to` introduces projection-view re-targeting for associations\n * defined on the underlying view.\n *\n * FROM-region associations (declared between the data source and the element\n * list) land in `ViewEntityDefinition.fromAssociations`; element-list\n * associations land in `members`.\n *\n * `bind aspect <name>(<elem> => <operand>, ...)` attaches an aspect binding\n * to a data source in the FROM region.\n */\nimport type { GrammarCoverage } from './index';\n\nexport const associationsCoverage: GrammarCoverage = {\n topic: 'associations',\n constructs: [\n 'association to <target>',\n 'association <target> (implicit to)',\n 'association[cardinality] to <target>',\n 'association[L..U] to <target>',\n 'association of (many|one|exact one) [to] <target>',\n 'composition [of] <target>',\n 'association to parent <target>',\n 'association to redirected to <target>',\n 'association ... as <alias>',\n 'association ... on <expression>',\n 'association ... with default filter <expression>',\n 'FROM-region association / composition',\n 'bind aspect <name>(<bindings>)',\n ],\n};\n","/**\n * Join and parameterized data source grammar coverage.\n *\n * [INNER] JOIN <source> ON <expression> -- ON is mandatory\n * LEFT [OUTER] JOIN <source> ON <expression> -- ON is mandatory\n * RIGHT [OUTER] JOIN <source> ON <expression> -- ON is mandatory\n * FULL [OUTER] JOIN <source> ON <expression> -- ON is mandatory\n * CROSS JOIN <source> -- ON is not allowed\n *\n * <source> := <name> [ ( <param> : <value> , ... ) ] [ AS <alias> ]\n *\n * The different spellings are normalized into a single `JoinType`:\n *\n * JOIN / INNER JOIN → inner\n * LEFT [OUTER] JOIN → leftOuter\n * RIGHT [OUTER] JOIN → rightOuter\n * FULL [OUTER] JOIN → fullOuter\n * CROSS JOIN → cross\n *\n * ## `OUTER` spelling\n *\n * The `OUTER` keyword is optional for the outer join types, and the accepted\n * spellings do **not** depend on the view flavour: a CDS view entity\n * (`define view entity`) and a classic SQL view (`define view`) accept the\n * same join syntax. The parser therefore keeps no state about the view\n * flavour.\n *\n * `FULL [OUTER] JOIN` is the SQL-standard full outer join. It is not part of\n * the ABAP CDS DDL join syntax, but it is supported so that HANA CDS / CAP\n * CDS sources — which use the standard SQL join syntax — can be read with the\n * same grammar.\n *\n * ## Condition coverage (`ON` / `WHERE`)\n *\n * The condition is captured opaquely as `Expression { source, tokens }`.\n *\n * ## Rejected by the grammar (listed here, NOT in `constructs`)\n *\n * - `CROSS JOIN` with an `ON` condition\n * - `INNER` / `LEFT` / `RIGHT` / `FULL JOIN` without an `ON` condition\n */\nimport type { GrammarCoverage } from './index';\n\nexport const joinsCoverage: GrammarCoverage = {\n topic: 'joins',\n constructs: [\n // --- supported and tested ---\n 'JOIN <source> ON <condition> (inner)',\n 'INNER JOIN <source> ON <condition> (inner)',\n 'LEFT JOIN <source> ON <condition> (leftOuter)',\n 'LEFT OUTER JOIN <source> ON <condition> (leftOuter)',\n 'RIGHT JOIN <source> ON <condition> (rightOuter)',\n 'RIGHT OUTER JOIN <source> ON <condition> (rightOuter)',\n 'FULL JOIN <source> ON <condition> (fullOuter)',\n 'FULL OUTER JOIN <source> ON <condition> (fullOuter)',\n 'CROSS JOIN <source> (cross, no ON condition)',\n 'chained joins (multiple joins in one FROM clause)',\n 'join source alias',\n 'parameterized data source (<param> : <value>)',\n 'parameter binding to a view parameter (:P_Param)',\n 'parameter binding to a system variable ($session.client, $parameters.P_X)',\n 'parameter binding to a literal',\n 'ON condition with AND / OR / NOT predicates',\n 'ON condition with parentheses and nested call arguments',\n 'ON condition with `is null` / `is not initial` predicates',\n 'ON condition with a system variable ($projection.Field)',\n 'ON condition with LIKE / BETWEEN / IN predicates',\n 'ON condition with arithmetic operands (B.k + 1 = A.k)',\n 'join cardinality ([INNER] TO ONE|MANY JOIN, MANY TO ONE JOIN, ...)',\n 'grouped joins ((A join B on ...) left join C on ...)',\n ],\n};\n","/**\n * Parameter grammar coverage.\n *\n * with parameters\n * <name> : <type> [default <literal>]\n * [, <name> : <type> [default <literal>] ] ...\n *\n * Parameters may carry per-parameter annotations.\n * Consumed by view entities, abstract entities, and custom entities.\n */\nimport type { GrammarCoverage } from './index';\n\nexport const parametersCoverage: GrammarCoverage = {\n topic: 'parameters',\n constructs: [\n 'with parameters <p>: <type>',\n 'with parameters <p>: <type> default <literal>',\n 'annotated parameters',\n ],\n};\n","/**\n * Projection / view grammar coverage.\n *\n * View body element (per member):\n * [annotation*] [key] [virtual] [redirected] (\n * <name> : <type> [not null] -- typed field (abstract/custom entities)\n * | <path> [as <alias>] -- projection element\n * | <func>( <arg> , ... ) [as <alias>] -- incl. empty calls f()\n * | cast( <value> as <type> [preserving type] ) [as <alias>]\n * | case <oper> when ... then ... [else ...] end\n * | case when <cond> then ... [else ...] end\n * | <operand> <arith-op> <operand> ... -- + - * / between operands\n * | <path> : localized -- projection-view localized element\n * ) ;|,\n *\n * Plus any association declarations (see `associations.ts`), projection-view\n * association redirections (`<assoc> : redirected to <target>`), and\n * `redirected to composition child <target>` elements.\n *\n * Window functions: `over (partition by <fields> [order by <sort>])` after\n * a call operand is accepted and preserved verbatim in the expression text.\n */\nimport type { GrammarCoverage } from './index';\n\nexport const projectionsCoverage: GrammarCoverage = {\n topic: 'projections',\n constructs: [\n 'view element (qualified name)',\n 'view element with alias',\n 'view element with key modifier',\n 'view element with virtual modifier',\n 'view element with function call (coalesce(a, b), sum(x))',\n 'window function over (partition by ... order by ...)',\n 'view element with cast expression (cast(x as type [preserving type]))',\n 'typed field (abstract/custom entity)',\n 'case expression (operand and searched forms)',\n 'arithmetic expression in element list',\n 'localized element (: localized)',\n 'association redirection (: redirected to <target>)',\n 'view where / group by / having clauses',\n 'projection view (as projection on <source>)',\n ],\n};\n","/**\n * Action / function grammar coverage.\n *\n * NOTE: CDS-level `define action` / `define function` declarations live inside\n * RAP behavior definitions (`.bdef`) and are the responsibility of E10 (BDEF).\n * This module is a placeholder that currently **does not** parse action\n * signatures — it documents what E10 is expected to layer on top of the\n * CDS parser.\n *\n * Expected coverage for downstream:\n * - `define action <name> [parameter <p> : <type>] returns <type>`\n * - `define function <name>(<params>) returns <type>`\n * - Behavior implementation bindings (handled entirely in E10).\n */\nimport type { GrammarCoverage } from './index';\n\nexport const actionsCoverage: GrammarCoverage = {\n topic: 'actions',\n constructs: [\n // intentionally empty — populated by E10.\n ],\n};\n","/**\n * Grammar coverage index.\n *\n * Each topic module in this directory documents a slice of the CDS grammar\n * implemented by the single Chevrotain parser in `../../parser.ts`. They are\n * intentionally documentation-first: Chevrotain's `CstParser` requires all\n * rules to live on one class, so we keep them together and split the docs\n * into focused files. Each module re-exports a `COVERED` array listing the\n * grammar constructs currently implemented — useful for downstream tools\n * (E10/E11/E12) to know what they can rely on.\n */\nexport type GrammarCoverage = {\n readonly topic: string;\n readonly constructs: readonly string[];\n};\n\nexport { ddlCoverage } from './ddl';\nexport { dclCoverage } from './dcl';\nexport { annotationsCoverage } from './annotations';\nexport { associationsCoverage } from './associations';\nexport { joinsCoverage } from './joins';\nexport { parametersCoverage } from './parameters';\nexport { projectionsCoverage } from './projections';\nexport { actionsCoverage } from './actions';\n\nimport { ddlCoverage } from './ddl';\nimport { dclCoverage } from './dcl';\nimport { annotationsCoverage } from './annotations';\nimport { associationsCoverage } from './associations';\nimport { joinsCoverage } from './joins';\nimport { parametersCoverage } from './parameters';\nimport { projectionsCoverage } from './projections';\nimport { actionsCoverage } from './actions';\n\nexport const GRAMMAR_COVERAGE: readonly GrammarCoverage[] = [\n ddlCoverage,\n dclCoverage,\n annotationsCoverage,\n associationsCoverage,\n joinsCoverage,\n parametersCoverage,\n projectionsCoverage,\n actionsCoverage,\n];\n","/**\n * @abapify/acds — ABAP CDS Source Parser\n *\n * Parses ABAP CDS DDL source (.acds) files into a typed AST.\n *\n * @example\n * ```typescript\n * import { parse } from '@abapify/acds';\n *\n * const result = parse(`\n * @AbapCatalog.tableCategory : #TRANSPARENT\n * define table ztable {\n * key field1 : abap.char(10) not null;\n * field2 : some_data_element;\n * }\n * `);\n *\n * if (result.errors.length === 0) {\n * const table = result.ast.definitions[0]; // TableDefinition\n * }\n * ```\n */\n\nimport { CdsLexer } from './tokens';\nimport { cdsParser } from './parser';\nimport { cdsVisitor } from './visitor';\nimport type { CdsSourceFile } from './ast';\nimport type { CdsParseError } from './errors';\nimport { fromLexError, fromParseError } from './errors';\n\n/** Result of parsing a CDS source file */\nexport interface ParseResult {\n /** The parsed AST (may be partial if there are errors) */\n ast: CdsSourceFile;\n /** Lexing and parsing errors */\n errors: CdsParseError[];\n}\n\n/**\n * Parse an ABAP CDS source string into a typed AST.\n *\n * @param source - The CDS source code to parse\n * @returns Parse result with AST and any errors\n */\nexport function parse(source: string): ParseResult {\n // Step 1: Tokenize\n const lexResult = CdsLexer.tokenize(source);\n const errors: CdsParseError[] = lexResult.errors.map(fromLexError);\n\n // Step 2: Parse tokens → CST\n cdsParser.input = lexResult.tokens;\n const cst = cdsParser.sourceFile();\n errors.push(...cdsParser.errors.map(fromParseError));\n\n // Step 3: CST → AST\n let ast: CdsSourceFile = { definitions: [] };\n if (cst) {\n try {\n ast = cdsVisitor.visit(cst) as CdsSourceFile;\n } catch {\n // Visitor may fail on severely malformed CST\n // Errors already captured from parser\n }\n }\n\n return { ast, errors };\n}\n\n// Re-export types\nexport type {\n CdsSourceFile,\n CdsDefinition,\n TableDefinition,\n StructureDefinition,\n SimpleTypeDefinition,\n ServiceDefinition,\n MetadataExtension,\n ViewEntityDefinition,\n AbstractEntityDefinition,\n CustomEntityDefinition,\n ExternalEntityDefinition,\n TableFunctionDefinition,\n ScalarFunctionDefinition,\n AspectDefinition,\n AspectElement,\n HierarchyDefinition,\n HierarchyPeriod,\n SortItem,\n ExtensionDefinition,\n ExtendSetOperation,\n AnnotationDefinition,\n AccessPolicyDefinition,\n RoleDefinition,\n RoleMember,\n GrantStatement,\n DclOptionalElement,\n InheritStatement,\n InheritingConditionsStatement,\n FieldDefinition,\n IncludeDirective,\n TableMember,\n ViewElement,\n ViewMember,\n SelectStatement,\n SetOperation,\n DataSource,\n DataSourceKind,\n DataSourceParameter,\n JoinClause,\n JoinType,\n JoinSource,\n JoinGroup,\n ConditionedJoinClause,\n CrossJoinClause,\n ParameterDefinition,\n AssociationDeclaration,\n AssociationKind,\n AssociationRedirection,\n RedefinedAssociation,\n AspectBinding,\n AspectBindingMapping,\n Cardinality,\n CardinalityWord,\n WordCardinality,\n Expression,\n ExposeStatement,\n AnnotatedElement,\n Annotation,\n AnnotationValue,\n StringLiteral,\n EnumValue,\n BooleanLiteral,\n NumberLiteral,\n AnnotationArray,\n AnnotationObject,\n AnnotationProperty,\n TypeRef,\n BuiltinTypeRef,\n NamedTypeRef,\n SourceLocation,\n AstNode,\n} from './ast';\n\nexport type { CdsParseError } from './errors';\n\n// AST walker helpers\nexport {\n walkDefinitions,\n walkAnnotations,\n walkAssociations,\n walkFields,\n walkFromAssociations,\n walkJoins,\n walkParameters,\n walkViewElements,\n findAnnotation,\n hasFields,\n hasMembers,\n hasParameters,\n isAssociation,\n} from './lib/ast/walker';\n\n// Semantic validators\nexport {\n validate,\n validateCardinality,\n validateViewElements,\n} from './lib/validate';\nexport type { SemanticDiagnostic } from './lib/validate';\n\n// Grammar coverage metadata (useful for tooling / test reports)\nexport {\n GRAMMAR_COVERAGE,\n ddlCoverage,\n dclCoverage,\n annotationsCoverage,\n associationsCoverage,\n joinsCoverage,\n parametersCoverage,\n projectionsCoverage,\n actionsCoverage,\n} from './lib/grammar';\nexport type { GrammarCoverage } from './lib/grammar';\n"],"mappings":"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ACnE,MAAa,SAAS,YAAY;CAAE,MAAM;CAAU,SAAS;AAAK,CAAC;AACnE,MAAa,WAAW,YAAY;CAAE,MAAM;CAAY,SAAS;AAAK,CAAC;AACvE,MAAa,WAAW,YAAY;CAAE,MAAM;CAAY,SAAS;AAAK,CAAC;AACvE,MAAa,OAAO,YAAY;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC;AAC/D,MAAa,OAAO,YAAY;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC;AAC/D,MAAa,QAAQ,YAAY;CAAE,MAAM;CAAS,SAAS;AAAI,CAAC;AAChE,MAAa,QAAQ,YAAY;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC;;;;;AAWjE,MAAa,gBAAgB;CAK3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;AACF;AAEA,MAAa,YAAY;CAEvB;CACA;CACA;CACA;CAGA;CACA;CACA;CAGA,GAAG;CAGH;CAGA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;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,KAAK;GACf,MAAM;GACN,UAAU;GACV,SAAS,iBAAiB,KAAK;GAC/B,QAAQ;EACV,CAAC;CAEL;CACA,OAAO;AACT;;;;;ACdA,SAAgB,SAAS,MAA2C;CAClE,OAAO,CAAC,GAAG,oBAAoB,IAAI,GAAG,GAAG,qBAAqB,IAAI,CAAC;AACrE;;;;ACeA,MAAa,cAA+B;CAC1C,OAAO;CACP,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;AChDA,MAAa,cAA+B;CAC1C,OAAO;CACP,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;ACbA,MAAa,sBAAuC;CAClD,OAAO;CACP,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;ACJA,MAAa,uBAAwC;CACnD,OAAO;CACP,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;ACJA,MAAa,gBAAiC;CAC5C,OAAO;CACP,YAAY;EAEV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;AC3DA,MAAa,qBAAsC;CACjD,OAAO;CACP,YAAY;EACV;EACA;EACA;CACF;AACF;;;;ACKA,MAAa,sBAAuC;CAClD,OAAO;CACP,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;AC1BA,MAAa,kBAAmC;CAC9C,OAAO;CACP,YAAY,CAEZ;AACF;;;;ACaA,MAAa,mBAA+C;CAC1D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACCA,SAAgB,MAAM,QAA6B;CAEjD,MAAM,YAAY,SAAS,SAAS,MAAM;CAC1C,MAAM,SAA0B,UAAU,OAAO,IAAI,YAAY;CAGjE,UAAU,QAAQ,UAAU;CAC5B,MAAM,MAAM,UAAU,WAAW;CACjC,OAAO,KAAK,GAAG,UAAU,OAAO,IAAI,cAAc,CAAC;CAGnD,IAAI,MAAqB,EAAE,aAAa,CAAC,EAAE;CAC3C,IAAI,KACF,IAAI;EACF,MAAM,WAAW,MAAM,GAAG;CAC5B,QAAQ,CAGR;CAGF,OAAO;EAAE;EAAK;CAAO;AACvB"}
|