@abapify/acds 0.4.0 → 0.4.3

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.
@@ -0,0 +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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"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.4.0",
6
+ "version": "0.4.3",
7
7
  "description": "ABAP CDS source parser — tokenizer, parser, and AST for all DDL-based ABAP source types",
8
8
  "type": "module",
9
9
  "types": "./dist/index.d.mts",