Skip to content
This repository was archived by the owner on Jan 19, 2019. It is now read-only.

Commit e33021d

Browse files
committed
Fix: Location data for typeAnnotations
1 parent 62088b1 commit e33021d

File tree

4 files changed

+709
-456
lines changed

4 files changed

+709
-456
lines changed

lib/convert.js

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,12 @@ module.exports = function convert(config) {
8585
*/
8686
function convertTypeAnnotation(child) {
8787
const annotation = convertChild(child);
88+
const annotationStartCol = child.getFullStart() - 1;
89+
const loc = nodeUtils.getLocFor(annotationStartCol, child.end, ast);
8890
return {
8991
type: AST_NODE_TYPES.TypeAnnotation,
90-
loc: annotation.loc,
91-
range: annotation.range,
92+
loc,
93+
range: [annotationStartCol, child.end],
9294
typeAnnotation: annotation
9395
};
9496
}
@@ -160,7 +162,7 @@ module.exports = function convert(config) {
160162

161163
const constraint = typeParameter.constraint
162164
? convert({ node: typeParameter.constraint, parent: typeParameter, ast, additionalOptions })
163-
: null;
165+
: undefined;
164166

165167
const defaultParameter = typeParameter.default
166168
? convert({ node: typeParameter.default, parent: typeParameter, ast, additionalOptions })
@@ -806,7 +808,7 @@ module.exports = function convert(config) {
806808
value: convertChild(node.initializer),
807809
computed: nodeUtils.isComputedProperty(node.name),
808810
static: nodeUtils.hasStaticModifierFlag(node),
809-
readonly: nodeUtils.hasModifier(SyntaxKind.ReadonlyKeyword, node)
811+
readonly: nodeUtils.hasModifier(SyntaxKind.ReadonlyKeyword, node) ? true : undefined
810812
});
811813

812814
if (node.type) {
@@ -1273,7 +1275,10 @@ module.exports = function convert(config) {
12731275

12741276
if (node.type) {
12751277
parameter.typeAnnotation = convertTypeAnnotation(node.type);
1276-
parameter.range[1] = node.type.getEnd();
1278+
const end = node.type.getEnd();
1279+
parameter.range[1] = end;
1280+
const loc = nodeUtils.getLocFor(parameter.range[0], parameter.range[1], ast);
1281+
parameter.loc = loc;
12771282
}
12781283

12791284
if (node.questionToken) {
@@ -1286,7 +1291,7 @@ module.exports = function convert(config) {
12861291
range: [node.getStart(), node.end],
12871292
loc: nodeUtils.getLoc(node, ast),
12881293
accessibility: nodeUtils.getTSNodeAccessibility(node),
1289-
readonly: nodeUtils.hasModifier(SyntaxKind.ReadonlyKeyword, node),
1294+
readonly: nodeUtils.hasModifier(SyntaxKind.ReadonlyKeyword, node) ? true : undefined,
12901295
static: nodeUtils.hasModifier(SyntaxKind.StaticKeyword, node),
12911296
export: nodeUtils.hasModifier(SyntaxKind.ExportKeyword, node),
12921297
parameter: result
@@ -1941,7 +1946,7 @@ module.exports = function convert(config) {
19411946
key: convertChild(node.name),
19421947
params: convertParameters(node.parameters),
19431948
typeAnnotation: (node.type) ? convertTypeAnnotation(node.type) : null,
1944-
readonly: nodeUtils.hasModifier(SyntaxKind.ReadonlyKeyword, node),
1949+
readonly: nodeUtils.hasModifier(SyntaxKind.ReadonlyKeyword, node) ? true : undefined,
19451950
static: nodeUtils.hasModifier(SyntaxKind.StaticKeyword, node),
19461951
export: nodeUtils.hasModifier(SyntaxKind.ExportKeyword, node)
19471952
});
@@ -1966,7 +1971,7 @@ module.exports = function convert(config) {
19661971
key: convertChild(node.name),
19671972
typeAnnotation: (node.type) ? convertTypeAnnotation(node.type) : null,
19681973
initializer: convertChild(node.initializer),
1969-
readonly: nodeUtils.hasModifier(SyntaxKind.ReadonlyKeyword, node),
1974+
readonly: nodeUtils.hasModifier(SyntaxKind.ReadonlyKeyword, node) ? true : undefined,
19701975
static: nodeUtils.hasModifier(SyntaxKind.StaticKeyword, node),
19711976
export: nodeUtils.hasModifier(SyntaxKind.ExportKeyword, node)
19721977
});
@@ -1984,7 +1989,7 @@ module.exports = function convert(config) {
19841989
type: AST_NODE_TYPES.TSIndexSignature,
19851990
index: convertChild(node.parameters[0]),
19861991
typeAnnotation: (node.type) ? convertTypeAnnotation(node.type) : null,
1987-
readonly: nodeUtils.hasModifier(SyntaxKind.ReadonlyKeyword, node),
1992+
readonly: nodeUtils.hasModifier(SyntaxKind.ReadonlyKeyword, node) ? true : undefined,
19881993
static: nodeUtils.hasModifier(SyntaxKind.StaticKeyword, node),
19891994
export: nodeUtils.hasModifier(SyntaxKind.ExportKeyword, node)
19901995
});

tests/ast-alignment/spec.js

Lines changed: 105 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,17 @@ const fixturePatternsToTest = [
426426
"typescript/basics/class-with-readonly-property.src.ts",
427427
"typescript/expressions/call-expression-type-arguments.src.ts",
428428
"typescript/expressions/new-expression-type-arguments.src.ts",
429-
429+
"typescript/basics/function-with-types.src.ts",
430+
"typescript/basics/non-null-assertion-operator.src.ts",
431+
"typescript/namespaces-and-modules/ambient-module-declaration-with-import.src.ts",
432+
"typescript/basics/class-with-accessibility-modifiers.src.ts",
433+
"typescript/basics/class-with-optional-computed-property.src.ts",
434+
"typescript/basics/object-with-escaped-properties.src.ts",
435+
"typescript/decorators/parameter-decorators/parameter-decorator-constructor.src.ts",
436+
"typescript/decorators/parameter-decorators/parameter-decorator-decorator-instance-member.src.ts",
437+
"typescript/decorators/parameter-decorators/parameter-decorator-decorator-static-member.src.ts",
438+
"typescript/decorators/parameter-decorators/parameter-decorator-instance-member.src.ts",
439+
"typescript/decorators/parameter-decorators/parameter-decorator-static-member.src.ts",
430440
{
431441
pattern: "typescript/basics/export-named-enum.src.ts",
432442
config: { babylonParserOptions: { sourceType: "module" } }
@@ -468,44 +478,59 @@ const fixturePatternsToTest = [
468478
*/
469479
// "typescript/basics/arrow-function-with-type-parameters.src.ts" // typescript-eslint-parser parse errors
470480

481+
/* ================================================== */
482+
471483
/**
472484
* TypeScript AST differences which need to be resolved
473485
*/
474-
// "typescript/babylon-convergence/type-parameters.src.ts",
486+
487+
/**
488+
* Identified major AST differences
489+
*/
490+
491+
/**
492+
* Babylon: ClassDeclaration + abstract: true
493+
* tsep: TSAbstractClassDeclaration
494+
*/
475495
// "typescript/basics/abstract-class-with-abstract-properties.src.ts",
496+
497+
/**
498+
* Babylon: ClassProperty + abstract: true
499+
* tsep: TSAbstractClassProperty
500+
*/
476501
// "typescript/basics/abstract-class-with-abstract-readonly-property.src.ts",
477-
// "typescript/basics/class-with-accessibility-modifiers.src.ts",
478-
// "typescript/basics/class-with-extends-generic-multiple.src.ts",
479-
// "typescript/basics/class-with-extends-generic.src.ts",
480-
// "typescript/basics/class-with-generic-method-default.src.ts",
481-
// "typescript/basics/class-with-generic-method.src.ts",
502+
503+
/**
504+
* Babylon: TSExpressionWithTypeArguments
505+
* tsep: ClassImplements
506+
*/
482507
// "typescript/basics/class-with-implements-generic-multiple.src.ts",
483508
// "typescript/basics/class-with-implements-generic.src.ts",
484509
// "typescript/basics/class-with-implements.src.ts",
485-
// "typescript/basics/class-with-mixin.src.ts",
486-
// "typescript/basics/class-with-optional-computed-property.src.ts",
487-
// "typescript/basics/class-with-optional-properties.src.ts",
488-
// "typescript/basics/class-with-optional-property-undefined.src.ts",
489-
// "typescript/basics/class-with-private-parameter-properties.src.ts",
490-
// "typescript/basics/class-with-protected-parameter-properties.src.ts",
491-
// "typescript/basics/class-with-public-parameter-properties.src.ts",
492-
// "typescript/basics/class-with-readonly-parameter-properties.src.ts",
493-
// "typescript/basics/class-with-type-parameter-default.src.ts",
494-
// "typescript/basics/class-with-type-parameter-underscore.src.ts",
495-
// "typescript/basics/class-with-type-parameter.src.ts",
510+
511+
/**
512+
* Babylon: TSDeclareFunction + declare: true
513+
* tsep: DeclareFunction
514+
*/
496515
// "typescript/basics/declare-function.src.ts",
497-
// "typescript/basics/destructuring-assignment.src.ts",
498-
// "typescript/basics/export-default-class-with-generic.src.ts",
499-
// "typescript/basics/export-default-class-with-multiple-generics.src.ts",
500-
// "typescript/basics/export-named-class-with-generic.src.ts",
501-
// "typescript/basics/export-named-class-with-multiple-generics.src.ts",
502-
// "typescript/basics/function-with-object-type-with-optional-properties.src.ts",
503-
// "typescript/basics/function-with-object-type-without-annotation.src.ts",
504-
// "typescript/basics/function-with-type-parameters-that-have-comments.src.ts",
505-
// "typescript/basics/function-with-type-parameters-with-constraint.src.ts",
506-
// "typescript/basics/function-with-type-parameters.src.ts",
516+
517+
/**
518+
* Babylon: TSDeclareFunction
519+
* tsep: TSNamespaceFunctionDeclaration
520+
*/
521+
// "typescript/namespaces-and-modules/declare-namespace-with-exported-function.src.ts",
522+
523+
/**
524+
* Babylon: FunctionDeclaration
525+
* tsep: TSNamespaceFunctionDeclaration
526+
*/
527+
// "typescript/namespaces-and-modules/module-with-default-exports.src.ts",
528+
529+
/**
530+
* Other major AST differences (e.g. fundamentally different node types)
531+
*/
532+
// "typescript/basics/class-with-mixin.src.ts",
507533
// "typescript/basics/function-with-types-assignation.src.ts",
508-
// "typescript/basics/function-with-types.src.ts",
509534
// "typescript/basics/interface-extends-multiple.src.ts",
510535
// "typescript/basics/interface-extends.src.ts",
511536
// "typescript/basics/interface-type-parameters.src.ts",
@@ -514,16 +539,31 @@ const fixturePatternsToTest = [
514539
// "typescript/basics/interface-with-jsdoc.src.ts",
515540
// "typescript/basics/interface-with-optional-properties.src.ts",
516541
// "typescript/basics/interface-without-type-annotation.src.ts",
517-
// "typescript/basics/nested-type-arguments.src.ts",
518-
// "typescript/basics/non-null-assertion-operator.src.ts",
519-
// "typescript/basics/null-and-undefined-type-annotations.src.ts",
520-
// "typescript/basics/object-with-escaped-properties.src.ts",
521542
// "typescript/basics/type-alias-declaration-with-constrained-type-parameter.src.ts",
522543
// "typescript/basics/type-alias-declaration.src.ts",
523544
// "typescript/basics/type-alias-object-without-annotation.src.ts",
524-
// "typescript/basics/type-guard.src.ts",
525-
// "typescript/basics/type-parameters-comments.src.ts",
526545
// "typescript/basics/typed-this.src.ts",
546+
// "typescript/errorRecovery/interface-empty-extends.src.ts",
547+
548+
/**
549+
* Minor AST differences (e.g. location data)
550+
*/
551+
// "typescript/basics/class-with-extends-generic-multiple.src.ts",
552+
// "typescript/basics/class-with-extends-generic.src.ts",
553+
// "typescript/basics/class-with-generic-method-default.src.ts",
554+
// "typescript/basics/class-with-generic-method.src.ts",
555+
// "typescript/basics/class-with-optional-properties.src.ts",
556+
// "typescript/basics/class-with-optional-property-undefined.src.ts",
557+
// "typescript/basics/class-with-private-parameter-properties.src.ts",
558+
// "typescript/basics/class-with-protected-parameter-properties.src.ts",
559+
// "typescript/basics/class-with-public-parameter-properties.src.ts",
560+
// "typescript/basics/class-with-readonly-parameter-properties.src.ts",
561+
// "typescript/basics/destructuring-assignment.src.ts",
562+
// "typescript/basics/function-with-object-type-with-optional-properties.src.ts",
563+
// "typescript/basics/function-with-object-type-without-annotation.src.ts",
564+
// "typescript/basics/nested-type-arguments.src.ts",
565+
// "typescript/basics/null-and-undefined-type-annotations.src.ts",
566+
// "typescript/basics/type-guard.src.ts",
527567
// "typescript/basics/var-with-dotted-type.src.ts",
528568
// "typescript/basics/var-with-type.src.ts",
529569
// "typescript/basics/variable-declaration-type-annotation-spacing.src.ts",
@@ -537,22 +577,42 @@ const fixturePatternsToTest = [
537577
// "typescript/decorators/method-decorators/method-decorator-factory-static-member.src.ts",
538578
// "typescript/decorators/method-decorators/method-decorator-instance-member.src.ts",
539579
// "typescript/decorators/method-decorators/method-decorator-static-member.src.ts",
540-
// "typescript/decorators/parameter-decorators/parameter-decorator-constructor.src.ts",
541-
// "typescript/decorators/parameter-decorators/parameter-decorator-decorator-instance-member.src.ts",
542-
// "typescript/decorators/parameter-decorators/parameter-decorator-decorator-static-member.src.ts",
543-
// "typescript/decorators/parameter-decorators/parameter-decorator-instance-member.src.ts",
544-
// "typescript/decorators/parameter-decorators/parameter-decorator-static-member.src.ts",
545580
// "typescript/decorators/property-decorators/property-decorator-factory-instance-member.src.ts",
546581
// "typescript/decorators/property-decorators/property-decorator-factory-static-member.src.ts",
547582
// "typescript/decorators/property-decorators/property-decorator-instance-member.src.ts",
548583
// "typescript/decorators/property-decorators/property-decorator-static-member.src.ts",
549-
// "typescript/errorRecovery/interface-empty-extends.src.ts",
550-
// "typescript/namespaces-and-modules/ambient-module-declaration-with-import.src.ts",
551-
// "typescript/namespaces-and-modules/declare-namespace-with-exported-function.src.ts",
552-
// "typescript/namespaces-and-modules/module-with-default-exports.src.ts",
553584

554585
/**
555-
* Requires fix in https://github.com/babel/babylon/pull/684
586+
* Requires a solution to https://github.com/babel/babylon/issues/691
587+
*/
588+
// "typescript/babylon-convergence/type-parameters.src.ts",
589+
// "typescript/babylon-convergence/type-parameter-whitespace-loc.src.ts",
590+
// "typescript/basics/class-with-type-parameter-default.src.ts",
591+
// "typescript/basics/class-with-type-parameter-underscore.src.ts",
592+
// "typescript/basics/class-with-type-parameter.src.ts",
593+
// {
594+
// pattern: "typescript/basics/export-default-class-with-generic.src.ts",
595+
// config: { babylonParserOptions: { sourceType: "module" } }
596+
// },
597+
// {
598+
// pattern: "typescript/basics/export-default-class-with-multiple-generics.src.ts",
599+
// config: { babylonParserOptions: { sourceType: "module" } }
600+
// },
601+
// {
602+
// pattern: "typescript/basics/export-named-class-with-generic.src.ts",
603+
// config: { babylonParserOptions: { sourceType: "module" } }
604+
// },
605+
// {
606+
// pattern: "typescript/basics/export-named-class-with-multiple-generics.src.ts",
607+
// config: { babylonParserOptions: { sourceType: "module" } }
608+
// },
609+
// "typescript/basics/function-with-type-parameters-that-have-comments.src.ts",
610+
// "typescript/basics/function-with-type-parameters-with-constraint.src.ts",
611+
// "typescript/basics/function-with-type-parameters.src.ts",
612+
// "typescript/basics/type-parameters-comments.src.ts",
613+
614+
/**
615+
* Requires the fix in https://github.com/babel/babylon/pull/684 (MERGED not yet released)
556616
*/
557617
// "typescript/namespaces-and-modules/shorthand-ambient-module-declaration.src.ts"
558618

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
function f< T >() {}

0 commit comments

Comments
 (0)