-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enhancement: add strict parent
types for nodes that have well-defined parents
#6225
Comments
This comment was marked as outdated.
This comment was marked as outdated.
|
Sorry @Josh-Cena I'd missed this comment till now - what do you mean by "in the spec"? Like, which spec? |
Uh, it was very long ago. I think I meant: should this be in |
Yeah there's a difficult thing. |
Chatted with @Josh-Cena, who is doing other work on ast-spec: I'll send a quick PoC in the meantime to proof this one out. |
Closed by #9560. |
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
(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.
The text was updated successfully, but these errors were encountered: