@@ -1386,7 +1386,7 @@ func GetNameOfDeclaration(declaration *Node) *Node {
13861386 return nonAssignedName
13871387 }
13881388 if IsFunctionExpression (declaration ) || IsArrowFunction (declaration ) || IsClassExpression (declaration ) {
1389- return getAssignedName (declaration )
1389+ return GetAssignedName (declaration )
13901390 }
13911391 return nil
13921392}
@@ -1415,7 +1415,7 @@ func GetNonAssignedNameOfDeclaration(declaration *Node) *Node {
14151415 return declaration .Name ()
14161416}
14171417
1418- func getAssignedName (node * Node ) * Node {
1418+ func GetAssignedName (node * Node ) * Node {
14191419 parent := node .Parent
14201420 if parent != nil {
14211421 switch parent .Kind {
@@ -3441,6 +3441,91 @@ func IsRightSideOfPropertyAccess(node *Node) bool {
34413441 return node .Parent .Kind == KindPropertyAccessExpression && node .Parent .Name () == node
34423442}
34433443
3444+ func IsArgumentExpressionOfElementAccess (node * Node ) bool {
3445+ return node .Parent != nil && node .Parent .Kind == KindElementAccessExpression && node .Parent .AsElementAccessExpression ().ArgumentExpression == node
3446+ }
3447+
3448+ func ClimbPastPropertyAccess (node * Node ) * Node {
3449+ if IsRightSideOfPropertyAccess (node ) {
3450+ return node .Parent
3451+ }
3452+ return node
3453+ }
3454+
3455+ func climbPastPropertyOrElementAccess (node * Node ) * Node {
3456+ if IsRightSideOfPropertyAccess (node ) || IsArgumentExpressionOfElementAccess (node ) {
3457+ return node .Parent
3458+ }
3459+ return node
3460+ }
3461+
3462+ func selectExpressionOfCallOrNewExpressionOrDecorator (node * Node ) * Node {
3463+ if IsCallExpression (node ) || IsNewExpression (node ) || IsDecorator (node ) {
3464+ return node .Expression ()
3465+ }
3466+ return nil
3467+ }
3468+
3469+ func selectTagOfTaggedTemplateExpression (node * Node ) * Node {
3470+ if IsTaggedTemplateExpression (node ) {
3471+ return node .AsTaggedTemplateExpression ().Tag
3472+ }
3473+ return nil
3474+ }
3475+
3476+ func selectTagNameOfJsxOpeningLikeElement (node * Node ) * Node {
3477+ if IsJsxOpeningElement (node ) || IsJsxSelfClosingElement (node ) {
3478+ return node .TagName ()
3479+ }
3480+ return nil
3481+ }
3482+
3483+ func IsCallExpressionTarget (node * Node , includeElementAccess bool , skipPastOuterExpressions bool ) bool {
3484+ return isCalleeWorker (node , IsCallExpression , selectExpressionOfCallOrNewExpressionOrDecorator , includeElementAccess , skipPastOuterExpressions )
3485+ }
3486+
3487+ func IsNewExpressionTarget (node * Node , includeElementAccess bool , skipPastOuterExpressions bool ) bool {
3488+ return isCalleeWorker (node , IsNewExpression , selectExpressionOfCallOrNewExpressionOrDecorator , includeElementAccess , skipPastOuterExpressions )
3489+ }
3490+
3491+ func IsCallOrNewExpressionTarget (node * Node , includeElementAccess bool , skipPastOuterExpressions bool ) bool {
3492+ return isCalleeWorker (node , IsCallOrNewExpression , selectExpressionOfCallOrNewExpressionOrDecorator , includeElementAccess , skipPastOuterExpressions )
3493+ }
3494+
3495+ func IsTaggedTemplateTag (node * Node , includeElementAccess bool , skipPastOuterExpressions bool ) bool {
3496+ return isCalleeWorker (node , IsTaggedTemplateExpression , selectTagOfTaggedTemplateExpression , includeElementAccess , skipPastOuterExpressions )
3497+ }
3498+
3499+ func IsDecoratorTarget (node * Node , includeElementAccess bool , skipPastOuterExpressions bool ) bool {
3500+ return isCalleeWorker (node , IsDecorator , selectExpressionOfCallOrNewExpressionOrDecorator , includeElementAccess , skipPastOuterExpressions )
3501+ }
3502+
3503+ func IsJsxOpeningLikeElementTagName (node * Node , includeElementAccess bool , skipPastOuterExpressions bool ) bool {
3504+ return isCalleeWorker (node , IsJsxOpeningLikeElement , selectTagNameOfJsxOpeningLikeElement , includeElementAccess , skipPastOuterExpressions )
3505+ }
3506+
3507+ func isCalleeWorker (
3508+ node * Node ,
3509+ pred func (* Node ) bool ,
3510+ calleeSelector func (* Node ) * Node ,
3511+ includeElementAccess bool ,
3512+ skipPastOuterExpressions bool ,
3513+ ) bool {
3514+ var target * Node
3515+ if includeElementAccess {
3516+ target = climbPastPropertyOrElementAccess (node )
3517+ } else {
3518+ target = ClimbPastPropertyAccess (node )
3519+ }
3520+ if skipPastOuterExpressions {
3521+ // Only skip outer expressions if the target is actually an expression node
3522+ if IsExpression (target ) {
3523+ target = SkipOuterExpressions (target , OEKAll )
3524+ }
3525+ }
3526+ return target != nil && target .Parent != nil && pred (target .Parent ) && calleeSelector (target .Parent ) == target
3527+ }
3528+
34443529func IsRightSideOfQualifiedNameOrPropertyAccess (node * Node ) bool {
34453530 parent := node .Parent
34463531 switch parent .Kind {
0 commit comments