diff --git a/internal/ls/utilities.go b/internal/ls/utilities.go index 433d170c8d..c46faf93f8 100644 --- a/internal/ls/utilities.go +++ b/internal/ls/utilities.go @@ -1647,20 +1647,24 @@ func getContainingObjectLiteralElementWorker(node *ast.Node) *ast.Node { switch node.Kind { case ast.KindStringLiteral, ast.KindNoSubstitutionTemplateLiteral, ast.KindNumericLiteral: if node.Parent.Kind == ast.KindComputedPropertyName { - if ast.IsObjectLiteralElement(node.Parent.Parent) { + if isObjectLiteralOrJsxElement(node.Parent.Parent) { return node.Parent.Parent } return nil } fallthrough case ast.KindIdentifier: - if ast.IsObjectLiteralElement(node.Parent) && (node.Parent.Parent.Kind == ast.KindObjectLiteralExpression || node.Parent.Parent.Kind == ast.KindJsxAttributes) && node.Parent.Name() == node { + if isObjectLiteralOrJsxElement(node.Parent) && (node.Parent.Parent.Kind == ast.KindObjectLiteralExpression || node.Parent.Parent.Kind == ast.KindJsxAttributes) && node.Parent.Name() == node { return node.Parent } } return nil } +func isObjectLiteralOrJsxElement(node *ast.Node) bool { + return ast.IsObjectLiteralElement(node) || ast.IsJsxAttribute(node) || ast.IsJsxSpreadAttribute(node) +} + // Return a function that returns true if the given node has not been seen func nodeSeenTracker() func(*ast.Node) bool { var seen collections.Set[*ast.Node] diff --git a/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences10.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences10.baseline.jsonc index 66169b1bef..ae62ad6be9 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences10.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences10.baseline.jsonc @@ -8,4 +8,13 @@ // } // interface LinkProps extends ClickableProps { // goTo: string; -// // --- (line: 16) skipped --- \ No newline at end of file +// } +// declare function MainButton(buttonProps: ButtonProps): JSX.Element; +// declare function MainButton(linkProps: LinkProps): JSX.Element; +// declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; +// let opt = ; +// let opt = ; +// let opt = {}} />; +// let opt = {}} ignore-prop />; +// let opt = ; +// let opt = ; \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences2.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences2.baseline.jsonc index fe81dcc1af..bbc44e1a5c 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences2.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences2.baseline.jsonc @@ -8,4 +8,6 @@ // isOpen?: boolean; // }; // span: { n: string; }; -// // --- (line: 9) skipped --- \ No newline at end of file +// } +// } +// var x =
; \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences3.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences3.baseline.jsonc index 8cfb85cc27..6512cb7d90 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences3.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences3.baseline.jsonc @@ -9,4 +9,4 @@ // } // // -// var x = ; \ No newline at end of file +// var x = ; \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences7.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences7.baseline.jsonc index ec6919e839..d0c6c2635a 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences7.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences7.baseline.jsonc @@ -8,4 +8,8 @@ // propString: string // optional?: boolean // } -// // --- (line: 12) skipped --- \ No newline at end of file +// declare function Opt(attributes: OptionPropBag): JSX.Element; +// let opt = ; +// let opt1 = ; +// let opt2 = ; +// let opt3 = ; \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences9.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences9.baseline.jsonc index 41f35bf02e..0f7118fa54 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences9.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/tsxFindAllReferences9.baseline.jsonc @@ -8,4 +8,11 @@ // } // declare function MainButton(buttonProps: ButtonProps): JSX.Element; // declare function MainButton(linkProps: LinkProps): JSX.Element; -// // --- (line: 19) skipped --- \ No newline at end of file +// declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; +// let opt = ; +// let opt = ; +// let opt = {}} />; +// let opt = {}} ignore-prop />; +// let opt = ; +// let opt = ; +// let opt = ; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename2.baseline.jsonc b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename2.baseline.jsonc index c9d4b07aa1..ecefa7fc1b 100644 --- a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename2.baseline.jsonc +++ b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename2.baseline.jsonc @@ -8,13 +8,21 @@ // isOpen?: boolean; // }; // span: { n: string; }; -// // --- (line: 9) skipped --- +// } +// } +// var x =
; // === findRenameLocations === // === /file.tsx === -// --- (line: 7) skipped --- +// declare module JSX { +// interface Element { } +// interface IntrinsicElements { +// div: { +// [|nameRENAME|]?: string; +// isOpen?: boolean; +// }; // span: { n: string; }; // } // } diff --git a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename2.baseline.jsonc.diff b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename2.baseline.jsonc.diff deleted file mode 100644 index b4ca831c75..0000000000 --- a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename2.baseline.jsonc.diff +++ /dev/null @@ -1,26 +0,0 @@ ---- old.tsxRename2.baseline.jsonc -+++ new.tsxRename2.baseline.jsonc -@@= skipped -7, +7 lines =@@ - // isOpen?: boolean; - // }; - // span: { n: string; }; --// } --// } --// var x =
; -+// // --- (line: 9) skipped --- - - - - // === findRenameLocations === - // === /file.tsx === --// declare module JSX { --// interface Element { } --// interface IntrinsicElements { --// div: { --// [|nameRENAME|]?: string; --// isOpen?: boolean; --// }; -+// --- (line: 7) skipped --- - // span: { n: string; }; - // } - // } \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename3.baseline.jsonc b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename3.baseline.jsonc index a4963b39a6..6316fd23f1 100644 --- a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename3.baseline.jsonc +++ b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename3.baseline.jsonc @@ -9,13 +9,18 @@ // } // // -// var x = ; +// var x = ; // === findRenameLocations === // === /file.tsx === -// --- (line: 10) skipped --- +// --- (line: 5) skipped --- +// } +// class MyClass { +// props: { +// [|nameRENAME|]?: string; +// size?: number; // } // // diff --git a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename3.baseline.jsonc.diff b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename3.baseline.jsonc.diff deleted file mode 100644 index 02c57a3f30..0000000000 --- a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename3.baseline.jsonc.diff +++ /dev/null @@ -1,23 +0,0 @@ ---- old.tsxRename3.baseline.jsonc -+++ new.tsxRename3.baseline.jsonc -@@= skipped -8, +8 lines =@@ - // } - // - // --// var x = ; -+// var x = ; - - - - // === findRenameLocations === - // === /file.tsx === --// --- (line: 5) skipped --- --// } --// class MyClass { --// props: { --// [|nameRENAME|]?: string; --// size?: number; -+// --- (line: 10) skipped --- - // } - // - // \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename7.baseline.jsonc b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename7.baseline.jsonc index 295648425f..950cb8ef4b 100644 --- a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename7.baseline.jsonc +++ b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename7.baseline.jsonc @@ -8,27 +8,44 @@ // propString: string // optional?: boolean // } -// // --- (line: 12) skipped --- +// declare function Opt(attributes: OptionPropBag): JSX.Element; +// let opt = ; +// let opt1 = ; +// let opt2 = ; +// let opt3 = ; // === findRenameLocations === // === /file.tsx === -// --- (line: 10) skipped --- +// --- (line: 4) skipped --- +// interface ElementAttributesProperty { props; } +// } +// interface OptionPropBag { +// [|propxRENAME|]: number +// propString: string +// optional?: boolean // } // declare function Opt(attributes: OptionPropBag): JSX.Element; // let opt = ; // let opt1 = ; -// let opt2 = ; +// let opt2 = ; // let opt3 = ; // === findRenameLocations === // === /file.tsx === -// --- (line: 11) skipped --- +// --- (line: 4) skipped --- +// interface ElementAttributesProperty { props; } +// } +// interface OptionPropBag { +// [|propxRENAME|]: number +// propString: string +// optional?: boolean +// } // declare function Opt(attributes: OptionPropBag): JSX.Element; // let opt = ; -// let opt1 = ; +// let opt1 = ; // let opt2 = ; // let opt3 = ; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename7.baseline.jsonc.diff b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename7.baseline.jsonc.diff deleted file mode 100644 index 7b8a814c5b..0000000000 --- a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename7.baseline.jsonc.diff +++ /dev/null @@ -1,52 +0,0 @@ ---- old.tsxRename7.baseline.jsonc -+++ new.tsxRename7.baseline.jsonc -@@= skipped -7, +7 lines =@@ - // propString: string - // optional?: boolean - // } --// declare function Opt(attributes: OptionPropBag): JSX.Element; --// let opt = ; --// let opt1 = ; --// let opt2 = ; --// let opt3 = ; -+// // --- (line: 12) skipped --- - - - - // === findRenameLocations === - // === /file.tsx === --// --- (line: 4) skipped --- --// interface ElementAttributesProperty { props; } --// } --// interface OptionPropBag { --// [|propxRENAME|]: number --// propString: string --// optional?: boolean -+// --- (line: 10) skipped --- - // } - // declare function Opt(attributes: OptionPropBag): JSX.Element; - // let opt = ; - // let opt1 = ; --// let opt2 = ; -+// let opt2 = ; - // let opt3 = ; - - - - // === findRenameLocations === - // === /file.tsx === --// --- (line: 4) skipped --- --// interface ElementAttributesProperty { props; } --// } --// interface OptionPropBag { --// [|propxRENAME|]: number --// propString: string --// optional?: boolean --// } -+// --- (line: 11) skipped --- - // declare function Opt(attributes: OptionPropBag): JSX.Element; - // let opt = ; --// let opt1 = ; -+// let opt1 = ; - // let opt2 = ; - // let opt3 = ; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename9.baseline.jsonc b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename9.baseline.jsonc index ee06cf2f9f..0e5e29ce6a 100644 --- a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename9.baseline.jsonc +++ b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename9.baseline.jsonc @@ -8,18 +8,37 @@ // } // interface LinkProps extends ClickableProps { // goTo: string; -// // --- (line: 16) skipped --- +// } +// declare function MainButton(buttonProps: ButtonProps): JSX.Element; +// declare function MainButton(linkProps: LinkProps): JSX.Element; +// declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; +// let opt = ; +// let opt = ; +// let opt = {}} />; +// let opt = {}} ignore-prop />; +// let opt = ; +// let opt = ; // === findRenameLocations === // === /file.tsx === -// --- (line: 18) skipped --- +// --- (line: 8) skipped --- +// className?: string; +// } +// interface ButtonProps extends ClickableProps { +// [|onClickRENAME|](event?: React.MouseEvent): void; +// } +// interface LinkProps extends ClickableProps { +// goTo: string; +// } +// declare function MainButton(buttonProps: ButtonProps): JSX.Element; +// declare function MainButton(linkProps: LinkProps): JSX.Element; // declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; // let opt = ; // let opt = ; // let opt = {}} />; -// let opt = {}} ignore-prop />; +// let opt = {}} ignore-prop />; // let opt = ; // let opt = ; @@ -27,10 +46,21 @@ // === findRenameLocations === // === /file.tsx === -// --- (line: 19) skipped --- +// --- (line: 8) skipped --- +// className?: string; +// } +// interface ButtonProps extends ClickableProps { +// [|onClickRENAME|](event?: React.MouseEvent): void; +// } +// interface LinkProps extends ClickableProps { +// goTo: string; +// } +// declare function MainButton(buttonProps: ButtonProps): JSX.Element; +// declare function MainButton(linkProps: LinkProps): JSX.Element; +// declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; // let opt = ; // let opt = ; -// let opt = {}} />; +// let opt = {}} />; // let opt = {}} ignore-prop />; // let opt = ; // let opt = ; @@ -47,13 +77,28 @@ // } // declare function MainButton(buttonProps: ButtonProps): JSX.Element; // declare function MainButton(linkProps: LinkProps): JSX.Element; -// // --- (line: 19) skipped --- +// declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; +// let opt = ; +// let opt = ; +// let opt = {}} />; +// let opt = {}} ignore-prop />; +// let opt = ; +// let opt = ; // === findRenameLocations === // === /file.tsx === -// --- (line: 20) skipped --- +// --- (line: 11) skipped --- +// onClick(event?: React.MouseEvent): void; +// } +// interface LinkProps extends ClickableProps { +// [|goToRENAME|]: string; +// } +// declare function MainButton(buttonProps: ButtonProps): JSX.Element; +// declare function MainButton(linkProps: LinkProps): JSX.Element; +// declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; +// let opt = ; // let opt = ; // let opt = {}} />; // let opt = {}} ignore-prop />; diff --git a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename9.baseline.jsonc.diff b/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename9.baseline.jsonc.diff deleted file mode 100644 index 40ae19c4bc..0000000000 --- a/testdata/baselines/reference/submodule/fourslash/findRenameLocations/tsxRename9.baseline.jsonc.diff +++ /dev/null @@ -1,98 +0,0 @@ ---- old.tsxRename9.baseline.jsonc -+++ new.tsxRename9.baseline.jsonc -@@= skipped -7, +7 lines =@@ - // } - // interface LinkProps extends ClickableProps { - // goTo: string; --// } --// declare function MainButton(buttonProps: ButtonProps): JSX.Element; --// declare function MainButton(linkProps: LinkProps): JSX.Element; --// declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; --// let opt = ; --// let opt = ; --// let opt = {}} />; --// let opt = {}} ignore-prop />; --// let opt = ; --// let opt = ; -+// // --- (line: 16) skipped --- - - - - // === findRenameLocations === - // === /file.tsx === --// --- (line: 8) skipped --- --// className?: string; --// } --// interface ButtonProps extends ClickableProps { --// [|onClickRENAME|](event?: React.MouseEvent): void; --// } --// interface LinkProps extends ClickableProps { --// goTo: string; --// } --// declare function MainButton(buttonProps: ButtonProps): JSX.Element; --// declare function MainButton(linkProps: LinkProps): JSX.Element; -+// --- (line: 18) skipped --- - // declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; - // let opt = ; - // let opt = ; - // let opt = {}} />; --// let opt = {}} ignore-prop />; -+// let opt = {}} ignore-prop />; - // let opt = ; - // let opt = ; - -@@= skipped -38, +19 lines =@@ - - // === findRenameLocations === - // === /file.tsx === --// --- (line: 8) skipped --- --// className?: string; --// } --// interface ButtonProps extends ClickableProps { --// [|onClickRENAME|](event?: React.MouseEvent): void; --// } --// interface LinkProps extends ClickableProps { --// goTo: string; --// } --// declare function MainButton(buttonProps: ButtonProps): JSX.Element; --// declare function MainButton(linkProps: LinkProps): JSX.Element; --// declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; -+// --- (line: 19) skipped --- - // let opt = ; - // let opt = ; --// let opt = {}} />; -+// let opt = {}} />; - // let opt = {}} ignore-prop />; - // let opt = ; - // let opt = ; -@@= skipped -31, +20 lines =@@ - // } - // declare function MainButton(buttonProps: ButtonProps): JSX.Element; - // declare function MainButton(linkProps: LinkProps): JSX.Element; --// declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; --// let opt = ; --// let opt = ; --// let opt = {}} />; --// let opt = {}} ignore-prop />; --// let opt = ; --// let opt = ; -+// // --- (line: 19) skipped --- - - - - // === findRenameLocations === - // === /file.tsx === --// --- (line: 11) skipped --- --// onClick(event?: React.MouseEvent): void; --// } --// interface LinkProps extends ClickableProps { --// [|goToRENAME|]: string; --// } --// declare function MainButton(buttonProps: ButtonProps): JSX.Element; --// declare function MainButton(linkProps: LinkProps): JSX.Element; --// declare function MainButton(props: ButtonProps | LinkProps): JSX.Element; --// let opt = ; -+// --- (line: 20) skipped --- - // let opt = ; - // let opt = {}} />; - // let opt = {}} ignore-prop />; \ No newline at end of file