Skip to content

Commit 8466592

Browse files
committed
TypescriptAPIUtils: add isClassInstanceOf function
1 parent c4f5c66 commit 8466592

File tree

11 files changed

+128
-0
lines changed

11 files changed

+128
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
export * from './instanceOf';
12
export * from './lookupParentClass';
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import {find, exists} from '@slicky/utils';
2+
import {lookupDeepParentClasses} from './lookupParentClass';
3+
import {ResolvedIdentifier} from '../resolvers';
4+
import {lookupSourceFile} from '../sourceFiles';
5+
import * as ts from 'typescript';
6+
7+
8+
export function isClassInstanceOf(classDeclaration: ts.ClassDeclaration, parentClass: ts.ClassDeclaration, compilerOptions: ts.CompilerOptions, moduleResolutionHost: ts.ModuleResolutionHost): boolean
9+
{
10+
let parentClassSourceFile: ts.SourceFile = undefined;
11+
function getParentClassSourceFile(): ts.SourceFile
12+
{
13+
return exists(parentClassSourceFile) ? parentClassSourceFile : parentClassSourceFile = lookupSourceFile(parentClass);
14+
}
15+
16+
const parents = lookupDeepParentClasses(classDeclaration, compilerOptions, moduleResolutionHost);
17+
18+
if (!parents.parents.length) {
19+
return false;
20+
}
21+
22+
const foundParent = find(parents.parents, (parent: ResolvedIdentifier<ts.ClassDeclaration>) => {
23+
if (parent.node === parentClass) {
24+
return true;
25+
}
26+
27+
if (!parent.imported) {
28+
return false;
29+
}
30+
31+
if (!exists(parentClass.name)) {
32+
return false;
33+
}
34+
35+
const parentSourceFile = getParentClassSourceFile();
36+
37+
if (parentSourceFile.fileName !== parent.sourceFile.fileName) {
38+
return false;
39+
}
40+
41+
return (<ts.Identifier>parentClass.name).text === parent.originalName;
42+
});
43+
44+
return exists(foundParent);
45+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export class A {}
2+
export class B {}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export class A {}
2+
export class B extends A {}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export class A {}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import {A} from './valid_3.classA';
2+
3+
4+
export class B extends A {}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export class A {}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './valid_4.classA2';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './valid_4.classA';
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import {A} from './valid_4.classA1';
2+
3+
4+
export class B extends A {}

0 commit comments

Comments
 (0)