@compodoc/compodoc
Version: 
The missing documentation tool for your Angular application
80 lines (71 loc) • 3.52 kB
text/typescript
import { ts, SyntaxKind } from 'ts-morph';
export class CodeGenerator {
    public generate(node: ts.Node): string {
        return this.visitAndRecognize(node, []).join('');
    }
    private visitAndRecognize(node: ts.Node, code: Array<string>, depth = 0): Array<string> {
        this.recognize(node, code);
        node.getChildren().forEach(c => this.visitAndRecognize(c, code, depth + 1));
        return code;
    }
    private recognize(node: ts.Node, code: Array<string>) {
        const conversion = TsKindConversion.find(x => x.kinds.some(z => z === node.kind));
        if (conversion) {
            const result = conversion.output(node);
            result.forEach(text => this.gen(text, code));
        }
    }
    private gen(token: string | undefined, code: Array<string>): void {
        if (!token) {
            return;
        }
        if (token === '\n') {
            code.push('');
        } else {
            code.push(token);
        }
    }
}
class TsKindsToText {
    constructor(public output: (node: ts.Node) => Array<string>, public kinds: Array<SyntaxKind>) {}
}
const TsKindConversion: Array<TsKindsToText> = [
    new TsKindsToText(
        node => ['"', node.text, '"'],
        [SyntaxKind.FirstLiteralToken, SyntaxKind.Identifier]
    ),
    new TsKindsToText(node => ['"', node.text, '"'], [SyntaxKind.StringLiteral]),
    new TsKindsToText(node => [], [SyntaxKind.ArrayLiteralExpression]),
    new TsKindsToText(node => ['import', ' '], [SyntaxKind.ImportKeyword]),
    new TsKindsToText(node => ['from', ' '], [SyntaxKind.FromKeyword]),
    new TsKindsToText(node => ['\n', 'export', ' '], [SyntaxKind.ExportKeyword]),
    new TsKindsToText(node => ['class', ' '], [SyntaxKind.ClassKeyword]),
    new TsKindsToText(node => ['this'], [SyntaxKind.ThisKeyword]),
    new TsKindsToText(node => ['constructor'], [SyntaxKind.ConstructorKeyword]),
    new TsKindsToText(node => ['false'], [SyntaxKind.FalseKeyword]),
    new TsKindsToText(node => ['true'], [SyntaxKind.TrueKeyword]),
    new TsKindsToText(node => ['null'], [SyntaxKind.NullKeyword]),
    new TsKindsToText(node => [], [SyntaxKind.AtToken]),
    new TsKindsToText(node => ['+'], [SyntaxKind.PlusToken]),
    new TsKindsToText(node => [' => '], [SyntaxKind.EqualsGreaterThanToken]),
    new TsKindsToText(node => ['('], [SyntaxKind.OpenParenToken]),
    new TsKindsToText(
        node => ['{', ' '],
        [SyntaxKind.ImportClause, SyntaxKind.ObjectLiteralExpression]
    ),
    new TsKindsToText(node => ['{', '\n'], [SyntaxKind.Block]),
    new TsKindsToText(node => ['}'], [SyntaxKind.CloseBraceToken]),
    new TsKindsToText(node => [')'], [SyntaxKind.CloseParenToken]),
    new TsKindsToText(node => ['['], [SyntaxKind.OpenBracketToken]),
    new TsKindsToText(node => [']'], [SyntaxKind.CloseBracketToken]),
    new TsKindsToText(node => [';', '\n'], [SyntaxKind.SemicolonToken]),
    new TsKindsToText(node => [',', ' '], [SyntaxKind.CommaToken]),
    new TsKindsToText(node => [' ', ':', ' '], [SyntaxKind.ColonToken]),
    new TsKindsToText(node => ['.'], [SyntaxKind.DotToken]),
    new TsKindsToText(node => [], [SyntaxKind.DoStatement]),
    new TsKindsToText(node => [], [SyntaxKind.Decorator]),
    new TsKindsToText(node => [' = '], [SyntaxKind.FirstAssignment]),
    new TsKindsToText(node => [' '], [SyntaxKind.FirstPunctuation]),
    new TsKindsToText(node => ['private', ' '], [SyntaxKind.PrivateKeyword]),
    new TsKindsToText(node => ['public', ' '], [SyntaxKind.PublicKeyword])
];