import { Imm } from 'ts-imm';
import { CodeBlock } from './CodeBlock';
import { CodeWriter } from './CodeWriter';
import { DecoratorSpec } from './DecoratorSpec';
import { FunctionSpec } from './FunctionSpec';
import { Modifier } from './Modifier';
import { PropertySpec } from './PropertySpec';
import { TypeName, TypeNameOrString, TypeVariable } from './TypeNames';
/** A generated `class` declaration. */
export declare class ClassSpec extends Imm<ClassSpec> {
    static create(name: string | TypeName): ClassSpec;
    readonly name: string;
    readonly javaDoc: CodeBlock;
    readonly decorators: DecoratorSpec[];
    readonly modifiers: Modifier[];
    readonly typeVariables: TypeVariable[];
    readonly superClassField?: TypeName;
    readonly interfaces: TypeName[];
    readonly propertySpecs: PropertySpec[];
    readonly constructorField?: FunctionSpec;
    readonly functionSpecs: FunctionSpec[];
    emit(codeWriter: CodeWriter): void;
    addJavadoc(format: string, ...args: any[]): this;
    addJavadocBlock(block: CodeBlock): this;
    addDecorators(...decoratorSpecs: DecoratorSpec[]): this;
    addDecorator(decoratorSpec: DecoratorSpec): this;
    addModifiers(...modifiers: Modifier[]): this;
    addTypeVariables(...typeVariables: TypeVariable[]): this;
    addTypeVariable(typeVariable: TypeVariable): this;
    superClass(superClass: TypeNameOrString): this;
    addInterfaces(interfaces: TypeName[]): this;
    addInterface(iface: TypeNameOrString): this;
    cstr(constructor?: FunctionSpec): this;
    addProperties(...propertySpecs: PropertySpec[]): this;
    addProperty(propertySpec: PropertySpec): this;
    addProperty(name: string, type: TypeName | string, data: Partial<PropertySpec>): this;
    addFunctions(...functionSpecs: FunctionSpec[]): this;
    addFunction(functionSpec: FunctionSpec): this;
    toString(): string;
    /** Returns the properties that can be declared inline as constructor parameters. */
    private constructorProperties;
    private constructorPropertyInitSearch;
    private get hasNoBody();
}
