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; 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; }