Skip to content
This repository was archived by the owner on Mar 31, 2025. It is now read-only.

Commit bd748bb

Browse files
devversionpetebacondarwin
authored andcommitted
feat(typescript): add option to disable leading comment concatenation
Introduces a new option that allows developers to configure the `tsHost` to not concatenate multiple leading comments for a `TypeScript` node content. The `tsHost` is a newly created service that delegates (for now) to the `tsParser` package for retrieving the content of a given node. The advantage of the `tsHost` is that people can inject the `tsHost` in Dgeni `.config()` and specify options or overwrite methods. Related angular/components#12736.
1 parent 8246843 commit bd748bb

27 files changed

+290
-115
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Not a license comment.
3+
*/
4+
5+
/**
6+
* This is a test function
7+
*/
8+
export function test(a: string) {
9+
return a;
10+
}

typescript/src/api-doc-types/AccessorInfoDoc.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Declaration } from 'typescript';
2+
import { Host } from '../services/ts-host/host';
23
import { MethodMemberDoc } from './MethodMemberDoc';
34
import { PropertyMemberDoc } from './PropertyMemberDoc';
45

@@ -13,7 +14,10 @@ export class AccessorInfoDoc extends MethodMemberDoc {
1314
aliases = this.propertyDoc.aliases.map(alias => `${alias}:${this.accessorType}`);
1415
anchor = this.name;
1516

16-
constructor(public accessorType: 'get'|'set', public propertyDoc: PropertyMemberDoc, declaration: Declaration) {
17-
super(propertyDoc.containerDoc, propertyDoc.symbol, declaration);
17+
constructor(host: Host,
18+
public accessorType: 'get'|'set',
19+
public propertyDoc: PropertyMemberDoc,
20+
declaration: Declaration) {
21+
super(host, propertyDoc.containerDoc, propertyDoc.symbol, declaration);
1822
}
1923
}

typescript/src/api-doc-types/ApiDoc.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Declaration, Symbol, TypeChecker } from 'typescript';
2+
import { Host } from '../services/ts-host/host';
23
import { FileInfo } from '../services/TsParser/FileInfo';
34
import { getContent } from '../services/TsParser/getContent';
45
import { ModuleDoc } from './ModuleDoc';
@@ -31,16 +32,18 @@ export abstract class BaseApiDoc implements ApiDoc {
3132
startingLine = this.fileInfo.location.start.line +
3233
(this.fileInfo.location.start.character ? 1 : 0);
3334
endingLine = this.fileInfo.location.end.line;
34-
content = getContent(this.declaration);
35+
content = this.host.getContent(this.declaration);
3536
path: string = '';
3637
outputPath: string = '';
3738

3839
originalModule = this.fileInfo.projectRelativePath
3940
.replace(new RegExp("\." + this.fileInfo.extension + "$"), "");
4041
typeChecker: TypeChecker = this.moduleDoc.typeChecker;
4142

42-
constructor(public moduleDoc: ModuleDoc,
43+
constructor(public host: Host,
44+
public moduleDoc: ModuleDoc,
4345
public symbol: Symbol,
4446
public declaration: Declaration,
45-
public aliasSymbol?: Symbol) {}
47+
public aliasSymbol?: Symbol) {
48+
}
4649
}

typescript/src/api-doc-types/ClassExportDoc.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ClassLikeExportDoc } from '../api-doc-types/ClassLikeExportDoc';
44
import { MemberDoc } from '../api-doc-types/MemberDoc';
55
import { MethodMemberDoc } from '../api-doc-types/MethodMemberDoc';
66
import { ModuleDoc } from '../api-doc-types/ModuleDoc';
7+
import { Host } from '../services/ts-host/host';
78

89
/**
910
* Classes are Class-like but also can contain static members
@@ -15,11 +16,12 @@ export class ClassExportDoc extends ClassLikeExportDoc {
1516
statics: MemberDoc[] = [];
1617
isAbstract = this.declaration.modifiers && this.declaration.modifiers.some(modifier => modifier.kind === SyntaxKind.AbstractKeyword);
1718

18-
constructor(
19-
moduleDoc: ModuleDoc,
20-
symbol: Symbol,
21-
aliasSymbol?: Symbol) {
22-
super(moduleDoc, symbol, symbol.valueDeclaration!, aliasSymbol);
19+
constructor(host: Host,
20+
moduleDoc: ModuleDoc,
21+
symbol: Symbol,
22+
aliasSymbol?: Symbol) {
23+
super(host, moduleDoc, symbol, symbol.valueDeclaration!, aliasSymbol);
24+
2325
if (symbol.exports) {
2426
this.statics = this.getMemberDocs(symbol.exports, moduleDoc.hidePrivateMembers);
2527
}
@@ -41,10 +43,10 @@ export class ClassExportDoc extends ClassLikeExportDoc {
4143
constructorSymbol.getDeclarations()!.forEach(declaration => {
4244
if ((declaration as FunctionLikeDeclaration).body) {
4345
// This is the "real" declaration of the method
44-
constructorDoc = new MethodMemberDoc(this, constructorSymbol, declaration, overloads);
46+
constructorDoc = new MethodMemberDoc(this.host, this, constructorSymbol, declaration, overloads);
4547
} else {
4648
// This is an overload signature of the method
47-
overloads.push(new MethodMemberDoc(this, constructorSymbol, declaration, overloads));
49+
overloads.push(new MethodMemberDoc(this.host, this, constructorSymbol, declaration, overloads));
4850
}
4951
});
5052
return constructorDoc || overloads.shift();

typescript/src/api-doc-types/ClassLikeExportDoc.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
/* tslint:disable:no-bitwise */
22
/* tslint:disable:max-classes-per-file */
3-
import { Declaration, ExpressionWithTypeArguments, HeritageClause, Symbol, SymbolFlags, SyntaxKind, symbolName } from 'typescript';
3+
import {
4+
Declaration,
5+
ExpressionWithTypeArguments,
6+
HeritageClause,
7+
Symbol,
8+
SymbolFlags,
9+
symbolName,
10+
SyntaxKind,
11+
} from 'typescript';
12+
import { Host } from '../services/ts-host/host';
413
import { getDecorators, ParsedDecorator } from "../services/TsParser/getDecorators";
514
import { getTypeText } from '../services/TsParser/getTypeText';
615

@@ -23,15 +32,15 @@ export abstract class ClassLikeExportDoc extends ContainerExportDoc {
2332
descendants: ClassLikeExportDoc[] = [];
2433
typeParams = this.computeTypeParams();
2534

26-
constructor(
27-
moduleDoc: ModuleDoc,
28-
symbol: Symbol,
29-
declaration: Declaration,
30-
aliasSymbol?: Symbol) {
31-
super(moduleDoc, symbol, declaration, aliasSymbol);
32-
this.computeHeritageClauses();
33-
this.addAliases();
34-
}
35+
constructor(host: Host, moduleDoc: ModuleDoc,
36+
symbol: Symbol,
37+
declaration: Declaration,
38+
aliasSymbol?: Symbol) {
39+
super(host, moduleDoc, symbol, declaration, aliasSymbol);
40+
41+
this.computeHeritageClauses();
42+
this.addAliases();
43+
}
3544

3645
private computeTypeParams() {
3746
if (this.symbol.members) {

typescript/src/api-doc-types/ConstExportDoc.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Symbol, Type, TypeFormatFlags, VariableDeclaration } from 'typescript';
2-
import { getDeclarationTypeText } from '../services/TsParser/getDeclarationTypeText';
1+
import { Symbol, VariableDeclaration } from 'typescript';
2+
import { Host } from '../services/ts-host/host';
33
import { ExportDoc } from './ExportDoc';
44
import { ModuleDoc } from './ModuleDoc';
55

@@ -8,8 +8,11 @@ export class ConstExportDoc extends ExportDoc {
88
variableDeclaration = this.declaration as VariableDeclaration;
99
type = this.getTypeString();
1010

11-
constructor(moduleDoc: ModuleDoc, symbol: Symbol, aliasSymbol?: Symbol) {
12-
super(moduleDoc, symbol, symbol.valueDeclaration!, aliasSymbol);
11+
constructor(host: Host,
12+
moduleDoc: ModuleDoc,
13+
symbol: Symbol,
14+
aliasSymbol?: Symbol) {
15+
super(host, moduleDoc, symbol, symbol.valueDeclaration!, aliasSymbol);
1316
}
1417

1518
private getTypeString() {

typescript/src/api-doc-types/ContainerExportDoc.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
/* tslint:disable:no-bitwise */
22
import {
3-
FunctionLikeDeclaration,
4-
GetAccessorDeclaration,
5-
Map,
6-
SetAccessorDeclaration,
7-
Symbol,
8-
SymbolFlags,
9-
SyntaxKind,
10-
UnderscoreEscapedMap
3+
FunctionLikeDeclaration,
4+
GetAccessorDeclaration,
5+
SetAccessorDeclaration,
6+
Symbol,
7+
SymbolFlags,
8+
SyntaxKind,
9+
UnderscoreEscapedMap,
1110
} from 'typescript';
1211
import { getAccessibility } from "../services/TsParser/getAccessibility";
1312
import { ExportDoc } from './ExportDoc';
@@ -56,21 +55,22 @@ export abstract class ContainerExportDoc extends ExportDoc {
5655
setAccessorDeclaration = declaration as SetAccessorDeclaration;
5756
} else if ((declaration as FunctionLikeDeclaration).body) {
5857
// This is the "real" declaration of the method
59-
memberDoc = new MethodMemberDoc(this, member, declaration, overloads);
58+
memberDoc = new MethodMemberDoc(this.host, this, member, declaration, overloads);
6059
} else {
6160
// This is an overload signature of the method
62-
overloads.push(new MethodMemberDoc(this, member, declaration, overloads));
61+
overloads.push(new MethodMemberDoc(this.host, this, member, declaration, overloads));
6362
}
6463
} else if (flags & PropertyMemberFlags) {
65-
memberDoc = new PropertyMemberDoc(this, member, declaration, null, null);
64+
memberDoc = new PropertyMemberDoc(this.host, this, member, declaration, null, null);
6665
} else {
6766
throw new Error(`Unknown member type for member ${member.name}`);
6867
}
6968
}
7069

7170
// If at least one of the declarations was an accessor then the whole member is a property.
7271
if (getAccessorDeclaration || setAccessorDeclaration) {
73-
memberDoc = new PropertyMemberDoc(this, member, null, getAccessorDeclaration, setAccessorDeclaration);
72+
memberDoc = new PropertyMemberDoc(this.host, this, member, null, getAccessorDeclaration,
73+
setAccessorDeclaration);
7474
}
7575

7676
// If there is no member doc then we are in an interface or abstract class and we just take the first overload

typescript/src/api-doc-types/EnumExportDoc.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Declaration, Symbol } from 'typescript';
2+
import { Host } from '../services/ts-host/host';
23
import { ContainerExportDoc } from './ContainerExportDoc';
34
import { ModuleDoc } from './ModuleDoc';
45

@@ -9,11 +10,12 @@ import { ModuleDoc } from './ModuleDoc';
910
export class EnumExportDoc extends ContainerExportDoc {
1011
docType = 'enum';
1112
additionalDeclarations: Declaration[] = [];
12-
constructor(
13-
moduleDoc: ModuleDoc,
14-
symbol: Symbol,
15-
aliasSymbol?: Symbol) {
16-
super(moduleDoc, symbol, symbol.valueDeclaration!, aliasSymbol);
13+
constructor(host: Host,
14+
moduleDoc: ModuleDoc,
15+
symbol: Symbol,
16+
aliasSymbol?: Symbol) {
17+
super(host, moduleDoc, symbol, symbol.valueDeclaration!, aliasSymbol);
18+
1719
this.additionalDeclarations = symbol.getDeclarations()!.filter(declaration => declaration !== this.declaration);
1820
if (symbol.exports) {
1921
this.members = this.getMemberDocs(symbol.exports, true);

typescript/src/api-doc-types/FunctionExportDoc.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Declaration, Symbol } from 'typescript';
2+
import { Host } from '../services/ts-host/host';
23
import { getDeclarationTypeText } from '../services/TsParser/getDeclarationTypeText';
34
import { ModuleDoc } from './ModuleDoc';
45
import { OverloadInfo } from './OverloadInfo';
@@ -18,11 +19,13 @@ export class FunctionExportDoc extends ParameterizedExportDoc implements Paramet
1819
readonly parameterDocs: ParameterDoc[] = getParameters(this);
1920
readonly parameters = this.parameterDocs.map(p => p.paramText);
2021

21-
constructor(
22-
public containerDoc: ModuleDoc,
23-
symbol: Symbol,
24-
aliasSymbol?: Symbol) {
25-
super(containerDoc, symbol, findRealDeclaration(symbol.getDeclarations()!), aliasSymbol);
22+
constructor(host: Host,
23+
public containerDoc: ModuleDoc,
24+
symbol: Symbol,
25+
aliasSymbol?: Symbol) {
26+
27+
super(host, containerDoc, symbol, findRealDeclaration(symbol.getDeclarations()!),
28+
aliasSymbol);
2629
}
2730

2831
}
Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,28 @@
11
import { Declaration, Symbol } from 'typescript';
22
import { ClassLikeExportDoc } from '../api-doc-types/ClassLikeExportDoc';
33
import { ModuleDoc } from '../api-doc-types/ModuleDoc';
4+
import { Host } from '../services/ts-host/host';
45

56
/**
67
* Interfaces are class-like but can also have multiple declarations that are merged together
78
*/
89
export class InterfaceExportDoc extends ClassLikeExportDoc {
910
docType = 'interface';
1011
additionalDeclarations: Declaration[] = [];
11-
constructor(
12-
moduleDoc: ModuleDoc,
13-
symbol: Symbol,
14-
aliasSymbol?: Symbol) {
15-
super(moduleDoc, symbol, symbol.valueDeclaration || symbol.getDeclarations()![0]!, aliasSymbol);
16-
if (symbol.members) this.members = this.getMemberDocs(symbol.members, true);
17-
this.additionalDeclarations = symbol.getDeclarations()!.filter(declaration => declaration !== this.declaration);
12+
13+
constructor(host: Host,
14+
moduleDoc: ModuleDoc,
15+
symbol: Symbol,
16+
aliasSymbol?: Symbol) {
17+
18+
super(host, moduleDoc, symbol, symbol.valueDeclaration || symbol.getDeclarations()![0]!,
19+
aliasSymbol);
20+
21+
if (symbol.members) {
22+
this.members = this.getMemberDocs(symbol.members, true);
23+
}
24+
25+
this.additionalDeclarations = symbol.getDeclarations()!
26+
.filter(declaration => declaration !== this.declaration);
1827
}
1928
}

typescript/src/api-doc-types/MemberDoc.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
/* tslint:disable:no-bitwise */
22
import { Declaration, Symbol, SymbolFlags, SyntaxKind, TypeChecker } from 'typescript';
3+
import { Host } from '../services/ts-host/host';
34
import { FileInfo } from '../services/TsParser/FileInfo';
45
import { getAccessibility } from "../services/TsParser/getAccessibility";
5-
import { getContent } from "../services/TsParser/getContent";
66
import { getDeclarationTypeText } from "../services/TsParser/getDeclarationTypeText";
77
import { getDecorators, ParsedDecorator } from "../services/TsParser/getDecorators";
88
import { ApiDoc } from './ApiDoc';
@@ -22,7 +22,7 @@ export abstract class MemberDoc implements ApiDoc {
2222

2323
path: string = '';
2424
outputPath: string = '';
25-
content = getContent(this.declaration);
25+
content = this.host.getContent(this.declaration);
2626
basePath = this.containerDoc.basePath;
2727
fileInfo = new FileInfo(this.declaration, this.basePath);
2828
startingLine = this.fileInfo.location.start.line + (this.fileInfo.location.start.character ? 1 : 0);
@@ -43,6 +43,7 @@ export abstract class MemberDoc implements ApiDoc {
4343
isStatic = !!this.declaration.modifiers && this.declaration.modifiers.some(modifier => modifier.kind === SyntaxKind.StaticKeyword);
4444

4545
constructor(
46+
public host: Host,
4647
public containerDoc: ContainerExportDoc,
4748
public symbol: Symbol,
4849
public declaration: Declaration) {

typescript/src/api-doc-types/MethodMemberDoc.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* tslint:disable:no-bitwise */
22
import { Declaration, Symbol } from 'typescript';
3+
import { Host } from '../services/ts-host/host';
34
import { getTypeParametersText } from '../services/TsParser/getTypeParametersText';
45
import { ContainerExportDoc } from './ContainerExportDoc';
56
import { MemberDoc } from './MemberDoc';
@@ -15,12 +16,14 @@ export class MethodMemberDoc extends MemberDoc implements ParameterContainer {
1516
readonly aliases = this.computeAliases();
1617
readonly typeParameters = getTypeParametersText(this.declaration);
1718

18-
constructor(
19-
containerDoc: ContainerExportDoc,
20-
symbol: Symbol,
21-
declaration: Declaration,
22-
public overloads: MethodMemberDoc[] = []) {
23-
super(containerDoc, symbol, declaration);
19+
constructor(host: Host,
20+
containerDoc: ContainerExportDoc,
21+
symbol: Symbol,
22+
declaration: Declaration,
23+
public overloads: MethodMemberDoc[] = []) {
24+
25+
super(host, containerDoc, symbol, declaration);
26+
2427
// fix up parameter ids and aliases, now that we have computed the id for this doc
2528
this.parameterDocs.forEach(param => {
2629
param.id = `${this.id}~${param.name}`;

typescript/src/api-doc-types/ModuleDoc.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,8 @@ export class ModuleDoc implements ApiDoc {
2323
outputPath: string = '';
2424
content: string = '';
2525

26-
constructor(public symbol: ModuleSymbol, public basePath: string, public hidePrivateMembers: boolean, public typeChecker: TypeChecker) {}
26+
constructor(public symbol: ModuleSymbol,
27+
public basePath: string,
28+
public hidePrivateMembers: boolean,
29+
public typeChecker: TypeChecker) {}
2730
}

typescript/src/api-doc-types/OverloadInfo.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { Declaration } from 'typescript';
22
import { getDeclarationTypeText } from '../services/TsParser/getDeclarationTypeText';
3+
import { BaseApiDoc } from './ApiDoc';
34
import { FunctionExportDoc } from './FunctionExportDoc';
45
import { ModuleDoc } from './ModuleDoc';
56
import { getParameters, ParameterContainer } from './ParameterContainer';
67
import { ParameterDoc } from './ParameterDoc';
7-
import { BaseApiDoc } from './ApiDoc';
88

99
/**
1010
* This represents a single overload of an exported function.
@@ -20,7 +20,8 @@ export class OverloadInfo extends BaseApiDoc implements ParameterContainer {
2020
containerDoc: ModuleDoc = this.functionDoc.containerDoc;
2121

2222
constructor(public functionDoc: FunctionExportDoc, declaration: Declaration) {
23-
super(functionDoc.moduleDoc, functionDoc.symbol, declaration);
23+
super(functionDoc.host, functionDoc.moduleDoc, functionDoc.symbol, declaration);
24+
2425
// Give this overload doc a more specific id and aliases than it's container doc
2526
const paramString = `(${this.parameters.join(', ')})`;
2627
this.id += paramString;

0 commit comments

Comments
 (0)