/// <reference path="../../../src/@types/output.d.ts" />
/// <reference path="../../../src/@types/parameter.d.ts" />
/// <reference path="../../../src/@types/common.d.ts" />
/// <reference path="../../../src/@types/decorator.d.ts" />
/// <reference path="../../../src/@types/expression.d.ts" />
/// <reference path="../../../src/@types/literal.d.ts" />
/// <reference path="../../../src/@types/module.d.ts" />
/// <reference path="../../../src/@types/property.d.ts" />
/// <reference path="../../../src/@types/statement.d.ts" />
/// <reference path="../../../src/@types/type.d.ts" />
import { BinaryOperatorToken, Expression, BinaryExpression, ObjectLiteralExpression, VariableDeclaration, PropertyDeclaration, Identifier, Block, Statement, EnumDeclaration, CallExpression, NodeFlags, NodeArray } from 'typescript';
import type { FileLineInfo, Nullable, ST_Expression, ST_ExpressionStatement, ST_FunctionProperty, ST_Statement, ST_TypeDef, ST_TypeDefs, ST_VariableStatement } from 'SmartTS';
import { InterpreterBase } from './Base';
import { ST_BinaryToken, ST_ExpressionKind } from '../../enums/expression';
import { FrontendType } from '../../enums/type';
export default class StatementInterpreter extends InterpreterBase {
    visitBlock: (node: Block) => void;
    extractStatements: (statements: Statement[]) => ST_Statement[];
    extractBinaryOperator: (token: BinaryOperatorToken) => ST_BinaryToken;
    extractExpression: (expression: Expression, type?: ST_TypeDef | undefined) => ST_Expression;
    extractFunction: (expression: CallExpression) => ST_FunctionProperty | void;
    extractObjectLiteralExpression: (expression: ObjectLiteralExpression, type: ({
        type: FrontendType.TRecord;
        properties: ST_TypeDefs;
        layout?: import("SmartTS").ST_Layout | import("../../enums/expression").Layout | undefined;
    } & {
        line?: FileLineInfo | undefined;
    }) | ({
        type: FrontendType.TVariant;
        properties: ST_TypeDefs;
        layout?: import("SmartTS").ST_Layout | import("../../enums/expression").Layout | undefined;
    } & {
        line?: FileLineInfo | undefined;
    })) => Extract<ST_Expression, {
        kind: ST_ExpressionKind.ObjectLiteralExpression;
    }>;
    extractEnumExpression: (expression: EnumDeclaration, type: {
        type: FrontendType.TRecord;
        properties: ST_TypeDefs;
        layout?: import("SmartTS").ST_Layout | import("../../enums/expression").Layout | undefined;
    } & {
        line?: FileLineInfo | undefined;
    }) => Extract<ST_Expression, {
        kind: ST_ExpressionKind.ObjectLiteralExpression;
    }>;
    lookupIdentifierInScopes: (identifier: string, line: FileLineInfo) => Nullable<ST_Expression>;
    extractAccessExpression: (expression: Expression) => ST_Expression;
    extractBinaryExpression: (expression: BinaryExpression) => ST_ExpressionStatement;
    extractEnumDeclaration: (node: EnumDeclaration) => ST_VariableStatement;
    extractVariableInitializer: (node: VariableDeclaration | PropertyDeclaration, flags: NodeFlags) => ST_VariableStatement;
    /**
     * @description Deference type from scope
     * @param {string} propName Property name
     * @param {Node} Identifier Property reference
     * @returns {ST_VariableStatement} Property value
     */
    dereferencePropertyDeclaration: (propName: string, node: Identifier) => ST_VariableStatement;
    extractArgExpressions: (args: NodeArray<Expression>, inputTypes: ST_TypeDefs) => Record<string, ST_Expression>;
    resolveImpureLambdaStatements: (lambdaExpression: Extract<ST_Expression, {
        kind: ST_ExpressionKind.LambdaExpression;
    }>, args: NodeArray<Expression>, line: FileLineInfo) => ST_Expression;
}
