Skip to content

Commit d627174

Browse files
Added basic type node traversal to register type argument dependencies
1 parent edab2a7 commit d627174

File tree

7 files changed

+387
-167
lines changed

7 files changed

+387
-167
lines changed

typescript/src/core/features.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,14 @@ import {
124124
JSXSpreadChildTraverser
125125
} from "./traversers/jsx.traverser";
126126
import { ExportsPostProcessor } from "./post-processors/exports.post-processor";
127+
import {
128+
ArrayTypeTraverser,
129+
IntersectionTypeTraverser,
130+
TupleTypeTraverser,
131+
TypeAnnotationTraverser,
132+
TypeReferenceTraverser,
133+
UnionTypeTraverser
134+
} from "./traversers/type.traverser";
127135

128136
/**
129137
* Central index of all traversers natively supported by the LCE.
@@ -191,6 +199,7 @@ export const TRAVERSERS: Map<AST_NODE_TYPES, Traverser> = new Map([
191199
[AST_NODE_TYPES.TSAbstractAccessorProperty, new AccessorPropertyTraverser()],
192200
[AST_NODE_TYPES.TSAbstractMethodDefinition, new MethodTraverser()],
193201
[AST_NODE_TYPES.TSAbstractPropertyDefinition, new PropertyTraverser()],
202+
[AST_NODE_TYPES.TSArrayType, new ArrayTypeTraverser()],
194203
[AST_NODE_TYPES.TSAsExpression, new AsExpressionTraverser()],
195204
[AST_NODE_TYPES.TSClassImplements, new SimpleTraverser()],
196205
[AST_NODE_TYPES.TSDeclareFunction, new FunctionTraverser()],
@@ -201,15 +210,20 @@ export const TRAVERSERS: Map<AST_NODE_TYPES, Traverser> = new Map([
201210
[AST_NODE_TYPES.TSInterfaceBody, new InterfaceBodyTraverser()],
202211
[AST_NODE_TYPES.TSInterfaceDeclaration, new InterfaceDeclarationTraverser()],
203212
[AST_NODE_TYPES.TSInterfaceHeritage, new InterfaceHeritageTraverser()],
213+
[AST_NODE_TYPES.TSIntersectionType, new IntersectionTypeTraverser()],
204214
[AST_NODE_TYPES.TSMethodSignature, new MethodTraverser()],
205215
[AST_NODE_TYPES.TSNonNullExpression, new NonNullExpressionTraverser()],
206216
[AST_NODE_TYPES.TSParameterProperty, new ParameterPropertyTraverser()],
207217
[AST_NODE_TYPES.TSPropertySignature, new PropertyTraverser()],
218+
[AST_NODE_TYPES.TSTupleType, new TupleTypeTraverser()],
208219
[AST_NODE_TYPES.TSTypeAliasDeclaration, new TypeAliasDeclarationTraverser()],
220+
[AST_NODE_TYPES.TSTypeAnnotation, new TypeAnnotationTraverser()],
209221
[AST_NODE_TYPES.TSTypeAssertion, new TypeAssertionTraverser()],
210222
[AST_NODE_TYPES.TSTypeParameter, new TypeParameterTraverser()],
211223
[AST_NODE_TYPES.TSTypeParameterDeclaration, new TypeParameterDeclarationTraverser()],
212224
[AST_NODE_TYPES.TSTypeParameterInstantiation, new TypeParameterInstantiationTraverser()],
225+
[AST_NODE_TYPES.TSTypeReference, new TypeReferenceTraverser()],
226+
[AST_NODE_TYPES.TSUnionType, new UnionTypeTraverser()],
213227
[AST_NODE_TYPES.UnaryExpression, new UnaryExpressionTraverser()],
214228
[AST_NODE_TYPES.UpdateExpression, new UpdateExpressionTraverser()],
215229
[AST_NODE_TYPES.VariableDeclaration, new VariableDeclarationTraverser()],

typescript/src/core/traversers/expression.traverser.ts

Lines changed: 87 additions & 97 deletions
Large diffs are not rendered by default.

typescript/src/core/traversers/function.traverser.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,6 @@ export class FunctionTraverser extends Traverser {
2020
node.type === AST_NODE_TYPES.FunctionExpression ||
2121
node.type === AST_NODE_TYPES.TSDeclareFunction
2222
) {
23-
if (node.typeParameters) {
24-
runTraverserForNodes(
25-
node.typeParameters.params,
26-
{ parentPropName: FunctionTraverser.TYPE_PARAMETERS_PROP },
27-
processingContext,
28-
processors,
29-
conceptMaps,
30-
);
31-
}
3223
runTraverserForNodes(node.params, { parentPropName: FunctionTraverser.PARAMETERS_PROP }, processingContext, processors, conceptMaps);
3324
if (node.body)
3425
runTraverserForNode(node.body, { parentPropName: FunctionTraverser.BODY_PROP }, processingContext, processors, conceptMaps);
Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,12 @@
1-
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2-
3-
import { ConceptMap, mergeConceptMaps } from "../concept";
1+
import { ConceptMap } from "../concept";
42
import { ProcessingContext } from "../context";
53
import { ProcessorMap } from "../processor";
64
import { Traverser } from "../traverser";
7-
import { runTraverserForNodes } from "../utils/traverser.utils";
85

96
export class TypeAliasDeclarationTraverser extends Traverser {
107
public static readonly TYPE_PARAMETERS_PROP = "type-parameters";
118

129
public traverseChildren(processingContext: ProcessingContext, processors: ProcessorMap): ConceptMap {
13-
const { node } = processingContext;
14-
const conceptMaps: ConceptMap[] = [];
15-
16-
if (node.type === AST_NODE_TYPES.TSTypeAliasDeclaration) {
17-
if (node.typeParameters) {
18-
runTraverserForNodes(
19-
node.typeParameters.params,
20-
{
21-
parentPropName: TypeAliasDeclarationTraverser.TYPE_PARAMETERS_PROP,
22-
},
23-
processingContext,
24-
processors,
25-
conceptMaps,
26-
);
27-
}
28-
}
29-
30-
return mergeConceptMaps(...conceptMaps);
10+
return new Map();
3111
}
3212
}
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
import { Traverser } from "../traverser";
2+
import { ProcessingContext } from "../context";
3+
import { ProcessorMap } from "../processor";
4+
import { ConceptMap, mergeConceptMaps } from "../concept";
5+
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
6+
import { runTraverserForNode, runTraverserForNodes } from "../utils/traverser.utils";
7+
8+
export class TypeAnnotationTraverser extends Traverser {
9+
public static readonly TYPE_PROP = "type";
10+
11+
public traverseChildren(processingContext: ProcessingContext, processors: ProcessorMap): ConceptMap {
12+
const { node } = processingContext;
13+
const conceptMaps: ConceptMap[] = [];
14+
15+
if (node.type === AST_NODE_TYPES.TSTypeAnnotation) {
16+
runTraverserForNode(
17+
node.typeAnnotation,
18+
{ parentPropName: TypeAnnotationTraverser.TYPE_PROP },
19+
processingContext,
20+
processors,
21+
conceptMaps,
22+
);
23+
}
24+
25+
return mergeConceptMaps(...conceptMaps);
26+
}
27+
}
28+
29+
export class TypeReferenceTraverser extends Traverser {
30+
public static readonly TYPE_ARGUMENTS_PROP = "type-arguments";
31+
public static readonly TYPE_NAME_PROP = "type-name";
32+
33+
public traverseChildren(processingContext: ProcessingContext, processors: ProcessorMap): ConceptMap {
34+
const { node } = processingContext;
35+
const conceptMaps: ConceptMap[] = [];
36+
37+
if (node.type === AST_NODE_TYPES.TSTypeReference) {
38+
if (node.typeArguments)
39+
runTraverserForNode(
40+
node.typeArguments,
41+
{
42+
parentPropName: TypeReferenceTraverser.TYPE_ARGUMENTS_PROP,
43+
},
44+
processingContext,
45+
processors,
46+
conceptMaps,
47+
);
48+
runTraverserForNode(node.typeName, { parentPropName: TypeReferenceTraverser.TYPE_NAME_PROP }, processingContext, processors, conceptMaps);
49+
}
50+
51+
return mergeConceptMaps(...conceptMaps);
52+
}
53+
}
54+
55+
export class UnionTypeTraverser extends Traverser {
56+
public static readonly TYPES_PROP = "types";
57+
58+
public traverseChildren(processingContext: ProcessingContext, processors: ProcessorMap): ConceptMap {
59+
const { node } = processingContext;
60+
const conceptMaps: ConceptMap[] = [];
61+
62+
if (node.type === AST_NODE_TYPES.TSUnionType) {
63+
runTraverserForNodes(
64+
node.types,
65+
{
66+
parentPropName: UnionTypeTraverser.TYPES_PROP,
67+
},
68+
processingContext,
69+
processors,
70+
conceptMaps,
71+
);
72+
}
73+
74+
return mergeConceptMaps(...conceptMaps);
75+
}
76+
}
77+
78+
export class IntersectionTypeTraverser extends Traverser {
79+
public static readonly TYPES_PROP = "types";
80+
81+
public traverseChildren(processingContext: ProcessingContext, processors: ProcessorMap): ConceptMap {
82+
const { node } = processingContext;
83+
const conceptMaps: ConceptMap[] = [];
84+
85+
if (node.type === AST_NODE_TYPES.TSIntersectionType) {
86+
runTraverserForNodes(
87+
node.types,
88+
{
89+
parentPropName: IntersectionTypeTraverser.TYPES_PROP,
90+
},
91+
processingContext,
92+
processors,
93+
conceptMaps,
94+
);
95+
}
96+
97+
return mergeConceptMaps(...conceptMaps);
98+
}
99+
}
100+
101+
export class TupleTypeTraverser extends Traverser {
102+
public static readonly ELEMENT_TYPES_PROP = "element-types";
103+
104+
public traverseChildren(processingContext: ProcessingContext, processors: ProcessorMap): ConceptMap {
105+
const { node } = processingContext;
106+
const conceptMaps: ConceptMap[] = [];
107+
108+
if (node.type === AST_NODE_TYPES.TSTupleType) {
109+
runTraverserForNodes(
110+
node.elementTypes,
111+
{
112+
parentPropName: TupleTypeTraverser.ELEMENT_TYPES_PROP,
113+
},
114+
processingContext,
115+
processors,
116+
conceptMaps,
117+
);
118+
}
119+
120+
return mergeConceptMaps(...conceptMaps);
121+
}
122+
}
123+
124+
export class ArrayTypeTraverser extends Traverser {
125+
public static readonly ELEMENT_TYPE_PROP = "element-type";
126+
127+
public traverseChildren(processingContext: ProcessingContext, processors: ProcessorMap): ConceptMap {
128+
const { node } = processingContext;
129+
const conceptMaps: ConceptMap[] = [];
130+
131+
if (node.type === AST_NODE_TYPES.TSArrayType) {
132+
runTraverserForNode(
133+
node.elementType,
134+
{
135+
parentPropName: ArrayTypeTraverser.ELEMENT_TYPE_PROP,
136+
},
137+
processingContext,
138+
processors,
139+
conceptMaps,
140+
);
141+
}
142+
143+
return mergeConceptMaps(...conceptMaps);
144+
}
145+
}
146+
147+
// TODO: implement traversal of other type constructs
148+
// TSFunctionType
149+
// TSConditionalType
150+
// TSConstructorType
151+
// TSImportType
152+
// TSIndexedAccessType
153+
// TSInferType
154+
// TSIntrinsicKeyword
155+
// TSLiteralType
156+
// TSMappedType
157+
// TSNamedTupleMember
158+
// TSNeverKeyword
159+
// TSOptionalType
160+
// TSQualifiedName
161+
// TSRestType
162+
// TSTemplateLiteralType
163+
// TSTypeLiteral
164+
// TSTypeOperator
165+
// TSTypePredicate
166+
// TSTypeQuery

0 commit comments

Comments
 (0)