Skip to content

Commit

Permalink
fix(app): interfaces multiple extends support
Browse files Browse the repository at this point in the history
fix #1364
  • Loading branch information
vogloblinsky committed Aug 16, 2023
1 parent 51fe4b9 commit 229f407
Show file tree
Hide file tree
Showing 15 changed files with 155 additions and 36 deletions.
41 changes: 29 additions & 12 deletions src/app/compiler/angular-dependencies.ts
Expand Up @@ -229,9 +229,9 @@ export class AngularDependencies extends FrameworkDependencies {
return deps;
}

private processClass(node, file, srcFile, outputSymbols, fileBody) {
private processClass(node, file, srcFile, outputSymbols, fileBody, astFile) {
const name = this.getSymboleName(node);
const IO = this.getClassIO(file, srcFile, node, fileBody);
const IO = this.getClassIO(file, srcFile, node, fileBody, astFile);
const sourceCode = srcFile.getText();
const hash = crypto.createHash('sha512').update(sourceCode).digest('hex');
const deps: any = {
Expand Down Expand Up @@ -363,7 +363,7 @@ export class AngularDependencies extends FrameworkDependencies {
) {
return;
}
const parseNode = (file, srcFile, node, fileBody) => {
const parseNode = (file, srcFile, node, fileBody, astFile) => {
const sourceCode = srcFile.getText();
const hash = crypto.createHash('sha512').update(sourceCode).digest('hex');

Expand All @@ -379,7 +379,8 @@ export class AngularDependencies extends FrameworkDependencies {
file,
srcFile,
node,
fileBody
fileBody,
astFile
);

if (this.isModule(visitedDecorator)) {
Expand Down Expand Up @@ -572,10 +573,10 @@ export class AngularDependencies extends FrameworkDependencies {
nodeDecorators.filter(filterByDecorators).forEach(visitDecorator);
} else if (node.symbol) {
if (node.symbol.flags === ts.SymbolFlags.Class) {
this.processClass(node, file, srcFile, outputSymbols, fileBody);
this.processClass(node, file, srcFile, outputSymbols, fileBody, astFile);
} else if (node.symbol.flags === ts.SymbolFlags.Interface) {
const name = this.getSymboleName(node);
const IO = this.getInterfaceIO(file, srcFile, node, fileBody);
const IO = this.getInterfaceIO(file, srcFile, node, fileBody, astFile);
const interfaceDeps: IInterfaceDep = {
name,
id: 'interface-' + name + '-' + hash,
Expand Down Expand Up @@ -709,7 +710,7 @@ export class AngularDependencies extends FrameworkDependencies {
if (node.body) {
if (node.body.statements && node.body.statements.length > 0) {
node.body.statements.forEach(statement =>
parseNode(file, srcFile, statement, node.body)
parseNode(file, srcFile, statement, node.body, astFile)
);
}
}
Expand Down Expand Up @@ -986,7 +987,7 @@ export class AngularDependencies extends FrameworkDependencies {
}
};

parseNode(fileName, scannedFile, initialNode);
parseNode(fileName, scannedFile, initialNode, null, astFile);
});
}

Expand Down Expand Up @@ -1523,7 +1524,13 @@ export class AngularDependencies extends FrameworkDependencies {
}
}

private getClassIO(filename: string, sourceFile: ts.SourceFile, node: ts.Node, fileBody) {
private getClassIO(
filename: string,
sourceFile: ts.SourceFile,
node: ts.Node,
fileBody,
astFile
) {
/**
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
*/
Expand All @@ -1532,7 +1539,12 @@ export class AngularDependencies extends FrameworkDependencies {
if (ts.isClassDeclaration(statement)) {
if (statement.pos === node.pos && statement.end === node.end) {
return directive.concat(
this.classHelper.visitClassDeclaration(filename, statement, sourceFile)
this.classHelper.visitClassDeclaration(
filename,
statement,
sourceFile,
astFile
)
);
}
}
Expand All @@ -1543,7 +1555,7 @@ export class AngularDependencies extends FrameworkDependencies {
return res[0] || {};
}

private getInterfaceIO(filename: string, sourceFile, node, fileBody) {
private getInterfaceIO(filename: string, sourceFile, node, fileBody, astFile) {
/**
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
*/
Expand All @@ -1552,7 +1564,12 @@ export class AngularDependencies extends FrameworkDependencies {
if (ts.isInterfaceDeclaration(statement)) {
if (statement.pos === node.pos && statement.end === node.end) {
return directive.concat(
this.classHelper.visitClassDeclaration(filename, statement, sourceFile)
this.classHelper.visitClassDeclaration(
filename,
statement,
sourceFile,
astFile
)
);
}
}
Expand Down
51 changes: 40 additions & 11 deletions src/app/compiler/angular/deps/helpers/class-helper.ts
Expand Up @@ -467,7 +467,8 @@ export class ClassHelper {
public visitClassDeclaration(
fileName: string,
classDeclaration: ts.ClassDeclaration | ts.InterfaceDeclaration,
sourceFile?: ts.SourceFile
sourceFile?: ts.SourceFile,
astFile?: ts.SourceFile
): any {
let symbol = this.typeChecker.getSymbolAtLocation(classDeclaration.name);
let rawdescription = '';
Expand Down Expand Up @@ -512,7 +513,7 @@ export class ClassHelper {
let className = classDeclaration.name.text;
let members;
let implementsElements = [];
let extendsElement;
let extendsElements = [];

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

if (typeof ts.getClassExtendsHeritageElement !== 'undefined') {
let extendsTypes = ts.getClassExtendsHeritageElement(classDeclaration);
if (extendsTypes) {
if (extendsTypes.expression) {
extendsElement = extendsTypes.expression.text;
if (astFile) {
let interfaceOrClassNode = astFile.getInterface(className);
if (!interfaceOrClassNode) {
interfaceOrClassNode = astFile.getClass(className);
}
if (interfaceOrClassNode) {
const extendsListRaw = interfaceOrClassNode.getExtends();
let extendsList = [];
if (extendsListRaw) {
if (Array.isArray(extendsListRaw)) {
if (extendsListRaw.length > 0) {
extendsListRaw.forEach(extendElement => {
const extendElementExpression = extendElement.getExpression();
if (extendElementExpression) {
const text = extendElementExpression.getText();
if (text) {
extendsList.push(text);
}
}
});
}
} else {
const extendElementExpression = extendsListRaw.getExpression();
if (extendElementExpression) {
const text = extendElementExpression.getText();
if (text) {
extendsList.push(text);
}
}
}
}
extendsElements = extendsList;
}
}
}
Expand Down Expand Up @@ -575,7 +604,7 @@ export class ClassHelper {
kind: members.kind,
constructor: members.constructor,
jsdoctags: jsdoctags,
extends: extendsElement,
extends: extendsElements,
implements: implementsElements,
accessors: members.accessors
};
Expand All @@ -594,7 +623,7 @@ export class ClassHelper {
kind: members.kind,
constructor: members.constructor,
jsdoctags: jsdoctags,
extends: extendsElement,
extends: extendsElements,
implements: implementsElements,
accessors: members.accessors
}
Expand Down Expand Up @@ -639,7 +668,7 @@ export class ClassHelper {
kind: members.kind,
constructor: members.constructor,
jsdoctags: jsdoctags,
extends: extendsElement,
extends: extendsElements,
implements: implementsElements,
accessors: members.accessors
}
Expand All @@ -662,7 +691,7 @@ export class ClassHelper {
kind: members.kind,
constructor: members.constructor,
jsdoctags: jsdoctags,
extends: extendsElement,
extends: extendsElements,
implements: implementsElements,
accessors: members.accessors
}
Expand All @@ -682,7 +711,7 @@ export class ClassHelper {
kind: members.kind,
constructor: members.constructor,
jsdoctags: jsdoctags,
extends: extendsElement,
extends: extendsElements,
implements: implementsElements,
accessors: members.accessors
}
Expand Down
10 changes: 8 additions & 2 deletions src/app/compiler/angular/deps/helpers/component-helper.ts
Expand Up @@ -321,7 +321,8 @@ export class ComponentHelper {
filename: string,
sourceFile: ts.SourceFile,
node: ts.Node,
fileBody
fileBody,
astFile: ts.SourceFile
): any {
/**
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
Expand All @@ -331,7 +332,12 @@ export class ComponentHelper {
if (ts.isClassDeclaration(statement)) {
if (statement.pos === node.pos && statement.end === node.end) {
return directive.concat(
this.classHelper.visitClassDeclaration(filename, statement, sourceFile)
this.classHelper.visitClassDeclaration(
filename,
statement,
sourceFile,
astFile
)
);
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/templates/partials/class.hbs
Expand Up @@ -49,7 +49,9 @@
<h3>{{t "extends" }}</h3>
</p>
<p class="comment">
{{> link-type type=class.extends }}
{{#each class.extends}}
{{> link-type type=this }}
{{/each}}
</p>
{{/if}}

Expand Down
4 changes: 3 additions & 1 deletion src/templates/partials/component-detail.hbs
Expand Up @@ -28,7 +28,9 @@
<h3>{{t "extends" }}</h3>
</p>
<p class="comment">
{{> link-type type=component.extends }}
{{#each component.extends}}
{{> link-type type=this }}
{{/each}}
</p>
{{/if}}

Expand Down
4 changes: 3 additions & 1 deletion src/templates/partials/controller.hbs
Expand Up @@ -58,7 +58,9 @@
<h3>{{t "extends" }}</h3>
</p>
<p class="comment">
{{> link-type type=controller.extends }}
{{#each controllerextends}}
{{> link-type type=this }}
{{/each}}
</p>
{{/if}}

Expand Down
4 changes: 3 additions & 1 deletion src/templates/partials/directive.hbs
Expand Up @@ -49,7 +49,9 @@
<h3>{{t "extends" }}</h3>
</p>
<p class="comment">
{{> link-type type=directive.extends }}
{{#each directive.extends}}
{{> link-type type=this }}
{{/each}}
</p>
{{/if}}

Expand Down
4 changes: 3 additions & 1 deletion src/templates/partials/guard.hbs
Expand Up @@ -49,7 +49,9 @@
<h3>{{t "extends" }}</h3>
</p>
<p class="comment">
{{> link-type type=injectable.extends }}
{{#each injectable.extends}}
{{> link-type type=this }}
{{/each}}
</p>
{{/if}}

Expand Down
4 changes: 3 additions & 1 deletion src/templates/partials/injectable.hbs
Expand Up @@ -49,7 +49,9 @@
<h3>{{t "extends" }}</h3>
</p>
<p class="comment">
{{> link-type type=injectable.extends }}
{{#each injectable.extends}}
{{> link-type type=this }}
{{/each}}
</p>
{{/if}}

Expand Down
4 changes: 3 additions & 1 deletion src/templates/partials/interface.hbs
Expand Up @@ -52,7 +52,9 @@
<h3>{{t "extends" }}</h3>
</p>
<p class="comment">
{{> link-type type=interface.extends }}
{{#each interface.extends}}
{{> link-type type=this }}
{{/each}}
</p>
{{/if}}

Expand Down
8 changes: 4 additions & 4 deletions src/utils/extends-merger.util.ts
Expand Up @@ -29,7 +29,7 @@ export class ExtendsMerger {
const mergeExtendedProperties = component => {
let ext;
if (typeof component.extends !== 'undefined') {
ext = this.findInDependencies(component.extends);
ext = this.findInDependencies(component.extends[0]);

if (ext) {
const recursiveScanWithInheritance = cls => {
Expand Down Expand Up @@ -112,7 +112,7 @@ export class ExtendsMerger {
);
}
if (cls.extends) {
recursiveScanWithInheritance(this.findInDependencies(cls.extends));
recursiveScanWithInheritance(this.findInDependencies(cls.extends[0]));
}
};
// From class to class
Expand All @@ -128,7 +128,7 @@ export class ExtendsMerger {
const mergeExtendedClasses = el => {
let ext;
if (typeof el.extends !== 'undefined') {
ext = this.findInDependencies(el.extends);
ext = this.findInDependencies(el.extends[0]);
if (ext) {
const recursiveScanWithInheritance = cls => {
if (typeof cls.methods !== 'undefined' && cls.methods.length > 0) {
Expand All @@ -146,7 +146,7 @@ export class ExtendsMerger {
}
}
if (cls.extends) {
recursiveScanWithInheritance(this.findInDependencies(cls.extends));
recursiveScanWithInheritance(this.findInDependencies(cls.extends[0]));
}
};
// From elss to elss
Expand Down
9 changes: 9 additions & 0 deletions test/fixtures/sample-files-extends/src/app/boo.interface.ts
@@ -0,0 +1,9 @@
/**
* A boo interface just for documentation purpose
*/
export interface BooInterface {
/**
* The boo
*/
boo: string;
}
25 changes: 25 additions & 0 deletions test/fixtures/sample-files-extends/src/app/clock.interface.ts
@@ -0,0 +1,25 @@
import { BooInterface } from './boo.interface';
import { TimeInterface } from './time.interface';

/**
* A class interface just for documentation purpose
*
* ```typescript
* class Clock implements ClockInterface {
* currentTime: Date;
* constructor(h: number, m: number) { }
* }
* ```
*/
interface ClockInterface extends TimeInterface, BooInterface {
/**
* The current time
* @type {Date}
* @deprecated The current time property is deprecated
*/
currentTime: Date;
/**
* A simple reset method
*/
reset(): void;
}

0 comments on commit 229f407

Please sign in to comment.