From c8d96e1eff9dadb573a424b3f8e6c0b453210ebc Mon Sep 17 00:00:00 2001 From: JG Date: Fri, 30 Jun 2023 22:45:11 +0100 Subject: [PATCH 1/2] fix: Validation errors when using true or false as prefix of id --- packages/language/src/generated/ast.ts | 16 ++++----- packages/language/src/generated/grammar.ts | 40 +++++++++++++-------- packages/schema/tests/schema/parser.test.ts | 13 +++++++ 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/packages/language/src/generated/ast.ts b/packages/language/src/generated/ast.ts index 7dd5c073c..e086b82e5 100644 --- a/packages/language/src/generated/ast.ts +++ b/packages/language/src/generated/ast.ts @@ -20,6 +20,12 @@ export function isAttributeName(item: unknown): item is AttributeName { return isDataModelAttributeName(item) || isDataModelFieldAttributeName(item) || isInternalAttributeName(item); } +export type Boolean = boolean; + +export function isBoolean(item: unknown): item is Boolean { + return typeof item === 'boolean'; +} + export type BuiltinType = 'BigInt' | 'Boolean' | 'Bytes' | 'DateTime' | 'Decimal' | 'Float' | 'Int' | 'Json' | 'String'; export function isBuiltinType(item: unknown): item is BuiltinType { @@ -422,7 +428,7 @@ export function isInvocationExpr(item: unknown): item is InvocationExpr { export interface LiteralExpr extends AstNode { readonly $container: Argument | ArrayExpr | AttributeArg | BinaryExpr | DataSourceField | FieldInitializer | FunctionDecl | GeneratorField | MemberAccessExpr | PluginField | UnaryExpr | UnsupportedFieldType; readonly $type: 'LiteralExpr'; - value: boolean | number | string + value: Boolean | number | string } export const LiteralExpr = 'LiteralExpr'; @@ -856,14 +862,6 @@ export class ZModelAstReflection extends AbstractAstReflection { ] }; } - case 'LiteralExpr': { - return { - name: 'LiteralExpr', - mandatory: [ - { name: 'value', type: 'boolean' } - ] - }; - } case 'Model': { return { name: 'Model', diff --git a/packages/language/src/generated/grammar.ts b/packages/language/src/generated/grammar.ts index 03814f026..7561db187 100644 --- a/packages/language/src/generated/grammar.ts +++ b/packages/language/src/generated/grammar.ts @@ -565,7 +565,7 @@ export const ZModelGrammar = (): Grammar => loadedZModelGrammar ?? (loadedZModel { "$type": "RuleCall", "rule": { - "$ref": "#/rules@56" + "$ref": "#/rules@55" }, "arguments": [] }, @@ -3258,28 +3258,38 @@ export const ZModelGrammar = (): Grammar => loadedZModelGrammar ?? (loadedZModel "wildcard": false }, { - "$type": "TerminalRule", - "hidden": true, - "name": "WS", + "$type": "ParserRule", + "name": "Boolean", + "dataType": "boolean", "definition": { - "$type": "RegexToken", - "regex": "\\\\s+" + "$type": "Alternatives", + "elements": [ + { + "$type": "Keyword", + "value": "true" + }, + { + "$type": "Keyword", + "value": "false" + } + ] }, - "fragment": false + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false }, { "$type": "TerminalRule", - "name": "BOOLEAN", - "type": { - "$type": "ReturnType", - "name": "boolean" - }, + "hidden": true, + "name": "WS", "definition": { "$type": "RegexToken", - "regex": "true|false" + "regex": "\\\\s+" }, - "fragment": false, - "hidden": false + "fragment": false }, { "$type": "TerminalRule", diff --git a/packages/schema/tests/schema/parser.test.ts b/packages/schema/tests/schema/parser.test.ts index 92240c255..c9230ae1f 100644 --- a/packages/schema/tests/schema/parser.test.ts +++ b/packages/schema/tests/schema/parser.test.ts @@ -496,4 +496,17 @@ describe('Parsing Tests', () => { `; await loadModel(content, false); }); + + it('boolean prefix id', async () => { + const content = ` + model trueModel { + id String @id + isPublic Boolean @default(false) + trueText String? + falseText String? + @@allow('all', isPublic == true) + } + `; + await loadModel(content, false); + }); }); From 129a564d4e41ca412edfb0597991d58a3aea265f Mon Sep 17 00:00:00 2001 From: JG Date: Fri, 30 Jun 2023 22:47:32 +0100 Subject: [PATCH 2/2] fix --- packages/language/src/zmodel.langium | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/language/src/zmodel.langium b/packages/language/src/zmodel.langium index a06bd120e..89cdfa8ee 100644 --- a/packages/language/src/zmodel.langium +++ b/packages/language/src/zmodel.langium @@ -39,7 +39,7 @@ Expression: LogicalExpr; LiteralExpr: - value=(BOOLEAN | NUMBER | STRING); + value=(Boolean | NUMBER | STRING); ArrayExpr: '[' (items+=Expression (',' items+=Expression)*)? ']'; @@ -255,8 +255,10 @@ ExpressionType returns string: BuiltinType returns string: 'String' | 'Boolean' | 'Int' | 'BigInt' | 'Float' | 'Decimal' | 'DateTime' | 'Json' | 'Bytes'; +Boolean returns boolean: + 'true' | 'false'; + hidden terminal WS: /\s+/; -terminal BOOLEAN returns boolean: /true|false/; terminal NULL: 'null'; terminal THIS: 'this'; terminal ID: /[_a-zA-Z][\w_]*/;