8000 Change name generation · SebastienGllmt/typescript-is@c3778a4 · GitHub
[go: up one dir, main page]

Skip to content

Commit c3778a4

Browse files
Change name generation
1 parent 765a949 commit c3778a4

File tree

6 files changed

+65
-69
lines changed

6 files changed

+65
-69
lines changed

debug/debug.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { transformNode } from '../src/transform-inline/transform-node';
88
import { PartialVisitorContext } from '../src/transform-inline/visitor-context';
99

1010
const configFilename = path.resolve('tsconfig.json');
11-
const inFile = path.resolve('test', 'issue-12.ts');
11+
const inFile = path.resolve('test', 'case-1.ts');
1212
const content = ts.sys.readFile(configFilename);
1313
if (content === undefined) {
1414
throw new Error('Could not read config file.');

src/transform-inline/visitor-indexed-access.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as VisitorTypeName from './visitor-type-name';
99
import { sliceSet } from './utils';
1010

1111
function visitRegularObjectType(type: ts.ObjectType, indexType: ts.Type, visitorContext: VisitorContext) {
12-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'indexed-access', indexType });
12+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'indexed-access', indexType });
1313
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
1414
// TODO: check property index
1515
// const stringIndexType = visitorContext.checker.getIndexTypeOfType(type, ts.IndexKind.String);
@@ -44,7 +44,7 @@ function visitRegularObjectType(type: ts.ObjectType, indexType: ts.Type, visitor
4444
}
4545

4646
function visitTupleObjectType(type: ts.TupleType, indexType: ts.Type, visitorContext: VisitorContext) {
47-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'indexed-access', indexType });
47+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'indexed-access', indexType });
4848
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
4949
if (type.typeArguments === undefined) {
5050
throw new Error('Expected tuple type to have type arguments.');
@@ -94,7 +94,7 @@ function visitObjectType(type: ts.ObjectType, indexType: ts.Type, visitorContext
9494
}
9595

9696
function visitUnionOrIntersectionType(type: ts.UnionOrIntersectionType, indexType: ts.Type, visitorContext: VisitorContext) {
97-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'indexed-access', indexType });
97+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'indexed-access', indexType });
9898
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
9999
const functionNames = type.types.map((type) => visitType(type, indexType, visitorContext));
100100
if (tsutils.isUnionType(type)) {

src/transform-inline/visitor-keyof.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import * as VisitorUtils from './visitor-utils';
55
import * as VisitorTypeName from './visitor-type-name';
66

77
function visitUnionOrIntersectionType(type: ts.UnionOrIntersectionType, visitorContext: VisitorContext) {
8-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'keyof' });
8+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'keyof' });
99
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
1010
const functionNames = type.types.map((type) => visitType(type, visitorContext));
1111
if (tsutils.isUnionType(type)) {
@@ -46,7 +46,7 @@ function visitRegularObjectType(type: ts.ObjectType, visitorContext: VisitorCont
4646
// keyof { [Key: string]: U } = string
4747
return VisitorUtils.getStringFunction(visitorContext);
4848
} else {
49-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'keyof' });
49+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'keyof' });
5050
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
5151
// In keyof mode we check if the object is equal to one of the property names.
5252
// keyof { x: T } = x

src/transform-inline/visitor-type-check.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as VisitorTypeName from './visitor-type-name';
99
import { sliceSet } from './utils';
1010

1111
function visitTupleObjectType(type: ts.TupleType, visitorContext: VisitorContext) {
12-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'type-check' });
12+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'type-check' });
1313
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
1414
if (type.typeArguments === undefined) {
1515
throw new Error('Expected tuple type to have type arguments.');
@@ -107,7 +107,7 @@ function visitTupleObjectType(type: ts.TupleType, visitorContext: VisitorContext
107107
}
108108

109109
function visitArrayObjectType(type: ts.ObjectType, visitorContext: VisitorContext) {
110-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'type-check' });
110+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'type-check' });
111111
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
112112
const numberIndexType = visitorContext.checker.getIndexTypeOfType(type, ts.IndexKind.Number);
113113
if (numberIndexType === undefined) {
@@ -215,7 +215,7 @@ function visitArrayObjectType(type: ts.ObjectType, visitorContext: VisitorContex
215215
}
216216

217217
function visitRegularObjectType(type: ts.ObjectType, visitorContext: VisitorContext) {
218-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'type-check', superfluousPropertyCheck: visitorContext.options.disallowSuperfluousObjectProperties });
218+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'type-check', superfluousPropertyCheck: visitorContext.options.disallowSuperfluousObjectProperties });
219219
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
220220
const propertyInfos = visitorContext.checker.getPropertiesOfType(type).map((property) => VisitorUtils.getPropertyInfo(property, visitorContext));
221221
const stringIndexType = visitorContext.checker.getIndexTypeOfType(type, ts.IndexKind.String);
@@ -436,7 +436,7 @@ function visitObjectType(type: ts.ObjectType, visitorContext: VisitorContext) {
436436

437437
function visitLiteralType(type: ts.LiteralType, visitorContext: VisitorContext) {
438438
if (typeof type.value === 'string') {
439-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'type-check' });
439+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'type-check' });
440440
const value = type.value;
441441
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
442442
return VisitorUtils.createAssertionFunction(
@@ -449,7 +449,7 @@ function visitLiteralType(type: ts.LiteralType, visitorContext: VisitorContext)
449449
);
450450
});
451451
} else if (typeof type.value === 'number') {
452-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'type-check' });
452+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'type-check' });
453453
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
454454
return VisitorUtils.createAssertionFunction(
455455
ts.createStrictInequality(
@@ -468,15 +468,15 @@ function visitLiteralType(type: ts.LiteralType, visitorContext: VisitorContext)
468468
function visitUnionOrIntersectionType(type: ts.UnionOrIntersectionType, visitorContext: VisitorContext) {
469469
const typeUnion = type;
470470
if (tsutils.isUnionType(typeUnion)) {
471-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'type-check' });
471+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'type-check' });
472472
const functionNames = typeUnion.types.map((type) => visitType(type, visitorContext));
473473
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
474474
return VisitorUtils.createDisjunctionFunction(functionNames, name);
475475
});
476476
}
477477
const intersectionType = type;
478478
if (tsutils.isIntersectionType(intersectionType)) {
479-
const name = VisitorTypeName.getFullTypeName(type, visitorContext, { type: 'type-check', superfluousPropertyCheck: visitorContext.options.disallowSuperfluousObjectProperties });
479+
const name = VisitorTypeName.visitType(type, visitorContext, { type: 'type-check', superfluousPropertyCheck: visitorContext.options.disallowSuperfluousObjectProperties });
480480
return VisitorUtils.setFunctionIfNotExists(name, visitorContext, () => {
481481
const functionNames = intersectionType.types.map((type) => visitType(type, { ...visitorContext, options: { ...visitorContext.options, disallowSuperfluousObjectProperties: false } }));
482482
if (visitorContext.options.disallowSuperfluousObjectProperties) {

src/transform-inline/visitor-type-name.ts

Lines changed: 51 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,36 @@ import * as VisitorUtils from './visitor-utils';
55
import * as VisitorKeyof from './visitor-keyof';
66
import * as VisitorIndexedAccess from './visitor-indexed-access';
77

8-
function visitTupleObjectType(type: ts.TupleType, visitorContext: VisitorContext) {
8+
interface TypeCheckNameMode {
9+
type: 'type-check';
10+
superfluousPropertyCheck?: boolean;
11+
}
12+
13+
interface KeyofNameMode {
14+
type: 'keyof';
15+
}
16+
17+
interface IndexedAccessNameMode {
18+
type: 'indexed-access';
19+
indexType: ts.Type;
20+
}
21+
22+
type NameMode = TypeCheckNameMode | KeyofNameMode | IndexedAccessNameMode;
23+
24+
function visitTupleObjectType(type: ts.TupleType, visitorContext: VisitorContext, mode: NameMode) {
925
if (type.typeArguments === undefined) {
1026
throw new Error('Expected tuple type to have type arguments.');
1127
}
12-
const itemNames = type.typeArguments.map((type) => visitType(type, visitorContext));
28+
const itemNames = type.typeArguments.map((type) => visitType(type, visitorContext, mode));
1329
return `st_${itemNames.join('_')}_et`;
1430
}
1531

16-
function visitArrayObjectType(type: ts.ObjectType, visitorContext: VisitorContext) {
32+
function visitArrayObjectType(type: ts.ObjectType, visitorContext: VisitorContext, mode: NameMode) {
1733
const numberIndexType = visitorContext.checker.getIndexTypeOfType(type, ts.IndexKind.Number);
1834
if (numberIndexType === undefined) {
1935
throw new Error('Expected array ObjectType to have a number index type.');
2036
}
21-
const numberIndexName = visitType(numberIndexType, visitorContext);
37+
const numberIndexName = visitType(numberIndexType, visitorContext, mode);
2238
return `sa_${numberIndexName}_ea`;
2339
}
2440

@@ -27,37 +43,37 @@ function visitRegularObjectType(type: ts.ObjectType) {
2743
return `_${id}`;
2844
}
2945

30-
function visitTypeReference(type: ts.TypeReference, visitorContext: VisitorContext) {
46+
function visitTypeReference(type: ts.TypeReference, visitorContext: VisitorContext, mode: NameMode) {
3147
const mapping: Map<ts.Type, ts.Type> = VisitorUtils.getTypeReferenceMapping(type, visitorContext);
3248
const previousTypeReference = visitorContext.previousTypeReference;
3349
visitorContext.typeMapperStack.push(mapping);
3450
visitorContext.previousTypeReference = type;
35-
const result = visitType(type.target, visitorContext);
51+
const result = visitType(type.target, visitorContext, mode);
3652
visitorContext.previousTypeReference = previousTypeReference;
3753
visitorContext.typeMapperStack.pop();
3854
return result;
3955
}
4056

41-
function visitTypeParameter(type: ts.Type, visitorContext: VisitorContext) {
57+
function visitTypeParameter(type: ts.Type, visitorContext: VisitorContext, mode: NameMode) {
4258
const mappedType = VisitorUtils.getResolvedTypeParameter(type, visitorContext);
4359
if (mappedType === undefined) {
4460
throw new Error('Unbound type parameter, missing type node.');
4561
}
46-
return visitType(mappedType, visitorContext);
62+
return visitType(mappedType, visitorContext, mode);
4763
}
4864

49-
function visitObjectType(type: ts.ObjectType, visitorContext: VisitorContext) {
65+
function visitObjectType(type: ts.ObjectType, visitorContext: VisitorContext, mode: NameMode) {
5066
if (tsutils.isTupleType(type)) {
51-
return visitTupleObjectType(type, visitorContext);
67+
return visitTupleObjectType(type, visitorContext, mode);
5268
} else if (visitorContext.checker.getIndexTypeOfType(type, ts.IndexKind.Number)) {
53-
return visitArrayObjectType(type, visitorContext);
69+
return visitArrayObjectType(type, visitorContext, mode);
5470
} else {
5571
return visitRegularObjectType(type);
5672
}
5773
}
5874

59-
function visitUnionOrIntersectionType(type: ts.UnionOrIntersectionType, visitorContext: VisitorContext) {
60-
const names = type.types.map((type) => visitType(type, visitorContext));
75+
function visitUnionOrIntersectionType(type: ts.UnionOrIntersectionType, visitorContext: VisitorContext, mode: NameMode) {
76+
const names = type.types.map((type) => visitType(type, visitorContext, mode));
6177
if (tsutils.isIntersectionType(type)) {
6278
return `si_${names.join('_')}_ei`;
6379
} else {
@@ -77,80 +93,61 @@ function visitIndexedAccessType(type: ts.IndexedAccessType, visitorContext: Visi
7793
return VisitorIndexedAccess.visitType(type.objectType, type.indexType, visitorContext);
7894
}
7995

80-
export function visitType(type: ts.Type, visitorContext: VisitorContext): string {
96+
export function visitType(type: ts.Type, visitorContext: VisitorContext, mode: NameMode): string {
97+
let name: string;
8198
const id: string = (type as unknown as { id: string }).id;
8299
if ((ts.TypeFlags.Any & type.flags) !== 0) {
83-
return VisitorUtils.getAnyFunction(visitorContext);
100+
name = VisitorUtils.getAnyFunction(visitorContext);
84101
} else if ((ts.TypeFlags.Unknown & type.flags) !== 0) {
85-
return VisitorUtils.getUnknownFunction(visitorContext);
102+
name = VisitorUtils.getUnknownFunction(visitorContext);
86103
} else if ((ts.TypeFlags.Never & type.flags) !== 0) {
87-
return VisitorUtils.getNeverFunction(visitorContext);
104+
name = VisitorUtils.getNeverFunction(visitorContext);
88105
} else if ((ts.TypeFlags.Null & type.flags) !== 0) {
89-
return VisitorUtils.getNullFunction(visitorContext);
106+
name = VisitorUtils.getNullFunction(visitorContext);
90107
} else if ((ts.TypeFlags.Undefined & type.flags) !== 0) {
91-
return VisitorUtils.getUndefinedFunction(visitorContext);
108+
name = VisitorUtils.getUndefinedFunction(visitorContext);
92109
} else if ((ts.TypeFlags.Number & type.flags) !== 0) {
93-
return VisitorUtils.getNumberFunction(visitorContext);
110+
name = VisitorUtils.getNumberFunction(visitorContext);
94111
} else if ((ts.TypeFlags.BigInt & type.flags) !== 0) {
95-
return VisitorUtils.getBigintFunction(visitorContext);
112+
name = VisitorUtils.getBigintFunction(visitorContext);
96113
} else if ((ts.TypeFlags.Boolean & type.flags) !== 0) {
97-
return VisitorUtils.getBooleanFunction(visitorContext);
114+
name = VisitorUtils.getBooleanFunction(visitorContext);
98115
} else if ((ts.TypeFlags.String & type.flags) !== 0) {
99-
return VisitorUtils.getStringFunction(visitorContext);
116+
name = VisitorUtils.getStringFunction(visitorContext);
100117
} else if ((ts.TypeFlags.BooleanLiteral & type.flags) !== 0) {
101-
return `_${id}`;
118+
name = `_${id}`;
102119
} else if (tsutils.isTypeReference(type) && visitorContext.previousTypeReference !== type) {
103-
return visitTypeReference(type, visitorContext);
120+
name = visitTypeReference(type, visitorContext, mode);
104121
} else if ((ts.TypeFlags.TypeParameter & type.flags) !== 0) {
105-
return visitTypeParameter(type, visitorContext);
122+
name = visitTypeParameter(type, visitorContext, mode);
106123
} else if (tsutils.isObjectType(type)) {
107-
return visitObjectType(type, visitorContext);
124+
name = visitObjectType(type, visitorContext, mode);
108125
} else if (tsutils.isLiteralType(type)) {
109-
return `_${id}`;
126+
name = `_${id}`;
110127
} else if (tsutils.isUnionOrIntersectionType(type)) {
111-
return visitUnionOrIntersectionType(type, visitorContext);
128+
name = visitUnionOrIntersectionType(type, visitorContext, mode);
112129
} else if ((ts.TypeFlags.NonPrimitive & type.flags) !== 0) {
113-
return `_${id}`;
130+
name = `_${id}`;
114131
} else if ((ts.TypeFlags.Index & type.flags) !== 0) {
115-
return visitIndexType(type, visitorContext);
132+
name = visitIndexType(type, visitorContext);
116133
} else if (tsutils.isIndexedAccessType(type)) {
117-
return visitIndexedAccessType(type, visitorContext);
134+
name = visitIndexedAccessType(type, visitorContext);
118135
} else {
119136
throw new Error('Could not generate type-check; unsupported type with flags: ' + type.flags);
120137
}
121-
}
122-
123-
interface TypeCheckNameMode {
124-
type: 'type-check';
125-
superfluousPropertyCheck?: boolean;
126-
}
127-
128-
interface KeyofNameMode {
129-
type: 'keyof';
130-
}
131-
132-
interface IndexedAccessNameMode {
133-
type: 'indexed-access';
134-
indexType: ts.Type;
135-
}
136-
137-
type NameMode = TypeCheckNameMode | KeyofNameMode | IndexedAccessNameMode;
138-
139-
export function getFullTypeName(type: ts.Type, visitorContext: VisitorContext, mode: NameMode) {
140-
let name = visitType(type, visitorContext);
141138
if (mode.type === 'keyof') {
142139
name += '_keyof';
143140
}
144141
if (mode.type === 'indexed-access') {
145-
const indexTypeName = getFullTypeName(mode.indexType, visitorContext, { type: 'type-check' });
142+
const indexTypeName = visitType(mode.indexType, visitorContext, { type: 'type-check' });
146143
name += `_ia__${indexTypeName}`;
147144
}
148145
if (mode.type === 'type-check' && !!mode.superfluousPropertyCheck) {
149146
name += '_s';
150147
}
151148
if (tsutils.isTypeReference(type) && type.typeArguments !== undefined) {
152149
for (const typeArgument of type.typeArguments) {
153-
const resolvedType = VisitorUtils.getResolvedTypeParameter(typeArgument, visitorContext);
150+
const resolvedType = VisitorUtils.getResolvedTypeParameter(typeArgument, visitorContext) || typeArgument;
154151
name += `_${(resolvedType as unknown as { id: string }).id}`;
155152
}
156153
}

src/transform-inline/visitor-utils.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,7 @@ export function getResolvedTypeParameter(type: ts.Type, visitorContext: VisitorC
111111
break;
112112
}
113113
}
114-
mappedType = mappedType || type.getDefault();
115-
return mappedType;
114+
return mappedType || type.getDefault();
116115
}
117116

118117
export function getStringFunction(visitorContext: VisitorContext) {

0 commit comments

Comments
 (0)
0