@sap/cds-compiler 2.15.4 → 3.0.0
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 +33 -1590
- package/bin/cdsc.js +36 -33
- package/doc/CHANGELOG_ARCHIVE.md +1592 -0
- package/doc/CHANGELOG_BETA.md +3 -4
- package/doc/CHANGELOG_DEPRECATED.md +35 -1
- package/doc/{DeprecatedOptions.md → DeprecatedOptions_v2.md} +3 -1
- package/doc/Versioning.md +20 -1
- package/lib/api/.eslintrc.json +2 -2
- package/lib/api/main.js +220 -103
- package/lib/api/options.js +15 -85
- package/lib/api/validate.js +6 -10
- package/lib/base/keywords.js +216 -109
- package/lib/base/message-registry.js +60 -20
- package/lib/base/messages.js +65 -24
- package/lib/base/model.js +44 -2
- package/lib/checks/actionsFunctions.js +7 -5
- package/lib/checks/annotationsOData.js +1 -1
- package/lib/checks/cdsPersistence.js +1 -0
- package/lib/checks/elements.js +6 -6
- package/lib/checks/invalidTarget.js +1 -1
- package/lib/checks/nonexpandableStructured.js +1 -1
- package/lib/checks/queryNoDbArtifacts.js +2 -1
- package/lib/checks/selectItems.js +5 -1
- package/lib/checks/types.js +4 -2
- package/lib/checks/utils.js +2 -2
- package/lib/checks/validator.js +2 -1
- package/lib/compiler/assert-consistency.js +15 -10
- package/lib/compiler/builtins.js +87 -9
- package/lib/compiler/define.js +2 -2
- package/lib/compiler/extend.js +59 -11
- package/lib/compiler/finalize-parse-cdl.js +20 -9
- package/lib/compiler/index.js +25 -11
- package/lib/compiler/moduleLayers.js +7 -0
- package/lib/compiler/populate.js +13 -13
- package/lib/compiler/propagator.js +3 -3
- package/lib/compiler/resolve.js +193 -218
- package/lib/compiler/shared.js +47 -76
- package/lib/compiler/tweak-assocs.js +9 -10
- package/lib/compiler/utils.js +5 -0
- package/lib/edm/csn2edm.js +18 -21
- package/lib/edm/edmPreprocessor.js +25 -30
- package/lib/edm/edmUtils.js +10 -24
- package/lib/gen/language.checksum +1 -1
- package/lib/gen/language.interp +8 -30
- package/lib/gen/language.tokens +105 -114
- package/lib/gen/languageLexer.interp +1 -34
- package/lib/gen/languageLexer.js +889 -1007
- package/lib/gen/languageLexer.tokens +95 -106
- package/lib/gen/languageParser.js +20632 -22313
- package/lib/json/from-csn.js +56 -49
- package/lib/json/to-csn.js +10 -8
- package/lib/language/antlrParser.js +2 -2
- package/lib/language/docCommentParser.js +61 -38
- package/lib/language/errorStrategy.js +52 -40
- package/lib/language/genericAntlrParser.js +303 -229
- package/lib/language/language.g4 +573 -629
- package/lib/language/multiLineStringParser.js +14 -42
- package/lib/language/textUtils.js +44 -0
- package/lib/main.d.ts +27 -42
- package/lib/main.js +104 -81
- package/lib/model/csnRefs.js +1 -1
- package/lib/model/csnUtils.js +170 -283
- package/lib/model/revealInternalProperties.js +28 -8
- package/lib/model/sortViews.js +32 -31
- package/lib/optionProcessor.js +12 -21
- package/lib/render/.eslintrc.json +1 -1
- package/lib/render/DuplicateChecker.js +4 -7
- package/lib/render/manageConstraints.js +70 -2
- package/lib/render/toCdl.js +334 -339
- package/lib/render/toHdbcds.js +19 -15
- package/lib/render/toRename.js +44 -22
- package/lib/render/toSql.js +53 -51
- package/lib/render/utils/common.js +15 -1
- package/lib/render/utils/sql.js +20 -19
- package/lib/sql-identifier.js +6 -0
- package/lib/transform/db/.eslintrc.json +3 -2
- package/lib/transform/db/cdsPersistence.js +5 -15
- package/lib/transform/db/constraints.js +1 -1
- package/lib/transform/db/expansion.js +7 -6
- package/lib/transform/db/flattening.js +18 -19
- package/lib/transform/db/views.js +3 -3
- package/lib/transform/draft/.eslintrc.json +2 -2
- package/lib/transform/draft/db.js +6 -6
- package/lib/transform/draft/odata.js +6 -7
- package/lib/transform/forHanaNew.js +19 -22
- package/lib/transform/forOdataNew.js +10 -12
- package/lib/transform/localized.js +22 -16
- package/lib/transform/odata/toFinalBaseType.js +10 -10
- package/lib/transform/odata/typesExposure.js +3 -3
- package/lib/transform/odata/utils.js +1 -38
- package/lib/transform/transformUtilsNew.js +63 -77
- package/lib/transform/translateAssocsToJoins.js +2 -2
- package/lib/transform/universalCsn/.eslintrc.json +2 -2
- package/lib/transform/universalCsn/coreComputed.js +11 -6
- package/lib/transform/universalCsn/universalCsnEnricher.js +33 -5
- package/lib/utils/file.js +3 -3
- package/lib/utils/timetrace.js +20 -21
- package/package.json +35 -4
- package/doc/ApiMigration.md +0 -237
- package/doc/CommandLineMigration.md +0 -58
- package/doc/ErrorMessages.md +0 -175
- package/doc/FioriAnnotations.md +0 -94
- package/doc/ODataTransformation.md +0 -273
- package/lib/backends.js +0 -529
- package/lib/fix_antlr4-8_warning.js +0 -56
|
@@ -29,12 +29,12 @@
|
|
|
29
29
|
'use strict';
|
|
30
30
|
|
|
31
31
|
const antlr4 = require('antlr4');
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
const predictionContext = require('antlr4/PredictionContext')
|
|
36
|
-
const { ATNState } = require('antlr4/atn/ATNState');
|
|
37
|
-
const {
|
|
32
|
+
const antlr4_LL1Analyzer = require('antlr4/src/antlr4/LL1Analyzer');
|
|
33
|
+
const { DefaultErrorStrategy } = require('antlr4/src/antlr4/error/ErrorStrategy');
|
|
34
|
+
const { InputMismatchException } = require('antlr4/src/antlr4/error/Errors');
|
|
35
|
+
const { predictionContextFromRuleContext: predictionContext } = require('antlr4/src/antlr4/PredictionContext');
|
|
36
|
+
const { ATNState } = require('antlr4/src/antlr4/atn/ATNState');
|
|
37
|
+
const { IntervalSet, Interval } = require('antlr4/src/antlr4/IntervalSet');
|
|
38
38
|
|
|
39
39
|
const keywordRegexp = /^[a-zA-Z]+$/; // we don't have keywords with underscore
|
|
40
40
|
|
|
@@ -65,30 +65,35 @@ function match( ttype ) {
|
|
|
65
65
|
//
|
|
66
66
|
// An instance of this class should be set as property `_errHandler` to the
|
|
67
67
|
// parser (prototype).
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
reportInputMismatch,
|
|
78
|
-
reportUnwantedToken,
|
|
79
|
-
reportMissingToken,
|
|
80
|
-
reportIgnoredWith,
|
|
81
|
-
// getErrorRecoverySet,
|
|
82
|
-
consumeUntil,
|
|
83
|
-
recoverInline,
|
|
84
|
-
getMissingSymbol,
|
|
85
|
-
getExpectedTokensForMessage,
|
|
86
|
-
getTokenDisplay,
|
|
87
|
-
constructor: KeywordErrorStrategy,
|
|
68
|
+
class KeywordErrorStrategy extends DefaultErrorStrategy {
|
|
69
|
+
constructor( ...args ) {
|
|
70
|
+
super( ...args );
|
|
71
|
+
|
|
72
|
+
this._super = {
|
|
73
|
+
consumeUntil: super.consumeUntil,
|
|
74
|
+
recoverInline: super.recoverInline,
|
|
75
|
+
getExpectedTokens: super.getExpectedTokens,
|
|
76
|
+
};
|
|
88
77
|
}
|
|
89
|
-
|
|
78
|
+
}
|
|
90
79
|
|
|
91
|
-
//
|
|
80
|
+
// TODO: Use actual methods
|
|
81
|
+
Object.assign( KeywordErrorStrategy.prototype, {
|
|
82
|
+
sync,
|
|
83
|
+
reportNoViableAlternative,
|
|
84
|
+
reportInputMismatch,
|
|
85
|
+
reportUnwantedToken,
|
|
86
|
+
reportMissingToken,
|
|
87
|
+
reportIgnoredWith,
|
|
88
|
+
// getErrorRecoverySet,
|
|
89
|
+
consumeUntil,
|
|
90
|
+
recoverInline,
|
|
91
|
+
getMissingSymbol,
|
|
92
|
+
getExpectedTokensForMessage,
|
|
93
|
+
getTokenDisplay,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// Attempt to recover from problems in subrules, except if rule has defined a
|
|
92
97
|
// local variable `_sync` with value 'nop'
|
|
93
98
|
function sync( recognizer ) {
|
|
94
99
|
// If already recovering, don't try to sync
|
|
@@ -166,7 +171,7 @@ function sync( recognizer ) {
|
|
|
166
171
|
case ATNState.STAR_LOOP_BACK: { // 9
|
|
167
172
|
// TODO: do not delete a '}'
|
|
168
173
|
this.reportUnwantedToken(recognizer);
|
|
169
|
-
const expecting = new IntervalSet
|
|
174
|
+
const expecting = new IntervalSet();
|
|
170
175
|
expecting.addSet(recognizer.getExpectedTokens());
|
|
171
176
|
const whatFollowsLoopIterationOrRule = expecting.addSet(this.getErrorRecoverySet(recognizer));
|
|
172
177
|
this.consumeUntil(recognizer, whatFollowsLoopIterationOrRule);
|
|
@@ -270,21 +275,21 @@ function consumeUntil( recognizer, set ) {
|
|
|
270
275
|
|
|
271
276
|
// let s=this.getTokenDisplay( recognizer.getCurrentToken(), recognizer );
|
|
272
277
|
if (SEMI < 1 || RBRACE < 1) {
|
|
273
|
-
|
|
278
|
+
this._super.consumeUntil.call( this, recognizer, set );
|
|
274
279
|
}
|
|
275
280
|
else if (set.contains(SEMI)) { // do not check for RBRACE here!
|
|
276
|
-
|
|
281
|
+
this._super.consumeUntil.call( this, recognizer, set );
|
|
277
282
|
// console.log('CONSUMED-ORIG:',s,this.getTokenDisplay( recognizer.getCurrentToken(), recognizer ),recognizer.getCurrentToken().line,intervalSetToArray( recognizer, set ));
|
|
278
283
|
}
|
|
279
284
|
else {
|
|
280
285
|
// DO NOT modify input param `set`, as the set might be cached in the ATN
|
|
281
|
-
const stop = new IntervalSet
|
|
286
|
+
const stop = new IntervalSet();
|
|
282
287
|
stop.addSet( set );
|
|
283
288
|
stop.removeOne( recognizer.constructor.Identifier );
|
|
284
289
|
stop.addOne( SEMI );
|
|
285
290
|
// I am not that sure whether to add RBRACE...
|
|
286
291
|
stop.addOne( RBRACE );
|
|
287
|
-
|
|
292
|
+
this._super.consumeUntil.call( this, recognizer, stop );
|
|
288
293
|
if (recognizer.getTokenStream().LA(1) === SEMI ||
|
|
289
294
|
recognizer.getTokenStream().LA(1) === RBRACE && !set.contains(RBRACE)) {
|
|
290
295
|
recognizer.consume();
|
|
@@ -310,11 +315,11 @@ function consumeUntil( recognizer, set ) {
|
|
|
310
315
|
function recoverInline( recognizer ) {
|
|
311
316
|
const identType = recognizer.constructor.Identifier;
|
|
312
317
|
if (!identType || !recognizer.isExpectedToken( identType ))
|
|
313
|
-
return
|
|
318
|
+
return this._super.recoverInline.call( this, recognizer );
|
|
314
319
|
|
|
315
320
|
const token = recognizer.getCurrentToken();
|
|
316
321
|
if (!keywordRegexp.test( token.text ))
|
|
317
|
-
return
|
|
322
|
+
return this._super.recoverInline.call( this, recognizer );
|
|
318
323
|
|
|
319
324
|
recognizer.message( 'syntax-fragile-ident', token, { id: token.text, delimited: token.text },
|
|
320
325
|
'$(ID) is a reserved name here - write $(DELIMITED) instead if you want to use it' );
|
|
@@ -344,8 +349,12 @@ function intervalSetToArray( recognizer, expected, excludesForNextToken ) {
|
|
|
344
349
|
for (let j = v.start; j < v.stop; j++) {
|
|
345
350
|
// a generic keyword as such does not appear in messages, only its replacements,
|
|
346
351
|
// which are function name and argument position dependent:
|
|
347
|
-
if (j === pc.
|
|
348
|
-
names.push( ...recognizer.$genericKeywords.
|
|
352
|
+
if (j === pc.GenericExpr)
|
|
353
|
+
names.push( ...recognizer.$genericKeywords.expr );
|
|
354
|
+
else if (j === pc.GenericSeparator)
|
|
355
|
+
names.push( ...recognizer.$genericKeywords.separator );
|
|
356
|
+
else if (j === pc.GenericIntro)
|
|
357
|
+
names.push( ...recognizer.$genericKeywords.introMsg );
|
|
349
358
|
// other expected tokens usually appear in messages, except the helper tokens
|
|
350
359
|
// which are used to solve ambiguities via the parser method setLocalToken():
|
|
351
360
|
else if (j !== pc.HelperToken1 && j !== pc.HelperToken2)
|
|
@@ -362,6 +371,9 @@ function intervalSetToArray( recognizer, expected, excludesForNextToken ) {
|
|
|
362
371
|
else if (names.includes("';'")) {
|
|
363
372
|
names = names.filter( n => n !== "'}'" );
|
|
364
373
|
}
|
|
374
|
+
else if (names.includes("'?'")) {
|
|
375
|
+
names = names.filter( n => n !== "'?'" );
|
|
376
|
+
}
|
|
365
377
|
names.sort( (a, b) => (tokenPrecedence(a) < tokenPrecedence(b) ? -1 : 1) );
|
|
366
378
|
return names;
|
|
367
379
|
}
|
|
@@ -421,10 +433,10 @@ function getExpectedTokensForMessage( recognizer, offendingToken, deadEnds ) {
|
|
|
421
433
|
const hideAltsType = recognizer.constructor.HideAlternatives;
|
|
422
434
|
const beforeUnreserved = recognizer.constructor.Number;
|
|
423
435
|
if (!identType || !beforeUnreserved || beforeUnreserved + 2 > identType)
|
|
424
|
-
return intervalSetToArray( recognizer,
|
|
436
|
+
return intervalSetToArray( recognizer, this._super.getExpectedTokens.call( this, recognizer ) );
|
|
425
437
|
|
|
426
438
|
const ll1 = new antlr4_LL1Analyzer(atn);
|
|
427
|
-
const expected = new IntervalSet
|
|
439
|
+
const expected = new IntervalSet();
|
|
428
440
|
const orig_addInterval = expected.addInterval;
|
|
429
441
|
const orig_addSet = expected.addSet;
|
|
430
442
|
expected.addInterval = addInterval;
|
|
@@ -485,7 +497,7 @@ function getExpectedTokensForMessage( recognizer, offendingToken, deadEnds ) {
|
|
|
485
497
|
}
|
|
486
498
|
|
|
487
499
|
function addRange( interval, start, stop ) {
|
|
488
|
-
orig_addInterval.call( interval, new
|
|
500
|
+
orig_addInterval.call( interval, new Interval( start, stop || start + 1 ) );
|
|
489
501
|
}
|
|
490
502
|
}
|
|
491
503
|
|