Skip to content

Commit 229f407

Browse files
committed
fix(app): interfaces multiple extends support
fix #1364
1 parent 51fe4b9 commit 229f407

File tree

15 files changed

+155
-36
lines changed

15 files changed

+155
-36
lines changed

src/app/compiler/angular-dependencies.ts

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,9 @@ export class AngularDependencies extends FrameworkDependencies {
229229
return deps;
230230
}
231231

232-
private processClass(node, file, srcFile, outputSymbols, fileBody) {
232+
private processClass(node, file, srcFile, outputSymbols, fileBody, astFile) {
233233
const name = this.getSymboleName(node);
234-
const IO = this.getClassIO(file, srcFile, node, fileBody);
234+
const IO = this.getClassIO(file, srcFile, node, fileBody, astFile);
235235
const sourceCode = srcFile.getText();
236236
const hash = crypto.createHash('sha512').update(sourceCode).digest('hex');
237237
const deps: any = {
@@ -363,7 +363,7 @@ export class AngularDependencies extends FrameworkDependencies {
363363
) {
364364
return;
365365
}
366-
const parseNode = (file, srcFile, node, fileBody) => {
366+
const parseNode = (file, srcFile, node, fileBody, astFile) => {
367367
const sourceCode = srcFile.getText();
368368
const hash = crypto.createHash('sha512').update(sourceCode).digest('hex');
369369

@@ -379,7 +379,8 @@ export class AngularDependencies extends FrameworkDependencies {
379379
file,
380380
srcFile,
381381
node,
382-
fileBody
382+
fileBody,
383+
astFile
383384
);
384385

385386
if (this.isModule(visitedDecorator)) {
@@ -572,10 +573,10 @@ export class AngularDependencies extends FrameworkDependencies {
572573
nodeDecorators.filter(filterByDecorators).forEach(visitDecorator);
573574
} else if (node.symbol) {
574575
if (node.symbol.flags === ts.SymbolFlags.Class) {
575-
this.processClass(node, file, srcFile, outputSymbols, fileBody);
576+
this.processClass(node, file, srcFile, outputSymbols, fileBody, astFile);
576577
} else if (node.symbol.flags === ts.SymbolFlags.Interface) {
577578
const name = this.getSymboleName(node);
578-
const IO = this.getInterfaceIO(file, srcFile, node, fileBody);
579+
const IO = this.getInterfaceIO(file, srcFile, node, fileBody, astFile);
579580
const interfaceDeps: IInterfaceDep = {
580581
name,
581582
id: 'interface-' + name + '-' + hash,
@@ -709,7 +710,7 @@ export class AngularDependencies extends FrameworkDependencies {
709710
if (node.body) {
710711
if (node.body.statements && node.body.statements.length > 0) {
711712
node.body.statements.forEach(statement =>
712-
parseNode(file, srcFile, statement, node.body)
713+
parseNode(file, srcFile, statement, node.body, astFile)
713714
);
714715
}
715716
}
@@ -986,7 +987,7 @@ export class AngularDependencies extends FrameworkDependencies {
986987
}
987988
};
988989

989-
parseNode(fileName, scannedFile, initialNode);
990+
parseNode(fileName, scannedFile, initialNode, null, astFile);
990991
});
991992
}
992993

@@ -1523,7 +1524,13 @@ export class AngularDependencies extends FrameworkDependencies {
15231524
}
15241525
}
15251526

1526-
private getClassIO(filename: string, sourceFile: ts.SourceFile, node: ts.Node, fileBody) {
1527+
private getClassIO(
1528+
filename: string,
1529+
sourceFile: ts.SourceFile,
1530+
node: ts.Node,
1531+
fileBody,
1532+
astFile
1533+
) {
15271534
/**
15281535
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
15291536
*/
@@ -1532,7 +1539,12 @@ export class AngularDependencies extends FrameworkDependencies {
15321539
if (ts.isClassDeclaration(statement)) {
15331540
if (statement.pos === node.pos && statement.end === node.end) {
15341541
return directive.concat(
1535-
this.classHelper.visitClassDeclaration(filename, statement, sourceFile)
1542+
this.classHelper.visitClassDeclaration(
1543+
filename,
1544+
statement,
1545+
sourceFile,
1546+
astFile
1547+
)
15361548
);
15371549
}
15381550
}
@@ -1543,7 +1555,7 @@ export class AngularDependencies extends FrameworkDependencies {
15431555
return res[0] || {};
15441556
}
15451557

1546-
private getInterfaceIO(filename: string, sourceFile, node, fileBody) {
1558+
private getInterfaceIO(filename: string, sourceFile, node, fileBody, astFile) {
15471559
/**
15481560
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
15491561
*/
@@ -1552,7 +1564,12 @@ export class AngularDependencies extends FrameworkDependencies {
15521564
if (ts.isInterfaceDeclaration(statement)) {
15531565
if (statement.pos === node.pos && statement.end === node.end) {
15541566
return directive.concat(
1555-
this.classHelper.visitClassDeclaration(filename, statement, sourceFile)
1567+
this.classHelper.visitClassDeclaration(
1568+
filename,
1569+
statement,
1570+
sourceFile,
1571+
astFile
1572+
)
15561573
);
15571574
}
15581575
}

src/app/compiler/angular/deps/helpers/class-helper.ts

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,8 @@ export class ClassHelper {
467467
public visitClassDeclaration(
468468
fileName: string,
469469
classDeclaration: ts.ClassDeclaration | ts.InterfaceDeclaration,
470-
sourceFile?: ts.SourceFile
470+
sourceFile?: ts.SourceFile,
471+
astFile?: ts.SourceFile
471472
): any {
472473
let symbol = this.typeChecker.getSymbolAtLocation(classDeclaration.name);
473474
let rawdescription = '';
@@ -512,7 +513,7 @@ export class ClassHelper {
512513
let className = classDeclaration.name.text;
513514
let members;
514515
let implementsElements = [];
515-
let extendsElement;
516+
let extendsElements = [];
516517

517518
if (typeof ts.getEffectiveImplementsTypeNodes !== 'undefined') {
518519
let implementedTypes = ts.getEffectiveImplementsTypeNodes(classDeclaration);
@@ -528,10 +529,38 @@ export class ClassHelper {
528529
}
529530

530531
if (typeof ts.getClassExtendsHeritageElement !== 'undefined') {
531-
let extendsTypes = ts.getClassExtendsHeritageElement(classDeclaration);
532-
if (extendsTypes) {
533-
if (extendsTypes.expression) {
534-
extendsElement = extendsTypes.expression.text;
532+
if (astFile) {
533+
let interfaceOrClassNode = astFile.getInterface(className);
534+
if (!interfaceOrClassNode) {
535+
interfaceOrClassNode = astFile.getClass(className);
536+
}
537+
if (interfaceOrClassNode) {
538+
const extendsListRaw = interfaceOrClassNode.getExtends();
539+
let extendsList = [];
540+
if (extendsListRaw) {
541+
if (Array.isArray(extendsListRaw)) {
542+
if (extendsListRaw.length > 0) {
543+
extendsListRaw.forEach(extendElement => {
544+
const extendElementExpression = extendElement.getExpression();
545+
if (extendElementExpression) {
546+
const text = extendElementExpression.getText();
547+
if (text) {
548+
extendsList.push(text);
549+
}
550+
}
551+
});
552+
}
553+
} else {
554+
const extendElementExpression = extendsListRaw.getExpression();
555+
if (extendElementExpression) {
556+
const text = extendElementExpression.getText();
557+
if (text) {
558+
extendsList.push(text);
559+
}
560+
}
561+
}
562+
}
563+
extendsElements = extendsList;
535564
}
536565
}
537566
}
@@ -575,7 +604,7 @@ export class ClassHelper {
575604
kind: members.kind,
576605
constructor: members.constructor,
577606
jsdoctags: jsdoctags,
578-
extends: extendsElement,
607+
extends: extendsElements,
579608
implements: implementsElements,
580609
accessors: members.accessors
581610
};
@@ -594,7 +623,7 @@ export class ClassHelper {
594623
kind: members.kind,
595624
constructor: members.constructor,
596625
jsdoctags: jsdoctags,
597-
extends: extendsElement,
626+
extends: extendsElements,
598627
implements: implementsElements,
599628
accessors: members.accessors
600629
}
@@ -639,7 +668,7 @@ export class ClassHelper {
639668
kind: members.kind,
640669
constructor: members.constructor,
641670
jsdoctags: jsdoctags,
642-
extends: extendsElement,
671+
extends: extendsElements,
643672
implements: implementsElements,
644673
accessors: members.accessors
645674
}
@@ -662,7 +691,7 @@ export class ClassHelper {
662691
kind: members.kind,
663692
constructor: members.constructor,
664693
jsdoctags: jsdoctags,
665-
extends: extendsElement,
694+
extends: extendsElements,
666695
implements: implementsElements,
667696
accessors: members.accessors
668697
}
@@ -682,7 +711,7 @@ export class ClassHelper {
682711
kind: members.kind,
683712
constructor: members.constructor,
684713
jsdoctags: jsdoctags,
685-
extends: extendsElement,
714+
extends: extendsElements,
686715
implements: implementsElements,
687716
accessors: members.accessors
688717
}

src/app/compiler/angular/deps/helpers/component-helper.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,8 @@ export class ComponentHelper {
321321
filename: string,
322322
sourceFile: ts.SourceFile,
323323
node: ts.Node,
324-
fileBody
324+
fileBody,
325+
astFile: ts.SourceFile
325326
): any {
326327
/**
327328
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
@@ -331,7 +332,12 @@ export class ComponentHelper {
331332
if (ts.isClassDeclaration(statement)) {
332333
if (statement.pos === node.pos && statement.end === node.end) {
333334
return directive.concat(
334-
this.classHelper.visitClassDeclaration(filename, statement, sourceFile)
335+
this.classHelper.visitClassDeclaration(
336+
filename,
337+
statement,
338+
sourceFile,
339+
astFile
340+
)
335341
);
336342
}
337343
}

src/templates/partials/class.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@
4949
<h3>{{t "extends" }}</h3>
5050
</p>
5151
<p class="comment">
52-
{{> link-type type=class.extends }}
52+
{{#each class.extends}}
53+
{{> link-type type=this }}
54+
{{/each}}
5355
</p>
5456
{{/if}}
5557

src/templates/partials/component-detail.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
<h3>{{t "extends" }}</h3>
2929
</p>
3030
<p class="comment">
31-
{{> link-type type=component.extends }}
31+
{{#each component.extends}}
32+
{{> link-type type=this }}
33+
{{/each}}
3234
</p>
3335
{{/if}}
3436

src/templates/partials/controller.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@
5858
<h3>{{t "extends" }}</h3>
5959
</p>
6060
<p class="comment">
61-
{{> link-type type=controller.extends }}
61+
{{#each controllerextends}}
62+
{{> link-type type=this }}
63+
{{/each}}
6264
</p>
6365
{{/if}}
6466

src/templates/partials/directive.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@
4949
<h3>{{t "extends" }}</h3>
5050
</p>
5151
<p class="comment">
52-
{{> link-type type=directive.extends }}
52+
{{#each directive.extends}}
53+
{{> link-type type=this }}
54+
{{/each}}
5355
</p>
5456
{{/if}}
5557

src/templates/partials/guard.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@
4949
<h3>{{t "extends" }}</h3>
5050
</p>
5151
<p class="comment">
52-
{{> link-type type=injectable.extends }}
52+
{{#each injectable.extends}}
53+
{{> link-type type=this }}
54+
{{/each}}
5355
</p>
5456
{{/if}}
5557

src/templates/partials/injectable.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@
4949
<h3>{{t "extends" }}</h3>
5050
</p>
5151
<p class="comment">
52-
{{> link-type type=injectable.extends }}
52+
{{#each injectable.extends}}
53+
{{> link-type type=this }}
54+
{{/each}}
5355
</p>
5456
{{/if}}
5557

src/templates/partials/interface.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@
5252
<h3>{{t "extends" }}</h3>
5353
</p>
5454
<p class="comment">
55-
{{> link-type type=interface.extends }}
55+
{{#each interface.extends}}
56+
{{> link-type type=this }}
57+
{{/each}}
5658
</p>
5759
{{/if}}
5860

0 commit comments

Comments
 (0)