import { ASTMain } from './ast';
import { SymbolTable } from './symtable';
import { SourceReader } from './reader';
export declare class Linter {
    private _symtable;
    private _enabledLinterChecks;
    constructor(symtable: SymbolTable);
    lint(ast: ASTMain): SymbolTable;
    _ensureLintCheckExists(linterCheckId: string): void;
    enableCheck(linterCheckId: string, enabled: boolean): void;
    _lintCheck(startPos: SourceReader, endPos: SourceReader, reason: string, args: any[]): void;
    _lintMain(ast: ASTMain): void;
    _addDefinitionToSymbolTable(definition: any): void;
    /** Definitions **/
    _lintDefinition(definition: {
        tag: symbol;
    }): void;
    _lintDefProgram(definition: {
        tag?: symbol;
        body?: any;
    }): void;
    _lintDefInteractiveProgram(definition: {
        tag?: symbol;
        branches?: any;
    }): void;
    _lintDefProcedure(definition: {
        tag?: symbol;
        body?: any;
        startPos?: any;
        endPos?: any;
        name?: any;
        parameters?: any;
    }): void;
    _lintDefFunction(definition: {
        tag?: symbol;
        body?: any;
        startPos?: any;
        endPos?: any;
        name?: any;
        parameters?: any;
    }): void;
    _lintDefType(): void;
    /** Statements **/
    _lintStatement(statement: {
        tag: symbol;
    }): void;
    _lintStmtBlock(block: {
        tag?: symbol;
        statements?: any;
    }, allowReturn: boolean): void;
    _lintStmtReturn(statement: {
        tag?: symbol;
        result?: any;
    }): void;
    _lintStmtIf(statement: {
        tag?: symbol;
        condition?: any;
        thenBlock?: any;
        elseBlock?: any;
    }): void;
    _lintStmtRepeat(statement: {
        tag?: symbol;
        times?: any;
        body?: any;
    }): void;
    _lintStmtForeach(statement: {
        tag?: symbol;
        pattern?: any;
        range?: any;
        body?: any;
    }): void;
    _lintStmtForeachPattern(pattern: {
        tag?: any;
        startPos: any;
        endPos: any;
        constructorName: any;
        boundVariables: any;
    }): void;
    _lintStmtWhile(statement: {
        tag?: symbol;
        condition?: any;
        body?: any;
    }): void;
    _lintStmtSwitch(statement: {
        tag?: symbol;
        subject?: any;
        branches?: any;
    }): void;
    _lintSwitchBranches(branches: any[], isInteractiveProgram: boolean): void;
    _lintBranches(branches: any[], isInteractiveProgram: boolean, isMatching: boolean): void;
    _branchesCheckWildcardAndVariable(branches: any[]): void;
    _branchesCheckNoRepeats(branches: any[]): void;
    _branchesCheckCompatible(branches: any[]): void;
    _branchesCheckTypeEvent(branches: any[]): void;
    _branchesCheckTypeNotEvent(branches: any[]): void;
    _lintBranchBody(branch: {
        pattern: {
            boundVariables: any;
        };
        body: {
            tag: symbol;
        };
    }, isMatching: boolean): void;
    _patternType(pattern: {
        tag?: any;
        startPos: any;
        endPos: any;
        constructorName: any;
        boundVariables: any;
    }): string;
    _lintStmtAssignVariable(statement: {
        tag?: symbol;
        variable?: any;
        value?: any;
    }): void;
    _lintStmtAssignTuple(statement: {
        tag?: symbol;
        variables?: any;
        value?: any;
    }): void;
    _lintStmtProcedureCall(statement: {
        tag?: symbol;
        procedureName?: any;
        startPos?: any;
        endPos?: any;
        args?: any;
    }): void;
    /** Patterns **/
    _lintPattern(pattern: {
        tag?: any;
        startPos: any;
        endPos: any;
        constructorName: any;
        boundVariables: any;
    }): void;
    _lintPatternWildcard(): void;
    _lintPatternVariable(): void;
    _lintPatternNumber(): void;
    _lintPatternStructure(pattern: {
        tag?: any;
        startPos: any;
        endPos: any;
        constructorName: any;
        boundVariables: any;
    }): void;
    _lintPatternTuple(): void;
    _lintPatternTimeout(): void;
    /** Expressions **/
    _lintExpression(expression: any): void;
    _lintExprVariable(): void;
    _lintExprConstantNumber(): void;
    _lintExprConstantString(): void;
    _lintExprChoose(expression: {
        condition: any;
        trueExpr: any;
        falseExpr: any;
    }): void;
    _lintExprMatching(expression: {
        subject: any;
        branches: any;
    }): void;
    _lintMatchingBranches(branches: any[]): void;
    _lintExprList(expression: {
        elements: any;
    }): void;
    _lintExprRange(expression: {
        first: any;
        second: any;
        last: any;
    }): void;
    _lintExprTuple(expression: {
        elements: any;
    }): void;
    _lintExprStructure(expression: {
        tag?: symbol;
        constructorName?: any;
        startPos: any;
        endPos: any;
        fieldBindings?: any;
        original?: any;
        fieldNames?: (() => any) | (() => any) | (() => any);
    }): void;
    _lintExprStructureUpdate(expression: {
        tag?: symbol;
        constructorName?: any;
        startPos: any;
        endPos: any;
        fieldBindings?: any;
        original?: any;
        fieldNames?: (() => any) | (() => any) | (() => any);
    }): void;
    _lintExprStructureOrUpdate(expression: any, original: {
        tag: symbol;
    }): void;
    _checkStructureNoRepeatedFields(constructorName: string, expression: {
        fieldNames: () => any;
        startPos: SourceReader;
        endPos: SourceReader;
    }): void;
    _checkStructureBindingsCorrect(constructorName: string, expression: {
        fieldNames: () => any;
        startPos: SourceReader;
        endPos: SourceReader;
    }): void;
    _checkStructureBindingsComplete(constructorName: string, expression: {
        fieldNames: () => any;
        startPos: SourceReader;
        endPos: SourceReader;
    }): void;
    _checkStructureTypeNotEvent(constructorName: string, expression: {
        startPos: SourceReader;
        endPos: SourceReader;
    }): void;
    _lintExprFunctionCall(expression: {
        functionName: {
            value: any;
        };
        startPos: SourceReader;
        endPos: SourceReader;
        args: string | any[];
    }): void;
    _disableRecursion(ast: ASTMain): void;
    _failExpectedConstructorButGot(startPos: SourceReader, endPos: SourceReader, name: string): void;
}
//# sourceMappingURL=linter.d.ts.map