@sap/cds-compiler 5.9.2 → 6.0.10

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.
Files changed (111) hide show
  1. package/CHANGELOG.md +109 -319
  2. package/README.md +1 -1
  3. package/bin/cds_update_identifiers.js +3 -5
  4. package/bin/cdsc.js +22 -8
  5. package/bin/cdshi.js +1 -1
  6. package/bin/cdsse.js +4 -4
  7. package/doc/CHANGELOG_BETA.md +11 -0
  8. package/doc/CHANGELOG_DEPRECATED.md +29 -0
  9. package/lib/api/main.js +8 -5
  10. package/lib/api/options.js +12 -10
  11. package/lib/base/builtins.js +1 -0
  12. package/lib/base/message-registry.js +190 -96
  13. package/lib/base/messages.js +29 -20
  14. package/lib/base/model.js +14 -24
  15. package/lib/checks/actionsFunctions.js +10 -20
  16. package/lib/checks/annotationsOData.js +1 -1
  17. package/lib/checks/elements.js +30 -10
  18. package/lib/checks/enums.js +31 -0
  19. package/lib/checks/foreignKeys.js +2 -2
  20. package/lib/checks/hasPersistedElements.js +5 -0
  21. package/lib/checks/invalidTarget.js +1 -1
  22. package/lib/checks/managedWithoutKeys.js +5 -4
  23. package/lib/checks/queryNoDbArtifacts.js +10 -8
  24. package/lib/checks/types.js +5 -5
  25. package/lib/checks/validator.js +6 -4
  26. package/lib/compiler/assert-consistency.js +12 -9
  27. package/lib/compiler/checks.js +18 -50
  28. package/lib/compiler/define.js +6 -6
  29. package/lib/compiler/extend.js +2 -1
  30. package/lib/compiler/generate.js +14 -17
  31. package/lib/compiler/populate.js +8 -31
  32. package/lib/compiler/propagator.js +21 -35
  33. package/lib/compiler/resolve.js +35 -22
  34. package/lib/compiler/shared.js +7 -1
  35. package/lib/compiler/tweak-assocs.js +1 -1
  36. package/lib/compiler/utils.js +1 -1
  37. package/lib/edm/annotations/edmJson.js +20 -15
  38. package/lib/edm/annotations/genericTranslation.js +7 -8
  39. package/lib/edm/csn2edm.js +46 -50
  40. package/lib/edm/edm.js +8 -7
  41. package/lib/edm/edmPreprocessor.js +37 -85
  42. package/lib/edm/edmUtils.js +2 -2
  43. package/lib/gen/BaseParser.js +55 -44
  44. package/lib/gen/CdlGrammar.checksum +1 -1
  45. package/lib/gen/CdlParser.js +1133 -1150
  46. package/lib/json/from-csn.js +70 -43
  47. package/lib/json/to-csn.js +6 -8
  48. package/lib/language/multiLineStringParser.js +3 -2
  49. package/lib/main.d.ts +58 -24
  50. package/lib/model/csnUtils.js +28 -39
  51. package/lib/model/xprAsTree.js +23 -9
  52. package/lib/modelCompare/compare.js +5 -4
  53. package/lib/optionProcessor.js +21 -17
  54. package/lib/parsers/AstBuildingParser.js +63 -11
  55. package/lib/parsers/XprTree.js +57 -3
  56. package/lib/parsers/identifiers.js +1 -1
  57. package/lib/parsers/index.js +0 -3
  58. package/lib/render/manageConstraints.js +25 -25
  59. package/lib/render/toCdl.js +173 -170
  60. package/lib/render/toHdbcds.js +126 -128
  61. package/lib/render/toRename.js +7 -7
  62. package/lib/render/toSql.js +128 -125
  63. package/lib/render/utils/common.js +47 -22
  64. package/lib/render/utils/delta.js +25 -25
  65. package/lib/render/utils/operators.js +2 -2
  66. package/lib/render/utils/pretty.js +5 -5
  67. package/lib/render/utils/sql.js +13 -13
  68. package/lib/render/utils/standardDatabaseFunctions.js +115 -103
  69. package/lib/render/utils/unique.js +4 -4
  70. package/lib/transform/db/applyTransformations.js +1 -1
  71. package/lib/transform/db/assertUnique.js +2 -2
  72. package/lib/transform/db/associations.js +6 -7
  73. package/lib/transform/db/assocsToQueries/utils.js +4 -5
  74. package/lib/transform/db/backlinks.js +12 -9
  75. package/lib/transform/db/cdsPersistence.js +8 -7
  76. package/lib/transform/db/constraints.js +13 -10
  77. package/lib/transform/db/expansion.js +7 -3
  78. package/lib/transform/db/flattening.js +4 -14
  79. package/lib/transform/db/processSqlServices.js +2 -1
  80. package/lib/transform/db/temporal.js +5 -7
  81. package/lib/transform/db/views.js +2 -4
  82. package/lib/transform/draft/db.js +8 -8
  83. package/lib/transform/draft/odata.js +10 -7
  84. package/lib/transform/forOdata.js +10 -5
  85. package/lib/transform/forRelationalDB.js +5 -75
  86. package/lib/transform/localized.js +1 -1
  87. package/lib/transform/odata/createForeignKeys.js +11 -10
  88. package/lib/transform/odata/flattening.js +8 -4
  89. package/lib/transform/odata/foreignKeyRefsInXprAnnos.js +96 -0
  90. package/lib/transform/odata/typesExposure.js +3 -3
  91. package/lib/transform/transformUtils.js +4 -8
  92. package/lib/transform/translateAssocsToJoins.js +14 -7
  93. package/lib/transform/universalCsn/universalCsnEnricher.js +10 -4
  94. package/lib/utils/objectUtils.js +0 -17
  95. package/package.json +10 -13
  96. package/share/messages/def-upcoming-virtual-change.md +1 -1
  97. package/LICENSE +0 -37
  98. package/bin/cds_remove_invalid_whitespace.js +0 -138
  99. package/doc/CHANGELOG_ARCHIVE.md +0 -3604
  100. package/lib/gen/genericAntlrParser.js +0 -3
  101. package/lib/gen/language.checksum +0 -1
  102. package/lib/gen/language.interp +0 -456
  103. package/lib/gen/language.tokens +0 -180
  104. package/lib/gen/languageLexer.interp +0 -439
  105. package/lib/gen/languageLexer.js +0 -1483
  106. package/lib/gen/languageLexer.tokens +0 -167
  107. package/lib/gen/languageParser.js +0 -24941
  108. package/lib/language/antlrParser.js +0 -205
  109. package/lib/language/errorStrategy.js +0 -646
  110. package/lib/language/genericAntlrParser.js +0 -1572
  111. package/lib/parsers/CdlGrammar.g4 +0 -2070
@@ -1,205 +0,0 @@
1
- // @ts-nocheck : Issues with Tokens on `this`, e.g. `this.DOT`.
2
-
3
- // Wrapper around generated ANTLR parser
4
-
5
- // To test the parser in the REPL
6
- // var parser = require( './lib/language/antlrParser' );
7
- // var ast = parser.parse( 'FileContent', 'FileName' );
8
-
9
- 'use strict';
10
-
11
- const antlr4 = require('antlr4');
12
-
13
- const { CompileMessage } = require('../base/messages');
14
- const errorStrategy = require('./errorStrategy');
15
- const { XsnSource } = require('../compiler/xsn-model');
16
-
17
- const Parser = require('../gen/languageParser').default;
18
- const Lexer = require('../gen/languageLexer').default;
19
-
20
- // Error listener used for ANTLR4-generated parser
21
- class ErrorListener extends antlr4.error.ErrorListener {
22
- // method which is called by generated parser with --trace-parser[-amg]:
23
- syntaxError( recognizer, offendingSymbol, line, column, msg, e ) {
24
- if (!(e instanceof CompileMessage)) // not already reported
25
- // Ignore warning, because only relevant for --trace-parser
26
- // eslint-disable-next-line cds-compiler/message-call-format
27
- recognizer.error( null, offendingSymbol, {}, msg );
28
- }
29
- }
30
-
31
- class RewriteTypeTokenStream extends antlr4.CommonTokenStream {
32
- LT( k ) {
33
- const t = super.LT(k);
34
- if (!t || !t.type)
35
- return t;
36
- if (t.type === this.DOT) {
37
- const n = super.LT(k + 1) || { type: this.Identifier };
38
- // after a '.', there is no keyword -> no word is reserved:
39
- if (n.type < this.Identifier && /^[a-z]+$/i.test( n.text ))
40
- n.type = this.Identifier;
41
- else if (n.type === this.BRACE || n.type === this.ASTERISK)
42
- t.type = this.DOTbeforeBRACE || t.type;
43
- }
44
- else if (t.type === this.AT) {
45
- const n = super.LT(k + 1) || { type: this.Identifier };
46
- // after a '@', there is no keyword -> no word is reserved:
47
- if (n.type < this.Identifier && /^[a-z]+$/i.test( n.text ))
48
- n.type = this.Identifier;
49
- }
50
- else if (t.type === this.NEW) {
51
- const n = super.LT(k + 1);
52
- // TODO: rewrite token in grammar via `this.setLocalToken`
53
- if (n?.type === this.Identifier) {
54
- const o = super.LT(k + 2);
55
- if (o?.type === this.PAREN)
56
- return t;
57
- }
58
- t.type = this.Identifier;
59
- }
60
- return t;
61
- }
62
-
63
- getHiddenTokenToLeft( type ) {
64
- this.lazyInit();
65
- let i = this.index;
66
- while (--i >= 0) {
67
- const t = this.tokens[i];
68
- if (t.channel === antlr4.Token.DEFAULT_CHANNEL)
69
- return null;
70
- else if (t.type === type)
71
- return t;
72
- }
73
- return null;
74
- }
75
- }
76
-
77
- function initTokenRewrite( recognizer, ts ) { // ts = tokenStream
78
- ts.DOTbeforeBRACE = Parser.DOTbeforeBRACE;
79
- ts.BRACE = tokenTypeOf( recognizer, "'{'" );
80
- ts.BRACE_CLOSE = tokenTypeOf( recognizer, "'}'" );
81
- ts.DOT = tokenTypeOf( recognizer, "'.'" );
82
- ts.ASTERISK = tokenTypeOf( recognizer, "'*'" );
83
- ts.AT = tokenTypeOf( recognizer, "'@'" );
84
- ts.SEMICOLON = tokenTypeOf( recognizer, "';'" );
85
- ts.NEW = Parser.NEW;
86
- ts.RETURNS = Parser.RETURNS;
87
- ts.Identifier = Parser.Identifier;
88
- ts.PAREN = tokenTypeOf( recognizer, "'('" );
89
-
90
- recognizer.tokenRewrite = [];
91
- if (Parser.Identifier) {
92
- if (ts.DOT && ts.DOTbeforeBRACE)
93
- recognizer.tokenRewrite[ts.DOTbeforeBRACE - Parser.Identifier] = ts.DOT;
94
- }
95
- }
96
-
97
- function initCodeCompletionTokenArrays( parser ) {
98
- // Set of top-level keywords used for code completion after token '}'
99
- // belonging to a top-level definition
100
- const startRuleIndex = parser.ruleNames.indexOf('start');
101
- const startState = parser.atn.ruleToStartState[startRuleIndex].stateNumber;
102
- const tokens = parser.atn.nextTokens(parser.atn.states[startState]);
103
- tokens.removeOne(parser.symbolicNames.indexOf('NAMESPACE'));
104
- tokens.removeOne(parser.symbolicNames.indexOf('HideAlternatives'));
105
-
106
- parser.topLevelKeywords = [];
107
- for (const interval of tokens.intervals) {
108
- for (let i = interval.start; i < interval.stop; i++)
109
- parser.topLevelKeywords.push(i);
110
- }
111
- }
112
-
113
- function tokenTypeOf( recognizer, literalName ) {
114
- const r = recognizer.literalNames.indexOf( literalName );
115
- return (r > 0) ? r : 0;
116
- }
117
-
118
- // Parse string `source` and return the AST (empty if serious parse error) with
119
- // a property `messages` for the syntax errors. Argument `filename` is used in
120
- // the AST locations and error messages. If provided, `options` are compile
121
- // options.
122
-
123
- function parse( source, filename, options, messageFunctions, rulespec ) {
124
- const lexer = new Lexer( new antlr4.InputStream(source) );
125
- const tokenStream = new RewriteTypeTokenStream(lexer);
126
- /** @type {object} */
127
- const parser = new Parser( tokenStream );
128
- const errorListener = new ErrorListener();
129
-
130
- parser.filename = filename;
131
- parser.options = options;
132
- parser.$messageFunctions = messageFunctions;
133
-
134
- initTokenRewrite( parser, tokenStream );
135
- initCodeCompletionTokenArrays(parser);
136
- // comment the following 2 lines if you want to output the parser errors directly:
137
- parser.messageErrorListener = errorListener;
138
- parser._errHandler = new errorStrategy.KeywordErrorStrategy();
139
- parser._interp.predictionMode = antlr4.atn.PredictionMode.SLL;
140
- // parser._interp.predictionMode = antlr4.atn.PredictionMode.LL_EXACT_AMBIG_DETECTION;
141
-
142
- if (options.traceParser) {
143
- parser.setTrace(true);
144
- // parser._interp.debug = true; // output too long
145
- parser._interp.debug_list_atn_decisions = true;
146
- parser._interp.dfa_debug = true;
147
- parser._interp.retry_debug = true;
148
- parser._interp.debug_add = true;
149
- }
150
- else if (options.traceParserAmb) {
151
- const listener = new antlr4.error.DiagnosticErrorListener();
152
- // listener.exactOnly = false;
153
- parser.addErrorListener( listener );
154
- parser._interp.predictionMode = antlr4.atn.PredictionMode.LL_EXACT_AMBIG_DETECTION;
155
- }
156
- else {
157
- parser.removeErrorListeners();
158
- parser.avoidErrorListeners = true;
159
- }
160
- parser.addErrorListener( errorListener );
161
-
162
- if (options.parseListener)
163
- parser.addParseListener(options.parseListener);
164
-
165
-
166
- let tree;
167
- try {
168
- tree = parser[rulespec.func]();
169
- }
170
- catch (e) {
171
- if (e instanceof RangeError && e.message.match(/Maximum.*exceeded$/i)) {
172
- messageFunctions.error('syntax-invalid-source', { file: filename },
173
- { '#': 'cdl-stackoverflow' } );
174
- }
175
- else {
176
- throw e;
177
- }
178
- }
179
- const ast = tree && tree[rulespec.returns] || new XsnSource();
180
- ast.options = options;
181
- if (rulespec.$frontend)
182
- ast.$frontend = rulespec.$frontend;
183
-
184
- // Do not warn if docComments are explicitly disabled.
185
- if (options.docComment !== false) {
186
- for (const token of tokenStream.tokens) {
187
- if (token.type === parser.constructor.DocComment && !token.isUsed) {
188
- messageFunctions.info('syntax-ignoring-doc-comment', parser.tokenLocation(token), {},
189
- 'Ignoring doc comment as it is not written at a defined position');
190
- }
191
- }
192
- }
193
-
194
- // TODO: clarify with LSP colleagues: still necessary?
195
- if (parser.messages) {
196
- Object.defineProperty( ast, 'messages',
197
- { value: parser.messages, configurable: true, writable: true } );
198
- }
199
- if (options.attachTokens === true || options.attachTokens === filename)
200
- ast.tokenStream = tokenStream;
201
- // if (filename === '<condition>.cds') console.log(ast)
202
- return ast;
203
- }
204
-
205
- module.exports = parse;