diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index d3cbf38522a76..d5b79c982cb9d 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -69,20 +69,21 @@ namespace ts { } switch (node.kind) { case SyntaxKind.QualifiedName: - return visitNode(cbNode, (node).left) || - visitNode(cbNode, (node).right); - case SyntaxKind.TypeParameter: - return visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).constraint) || - visitNode(cbNode, (node).default) || - visitNode(cbNode, (node).expression); - case SyntaxKind.ShorthandPropertyAssignment: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).equalsToken) || - visitNode(cbNode, (node).objectAssignmentInitializer); + const { left, right } = node as QualifiedName; + return visitNode(cbNode, left) || visitNode(cbNode, right); + case SyntaxKind.TypeParameter: { + const { name, constraint, default: d, expression } = node as TypeParameterDeclaration; + return visitNode(cbNode, name) || visitNode(cbNode, constraint) || visitNode(cbNode, d) || visitNode(cbNode, expression); + } + case SyntaxKind.ShorthandPropertyAssignment: { + const { decorators, modifiers, name, questionToken, equalsToken, objectAssignmentInitializer } = node as ShorthandPropertyAssignment; + return visitNodes(cbNode, cbNodes, decorators) || + visitNodes(cbNode, cbNodes, modifiers) || + visitNode(cbNode, name) || + visitNode(cbNode, questionToken) || + visitNode(cbNode, equalsToken) || + visitNode(cbNode, objectAssignmentInitializer); + } case SyntaxKind.SpreadAssignment: return visitNode(cbNode, (node).expression); case SyntaxKind.Parameter: @@ -90,25 +91,29 @@ namespace ts { case SyntaxKind.PropertySignature: case SyntaxKind.PropertyAssignment: case SyntaxKind.VariableDeclaration: - case SyntaxKind.BindingElement: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).propertyName) || - visitNode(cbNode, (node).dotDotDotToken) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).type) || - visitNode(cbNode, (node).initializer); + case SyntaxKind.BindingElement: { + const { decorators, modifiers, propertyName, dotDotDotToken, name, questionToken, type, initializer } = node as VariableLikeDeclaration; + return visitNodes(cbNode, cbNodes, decorators) || + visitNodes(cbNode, cbNodes, modifiers) || + visitNode(cbNode, propertyName) || + visitNode(cbNode, dotDotDotToken) || + visitNode(cbNode, name) || + visitNode(cbNode, questionToken) || + visitNode(cbNode, type) || + visitNode(cbNode, initializer); + } case SyntaxKind.FunctionType: case SyntaxKind.ConstructorType: case SyntaxKind.CallSignature: case SyntaxKind.ConstructSignature: - case SyntaxKind.IndexSignature: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNodes(cbNode, cbNodes, (node).typeParameters) || - visitNodes(cbNode, cbNodes, (node).parameters) || - visitNode(cbNode, (node).type); + case SyntaxKind.IndexSignature: { + const { decorators, modifiers, typeParameters, parameters, type } = node as SignatureDeclaration; + return visitNodes(cbNode, cbNodes, decorators) || + visitNodes(cbNode, cbNodes, modifiers) || + visitNodes(cbNode, cbNodes, typeParameters) || + visitNodes(cbNode, cbNodes, parameters) || + visitNode(cbNode, type); + } case SyntaxKind.MethodDeclaration: case SyntaxKind.MethodSignature: case SyntaxKind.Constructor: @@ -117,22 +122,26 @@ namespace ts { case SyntaxKind.FunctionExpression: case SyntaxKind.FunctionDeclaration: case SyntaxKind.ArrowFunction: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).asteriskToken) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).questionToken) || - visitNodes(cbNode, cbNodes, (node).typeParameters) || - visitNodes(cbNode, cbNodes, (node).parameters) || - visitNode(cbNode, (node).type) || - visitNode(cbNode, (node).equalsGreaterThanToken) || - visitNode(cbNode, (node).body); - case SyntaxKind.TypeReference: - return visitNode(cbNode, (node).typeName) || - visitNodes(cbNode, cbNodes, (node).typeArguments); - case SyntaxKind.TypePredicate: - return visitNode(cbNode, (node).parameterName) || - visitNode(cbNode, (node).type); + // TODO: invalid cast + const { decorators, modifiers, asteriskToken, name, questionToken, typeParameters, parameters, type, equalsGreaterThanToken, body } = node as ArrowFunction; + return visitNodes(cbNode, cbNodes, decorators) || + visitNodes(cbNode, cbNodes, modifiers) || + visitNode(cbNode, asteriskToken) || + visitNode(cbNode, name) || + visitNode(cbNode, questionToken) || + visitNodes(cbNode, cbNodes, typeParameters) || + visitNodes(cbNode, cbNodes, parameters) || + visitNode(cbNode, type) || + visitNode(cbNode, equalsGreaterThanToken) || + visitNode(cbNode, body); + case SyntaxKind.TypeReference: { + const { typeName, typeArguments } = node as TypeReferenceNode; + return visitNode(cbNode, typeName) || visitNodes(cbNode, cbNodes, typeArguments); + } + case SyntaxKind.TypePredicate: { + const { parameterName, type } = node as TypePredicateNode; + return visitNode(cbNode, parameterName) || visitNode(cbNode, type); + } case SyntaxKind.TypeQuery: return visitNode(cbNode, (node).exprName); case SyntaxKind.TypeLiteral: @@ -147,14 +156,14 @@ namespace ts { case SyntaxKind.ParenthesizedType: case SyntaxKind.TypeOperator: return visitNode(cbNode, (node).type); - case SyntaxKind.IndexedAccessType: - return visitNode(cbNode, (node).objectType) || - visitNode(cbNode, (node).indexType); - case SyntaxKind.MappedType: - return visitNode(cbNode, (node).readonlyToken) || - visitNode(cbNode, (node).typeParameter) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).type); + case SyntaxKind.IndexedAccessType: { + const { objectType, indexType } = node as IndexedAccessTypeNode; + return visitNode(cbNode, objectType) || visitNode(cbNode, indexType); + } + case SyntaxKind.MappedType: { + const { readonlyToken, typeParameter, questionToken, type } = node as MappedTypeNode; + return visitNode(cbNode, readonlyToken) || visitNode(cbNode, typeParameter) || visitNode(cbNode, questionToken) || visitNode(cbNode, type); + } case SyntaxKind.LiteralType: return visitNode(cbNode, (node).literal); case SyntaxKind.ObjectBindingPattern: @@ -164,23 +173,27 @@ namespace ts { return visitNodes(cbNode, cbNodes, (node).elements); case SyntaxKind.ObjectLiteralExpression: return visitNodes(cbNode, cbNodes, (node).properties); - case SyntaxKind.PropertyAccessExpression: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).name); - case SyntaxKind.ElementAccessExpression: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).argumentExpression); + case SyntaxKind.PropertyAccessExpression: { + const { expression, name } = node as PropertyAccessExpression; + return visitNode(cbNode, expression) || visitNode(cbNode, name); + } + case SyntaxKind.ElementAccessExpression: { + const { expression, argumentExpression } = node as ElementAccessExpression; + return visitNode(cbNode, expression) || visitNode(cbNode, argumentExpression); + } case SyntaxKind.CallExpression: - case SyntaxKind.NewExpression: - return visitNode(cbNode, (node).expression) || - visitNodes(cbNode, cbNodes, (node).typeArguments) || - visitNodes(cbNode, cbNodes, (node).arguments); - case SyntaxKind.TaggedTemplateExpression: - return visitNode(cbNode, (node).tag) || - visitNode(cbNode, (node).template); - case SyntaxKind.TypeAssertionExpression: - return visitNode(cbNode, (node).type) || - visitNode(cbNode, (node).expression); + case SyntaxKind.NewExpression: { + const { expression, typeArguments, arguments: args } = node as CallExpression | NewExpression; + return visitNode(cbNode, expression) || visitNodes(cbNode, cbNodes, typeArguments) || visitNodes(cbNode, cbNodes, args); + } + case SyntaxKind.TaggedTemplateExpression: { + const { tag, template } = node as TaggedTemplateExpression; + return visitNode(cbNode, tag) || visitNode(cbNode, template); + } + case SyntaxKind.TypeAssertionExpression: { + const { type, expression } = node as TypeAssertion; + return visitNode(cbNode, type) || visitNode(cbNode, expression); + } case SyntaxKind.ParenthesizedExpression: return visitNode(cbNode, (node).expression); case SyntaxKind.DeleteExpression: @@ -198,23 +211,22 @@ namespace ts { return visitNode(cbNode, (node).expression); case SyntaxKind.PostfixUnaryExpression: return visitNode(cbNode, (node).operand); - case SyntaxKind.BinaryExpression: - return visitNode(cbNode, (node).left) || - visitNode(cbNode, (node).operatorToken) || - visitNode(cbNode, (node).right); - case SyntaxKind.AsExpression: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).type); + case SyntaxKind.BinaryExpression: { + const { left, operatorToken, right } = node as BinaryExpression; + return visitNode(cbNode, left) || visitNode(cbNode, operatorToken) || visitNode(cbNode, right); + } + case SyntaxKind.AsExpression: { + const { expression, type } = node as AsExpression; + return visitNode(cbNode, expression) || visitNode(cbNode, type); + } case SyntaxKind.NonNullExpression: return visitNode(cbNode, (node).expression); case SyntaxKind.MetaProperty: return visitNode(cbNode, (node).name); - case SyntaxKind.ConditionalExpression: - return visitNode(cbNode, (node).condition) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).whenTrue) || - visitNode(cbNode, (node).colonToken) || - visitNode(cbNode, (node).whenFalse); + case SyntaxKind.ConditionalExpression: { + const { condition, questionToken, whenTrue, colonToken, whenFalse } = node as ConditionalExpression; + return visitNode(cbNode, condition) || visitNode(cbNode, questionToken) || visitNode(cbNode, whenTrue) || visitNode(cbNode, colonToken) || visitNode(cbNode, whenFalse); + } case SyntaxKind.SpreadElement: return visitNode(cbNode, (node).expression); case SyntaxKind.Block: @@ -231,30 +243,30 @@ namespace ts { return visitNodes(cbNode, cbNodes, (node).declarations); case SyntaxKind.ExpressionStatement: return visitNode(cbNode, (node).expression); - case SyntaxKind.IfStatement: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).thenStatement) || - visitNode(cbNode, (node).elseStatement); - case SyntaxKind.DoStatement: - return visitNode(cbNode, (node).statement) || - visitNode(cbNode, (node).expression); - case SyntaxKind.WhileStatement: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).statement); - case SyntaxKind.ForStatement: - return visitNode(cbNode, (node).initializer) || - visitNode(cbNode, (node).condition) || - visitNode(cbNode, (node).incrementor) || - visitNode(cbNode, (node).statement); - case SyntaxKind.ForInStatement: - return visitNode(cbNode, (node).initializer) || - visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).statement); - case SyntaxKind.ForOfStatement: - return visitNode(cbNode, (node).awaitModifier) || - visitNode(cbNode, (node).initializer) || - visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).statement); + case SyntaxKind.IfStatement: { + const { expression, thenStatement, elseStatement } = node as IfStatement; + return visitNode(cbNode, expression) || visitNode(cbNode, thenStatement) || visitNode(cbNode, elseStatement); + } + case SyntaxKind.DoStatement: { + const { statement, expression } = node as DoStatement; + return visitNode(cbNode, statement) || visitNode(cbNode, expression); + } + case SyntaxKind.WhileStatement: { + const { expression, statement } = node as WhileStatement; + return visitNode(cbNode, expression) || visitNode(cbNode, statement); + } + case SyntaxKind.ForStatement: { + const { initializer, condition, incrementor, statement } = node as ForStatement; + return visitNode(cbNode, initializer) || visitNode(cbNode, condition) || visitNode(cbNode, incrementor) || visitNode(cbNode, statement); + } + case SyntaxKind.ForInStatement: { + const { initializer, expression, statement } = node as ForInStatement; + return visitNode(cbNode, initializer) || visitNode(cbNode, expression) || visitNode(cbNode, statement); + } + case SyntaxKind.ForOfStatement: { + const { awaitModifier, initializer, expression, statement } = node as ForOfStatement; + return visitNode(cbNode, awaitModifier) || visitNode(cbNode, initializer) || visitNode(cbNode, expression) || visitNode(cbNode, statement); + } case SyntaxKind.ContinueStatement: case SyntaxKind.BreakStatement: return visitNode(cbNode, (node).label); @@ -263,77 +275,77 @@ namespace ts { case SyntaxKind.WithStatement: return visitNode(cbNode, (node).expression) || visitNode(cbNode, (node).statement); - case SyntaxKind.SwitchStatement: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).caseBlock); + case SyntaxKind.SwitchStatement: { + const { expression, caseBlock } = node as SwitchStatement; + return visitNode(cbNode, expression) || visitNode(cbNode, caseBlock); + } case SyntaxKind.CaseBlock: return visitNodes(cbNode, cbNodes, (node).clauses); - case SyntaxKind.CaseClause: - return visitNode(cbNode, (node).expression) || - visitNodes(cbNode, cbNodes, (node).statements); + case SyntaxKind.CaseClause: { + const { expression, statements } = node as CaseClause; + return visitNode(cbNode, expression) || visitNodes(cbNode, cbNodes, statements); + } case SyntaxKind.DefaultClause: return visitNodes(cbNode, cbNodes, (node).statements); - case SyntaxKind.LabeledStatement: - return visitNode(cbNode, (node).label) || - visitNode(cbNode, (node).statement); + case SyntaxKind.LabeledStatement: { + const { label, statement } = node as LabeledStatement; + return visitNode(cbNode, label) || visitNode(cbNode, statement); + } case SyntaxKind.ThrowStatement: return visitNode(cbNode, (node).expression); - case SyntaxKind.TryStatement: - return visitNode(cbNode, (node).tryBlock) || - visitNode(cbNode, (node).catchClause) || - visitNode(cbNode, (node).finallyBlock); - case SyntaxKind.CatchClause: - return visitNode(cbNode, (node).variableDeclaration) || - visitNode(cbNode, (node).block); + case SyntaxKind.TryStatement: { + const { tryBlock, catchClause, finallyBlock } = node as TryStatement; + return visitNode(cbNode, tryBlock) || visitNode(cbNode, catchClause) || visitNode(cbNode, finallyBlock); + } + case SyntaxKind.CatchClause: { + const { variableDeclaration, block } = node as CatchClause; + return visitNode(cbNode, variableDeclaration) || visitNode(cbNode, block); + } case SyntaxKind.Decorator: return visitNode(cbNode, (node).expression); case SyntaxKind.ClassDeclaration: case SyntaxKind.ClassExpression: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNodes(cbNode, cbNodes, (node).typeParameters) || - visitNodes(cbNode, cbNodes, (node).heritageClauses) || - visitNodes(cbNode, cbNodes, (node).members); - case SyntaxKind.InterfaceDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNodes(cbNode, cbNodes, (node).typeParameters) || - visitNodes(cbNode, cbNodes, (node).heritageClauses) || - visitNodes(cbNode, cbNodes, (node).members); - case SyntaxKind.TypeAliasDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNodes(cbNode, cbNodes, (node).typeParameters) || - visitNode(cbNode, (node).type); - case SyntaxKind.EnumDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNodes(cbNode, cbNodes, (node).members); - case SyntaxKind.EnumMember: - return visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).initializer); - case SyntaxKind.ModuleDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).body); - case SyntaxKind.ImportEqualsDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).moduleReference); - case SyntaxKind.ImportDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).importClause) || - visitNode(cbNode, (node).moduleSpecifier); - case SyntaxKind.ImportClause: - return visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).namedBindings); + case SyntaxKind.InterfaceDeclaration: { + const { decorators, modifiers, name, typeParameters, heritageClauses, members } = node as ClassDeclaration | ClassExpression | InterfaceDeclaration; + return visitNodes(cbNode, cbNodes, decorators) || + visitNodes(cbNode, cbNodes, modifiers) || + visitNode(cbNode, name) || + visitNodes(cbNode, cbNodes, typeParameters) || + visitNodes(cbNode, cbNodes, heritageClauses) || + visitNodes(cbNode, cbNodes, members); + } + case SyntaxKind.TypeAliasDeclaration: { + const { decorators, modifiers, name, typeParameters, type } = node as TypeAliasDeclaration; + return visitNodes(cbNode, cbNodes, decorators) || + visitNodes(cbNode, cbNodes, modifiers) || + visitNode(cbNode, name) || + visitNodes(cbNode, cbNodes, typeParameters) || + visitNode(cbNode, type); + } + case SyntaxKind.EnumDeclaration: { + const { decorators, modifiers, name, members } = node as EnumDeclaration; + return visitNodes(cbNode, cbNodes, decorators) || visitNodes(cbNode, cbNodes, modifiers) || visitNode(cbNode, name) || visitNodes(cbNode, cbNodes, members); + } + case SyntaxKind.EnumMember: { + const { name, initializer } = node as EnumMember; + return visitNode(cbNode, name) || visitNode(cbNode, initializer); + } + case SyntaxKind.ModuleDeclaration: { + const { decorators, modifiers, name, body } = node as ModuleDeclaration; + return visitNodes(cbNode, cbNodes, decorators) || visitNodes(cbNode, cbNodes, modifiers) || visitNode(cbNode, name) || visitNode(cbNode, body); + } + case SyntaxKind.ImportEqualsDeclaration: { + const { decorators, modifiers, name, moduleReference } = node as ImportEqualsDeclaration; + return visitNodes(cbNode, cbNodes, decorators) || visitNodes(cbNode, cbNodes, modifiers) || visitNode(cbNode, name) || visitNode(cbNode, moduleReference); + } + case SyntaxKind.ImportDeclaration: { + const { decorators, modifiers, importClause, moduleSpecifier } = node as ImportDeclaration; + return visitNodes(cbNode, cbNodes, decorators) || visitNodes(cbNode, cbNodes, modifiers) || visitNode(cbNode, importClause) || visitNode(cbNode, moduleSpecifier); + } + case SyntaxKind.ImportClause: { + const { name, namedBindings } = node as ImportClause; + return visitNode(cbNode, name) || visitNode(cbNode, namedBindings); + } case SyntaxKind.NamespaceExportDeclaration: return visitNode(cbNode, (node).name); @@ -342,30 +354,35 @@ namespace ts { case SyntaxKind.NamedImports: case SyntaxKind.NamedExports: return visitNodes(cbNode, cbNodes, (node).elements); - case SyntaxKind.ExportDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).exportClause) || - visitNode(cbNode, (node).moduleSpecifier); + case SyntaxKind.ExportDeclaration: { + const { decorators, modifiers, exportClause, moduleSpecifier } = node as ExportDeclaration; + return visitNodes(cbNode, cbNodes, decorators) || visitNodes(cbNode, cbNodes, modifiers) || visitNode(cbNode, exportClause) || visitNode(cbNode, moduleSpecifier); + } case SyntaxKind.ImportSpecifier: - case SyntaxKind.ExportSpecifier: - return visitNode(cbNode, (node).propertyName) || - visitNode(cbNode, (node).name); - case SyntaxKind.ExportAssignment: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).expression); - case SyntaxKind.TemplateExpression: - return visitNode(cbNode, (node).head) || visitNodes(cbNode, cbNodes, (node).templateSpans); - case SyntaxKind.TemplateSpan: - return visitNode(cbNode, (node).expression) || visitNode(cbNode, (node).literal); + case SyntaxKind.ExportSpecifier: { + const { propertyName, name } = node as ImportSpecifier | ExportSpecifier; + return visitNode(cbNode, propertyName) || visitNode(cbNode, name); + } + case SyntaxKind.ExportAssignment: { + const { decorators, modifiers, expression } = node as ExportAssignment; + return visitNodes(cbNode, cbNodes, decorators) || visitNodes(cbNode, cbNodes, modifiers) || visitNode(cbNode, expression); + } + case SyntaxKind.TemplateExpression: { + const { head, templateSpans } = node as TemplateExpression; + return visitNode(cbNode, head) || visitNodes(cbNode, cbNodes, templateSpans); + } + case SyntaxKind.TemplateSpan: { + const { expression, literal } = node as TemplateSpan; + return visitNode(cbNode, expression) || visitNode(cbNode, literal); + } case SyntaxKind.ComputedPropertyName: return visitNode(cbNode, (node).expression); case SyntaxKind.HeritageClause: return visitNodes(cbNode, cbNodes, (node).types); - case SyntaxKind.ExpressionWithTypeArguments: - return visitNode(cbNode, (node).expression) || - visitNodes(cbNode, cbNodes, (node).typeArguments); + case SyntaxKind.ExpressionWithTypeArguments: { + const { expression, typeArguments } = node as ExpressionWithTypeArguments; + return visitNode(cbNode, expression) || visitNodes(cbNode, cbNodes, typeArguments); + } case SyntaxKind.ExternalModuleReference: return visitNode(cbNode, (node).expression); case SyntaxKind.MissingDeclaration: @@ -373,24 +390,27 @@ namespace ts { case SyntaxKind.CommaListExpression: return visitNodes(cbNode, cbNodes, (node).elements); - case SyntaxKind.JsxElement: - return visitNode(cbNode, (node).openingElement) || - visitNodes(cbNode, cbNodes, (node).children) || - visitNode(cbNode, (node).closingElement); + case SyntaxKind.JsxElement: { + const { openingElement, children, closingElement } = node as JsxElement; + return visitNode(cbNode, openingElement) || visitNodes(cbNode, cbNodes, children) || visitNode(cbNode, closingElement); + } case SyntaxKind.JsxSelfClosingElement: - case SyntaxKind.JsxOpeningElement: - return visitNode(cbNode, (node).tagName) || - visitNode(cbNode, (node).attributes); + case SyntaxKind.JsxOpeningElement: { + const { tagName, attributes } = node as JsxSelfClosingElement | JsxOpeningElement; + return visitNode(cbNode, tagName) || visitNode(cbNode, attributes); + } case SyntaxKind.JsxAttributes: return visitNodes(cbNode, cbNodes, (node).properties); - case SyntaxKind.JsxAttribute: - return visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).initializer); + case SyntaxKind.JsxAttribute: { + const { name, initializer } = node as JsxAttribute; + return visitNode(cbNode, name) || visitNode(cbNode, initializer); + } case SyntaxKind.JsxSpreadAttribute: return visitNode(cbNode, (node).expression); - case SyntaxKind.JsxExpression: - return visitNode(cbNode, (node as JsxExpression).dotDotDotToken) || - visitNode(cbNode, (node as JsxExpression).expression); + case SyntaxKind.JsxExpression: { + const { dotDotDotToken, expression } = node as JsxExpression; + return visitNode(cbNode, dotDotDotToken) || visitNode(cbNode, expression); + } case SyntaxKind.JsxClosingElement: return visitNode(cbNode, (node).tagName); @@ -402,23 +422,21 @@ namespace ts { return visitNode(cbNode, (node).type); case SyntaxKind.JSDocOptionalType: return visitNode(cbNode, (node).type); - case SyntaxKind.JSDocFunctionType: - return visitNodes(cbNode, cbNodes, (node).parameters) || - visitNode(cbNode, (node).type); + case SyntaxKind.JSDocFunctionType: { + const { parameters, type } = node as JSDocFunctionType; + return visitNodes(cbNode, cbNodes, parameters) || visitNode(cbNode, type); + } case SyntaxKind.JSDocVariadicType: return visitNode(cbNode, (node).type); case SyntaxKind.JSDocComment: return visitNodes(cbNode, cbNodes, (node).tags); case SyntaxKind.JSDocParameterTag: - case SyntaxKind.JSDocPropertyTag: - if ((node as JSDocPropertyLikeTag).isNameFirst) { - return visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).typeExpression); - } - else { - return visitNode(cbNode, (node).typeExpression) || - visitNode(cbNode, (node).name); - } + case SyntaxKind.JSDocPropertyTag: { + const { isNameFirst, name, typeExpression } = node as JSDocParameterTag | JSDocPropertyTag; + return isNameFirst + ? visitNode(cbNode, name) || visitNode(cbNode, typeExpression) + : visitNode(cbNode, typeExpression) || visitNode(cbNode, name); + } case SyntaxKind.JSDocReturnTag: return visitNode(cbNode, (node).typeExpression); case SyntaxKind.JSDocTypeTag: @@ -427,16 +445,12 @@ namespace ts { return visitNode(cbNode, (node).typeExpression); case SyntaxKind.JSDocTemplateTag: return visitNodes(cbNode, cbNodes, (node).typeParameters); - case SyntaxKind.JSDocTypedefTag: - if ((node as JSDocTypedefTag).typeExpression && - (node as JSDocTypedefTag).typeExpression.kind === SyntaxKind.JSDocTypeExpression) { - return visitNode(cbNode, (node).typeExpression) || - visitNode(cbNode, (node).fullName); - } - else { - return visitNode(cbNode, (node).fullName) || - visitNode(cbNode, (node).typeExpression); - } + case SyntaxKind.JSDocTypedefTag: { + const { typeExpression, fullName } = node as JSDocTypedefTag; + return typeExpression && typeExpression.kind === SyntaxKind.JSDocTypeExpression + ? visitNode(cbNode, typeExpression) || visitNode(cbNode, fullName) + : visitNode(cbNode, fullName) || visitNode(cbNode, typeExpression); + } case SyntaxKind.JSDocTypeLiteral: for (const tag of (node as JSDocTypeLiteral).jsDocPropertyTags) { visitNode(cbNode, tag);