type ASTContext = { ctx: ASTCtx; }; export type ASTCtx = { from?: number; to?: number; } & Record; export type LuaBlock = { type: "Block"; statements: LuaStatement[]; } & ASTContext; // STATEMENTS export type LuaReturnStatement = { type: "Return"; expressions: LuaExpression[]; } & ASTContext; export type LuaStatement = | LuaSemicolonStatement | LuaLabelStatement | LuaBreakStatement | LuaGotoStatement | LuaReturnStatement | LuaBlock | LuaWhileStatement | LuaRepeatStatement | LuaIfStatement | LuaForStatement | LuaForInStatement | LuaFunctionStatement | LuaLocalFunctionStatement | LuaAssignmentStatement | LuaLocalStatement | LuaFunctionCallStatement; export type LuaSemicolonStatement = { type: "Semicolon"; } & ASTContext; export type LuaLabelStatement = { type: "Label"; name: string; } & ASTContext; export type LuaBreakStatement = { type: "Break"; } & ASTContext; export type LuaGotoStatement = { type: "Goto"; name: string; } & ASTContext; export type LuaWhileStatement = { type: "While"; condition: LuaExpression; block: LuaBlock; } & ASTContext; export type LuaRepeatStatement = { type: "Repeat"; block: LuaBlock; condition: LuaExpression; } & ASTContext; export type LuaIfStatement = { type: "If"; conditions: { condition: LuaExpression; block: LuaBlock }[]; elseBlock?: LuaBlock; } & ASTContext; export type LuaForStatement = { type: "For"; name: string; start: LuaExpression; end: LuaExpression; step?: LuaExpression; block: LuaBlock; } & ASTContext; export type LuaForInStatement = { type: "ForIn"; names: string[]; expressions: LuaExpression[]; block: LuaBlock; } & ASTContext; export type LuaFunctionStatement = { type: "Function"; name: LuaFunctionName; body: LuaFunctionBody; } & ASTContext; export type LuaLocalFunctionStatement = { type: "LocalFunction"; name: string; body: LuaFunctionBody; } & ASTContext; export type LuaFunctionName = { type: "FunctionName"; propNames: string[]; colonName?: string; } & ASTContext; export type LuaFunctionBody = { type: "FunctionBody"; parameters: string[]; block: LuaBlock; } & ASTContext; export type LuaAssignmentStatement = { type: "Assignment"; variables: LuaLValue[]; expressions: LuaExpression[]; } & ASTContext; export type LuaLValue = | LuaVariable | LuaPropertyAccessExpression | LuaTableAccessExpression; export type LuaLocalStatement = { type: "Local"; names: LuaAttName[]; expressions?: LuaExpression[]; } & ASTContext; export type LuaAttName = { type: "AttName"; name: string; attribute?: string; } & ASTContext; export type LuaFunctionCallStatement = { type: "FunctionCallStatement"; call: LuaFunctionCallExpression; } & ASTContext; // EXPRESSIONS export type LuaExpression = | LuaNilLiteral | LuaBooleanLiteral | LuaNumberLiteral | LuaStringLiteral | LuaPrefixExpression | LuaBinaryExpression | LuaUnaryExpression | LuaTableConstructor | LuaFunctionDefinition; export type LuaNilLiteral = { type: "Nil"; } & ASTContext; export type LuaBooleanLiteral = { type: "Boolean"; value: boolean; } & ASTContext; export type LuaNumberLiteral = { type: "Number"; value: number; } & ASTContext; export type LuaStringLiteral = { type: "String"; value: string; } & ASTContext; export type LuaPrefixExpression = | LuaVariableExpression | LuaParenthesizedExpression | LuaFunctionCallExpression; export type LuaParenthesizedExpression = { type: "Parenthesized"; expression: LuaExpression; } & ASTContext; export type LuaVariableExpression = | LuaVariable | LuaPropertyAccessExpression | LuaTableAccessExpression; export type LuaVariable = { type: "Variable"; name: string; } & ASTContext; export type LuaPropertyAccessExpression = { type: "PropertyAccess"; object: LuaPrefixExpression; property: string; } & ASTContext; export type LuaTableAccessExpression = { type: "TableAccess"; object: LuaPrefixExpression; key: LuaExpression; } & ASTContext; export type LuaFunctionCallExpression = { type: "FunctionCall"; prefix: LuaPrefixExpression; name?: string; args: LuaExpression[]; } & ASTContext; export type LuaBinaryExpression = { type: "Binary"; operator: string; left: LuaExpression; right: LuaExpression; } & ASTContext; export type LuaUnaryExpression = { type: "Unary"; operator: string; argument: LuaExpression; } & ASTContext; export type LuaTableConstructor = { type: "TableConstructor"; fields: LuaTableField[]; } & ASTContext; export type LuaTableField = | LuaDynamicField | LuaPropField | LuaExpressionField; export type LuaDynamicField = { type: "DynamicField"; key: LuaExpression; value: LuaExpression; } & ASTContext; export type LuaPropField = { type: "PropField"; key: string; value: LuaExpression; } & ASTContext; export type LuaExpressionField = { type: "ExpressionField"; value: LuaExpression; } & ASTContext; export type LuaFunctionDefinition = { type: "FunctionDefinition"; body: LuaFunctionBody; } & ASTContext;