Skip to content

Commit 617764d

Browse files
authored
feat(flags): isStatic (#91)
Add isStatic flag to various declarations
1 parent 5ffa0e3 commit 617764d

File tree

12 files changed

+195
-7
lines changed

12 files changed

+195
-7
lines changed

src/declarations/AccessorDeclaration.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AbstractDeclaration, ScopedDeclaration, TypedDeclaration } from './Declaration';
1+
import { AbstractDeclaration, ScopedDeclaration, StaticDeclaration, TypedDeclaration } from './Declaration';
22
import { DeclarationVisibility } from './DeclarationVisibility';
33

44
/**
@@ -11,12 +11,17 @@ import { DeclarationVisibility } from './DeclarationVisibility';
1111
* @implements {TypedDeclaration}
1212
* @implements {AbstractDeclaration}
1313
*/
14-
export abstract class AccessorDeclaration implements ScopedDeclaration, TypedDeclaration, AbstractDeclaration {
14+
export abstract class AccessorDeclaration implements
15+
ScopedDeclaration,
16+
StaticDeclaration,
17+
TypedDeclaration,
18+
AbstractDeclaration {
1519
constructor(
1620
public name: string,
1721
public visibility: DeclarationVisibility | undefined,
1822
public type: string | undefined,
1923
public isAbstract: boolean,
24+
public isStatic: boolean,
2025
public start?: number,
2126
public end?: number,
2227
) { }

src/declarations/Declaration.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,20 @@ export interface OptionalDeclaration extends Declaration {
192192
*/
193193
isOptional: boolean;
194194
}
195+
196+
/**
197+
* Interface for possible static declarations.
198+
*
199+
* @export
200+
* @interface StaticDeclaration
201+
* @extends {Declaration}
202+
*/
203+
export interface StaticDeclaration extends Declaration {
204+
/**
205+
* Defines if the declaration is static or not.
206+
*
207+
* @type {boolean}
208+
* @memberof StaticDeclaration
209+
*/
210+
isStatic: boolean;
211+
}

src/declarations/MethodDeclaration.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
CallableDeclaration,
44
OptionalDeclaration,
55
ScopedDeclaration,
6+
StaticDeclaration,
67
TypedDeclaration,
78
} from './Declaration';
89
import { DeclarationVisibility } from './DeclarationVisibility';
@@ -24,6 +25,7 @@ export class MethodDeclaration implements
2425
CallableDeclaration,
2526
OptionalDeclaration,
2627
ScopedDeclaration,
28+
StaticDeclaration,
2729
TypedDeclaration {
2830

2931
public parameters: ParameterDeclaration[] = [];
@@ -35,6 +37,7 @@ export class MethodDeclaration implements
3537
public visibility: DeclarationVisibility | undefined,
3638
public type: string | undefined,
3739
public isOptional: boolean,
40+
public isStatic: boolean,
3841
public start?: number,
3942
public end?: number,
4043
) { }

src/declarations/PropertyDeclaration.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { OptionalDeclaration, ScopedDeclaration, TypedDeclaration } from './Declaration';
1+
import { OptionalDeclaration, ScopedDeclaration, StaticDeclaration, TypedDeclaration } from './Declaration';
22
import { DeclarationVisibility } from './DeclarationVisibility';
33

44
/**
@@ -9,12 +9,13 @@ import { DeclarationVisibility } from './DeclarationVisibility';
99
* @implements {ScopedDeclaration}
1010
* @implements {TypedDeclaration}
1111
*/
12-
export class PropertyDeclaration implements OptionalDeclaration, ScopedDeclaration, TypedDeclaration {
12+
export class PropertyDeclaration implements OptionalDeclaration, ScopedDeclaration, StaticDeclaration, TypedDeclaration {
1313
constructor(
1414
public name: string,
1515
public visibility: DeclarationVisibility | undefined,
1616
public type: string | undefined,
1717
public isOptional: boolean,
18+
public isStatic: boolean,
1819
public start?: number,
1920
public end?: number,
2021
) { }

src/node-parser/class-parser.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
import { parseFunctionParts, parseMethodParams } from './function-parser';
3030
import { parseIdentifier } from './identifier-parser';
3131
import {
32+
containsModifier,
3233
getDefaultResourceIdentifier,
3334
getNodeType,
3435
getNodeVisibility,
@@ -89,6 +90,7 @@ export function parseCtorParams(
8990
getNodeVisibility(o),
9091
getNodeType(o.type),
9192
!!o.questionToken,
93+
containsModifier(o, SyntaxKind.StaticKeyword),
9294
o.getStart(),
9395
o.getEnd(),
9496
),
@@ -139,6 +141,7 @@ export function parseClass(tsResource: Resource, node: ClassDeclaration): void {
139141
getNodeVisibility(o),
140142
getNodeType(o.type),
141143
!!o.questionToken,
144+
containsModifier(o, SyntaxKind.StaticKeyword),
142145
o.getStart(),
143146
o.getEnd(),
144147
),
@@ -151,6 +154,7 @@ export function parseClass(tsResource: Resource, node: ClassDeclaration): void {
151154
getNodeVisibility(o),
152155
getNodeType(o.type),
153156
!!o.questionToken,
157+
containsModifier(o, SyntaxKind.StaticKeyword),
154158
o.getStart(),
155159
o.getEnd(),
156160
),
@@ -166,6 +170,7 @@ export function parseClass(tsResource: Resource, node: ClassDeclaration): void {
166170
getNodeVisibility(o),
167171
getNodeType(o.type),
168172
o.modifiers !== undefined && o.modifiers.some(m => m.kind === SyntaxKind.AbstractKeyword),
173+
containsModifier(o, SyntaxKind.StaticKeyword),
169174
o.getStart(),
170175
o.getEnd(),
171176
),
@@ -179,6 +184,7 @@ export function parseClass(tsResource: Resource, node: ClassDeclaration): void {
179184
getNodeVisibility(o),
180185
getNodeType(o.type),
181186
o.modifiers !== undefined && o.modifiers.some(m => m.kind === SyntaxKind.AbstractKeyword),
187+
containsModifier(o, SyntaxKind.StaticKeyword),
182188
o.getStart(),
183189
o.getEnd(),
184190
),
@@ -197,6 +203,7 @@ export function parseClass(tsResource: Resource, node: ClassDeclaration): void {
197203
getNodeVisibility(o),
198204
getNodeType(o.type),
199205
!!o.questionToken,
206+
containsModifier(o, SyntaxKind.StaticKeyword),
200207
o.getStart(),
201208
o.getEnd(),
202209
);

src/node-parser/interface-parser.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Identifier, InterfaceDeclaration } from 'typescript';
1+
import { Identifier, InterfaceDeclaration, SyntaxKind } from 'typescript';
22

33
import { DeclarationVisibility } from '../declarations/DeclarationVisibility';
44
import { DefaultDeclaration } from '../declarations/DefaultDeclaration';
@@ -8,7 +8,13 @@ import { PropertyDeclaration } from '../declarations/PropertyDeclaration';
88
import { Resource } from '../resources/Resource';
99
import { isMethodSignature, isPropertySignature } from '../type-guards/TypescriptGuards';
1010
import { parseMethodParams } from './function-parser';
11-
import { getDefaultResourceIdentifier, getNodeType, isNodeDefaultExported, isNodeExported } from './parse-utilities';
11+
import {
12+
containsModifier,
13+
getDefaultResourceIdentifier,
14+
getNodeType,
15+
isNodeDefaultExported,
16+
isNodeExported,
17+
} from './parse-utilities';
1218

1319
/**
1420
* Parses an interface node into its declaration.
@@ -38,6 +44,7 @@ export function parseInterface(resource: Resource, node: InterfaceDeclaration):
3844
DeclarationVisibility.Public,
3945
getNodeType(o.type),
4046
!!o.questionToken,
47+
containsModifier(o, SyntaxKind.StaticKeyword),
4148
o.getStart(),
4249
o.getEnd(),
4350
),
@@ -49,6 +56,7 @@ export function parseInterface(resource: Resource, node: InterfaceDeclaration):
4956
DeclarationVisibility.Public,
5057
getNodeType(o.type),
5158
!!o.questionToken,
59+
containsModifier(o, SyntaxKind.StaticKeyword),
5260
o.getStart(),
5361
o.getEnd(),
5462
);

src/node-parser/parse-utilities.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@ export function getNodeType(node: TypeNode | undefined): string | undefined {
4141
return node ? node.getText() : undefined;
4242
}
4343

44+
/**
45+
* Checks if a node contains a certain modifier (of a given kind)
46+
*
47+
* @export
48+
* @param {Node} node
49+
* @param {SyntaxKind} modifierKind
50+
* @returns {boolean}
51+
*/
52+
export function containsModifier(node: Node, modifierKind: SyntaxKind): boolean {
53+
if (!node.modifiers) return false;
54+
return node.modifiers.some(mod => mod.kind === modifierKind);
55+
}
56+
4457
/**
4558
* Returns the enum value (visibility) of a node.
4659
*

test/TypescriptParser.spec.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ describe('TypescriptParser', () => {
460460
});
461461

462462
it('should parse a file', () => {
463-
expect(parsed.declarations).toHaveLength(9);
463+
expect(parsed.declarations).toHaveLength(10);
464464
});
465465

466466
it('should parse an abstract class', () => {
@@ -547,6 +547,12 @@ describe('TypescriptParser', () => {
547547
expect(parsedClass.properties).toMatchSnapshot();
548548
});
549549

550+
it('should parse static class properties and methods', () => {
551+
const parsedClass = parsed.declarations[9] as ClassDeclaration;
552+
553+
expect(parsedClass).toMatchSnapshot();
554+
});
555+
550556
});
551557

552558
describe('Modules', () => {

0 commit comments

Comments
 (0)