import * as ts from "ts-morph";
import { CompilerDirective } from "./compiler";
import { PrecedingStatementContext } from "./CompilerState";
export declare const RBX_SERVICES: Array<string>;
export declare function isRbxService(name: string): boolean;
export declare function isTypeStatement(node: ts.Node): boolean;
export declare function isType(node: ts.Node): boolean;
export declare function isUsedAsType(node: ts.Identifier): boolean;
export declare function inheritsFrom(type: ts.Type, className: string): boolean;
export declare function isTypeOnlyNamespace(node: ts.NamespaceDeclaration): boolean;
export declare function typeConstraint(type: ts.Type, cb: (type: ts.Type) => boolean): boolean;
export declare function laxTypeConstraint(type: ts.Type, cb: (type: ts.Type) => boolean): boolean;
export declare function strictTypeConstraint(type: ts.Type, cb: (type: ts.Type) => boolean): boolean;
export declare function isAnyType(type: ts.Type): boolean;
export declare function isNullableType(type: ts.Type): boolean;
export declare function isBooleanType(type: ts.Type): boolean;
export declare function isNumberType(type: ts.Type): boolean;
export declare function isNumberTypeStrict(type: ts.Type): boolean;
export declare function isStringType(type: ts.Type): boolean;
export declare function isObjectType(type: ts.Type): boolean;
export declare function isEnumType(type: ts.Type): boolean;
export declare function isIterableIterator(type: ts.Type, node: ts.Node): boolean;
export declare function isIterableFunction(type: ts.Type): boolean;
export declare function getCompilerDirectiveWithConstraint(type: ts.Type, directive: CompilerDirective, orCallback?: (t: ts.Type<ts.ts.Type>) => boolean): boolean;
export declare function getCompilerDirectiveWithStrictConstraint(type: ts.Type, directive: CompilerDirective, orCallback?: (t: ts.Type<ts.ts.Type>) => boolean): boolean;
export declare function getCompilerDirectiveWithLaxConstraint(type: ts.Type, directive: CompilerDirective, orCallback?: (t: ts.Type<ts.ts.Type>) => boolean): boolean;
export declare function superExpressionClassInheritsFromSetOrMap(node: ts.Expression): boolean;
export declare function superExpressionClassInheritsFromArray(node: ts.Expression, recursive?: boolean): boolean;
export declare function classDeclarationInheritsFromArray(classExp: ts.ClassDeclaration | ts.ClassExpression, recursive?: boolean): boolean;
export declare function isArrayTypeLax(type: ts.Type): boolean;
export declare function isStringMethodType(type: ts.Type): boolean;
export declare function isArrayType(type: ts.Type): boolean;
export declare function isMapType(type: ts.Type): boolean;
export declare function isSetType(type: ts.Type): boolean;
export declare function isMethodType(type: ts.Type): boolean;
export declare function isArrayMethodType(type: ts.Type): boolean;
export declare function isMapMethodType(type: ts.Type): boolean;
export declare function isSetMethodType(type: ts.Type): boolean;
export declare function isTupleType(node: ts.TypeNode | ts.Type): boolean;
export declare function isTupleReturnType(node: ts.ReturnTypedNode): boolean;
export declare function isTupleReturnTypeCall(node: ts.CallExpression): boolean;
export declare function shouldHoist(ancestor: ts.Node, id: ts.Identifier, checkAncestor?: boolean): boolean;
export declare function shouldPushToPrecedingStatement(arg: ts.Expression, argStr: string, argContext: PrecedingStatementContext): boolean;
/** Returns whether or not the given expression is an expression containing only:
 * - constants
 * - numeric/string literals
 * - unary/binary/ternary expressions
 */
export declare function isConstantExpression(node: ts.Expression, maxDepth?: number): boolean;
/** Calls skipNodesUpwards and returns getType() */
export declare function getType(node: ts.Node): ts.Type<ts.ts.Type>;
