Description
Right now a node's .parent
property is loosely typed as TESTree.Node
. This is pretty sucky as it means that users need to either add unnecessary logic or explicit casts to refine types in some cases.
There are a number of nodes wherein we know exactly what the parent node will always be due to the defined structure of the AST.
For example, we know that a VariableDeclarator
will always have a VariableDeclaration
parent.
We should define some of these simpler relationships in our types to improve the experience of consuming the AST types.
Some cases we can define:
-
AccessorProperty
has parentClassBody
(feat(ast-spec): add parent property to AccessorProperty node types #9487) -
CatchClause
has parentTryStatement
-
ClassBody
has parentClassDeclaration | ClassExpression | TSAbstractClassDeclaration
-
ExportSpecifier
has parentExportNamedDeclaration
-
ImportAttribute
has parentImportDeclaration | ImportExpression
-
ImportDefaultSpecifier
has parentImportDeclaration
-
ImportNamespaceSpecifier
has parentImportDeclaration
-
ImportSpecifier
has parentExportAllDeclaration | ExportNamedDeclaration | ImportDeclaration
-
JSXAttribute
has parentJSXOpeningElement
-
JSXClosingElement
has parentJSXElement
-
JSXClosingFragment
has parentJSXFragment
-
JSXOpeningElement
has parentJSXElement
-
JSXOpeningFragment
has parentJSXFragment
-
JSXSpreadAttribute
has parentJSXOpeningElement
-
MethodDefinition
has parentClassBody
-
Property
has parentObjectExpression | ObjectPattern
-
PropertyDefinition
has parentClassBody
-
SpreadElement
has parentArrayExpression | CallExpression | ObjectExpression
-
StaticBlock
has parentClassBody
-
SwitchCase
has parentSwitchStatement
-
TemplateElement
has parentTemplateLiteral | TSTemplateLiteralType
-
TSAbstractAccessorProperty
has parentClassBody
-
TSAbstractMethodDefinition
has parentClassBody
-
TSAbstractPropertyDefinition
has parentClassBody
-
TSCallSignatureDeclaration
has parentTSInterfaceBody | TSTypeLiteral
-
TSConstructSignatureDeclaration
has parentTSInterfaceBody | TSTypeLiteral
-
TSClassImplements
has parentClassDeclaration | ClassExpression
-
TSEnumMember
has parentTSEnumDeclaration
-
TSIndexSignature
has parentClassBody | TSInterfaceBody | TSTypeLiteral
-
TSInterfaceBody
has parentTSInterfaceDeclaration
-
TSInterfaceHeritage
has parentTSInterfaceBody
-
TSMethodSignature
has parentTSInterfaceBody | TSTypeLiteral
-
TSModuleBlock
has parentTSModuleDeclaration
-
TSParameterProperty
has parentFunctionLike
-
TSPropertySignature
has parentTSInterfaceBody | TSTypeLiteral
-
TSTypeParameter
has parentTSInferType | TSTypeParameterDeclaration | TSMappedType
-
VariableDeclarator
has parentVariableDeclaration
(feat(typescript-estree): restrict variable declarator definite/init combinations #9228)
Note: the implementor should double check that I've written these correctly by comparing them against the AST types.
The import thing to note is that we shouldn't define all of the relationships that exist - just a subset of them that we can easily statically define and maintain. I'd probably put a rule around ~3 parent types being the maximum.