@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.
- package/CHANGELOG.md +109 -319
- package/README.md +1 -1
- package/bin/cds_update_identifiers.js +3 -5
- package/bin/cdsc.js +22 -8
- package/bin/cdshi.js +1 -1
- package/bin/cdsse.js +4 -4
- package/doc/CHANGELOG_BETA.md +11 -0
- package/doc/CHANGELOG_DEPRECATED.md +29 -0
- package/lib/api/main.js +8 -5
- package/lib/api/options.js +12 -10
- package/lib/base/builtins.js +1 -0
- package/lib/base/message-registry.js +190 -96
- package/lib/base/messages.js +29 -20
- package/lib/base/model.js +14 -24
- package/lib/checks/actionsFunctions.js +10 -20
- package/lib/checks/annotationsOData.js +1 -1
- package/lib/checks/elements.js +30 -10
- package/lib/checks/enums.js +31 -0
- package/lib/checks/foreignKeys.js +2 -2
- package/lib/checks/hasPersistedElements.js +5 -0
- package/lib/checks/invalidTarget.js +1 -1
- package/lib/checks/managedWithoutKeys.js +5 -4
- package/lib/checks/queryNoDbArtifacts.js +10 -8
- package/lib/checks/types.js +5 -5
- package/lib/checks/validator.js +6 -4
- package/lib/compiler/assert-consistency.js +12 -9
- package/lib/compiler/checks.js +18 -50
- package/lib/compiler/define.js +6 -6
- package/lib/compiler/extend.js +2 -1
- package/lib/compiler/generate.js +14 -17
- package/lib/compiler/populate.js +8 -31
- package/lib/compiler/propagator.js +21 -35
- package/lib/compiler/resolve.js +35 -22
- package/lib/compiler/shared.js +7 -1
- package/lib/compiler/tweak-assocs.js +1 -1
- package/lib/compiler/utils.js +1 -1
- package/lib/edm/annotations/edmJson.js +20 -15
- package/lib/edm/annotations/genericTranslation.js +7 -8
- package/lib/edm/csn2edm.js +46 -50
- package/lib/edm/edm.js +8 -7
- package/lib/edm/edmPreprocessor.js +37 -85
- package/lib/edm/edmUtils.js +2 -2
- package/lib/gen/BaseParser.js +55 -44
- package/lib/gen/CdlGrammar.checksum +1 -1
- package/lib/gen/CdlParser.js +1133 -1150
- package/lib/json/from-csn.js +70 -43
- package/lib/json/to-csn.js +6 -8
- package/lib/language/multiLineStringParser.js +3 -2
- package/lib/main.d.ts +58 -24
- package/lib/model/csnUtils.js +28 -39
- package/lib/model/xprAsTree.js +23 -9
- package/lib/modelCompare/compare.js +5 -4
- package/lib/optionProcessor.js +21 -17
- package/lib/parsers/AstBuildingParser.js +63 -11
- package/lib/parsers/XprTree.js +57 -3
- package/lib/parsers/identifiers.js +1 -1
- package/lib/parsers/index.js +0 -3
- package/lib/render/manageConstraints.js +25 -25
- package/lib/render/toCdl.js +173 -170
- package/lib/render/toHdbcds.js +126 -128
- package/lib/render/toRename.js +7 -7
- package/lib/render/toSql.js +128 -125
- package/lib/render/utils/common.js +47 -22
- package/lib/render/utils/delta.js +25 -25
- package/lib/render/utils/operators.js +2 -2
- package/lib/render/utils/pretty.js +5 -5
- package/lib/render/utils/sql.js +13 -13
- package/lib/render/utils/standardDatabaseFunctions.js +115 -103
- package/lib/render/utils/unique.js +4 -4
- package/lib/transform/db/applyTransformations.js +1 -1
- package/lib/transform/db/assertUnique.js +2 -2
- package/lib/transform/db/associations.js +6 -7
- package/lib/transform/db/assocsToQueries/utils.js +4 -5
- package/lib/transform/db/backlinks.js +12 -9
- package/lib/transform/db/cdsPersistence.js +8 -7
- package/lib/transform/db/constraints.js +13 -10
- package/lib/transform/db/expansion.js +7 -3
- package/lib/transform/db/flattening.js +4 -14
- package/lib/transform/db/processSqlServices.js +2 -1
- package/lib/transform/db/temporal.js +5 -7
- package/lib/transform/db/views.js +2 -4
- package/lib/transform/draft/db.js +8 -8
- package/lib/transform/draft/odata.js +10 -7
- package/lib/transform/forOdata.js +10 -5
- package/lib/transform/forRelationalDB.js +5 -75
- package/lib/transform/localized.js +1 -1
- package/lib/transform/odata/createForeignKeys.js +11 -10
- package/lib/transform/odata/flattening.js +8 -4
- package/lib/transform/odata/foreignKeyRefsInXprAnnos.js +96 -0
- package/lib/transform/odata/typesExposure.js +3 -3
- package/lib/transform/transformUtils.js +4 -8
- package/lib/transform/translateAssocsToJoins.js +14 -7
- package/lib/transform/universalCsn/universalCsnEnricher.js +10 -4
- package/lib/utils/objectUtils.js +0 -17
- package/package.json +10 -13
- package/share/messages/def-upcoming-virtual-change.md +1 -1
- package/LICENSE +0 -37
- package/bin/cds_remove_invalid_whitespace.js +0 -138
- package/doc/CHANGELOG_ARCHIVE.md +0 -3604
- package/lib/gen/genericAntlrParser.js +0 -3
- package/lib/gen/language.checksum +0 -1
- package/lib/gen/language.interp +0 -456
- package/lib/gen/language.tokens +0 -180
- package/lib/gen/languageLexer.interp +0 -439
- package/lib/gen/languageLexer.js +0 -1483
- package/lib/gen/languageLexer.tokens +0 -167
- package/lib/gen/languageParser.js +0 -24941
- package/lib/language/antlrParser.js +0 -205
- package/lib/language/errorStrategy.js +0 -646
- package/lib/language/genericAntlrParser.js +0 -1572
- 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;
|