import { Token, Identifier, Location } from "../lexer"; import { BrsType, Argument, ValueKind, BrsString } from "../brsTypes"; import { Block } from "./Statement"; import { AstNode } from "./AstNode"; export interface Visitor { visitBinary(expression: Binary): T; visitCall(expression: Call): T; visitAnonymousFunction(func: Function): T; visitDottedGet(expression: DottedGet): T; visitIndexedGet(expression: IndexedGet): T; visitGrouping(expression: Grouping): T; visitLiteral(expression: Literal): T; visitArrayLiteral(expression: ArrayLiteral): T; visitAALiteral(expression: AALiteral): T; visitUnary(expression: Unary): T; visitVariable(expression: Variable): T; } /** A BrightScript expression */ export interface Expression extends AstNode { /** * Handles the enclosing `Expression` with `visitor`. * @param visitor the `Visitor` that will handle the enclosing `Expression` * @returns the BrightScript value resulting from evaluating the expression */ accept(visitor: Visitor): R; } export declare class Binary extends AstNode implements Expression { readonly left: Expression; readonly token: Token; readonly right: Expression; constructor(left: Expression, token: Token, right: Expression); accept(visitor: Visitor): R; get location(): { file: string; start: { line: number; column: number; }; end: { line: number; column: number; }; }; } export declare class Call extends AstNode implements Expression { readonly callee: Expression; readonly closingParen: Token; readonly args: Expression[]; readonly optional: boolean; static MaximumArguments: number; constructor(callee: Expression, closingParen: Token, args: Expression[], optional?: boolean); accept(visitor: Visitor): R; get location(): { file: string; start: { line: number; column: number; }; end: { line: number; column: number; }; }; } export declare class Function extends AstNode implements Expression { readonly parameters: Argument[]; readonly returns: ValueKind; readonly body: Block; readonly keyword: Token; readonly endKeyword: Token; constructor(parameters: Argument[], returns: ValueKind, body: Block, keyword: Token, endKeyword: Token); accept(visitor: Visitor): R; get location(): { file: string; start: { line: number; column: number; }; end: { line: number; column: number; }; }; } export declare class DottedGet extends AstNode implements Expression { readonly obj: Expression; readonly name: Identifier; readonly optional: boolean; constructor(obj: Expression, name: Identifier, optional?: boolean); accept(visitor: Visitor): R; get location(): { file: string; start: { line: number; column: number; }; end: { line: number; column: number; }; }; } export declare class IndexedGet extends AstNode implements Expression { readonly obj: Expression; readonly indexes: Expression[]; readonly closingSquare: Token; readonly optional: boolean; constructor(obj: Expression, indexes: Expression[], closingSquare: Token, optional?: boolean); accept(visitor: Visitor): R; get location(): { file: string; start: { line: number; column: number; }; end: { line: number; column: number; }; }; } export declare class Grouping extends AstNode implements Expression { readonly tokens: { left: Token; right: Token; }; readonly expression: Expression; constructor(tokens: { left: Token; right: Token; }, expression: Expression); accept(visitor: Visitor): R; get location(): { file: string; start: { line: number; column: number; }; end: { line: number; column: number; }; }; } export declare class Literal extends AstNode implements Expression { readonly value: BrsType; readonly _location: Location | undefined; constructor(value: BrsType, _location: Location | undefined); accept(visitor: Visitor): R; get location(): Location; } export declare class ArrayLiteral extends AstNode implements Expression { readonly elements: Expression[]; readonly open: Token; readonly close: Token; constructor(elements: Expression[], open: Token, close: Token); accept(visitor: Visitor): R; get location(): { file: string; start: { line: number; column: number; }; end: { line: number; column: number; }; }; } /** A member of an associative array literal. */ export interface AAMember { /** The name of the member. */ name: BrsString; /** The expression evaluated to determine the member's initial value. */ value: Expression; } export declare class AALiteral extends AstNode implements Expression { readonly elements: AAMember[]; readonly open: Token; readonly close: Token; constructor(elements: AAMember[], open: Token, close: Token); accept(visitor: Visitor): R; get location(): { file: string; start: { line: number; column: number; }; end: { line: number; column: number; }; }; } export declare class Unary extends AstNode implements Expression { readonly operator: Token; readonly right: Expression; constructor(operator: Token, right: Expression); accept(visitor: Visitor): R; get location(): { file: string; start: { line: number; column: number; }; end: { line: number; column: number; }; }; } export declare class Variable extends AstNode implements Expression { readonly name: Identifier; constructor(name: Identifier); accept(visitor: Visitor): R; get location(): Location; }