From 634d55a4f61dcfdf41d7cc2b8e9c81f5d421cddb Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Sat, 13 Jul 2024 00:23:32 +0200 Subject: [PATCH] refactor(compiler-cli): Extract call signatures from interfaces. (#56973) This commit adds support for extracting call signals from interfaces. fixes #56969 PR Close #56973 --- .../src/ngtsc/docs/src/class_extractor.ts | 15 +++++++++++--- .../interface_doc_extraction_spec.ts | 20 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts b/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts index 970105117bf..a8917f7a551 100644 --- a/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts +++ b/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts @@ -272,7 +272,8 @@ class ClassExtractor { return ( !member.name || !this.isDocumentableMember(member) || - !!member.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.PrivateKeyword) || + (!ts.isCallSignatureDeclaration(member) && + member.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.PrivateKeyword)) || member.name.getText() === 'prototype' || isAngularPrivateName(member.name.getText()) || isInternal(member) @@ -280,8 +281,16 @@ class ClassExtractor { } /** Gets whether a class member is a method, property, or accessor. */ - private isDocumentableMember(member: ts.Node): member is MethodLike | PropertyLike { - return this.isMethod(member) || this.isProperty(member) || ts.isAccessor(member); + private isDocumentableMember( + member: ts.Node, + ): member is MethodLike | PropertyLike | ts.CallSignatureDeclaration { + return ( + this.isMethod(member) || + this.isProperty(member) || + ts.isAccessor(member) || + // Signatures are documentable if they are part of an interface. + ts.isCallSignatureDeclaration(member) + ); } /** Gets whether a member is a property. */ diff --git a/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts b/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts index a10e459926a..69070964416 100644 --- a/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts +++ b/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts @@ -76,6 +76,26 @@ runInEachFileSystem(() => { expect(propertyEntry.type).toBe('number'); }); + it('should extract call signatures', () => { + env.write( + 'index.ts', + ` + export interface UserProfile { + (name: string): string; + } + `, + ); + + const docs: DocEntry[] = env.driveDocsExtraction('index.ts'); + const interfaceEntry = docs[0] as InterfaceEntry; + expect(interfaceEntry.members.length).toBe(1); + + const methodEntry = interfaceEntry.members[0] as MethodEntry; + expect(methodEntry.memberType).toBe(MemberType.Method); + expect(methodEntry.name).toBe(''); + expect(methodEntry.returnType).toBe('string'); + }); + it('should extract a method with a rest parameter', () => { env.write( 'index.ts',