diff --git a/src/haxeLanguageServer/features/haxe/codeAction/ExtractVarFeature.hx b/src/haxeLanguageServer/features/haxe/codeAction/ExtractVarFeature.hx index d5cb71f9..bc28b1ee 100644 --- a/src/haxeLanguageServer/features/haxe/codeAction/ExtractVarFeature.hx +++ b/src/haxeLanguageServer/features/haxe/codeAction/ExtractVarFeature.hx @@ -207,9 +207,18 @@ class ExtractVarFeature implements CodeActionContributor { if (token.tok == BrClose || token.tok == BkClose) { token = token.parent ?? return []; } + // extract full object/array switch token.tok { - case BrOpen, BkOpen: // extract full object/array + case BrOpen: return [token, getLastNonCommaToken(token)]; + case BkOpen: + final parent = token.parent ?? return []; + final isArrAccess = parent.isCIdent() || parent.matches(BkOpen); + if (!isArrAccess) { + return [token, getLastNonCommaToken(token)]; + } else { + token = parent; + } case _: } diff --git a/test/codeActions/ExtractVarTest.hx b/test/codeActions/ExtractVarTest.hx index 7d13226e..3a0eabcd 100644 --- a/test/codeActions/ExtractVarTest.hx +++ b/test/codeActions/ExtractVarTest.hx @@ -73,4 +73,56 @@ class ExtractVarTest extends DisplayTestCase { applyTextEdit(actions[0].edit); eq(ctx.result, ctx.doc.content); } + + /** + function main() { + final foo = add({ + onComplete: spr{-1-}ite -> { + foo(1, [2]); + } + }); + } + --- + function main() { + final sprite = sprite -> { + foo(1, [2]); + }; + final foo = add({ + onComplete: sprite + }); + } + **/ + function testArrowFunction():Void { + final feature = new ExtractVarFeature(ctx.context); + final actions:Array = feature.extractVar(ctx.doc, ctx.uri, pos(1).toRange()); + applyTextEdit(actions[0].edit); + eq(ctx.result, ctx.doc.content); + } + + /** + function main() { + final item1 = tasks[0]{-1-}; + final item2 = [1, 2, 3][0]{-2-}; + final item3 = call()[0]{-3-}; + } + --- + function main() { + final arr = tasks[0]; + final item1 = arr; + final arr = [1, 2, 3][0]; + final item2 = arr; + final arr = call()[0]; + final item3 = arr; + } + **/ + function testArrayAccess():Void { + final feature = new ExtractVarFeature(ctx.context); + final actions:Array = feature.extractVar(ctx.doc, ctx.uri, pos(3).toRange()); + applyTextEdit(actions[0].edit); + final actions:Array = feature.extractVar(ctx.doc, ctx.uri, pos(2).toRange()); + applyTextEdit(actions[0].edit); + final actions:Array = feature.extractVar(ctx.doc, ctx.uri, pos(1).toRange()); + applyTextEdit(actions[0].edit); + eq(ctx.result, ctx.doc.content); + } }