UNPKG

iproto

Version:

904 lines (889 loc) 99.9 kB
import path from 'node:path'; import { globby } from 'globby'; import { URI, AbstractAstReflection, AstUtils, inject, loadGrammarFromJson, DefaultScopeProvider, EMPTY_SCOPE, DefaultScopeComputation, interruptAndCheck, Cancellation, DefaultWorkspaceManager } from 'langium'; import { NodeFileSystem } from 'langium/node'; import { DiagnosticSeverity, CompletionItemKind, SemanticTokenTypes } from 'vscode-languageserver'; import { createDefaultSharedModule, createDefaultModule, AbstractFormatter, Formatting, DefaultCompletionProvider, AstNodeHoverProvider, AbstractSemanticTokenProvider } from 'langium/lsp'; import { Decimal } from 'decimal.js'; import { RegExpParser } from 'regexpp'; var __defProp = Object.defineProperty; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var BUILTIN_LIBRARY = ` module Builtin scalar Float.[ const:float lt:float gt:float lte:float gte:float positive: boolean nonnegative: boolean negative: boolean nonpositive: boolean ] scalar Int.[ const:int lt:int gt:int lte:int gte:int positive: boolean nonnegative: boolean negative: boolean nonpositive: boolean ] scalar String.[ const:string max:int min:int length:int nonempty:boolean pattern:string email:boolean uuid:boolean prefix:string suffix:string url:boolean nanoid:boolean ] scalar Boolean.[ const:boolean ] scalar Binary.[ min:int min_kb:float min_mb:float max:int max_kb:float max_mb:float nonempty:boolean ] scalar Time scalar List<T>.[ max:int min:int length:int nonempty:boolean ] scalar Dictionary<T>.[ max:int min:int size:int nonempty:boolean ] scalar Union<A B ...> directive Deprecated(reason?:string) directive Optional on field directive Relaxed on struct exception directive Incremental on enum `; var BUILTIN_LIBRARY_URI = URI.parse("iproto:///builtin.iproto").toString(); var Declaration = "Declaration"; function isDeclaration(item) { return reflection.isInstance(item, Declaration); } var Importable = "Importable"; function isImportable(item) { return reflection.isInstance(item, Importable); } var LiteralValue = "LiteralValue"; function isLiteralValue(item) { return reflection.isInstance(item, LiteralValue); } var Type = "Type"; function isType(item) { return reflection.isInstance(item, Type); } var Alias = "Alias"; function isAlias(item) { return reflection.isInstance(item, Alias); } var BooleanLiteral = "BooleanLiteral"; var Directive = "Directive"; function isDirective(item) { return reflection.isInstance(item, Directive); } var DirectiveParameter = "DirectiveParameter"; function isDirectiveParameter(item) { return reflection.isInstance(item, DirectiveParameter); } var Endpoint = "Endpoint"; function isEndpoint(item) { return reflection.isInstance(item, Endpoint); } var Enum = "Enum"; function isEnum(item) { return reflection.isInstance(item, Enum); } var EnumMember = "EnumMember"; function isEnumMember(item) { return reflection.isInstance(item, EnumMember); } var Exception = "Exception"; function isException(item) { return reflection.isInstance(item, Exception); } var Field = "Field"; function isField(item) { return reflection.isInstance(item, Field); } var File = "File"; var Import = "Import"; function isImport(item) { return reflection.isInstance(item, Import); } var ImportMember = "ImportMember"; function isImportMember(item) { return reflection.isInstance(item, ImportMember); } var Module = "Module"; function isModule(item) { return reflection.isInstance(item, Module); } var NumberLiteral = "NumberLiteral"; var ReferenceDirective = "ReferenceDirective"; function isReferenceDirective(item) { return reflection.isInstance(item, ReferenceDirective); } var ReferenceDirectiveArgument = "ReferenceDirectiveArgument"; function isReferenceDirectiveArgument(item) { return reflection.isInstance(item, ReferenceDirectiveArgument); } var ReferenceType = "ReferenceType"; function isReferenceType(item) { return reflection.isInstance(item, ReferenceType); } var ReferenceTypeOption = "ReferenceTypeOption"; function isReferenceTypeOption(item) { return reflection.isInstance(item, ReferenceTypeOption); } var Scalar = "Scalar"; function isScalar(item) { return reflection.isInstance(item, Scalar); } var ScalarOption = "ScalarOption"; function isScalarOption(item) { return reflection.isInstance(item, ScalarOption); } var ScalarParameter = "ScalarParameter"; var StringLiteral = "StringLiteral"; var Struct = "Struct"; function isStruct(item) { return reflection.isInstance(item, Struct); } var IprotoAstReflection = class extends AbstractAstReflection { getAllTypes() { return [Alias, BooleanLiteral, Declaration, Directive, DirectiveParameter, Endpoint, Enum, EnumMember, Exception, Field, File, Import, ImportMember, Importable, LiteralValue, Module, NumberLiteral, ReferenceDirective, ReferenceDirectiveArgument, ReferenceType, ReferenceTypeOption, Scalar, ScalarOption, ScalarParameter, StringLiteral, Struct, Type]; } computeIsSubtype(subtype, supertype) { switch (subtype) { case Alias: case Enum: case Scalar: case Struct: { return this.isSubtype(Declaration, supertype) || this.isSubtype(Type, supertype); } case BooleanLiteral: case NumberLiteral: case StringLiteral: { return this.isSubtype(LiteralValue, supertype); } case Directive: { return this.isSubtype(Declaration, supertype) || this.isSubtype(Importable, supertype); } case Endpoint: case Exception: case Import: { return this.isSubtype(Declaration, supertype); } case Type: { return this.isSubtype(Importable, supertype); } default: { return false; } } } getReferenceType(refInfo) { const referenceId = `${refInfo.container.$type}:${refInfo.property}`; switch (referenceId) { case "Import:target": { return Module; } case "ImportMember:target": { return Importable; } case "ReferenceDirective:target": { return Directive; } case "ReferenceDirectiveArgument:target": { return DirectiveParameter; } case "ReferenceType:target": { return Type; } case "ReferenceTypeOption:target": { return ScalarOption; } default: { throw new Error(`${referenceId} is not a valid reference id.`); } } } getTypeMetaData(type) { switch (type) { case Alias: { return { name: Alias, properties: [ { name: "name" }, { name: "type" } ] }; } case BooleanLiteral: { return { name: BooleanLiteral, properties: [ { name: "value", defaultValue: false } ] }; } case Directive: { return { name: Directive, properties: [ { name: "locations", defaultValue: [] }, { name: "name" }, { name: "parameters", defaultValue: [] } ] }; } case DirectiveParameter: { return { name: DirectiveParameter, properties: [ { name: "name" }, { name: "optional", defaultValue: false }, { name: "type" } ] }; } case Endpoint: { return { name: Endpoint, properties: [ { name: "directives", defaultValue: [] }, { name: "input" }, { name: "name" }, { name: "output" } ] }; } case Enum: { return { name: Enum, properties: [ { name: "directives", defaultValue: [] }, { name: "members", defaultValue: [] }, { name: "name" } ] }; } case EnumMember: { return { name: EnumMember, properties: [ { name: "directives", defaultValue: [] }, { name: "name" } ] }; } case Exception: { return { name: Exception, properties: [ { name: "directives", defaultValue: [] }, { name: "fields", defaultValue: [] }, { name: "name" } ] }; } case Field: { return { name: Field, properties: [ { name: "directives", defaultValue: [] }, { name: "name" }, { name: "type" } ] }; } case File: { return { name: File, properties: [ { name: "declaraions", defaultValue: [] }, { name: "module" } ] }; } case Import: { return { name: Import, properties: [ { name: "members", defaultValue: [] }, { name: "target" } ] }; } case ImportMember: { return { name: ImportMember, properties: [ { name: "name" }, { name: "target" } ] }; } case Module: { return { name: Module, properties: [ { name: "directives", defaultValue: [] }, { name: "name" } ] }; } case NumberLiteral: { return { name: NumberLiteral, properties: [ { name: "value" } ] }; } case ReferenceDirective: { return { name: ReferenceDirective, properties: [ { name: "arguments", defaultValue: [] }, { name: "target" } ] }; } case ReferenceDirectiveArgument: { return { name: ReferenceDirectiveArgument, properties: [ { name: "target" }, { name: "value" } ] }; } case ReferenceType: { return { name: ReferenceType, properties: [ { name: "arguments", defaultValue: [] }, { name: "options", defaultValue: [] }, { name: "target" } ] }; } case ReferenceTypeOption: { return { name: ReferenceTypeOption, properties: [ { name: "target" }, { name: "value" } ] }; } case Scalar: { return { name: Scalar, properties: [ { name: "directives", defaultValue: [] }, { name: "ellipsis", defaultValue: false }, { name: "name" }, { name: "options", defaultValue: [] }, { name: "parameters", defaultValue: [] } ] }; } case ScalarOption: { return { name: ScalarOption, properties: [ { name: "name" }, { name: "type" } ] }; } case ScalarParameter: { return { name: ScalarParameter, properties: [ { name: "name" } ] }; } case StringLiteral: { return { name: StringLiteral, properties: [ { name: "value" } ] }; } case Struct: { return { name: Struct, properties: [ { name: "directives", defaultValue: [] }, { name: "fields", defaultValue: [] }, { name: "mixins", defaultValue: [] }, { name: "name" } ] }; } default: { return { name: type, properties: [] }; } } } }; var reflection = new IprotoAstReflection(); var loadedIprotoGrammar; var IprotoGrammar = () => loadedIprotoGrammar != null ? loadedIprotoGrammar : loadedIprotoGrammar = loadGrammarFromJson('{"$type":"Grammar","isDeclared":true,"name":"Iproto","rules":[{"$type":"ParserRule","name":"File","entry":true,"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"module","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"declaraions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Declaration","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RegularName","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RegularDeclarationName","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Keyword","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"module"},{"$type":"Keyword","value":"use"},{"$type":"Keyword","value":"as"},{"$type":"Keyword","value":"directive"},{"$type":"Keyword","value":"on"},{"$type":"Keyword","value":"scalar"},{"$type":"Keyword","value":"enum"},{"$type":"Keyword","value":"struct"},{"$type":"Keyword","value":"with"},{"$type":"Keyword","value":"alias"},{"$type":"Keyword","value":"endpoint"},{"$type":"Keyword","value":"exception"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Module","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"Keyword","value":"module"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Import","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"use"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Import\\n */"},{"$type":"ParserRule","name":"ImportMember","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@0"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Keyword","value":"as"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ImportBody","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"::"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"members","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Directive","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"directive"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Directive\\n */"},{"$type":"ParserRule","name":"DirectiveParameter","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Assignment","feature":"optional","operator":"?=","terminal":{"$type":"Keyword","value":"?"},"cardinality":"?"},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectiveLocation","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"module"},{"$type":"Keyword","value":"scalar"},{"$type":"Keyword","value":"enum"},{"$type":"Keyword","value":"variant"},{"$type":"Keyword","value":"struct"},{"$type":"Keyword","value":"field"},{"$type":"Keyword","value":"exception"},{"$type":"Keyword","value":"endpoint"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectiveParameters","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"parameters","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectiveLocations","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"on"},{"$type":"Assignment","feature":"locations","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"+"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Scalar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"Keyword","value":"scalar"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Scalar\\n */"},{"$type":"ParserRule","name":"ScalarParameter","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ScalarOption","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ScalarOptions","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"."},{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ScalarParameters","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"<"},{"$type":"Assignment","feature":"parameters","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"ellipsis","operator":"?=","terminal":{"$type":"Keyword","value":"..."},"cardinality":"?"},{"$type":"Keyword","value":">"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Enum","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"Keyword","value":"enum"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Enum\\n */"},{"$type":"ParserRule","name":"EnumMember","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EnumMembers","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"members","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Field","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Field\\n */"},{"$type":"ParserRule","name":"Struct","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"Keyword","value":"struct"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Struct\\n */"},{"$type":"ParserRule","name":"Alias","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"alias"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Alias\\n */"},{"$type":"ParserRule","name":"StructMixins","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"mixins","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]},"cardinality":"+"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StructFields","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"fields","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Exception","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"Keyword","value":"exception"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Exception\\n */"},{"$type":"ParserRule","name":"ExceptionFields","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"fields","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Endpoint","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"Keyword","value":"endpoint"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"input","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":")"},{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"output","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Endpoint\\n */"},{"$type":"ParserRule","name":"ReferenceType","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * ReferenceType\\n */"},{"$type":"ParserRule","name":"ReferenceTypeOption","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@16"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ReferenceTypeArguments","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"<"},{"$type":"Assignment","feature":"arguments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":">"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ReferenceTypeOptions","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"."},{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ReferenceDirective","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"#"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@9"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * ReferenceDirective\\n */"},{"$type":"ParserRule","name":"ReferenceDirectiveArgument","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@10"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ReferenceDirectiveArguments","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"arguments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ReferenceDirectives","fragment":true,"definition":{"$type":"Assignment","feature":"directives","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[]},"cardinality":"*"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StringLiteral","definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Literal\\n */"},{"$type":"ParserRule","name":"BooleanLiteral","definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NumberLiteral","definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LiteralValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LiteralValueType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"int"},{"$type":"Keyword","value":"float"},{"$type":"Keyword","value":"boolean"},{"$type":"Keyword","value":"string"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/\\\\s+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"ML_COMMENT","definition":{"$type":"RegexToken","regex":"/--[\\\\s\\\\S]*?--/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SL_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"(\\\\\\\\.|[^\\"\\\\\\\\])*\\"/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/-?\\\\d+(\\\\.\\\\d+)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/true|false/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IDENTIFIER","definition":{"$type":"RegexToken","regex":"/[a-zA-Z][a-zA-Z0-9_]*/"},"fragment":false,"hidden":false}],"types":[{"$type":"Type","name":"Importable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@9"}}]}},{"$type":"Type","name":"Type","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@14"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@19"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}}]}}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"interfaces":[],"usedGrammars":[]}'); // src/language/generated/module.ts var IprotoLanguageMetaData = { languageId: "iproto", fileExtensions: [".iproto"], caseInsensitive: false, mode: "production" }; var IprotoGeneratedSharedModule = { AstReflection: () => new IprotoAstReflection() }; var IprotoGeneratedModule = { Grammar: () => IprotoGrammar(), LanguageMetaData: () => IprotoLanguageMetaData, parser: {} }; var IprotoCompletionProvider = class extends DefaultCompletionProvider { constructor(services) { super(services); this.commentProvider = services.documentation.CommentProvider; this.completionOptions = { triggerCharacters: [":", "#", "<"] }; } completionForReferenceTypeOption(context, next, acceptor) { const node = context.node; if (isReferenceTypeOption(node)) { const property = "target"; const refInfo = { reference: { $refText: "" }, container: node, property }; for (const element of this.scopeProvider.getScope(refInfo).getAllElements()) { if (isScalarOption(element.node)) { let insertText = element.node.name; if (element.node.type === "int" || element.node.type === "float") { insertText += ":0"; } if (element.node.type === "string") { insertText += `:""`; } if (element.node.type === "boolean") { insertText += ":true"; } acceptor(context, { label: element.name, labelDetails: { description: `${element.node.type}` }, kind: CompletionItemKind.Field, documentation: this.formatComment(element.node), insertText }); } } return; } } completionForReferenceDirective(context, next, acceptor) { const node = context.node; if (isReferenceDirective(node)) { const property = "target"; const refInfo = { reference: { $refText: "" }, container: node, property }; for (const element of this.scopeProvider.getScope(refInfo).getAllElements()) { if (isDirective(element.node)) { acceptor(context, { label: element.name, labelDetails: { description: `on ${element.node.locations.join(" | ").trim()}` }, kind: CompletionItemKind.Field, documentation: this.formatComment(element.node) }); } } return; } } completionForReferenceDirectiveArgument(context, next, acceptor) { const node = context.node; if (isReferenceDirectiveArgument(node)) { const property = "target"; const refInfo = { reference: { $refText: "" }, container: node, property }; for (const element of this.scopeProvider.getScope(refInfo).getAllElements()) { if (isDirectiveParameter(element.node)) { let insertText = element.node.name; if (element.node.type === "int" || element.node.type === "float") { insertText += ":0"; } if (element.node.type === "string") { insertText += `:""`; } if (element.node.type === "boolean") { insertText += ":true"; } acceptor(context, { label: element.name, labelDetails: { description: `${element.node.type}${element.node.optional ? "?" : ""}` }, kind: CompletionItemKind.Field, documentation: this.formatComment(element.node), insertText }); } } return; } } completionForReferenceType(context, next, acceptor) { const node = context.node; if (isReferenceType(node)) { const property = "target"; const refInfo = { reference: { $refText: "" }, container: node, property }; for (const element of this.scopeProvider.getScope(refInfo).getAllElements()) { if (isType(element.node)) { acceptor(context, { label: element.name, labelDetails: { description: element.node.$type }, kind: CompletionItemKind.Field, documentation: this.formatComment(element.node) }); } } return; } } completionForImport(context, next, acceptor) { const node = context.node; if (isImport(node)) { const property = "target"; const refInfo = { reference: { $refText: "" }, container: node, property }; for (const element of this.scopeProvider.getScope(refInfo).getAllElements()) { if (isModule(element.node)) { acceptor(context, { label: element.name, labelDetails: { description: element.node.$type }, kind: CompletionItemKind.Field, documentation: this.formatComment(element.node) }); } } return; } } completionForImportMember(context, next, acceptor) { const node = context.node; if (isImportMember(node)) { const property = "target"; const refInfo = { reference: { $refText: "" }, container: node, property }; for (const element of this.scopeProvider.getScope(refInfo).getAllElements()) { if (isImportable(element.node)) { acceptor(context, { label: element.name, labelDetails: { description: element.node.$type }, kind: CompletionItemKind.Field, documentation: this.formatComment(element.node) }); } } return; } } formatComment(node) { const contents = { kind: "markdown", value: "" }; this.documentationProvider.getDocumentation(node); const comment = this.commentProvider.getComment(node); if (comment) { return { kind: "markdown", value: comment.substring(2, comment.length - 2).trim() }; } return contents; } completionForCrossReference(context, next, acceptor) { const node = context.node; if (!node) { return super.completionForCrossReference(context, next, acceptor); } if (isReferenceTypeOption(node)) { this.completionForReferenceTypeOption(context, next, acceptor); } else if (isReferenceDirective(node)) { this.completionForReferenceDirective(context, next, acceptor); } else if (isReferenceDirectiveArgument(node)) { this.completionForReferenceDirectiveArgument(context, next, acceptor); } else if (isReferenceType(node)) { this.completionForReferenceType(context, next, acceptor); } else if (isImport(node)) { this.completionForImport(context, next, acceptor); } else if (isImportMember(node)) { this.completionForImportMember(context, next, acceptor); } } completionForKeyword(context, keyword, acceptor) { if (isDeclaration(context.node)) { for (const keyword2 of ["use", "directive", "scalar", "enum", "struct", "service", "exception", "alias"]) { acceptor(context, { label: keyword2, kind: CompletionItemKind.Keyword }); } return; } return super.completionForKeyword(context, keyword, acceptor); } completionFor(context, next, acceptor) { return super.completionFor(context, next, acceptor); } }; var IprotoFormatter = class extends AbstractFormatter { constructor(services) { super(); this.grammarConfig = () => services.parser.GrammarConfig; } formatDirectives(node) { const formatter = this.getNodeFormatter(node); node.directives.map((directive, index) => { if (index !== 0) { formatter.node(directive).prepend(Formatting.oneSpace()); } else { formatter.node(directive).prepend(Formatting.noIndent()); } }); } formatModule(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("module").prepend(Formatting.noIndent()).append(Formatting.oneSpace()); formatter.property("name").append(Formatting.newLines(2)); this.formatDirectives(node); } formatImport(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("use").prepend(Formatting.noIndent()).append(Formatting.oneSpace()); formatter.property("target").append(Formatting.noSpace()); formatter.keyword("::").surround(Formatting.noSpace()); formatter.keyword("{").append(Formatting.oneSpace()); formatter.keyword("}").prepend(Formatting.oneSpace()); formatter.nodes(...node.members).surround(Formatting.oneSpace()); } formatImportMember(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("as").surround(Formatting.oneSpace()); } formatScalar(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("scalar").prepend(Formatting.noIndent()).append(Formatting.oneSpace()); formatter.keywords("<", ".", "[").surround(Formatting.noSpace()); formatter.keywords(">", "]").prepend(Formatting.noSpace()); formatter.keyword("...").prepend(Formatting.oneSpace()); node.parameters.map((node2, index) => { if (index !== 0) { formatter.node(node2).prepend(Formatting.oneSpace()); } }); node.options.map((node2, index) => { if (index !== 0) { formatter.node(node2).prepend(Formatting.oneSpace()); } }); this.formatDirectives(node); } formatScalarOption(node) { const formatter = this.getNodeFormatter(node); formatter.keyword(":").surround(Formatting.noSpace()); } formatEnum(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("enum").prepend(Formatting.noIndent()).append(Formatting.oneSpace()); formatter.property("name").append(Formatting.oneSpace()); const bracesOpen = formatter.keyword("{"); const bracesClose = formatter.keyword("}").prepend(Formatting.newLine()); formatter.interior(bracesOpen, bracesClose).prepend(Formatting.indent()); this.formatDirectives(node); } formatEnumMember(node) { this.formatDirectives(node); } formatStruct(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("struct").prepend(Formatting.noIndent()).append(Formatting.oneSpace()); formatter.properties("name").append(Formatting.oneSpace()); formatter.keyword("with").append(Formatting.oneSpace()); node.mixins.map((node2) => { formatter.node(node2).append(Formatting.oneSpace()); }); const bracesOpen = formatter.keyword("{"); const bracesClose = formatter.keyword("}").prepend(Formatting.newLine()); formatter.interior(bracesOpen, bracesClose).prepend(Formatting.indent()); this.formatDirectives(node); } formatException(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("exception").prepend(Formatting.noIndent()).append(Formatting.oneSpace()); formatter.property("name").append(Formatting.oneSpace()); const bracesOpen = formatter.keyword("{"); const bracesClose = formatter.keyword("}").prepend(Formatting.newLine()); formatter.interior(bracesOpen, bracesClose).prepend(Formatting.indent()); this.formatDirectives(node); } formatEndpoint(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("endpoint").prepend(Formatting.noIndent()).append(Formatting.oneSpace()); formatter.property("name").append(Formatting.noSpace()); formatter.keywords("(").surround(Formatting.noSpace()); formatter.keyword(")").prepend(Formatting.noSpace()); formatter.keyword(":").append(Formatting.oneSpace()).prepend(Formatting.noSpace()); this.formatDirectives(node); } formatDirective(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("directive").prepend(Formatting.noIndent()).append(Formatting.oneSpace()); formatter.keywords("on", "module", "scalar", "enum", "variant", "struct", "field", "exception", "endpoint").prepend(Formatting.oneSpace()); formatter.keyword("(").surround(Formatting.noSpace()); formatter.keyword(")").prepend(Formatting.noSpace()); node.parameters.map((node2, index) => { if (index !== 0) { formatter.node(node2).prepend(Formatting.oneSpace()); } }); } formatDirectiveParameter(node) { const formatter = this.getNodeFormatter(node); formatter.keywords(":", "?").surround(Formatting.noSpace()); } formatAlias(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("alias").prepend(Formatting.noIndent()).append(Formatting.oneSpace()); formatter.property("name").append(Formatting.oneSpace()); } formatReferenceType(node) { const formatter = this.getNodeFormatter(node); formatter.keywords("<", ".", "[").surround(Formatting.noSpace()); formatter.keywords(">", "]").prepend(Formatting.noSpace()); node.arguments.map((node2, index) => { if (index !== 0) { formatter.node(node2).prepend(Formatting.oneSpace()); } }); node.options.map((node2, index) => { if (index !== 0) { formatter.node(node2).prepend(Formatting.oneSpace()); } }); } formatReferenceTypeOption(node) { const formatter = this.getNodeFormatter(node); formatter.keyword(":").surround(Formatting.noSpace()); } formatReferenceDirective(node) { const formatter = this.getNodeFormatter(node); formatter.keyword("#").append(Formatting.noSpace()); formatter.keyword("(").surround(Formatting.noSpace()); formatter.keyword(")").prepend(Formatting.noSpace()); node.arguments.map((node2, index) => { if (index !== 0) { formatter.node(node2).prepend(Formatting.oneSpace()); } }); } formatReferenceDirectiveArgument(node) { const formatter = this.getNodeFormatter(node); formatter.keyword(":").surround(Formatting.noSpace()); } formatField(node) { const formatter = this.getNodeFormatter(node); const siblings = node.$container.fields; const max = Math.max(...siblings.map((node2) => node2.name.length)); formatter.property("name").append(Formatting.spaces(max + 1 - node.name.length)); } format(node) { if (isModule