Enhancement: add strict parent
types for nodes that have well-defined parents
#6225
Labels
accepting prs
Go ahead, send a pull request that resolves this issue
AST
PRs and Issues about the AST structure
enhancement
New feature or request
package: ast-spec
Issues related to @typescript-eslint/ast-spec
Milestone
Right now a node's
.parent
property is loosely typed asTESTree.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 aVariableDeclaration
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
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 parent `TemplateLiteral | 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
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.
The text was updated successfully, but these errors were encountered: