import ts from 'typescript';
import { StructuredStorageType } from '../compile/constants';
import { Context } from '../Context';
export interface PropInfoBase {
    readonly classDecl: ts.ClassDeclaration | ts.ClassExpression;
    readonly isPublic: boolean;
}
export interface DeployPropInfo extends PropInfoBase {
    readonly type: 'deploy';
    readonly name: string;
    readonly isMixinDeploy: boolean;
    readonly decl?: ts.ConstructorDeclaration;
    readonly callSignature?: ts.Signature;
}
export interface RefundAssetsPropInfo extends PropInfoBase {
    readonly type: 'refundAssets';
    readonly name: string;
}
export interface CompleteSendPropInfo extends PropInfoBase {
    readonly type: 'completeSend';
    readonly name: string;
}
export interface UpgradePropInfo extends PropInfoBase {
    readonly type: 'upgrade';
    readonly name: string;
    readonly approveUpgrade: ts.PropertyDeclaration | ts.MethodDeclaration;
}
export interface FunctionPropInfo extends PropInfoBase {
    readonly type: 'function';
    readonly name: string;
    readonly symbol: ts.Symbol;
    readonly decl: ts.PropertyDeclaration | ts.MethodDeclaration;
    readonly callSignature: ts.Signature | undefined;
    readonly send: boolean;
    readonly sendUnsafe: boolean;
    readonly receive: boolean;
    readonly claim: boolean;
    readonly constant: boolean;
    readonly acceptsClaim: boolean;
    readonly returnType: ts.Type | undefined;
    readonly isAbstract: boolean;
}
export interface PropertyPropInfo extends PropInfoBase {
    readonly type: 'property';
    readonly name: string;
    readonly symbol: ts.Symbol;
    readonly decl: ts.PropertyDeclaration | ts.ParameterPropertyDeclaration;
    readonly propertyType: ts.Type | undefined;
    readonly isReadonly: boolean;
    readonly isAbstract: boolean;
    readonly structuredStorageType: StructuredStorageType | undefined;
}
export interface AccessorPropInfo extends PropInfoBase {
    readonly type: 'accessor';
    readonly name: string;
    readonly symbol: ts.Symbol;
    readonly getter?: {
        readonly name: string;
        readonly decl: ts.GetAccessorDeclaration;
        readonly constant: boolean;
    };
    readonly setter?: {
        readonly name: string;
        readonly decl: ts.SetAccessorDeclaration;
    };
    readonly propertyType: ts.Type | undefined;
}
export declare type PropInfo = PropertyPropInfo | AccessorPropInfo | FunctionPropInfo | DeployPropInfo | RefundAssetsPropInfo | UpgradePropInfo | CompleteSendPropInfo;
export interface ContractInfo {
    readonly smartContract: ts.ClassDeclaration | ts.ClassExpression;
    readonly propInfos: ReadonlyArray<PropInfo>;
    readonly superSmartContract?: ContractInfo;
}
export declare class ContractInfoProcessor {
    readonly context: Context;
    readonly smartContract: ts.ClassDeclaration;
    constructor(context: Context, smartContract: ts.ClassDeclaration);
    process(): ContractInfo;
    private processClass;
    private processProperty;
    private hasConstant;
    private hasSend;
    private hasSendUnsafe;
    private hasReceive;
    private hasClaim;
    private hasDecorator;
    private isValidDecorator;
    private isDecorator;
    private isLastParamClaim;
    private hasDeployInfo;
    private getApproveUpgradeDecl;
}
