import { ClassDeclaration, factory, SyntaxKind } from 'typescript'; import { transformMethod } from './methods'; import { transformProperty } from './properties'; export function transformMembers(cls: ClassDeclaration) { const propertyIndices: number[] = []; const members = cls.members.map((member: any, index: number) => { // only process decorated members if (!member.decorators || !member.decorators.length) return member; switch (member.kind) { case SyntaxKind.MethodDeclaration: return transformMethod(member); case SyntaxKind.PropertyDeclaration: propertyIndices.push(index); return member; case SyntaxKind.Constructor: return factory.createConstructorDeclaration(undefined, undefined, member.parameters, member.body); default: return member; // in case anything gets here by accident... } }); propertyIndices.forEach((i: number) => { const [getter, setter] = transformProperty(members, i) as any; members.push(getter, setter); }); propertyIndices.reverse().forEach((i) => members.splice(i, 1)); return members; }