@language Bolt; @language JS; node EndOfFile > BoltToken, JSToken; node Token; node SourceFile; // Bolt language AST definitions type BoltValue = Integer | bool | String; node FunctionBody; node BoltToken > Token; node BoltStringLiteral > BoltToken { value: String, } node BoltIntegerLiteral > BoltToken { value: Int, } node BoltSymbol > BoltToken; node BoltIdentifier > BoltSymbol { text: String, } node BoltOperatorLike > BoltSymbol; node BoltOperator > BoltSymbol { text: String, } node BoltAssignment > BoltToken { operator: Option, } node BoltComma > BoltToken; node BoltSemi > BoltToken; node BoltColon > BoltToken; node BoltColonColon > BoltToken; node BoltDot > BoltToken; node BoltDotDot > BoltToken; node BoltRArrow > BoltToken; node BoltRArrowAlt > BoltToken; node BoltLArrow > BoltToken; node BoltEqSign > BoltToken; node BoltGtSign > BoltToken, BoltOperatorLike; node BoltExMark > BoltToken, BoltOperatorLike; node BoltLtSign > BoltToken, BoltOperatorLike; node BoltVBar > BoltToken, BoltOperatorLike; node BoltKeyword; node BoltWhereKeyword > BoltToken, BoltKeyword; node BoltQuoteKeyword > BoltToken, BoltKeyword; node BoltFnKeyword > BoltToken, BoltKeyword; node BoltForeignKeyword > BoltToken, BoltKeyword; node BoltForKeyword > BoltToken, BoltKeyword; node BoltLetKeyword > BoltToken, BoltKeyword; node BoltReturnKeyword > BoltToken, BoltKeyword; node BoltLoopKeyword > BoltToken, BoltKeyword; node BoltYieldKeyword > BoltToken, BoltKeyword; node BoltMatchKeyword > BoltToken, BoltKeyword; node BoltImportKeyword > BoltToken, BoltKeyword; node BoltPubKeyword > BoltToken, BoltKeyword; node BoltModKeyword > BoltToken, BoltKeyword; node BoltMutKeyword > BoltToken, BoltKeyword; node BoltEnumKeyword > BoltToken, BoltKeyword; node BoltStructKeyword > BoltToken, BoltKeyword; node BoltTypeKeyword > BoltToken, BoltKeyword; node BoltTraitKeyword > BoltToken, BoltKeyword; node BoltImplKeyword > BoltToken, BoltKeyword; node BoltPunctuated > BoltToken { text: String, } node BoltParenthesized > BoltPunctuated; node BoltBraced > BoltPunctuated; node BoltBracketed > BoltPunctuated; node BoltSourceFile > SourceFile { elements: Vec, } node BoltQualName { modulePath: Option>, name: BoltSymbol, } node BoltTypeExpression; node BoltReferenceTypeExpression > BoltTypeExpression { name: BoltQualName, arguments: Option>, } node BoltFunctionTypeExpression > BoltTypeExpression { params: Vec, returnType: Option, } node BoltTypeParameter { index: usize, name: BoltIdentifier, defaultType: Option, } node BoltPattern; node BoltBindPattern > BoltPattern { name: BoltIdentifier, } node BoltTypePattern > BoltPattern { type: BoltTypeExpression, nestedPattern: BoltPattern, } node BoltExpressionPattern > BoltPattern { expression: BoltExpression, } node BoltTuplePatternElement { index: usize, pattern: BoltPattern, } node BoltTuplePattern > BoltPattern { elements: Vec, } node BoltRecordFieldPattern { isRest: bool, name: Option, pattern: Option, } node BoltRecordPattern > BoltPattern { name: BoltQualName, fields: Vec, } node BoltExpression; node BoltQuoteExpression > BoltExpression { tokens: Vec, } node BoltReferenceExpression > BoltExpression { name: BoltQualName, } node BoltMemberExpression > BoltExpression { expression: BoltExpression, path: Vec, } node BoltFunctionExpression > BoltExpression { params: Vec, returnType: Option, body: Vec, } node BoltCallExpression > BoltExpression { operator: BoltExpression, operands: Vec, } node BoltYieldExpression > BoltExpression { value: BoltExpression, } node BoltMatchArm { pattern: BoltPattern, body: BoltExpression, } node BoltMatchExpression > BoltExpression { value: BoltExpression, arms: Vec, } node BoltCase { test: BoltExpression, result: BoltExpression, } node BoltCaseExpression > BoltExpression { cases: Vec, } node BoltBlockExpression > BoltExpression { elements: Vec, } node BoltConstantExpression > BoltExpression { value: BoltValue, } node BoltStatement > BoltFunctionBodyElement, BoltSourceElement; node BoltReturnStatement > BoltStatement { value: Option, } node BoltConditionalCase { test: Option, body: Vec, } node BoltConditionalStatement > BoltStatement { cases: Vec, } node BoltResumeStatement > BoltStatement { value: BoltExpression, } node BoltExpressionStatement > BoltStatement { expression: BoltExpression, } node BoltParameter { index: usize, bindings: BoltPattern, type: Option, defaultValue: Option, } node BoltDeclaration > BoltSourceElement; node BoltTypeDeclaration > BoltSourceElement; enum BoltDeclarationModifiers { Mutable = 0x1, Public = 0x2, IsType = 0x4, IsForeign = 0x8, } node BoltModule > BoltDeclaration { modifiers: BoltDeclarationModifiers, name: BoltQualName, elements: Vec, } node BoltFunctionBodyElement; node BoltFunctionDeclaration > BoltFunctionBodyElement, BoltDeclaration { modifiers: BoltDeclarationModifiers, target: String, name: BoltSymbol, params: Vec, returnType: Option, typeParams: Option>, body: Vec, } node BoltVariableDeclaration > BoltFunctionBodyElement, BoltDeclaration { modifiers: BoltDeclarationModifiers, bindings: BoltPattern, type: Option, value: Option, } node BoltImportSymbol; node BoltPlainImportSymbol > BoltImportSymbol { name: BoltQualName, } node BoltImportDeclaration > BoltDeclaration { file: String, symbols: Vec, } node BoltTraitDeclaration > BoltDeclaration, BoltTypeDeclaration { modifiers: BoltDeclarationModifiers, name: BoltIdentifier, typeParams: Option>, elements: Vec, } node BoltImplDeclaration > BoltDeclaration { modifiers: BoltDeclarationModifiers, name: BoltIdentifier, trait: BoltTypeExpression, typeParams: Option>, elements: Vec, } node BoltTypeAliasDeclaration > BoltDeclaration, BoltTypeDeclaration { modifiers: BoltDeclarationModifiers, name: BoltIdentifier, typeParams: Option>, typeExpr: BoltTypeExpression, } node BoltRecordMember; node BoltRecordField > BoltRecordMember { name: BoltIdentifier, type: BoltTypeExpression, } node BoltRecordDeclaration > BoltDeclaration, BoltTypeDeclaration { modifiers: BoltDeclarationModifiers, name: BoltIdentifier, typeParms: Option>, members: Option>, } node BoltSourceElement; node BoltMacroCall > BoltRecordMember, BoltStatement, BoltDeclaration, BoltExpression { name: BoltIdentifier, text: String, } // JavaScript AST definitions type JSValue = Int | String | Bool | Void; node JSToken > Token; node JSOperator > JSToken { text: String, } node JSIdentifier > JSToken { text: String, } node JSString > JSToken { value: String, } node JSInteger > JSToken { value: Int, } node JSFromKeyword > JSToken; node JSReturnKeyword > JSToken; node JSTryKeyword > JSToken; node JSFinallyKeyword > JSToken; node JSCatchKeyword > JSToken; node JSImportKeyword > JSToken; node JSAsKeyword > JSToken; node JSConstKeyword > JSToken; node JSLetKeyword > JSToken; node JSExportKeyword > JSToken; node JSFunctionKeyword > JSToken; node JSWhileKeyword > JSToken; node JSForKeyword > JSToken; node JSCloseBrace > JSToken; node JSCloseBracket > JSToken; node JSCloseParen > JSToken; node JSOpenBrace > JSToken; node JSOpenBracket > JSToken; node JSOpenParen > JSToken; node JSSemi > JSToken; node JSComma > JSToken; node JSDot > JSToken; node JSDotDotDot > JSToken; node JSMulOp > JSToken; node JSAddOp > JSToken; node JSDivOp > JSToken; node JSSubOp > JSToken; node JSLtOp > JSToken; node JSGtOp > JSToken; node JSBOrOp > JSToken; node JSBXorOp > JSToken; node JSBAndOp > JSToken; node JSBNotOp > JSToken; node JSNotOp > JSToken; node JSPattern; node JSBindPattern > JSPattern { name: JSIdentifier, } node JSExpression; node JSConstantExpression > JSExpression { value: BoltValue, } node JSMemberExpression > JSExpression { value: JSExpression, property: JSIdentifier, } node JSCallExpression > JSExpression { operator: JSExpression, operands: Vec, } node JSBinaryExpression > JSExpression { left: JSExpression, operator: JSOperator, right: JSExpression, } node JSUnaryExpression > JSExpression { operator: JSOperator, operand: JSExpression } node JSNewExpression > JSExpression { target: JSExpression, arguments: Vec, } node JSSequenceExpression > JSExpression { expressions: Vec, } node JSConditionalExpression > JSExpression { test: JSExpression, consequent: JSExpression, alternate: JSExpression, } type JSValue = Int node JSLiteralExpression > JSExpression { value: JSValue, } node JSReferenceExpression > JSExpression { name: String, } node JSSourceElement; node JSFunctionBodyElement; node JSStatement > JSSourceElement, JSFunctionBodyElement; node JSCatchBlock { bindings: Option, elements: Vec, } node JSTryCatchStatement { tryBlock: Vec, catchBlock: Option, finalBlock: Option>, } node JSExpressionStatement > JSStatement { expression: JSExpression, } node JSConditionalCase { test: Option, body: Vec, } node JSConditionalStatement > JSStatement { cases: Vec, } node JSReturnStatement > JSStatement { value: Option, } node JSParameter { index: usize, bindings: JSPattern, defaultValue: Option, } node JSDeclaration > JSSourceElement; enum JSDeclarationModifiers { IsExported = 0x1, } node JSImportBinding; node JSImportStarBinding > JSImportBinding { local: JSIdentifier, } node JSImportAsBinding > JSImportBinding { remote: JSIdentifier, local: Option, } node JSImportDeclaration > JSDeclaration { bindings: Vec, filename: JSString, } node JSFunctionDeclaration > JSDeclaration, JSFunctionBodyElement { modifiers: JSDeclarationModifiers, name: JSIdentifier, params: Vec, body: Vec, } node JSArrowFunctionDeclaration > JSDeclaration, JSFunctionBodyElement { name: JSIdentifier, params: Vec, body: JSExpression, } node JSLetDeclaration > JSDeclaration, JSFunctionBodyElement { bindings: JSPattern, value: Option, } node JSSourceFile > SourceFile { elements: Vec, }