From abba161d974d001a0b2aa1a811d3e19dd547341b Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sat, 18 Nov 2023 14:48:47 +0100 Subject: [PATCH 01/20] Migrate java scopes --- .../src/languages/getTextFragmentExtractor.ts | 4 - .../cursorless-engine/src/languages/java.ts | 62 -------- .../recorded/languages/java/changeBranch.yml | 42 ++++++ .../recorded/languages/java/changeBranch2.yml | 42 ++++++ .../recorded/languages/java/changeBranch3.yml | 42 ++++++ .../languages/java/changeCondition.yml | 43 ++++++ .../languages/java/changeCondition2.yml | 43 ++++++ queries/java.scm | 135 ++++++++++++++++++ 8 files changed, 347 insertions(+), 66 deletions(-) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch3.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition2.yml create mode 100644 queries/java.scm diff --git a/packages/cursorless-engine/src/languages/getTextFragmentExtractor.ts b/packages/cursorless-engine/src/languages/getTextFragmentExtractor.ts index a9e8aadf98..c204b44113 100644 --- a/packages/cursorless-engine/src/languages/getTextFragmentExtractor.ts +++ b/packages/cursorless-engine/src/languages/getTextFragmentExtractor.ts @@ -132,10 +132,6 @@ const textFragmentExtractors: Record< "html", htmlStringTextFragmentExtractor, ), - java: constructDefaultTextFragmentExtractor( - "java", - constructHackedStringTextFragmentExtractor("java"), - ), javascript: constructDefaultTextFragmentExtractor( "javascript", typescriptStringTextFragmentExtractor, diff --git a/packages/cursorless-engine/src/languages/java.ts b/packages/cursorless-engine/src/languages/java.ts index 1be9e7909e..c1532ff7ce 100644 --- a/packages/cursorless-engine/src/languages/java.ts +++ b/packages/cursorless-engine/src/languages/java.ts @@ -2,7 +2,6 @@ import { createPatternMatchers, argumentMatcher, leadingMatcher, - conditionMatcher, trailingMatcher, matcher, cascadingMatcher, @@ -13,61 +12,9 @@ import { patternFinder } from "../util/nodeFinders"; import { NodeMatcherAlternative } from "../typings/Types"; import { SimpleScopeTypeType } from "@cursorless/common"; -// Generated by the following command: -// > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-java/master/src/node-types.json | jq '[.[] | select(.type == "statement" or .type == "declaration") | .subtypes[].type]' -const STATEMENT_TYPES = [ - "annotation_type_declaration", - "class_declaration", - "enum_declaration", - "import_declaration", - "interface_declaration", - "module_declaration", - "package_declaration", - "assert_statement", - "break_statement", - "continue_statement", - "declaration", - "do_statement", - "enhanced_for_statement", - "expression_statement", - "for_statement", - "if_statement", - "labeled_statement", - "local_variable_declaration", - "return_statement", - "switch_expression", - "synchronized_statement", - "throw_statement", - "try_statement", - "try_with_resources_statement", - "while_statement", - "yield_statement", - - // exceptions - // ";", - // "block", - "switch_statement", - "method_declaration", - "constructor_declaration", - "field_declaration", -]; - const nodeMatchers: Partial< Record > = { - statement: STATEMENT_TYPES, - class: "class_declaration", - className: "class_declaration[name]", - ifStatement: "if_statement", - string: "string_literal", - comment: ["line_comment", "block_comment", "comment"], - anonymousFunction: "lambda_expression", - list: "array_initializer", - functionCall: [ - "method_invocation", - "object_creation_expression", - "explicit_constructor_invocation", - ], functionCallee: cascadingMatcher( matcher( patternFinder("method_invocation"), @@ -82,14 +29,12 @@ const nodeMatchers: Partial< childRangeSelector(["argument_list", ";"], []), ), ), - map: "block", name: [ "*[declarator][name]", "assignment_expression[left]", "*[name]", "formal_parameter.identifier!", ], - namedFunction: ["method_declaration", "constructor_declaration"], type: trailingMatcher([ "generic_type.type_arguments.type_identifier", "generic_type.type_identifier", @@ -100,10 +45,6 @@ const nodeMatchers: Partial< "formal_parameter[type]", "method_declaration[type]", ]), - functionName: [ - "method_declaration.identifier!", - "constructor_declaration.identifier!", - ], value: leadingMatcher( [ "*[declarator][value]", @@ -113,10 +54,7 @@ const nodeMatchers: Partial< ], ["=", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "<<=", ">>="], ), - condition: conditionMatcher("*[condition]"), argumentOrParameter: argumentMatcher("formal_parameters", "argument_list"), - branch: ["switch_block_statement_group", "switch_rule"], - switchStatementSubject: "switch_expression[condition][0]", }; export default createPatternMatchers(nodeMatchers); diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch.yml new file mode 100644 index 0000000000..8730465b3f --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch.yml @@ -0,0 +1,42 @@ +languageId: java +command: + version: 6 + spokenForm: change branch + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: branch} + usePrePhraseSnapshot: true +initialState: + documentContents: | + public class MyClass { + public void myFunk() { + if (true) { + } + else if (false) { + } + else { + } + } + } + selections: + - anchor: {line: 2, character: 4} + active: {line: 2, character: 4} + marks: {} +finalState: + documentContents: | + public class MyClass { + public void myFunk() { + + else if (false) { + } + else { + } + } + } + selections: + - anchor: {line: 2, character: 4} + active: {line: 2, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch2.yml new file mode 100644 index 0000000000..a0bd1df293 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch2.yml @@ -0,0 +1,42 @@ +languageId: java +command: + version: 6 + spokenForm: change branch + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: branch} + usePrePhraseSnapshot: true +initialState: + documentContents: | + public class MyClass { + public void myFunk() { + if (true) { + } + else if (false) { + } + else { + } + } + } + selections: + - anchor: {line: 4, character: 4} + active: {line: 4, character: 4} + marks: {} +finalState: + documentContents: | + public class MyClass { + public void myFunk() { + if (true) { + } + + else { + } + } + } + selections: + - anchor: {line: 4, character: 4} + active: {line: 4, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch3.yml new file mode 100644 index 0000000000..f16ab7ed3c --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch3.yml @@ -0,0 +1,42 @@ +languageId: java +command: + version: 6 + spokenForm: change branch + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: branch} + usePrePhraseSnapshot: true +initialState: + documentContents: | + public class MyClass { + public void myFunk() { + if (true) { + } + else if (false) { + } + else { + } + } + } + selections: + - anchor: {line: 6, character: 4} + active: {line: 6, character: 4} + marks: {} +finalState: + documentContents: | + public class MyClass { + public void myFunk() { + if (true) { + } + else if (false) { + } + + } + } + selections: + - anchor: {line: 6, character: 4} + active: {line: 6, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition.yml new file mode 100644 index 0000000000..74ea19720a --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition.yml @@ -0,0 +1,43 @@ +languageId: java +command: + version: 6 + spokenForm: change condition + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: condition} + usePrePhraseSnapshot: true +initialState: + documentContents: | + public class MyClass { + public void myFunk() { + if (true) { + } + else if (false) { + } + else { + } + } + } + selections: + - anchor: {line: 2, character: 4} + active: {line: 2, character: 4} + marks: {} +finalState: + documentContents: | + public class MyClass { + public void myFunk() { + if () { + } + else if (false) { + } + else { + } + } + } + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition2.yml new file mode 100644 index 0000000000..cdde7c4e8f --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition2.yml @@ -0,0 +1,43 @@ +languageId: java +command: + version: 6 + spokenForm: change condition + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: condition} + usePrePhraseSnapshot: true +initialState: + documentContents: | + public class MyClass { + public void myFunk() { + if (true) { + } + else if (false) { + } + else { + } + } + } + selections: + - anchor: {line: 4, character: 4} + active: {line: 4, character: 4} + marks: {} +finalState: + documentContents: | + public class MyClass { + public void myFunk() { + if (true) { + } + else if () { + } + else { + } + } + } + selections: + - anchor: {line: 4, character: 13} + active: {line: 4, character: 13} diff --git a/queries/java.scm b/queries/java.scm new file mode 100644 index 0000000000..a3711474bb --- /dev/null +++ b/queries/java.scm @@ -0,0 +1,135 @@ +;; Generated by the following command: +;; > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-java/master/src/node-types.json | jq '[.[] | select(.type == "statement" or .type == "declaration") | .subtypes[].type]' +[ + (annotation_type_declaration) + (class_declaration) + (enum_declaration) + (import_declaration) + (interface_declaration) + (module_declaration) + (package_declaration) + (assert_statement) + (break_statement) + (continue_statement) + (declaration) + (do_statement) + (enhanced_for_statement) + (expression_statement) + (for_statement) + (if_statement) + (labeled_statement) + (local_variable_declaration) + (return_statement) + (switch_expression) + (synchronized_statement) + (throw_statement) + (try_statement) + (try_with_resources_statement) + (while_statement) + (yield_statement) + + ;; exceptions + ;; ";", + ;; "block", + (method_declaration) + (constructor_declaration) + (field_declaration) +] @statement + +(class_declaration + name: (_) @className +) @class @className.domain + +(method_declaration + (identifier) @functionName +) @namedFunction @functionName.domain +(constructor_declaration + (identifier) @functionName +) @namedFunction @functionName.domain + +(lambda_expression) @anonymousFunction + +( + (if_statement) @ifStatement + (#not-parent-type? @ifStatement "if_statement") +) + +(string_literal) @string @textFragment + +[ + (line_comment) + (block_comment) +] @comment @textFragment + +(array_initializer) @list + +(block) @map + +[ + (method_invocation) + (object_creation_expression) + (explicit_constructor_invocation) +] @functionCall + +;;!! case "0": return "zero"; +;;! ^^^^^^^^^^^^^^^^^^^^^^^^ +;;!! case "0" -> "zero"; +;;! ^^^^^^^^^^^^^^^^^^^ +[ + (switch_block_statement_group) + (switch_rule) +] @branch + +;;!! if () {} +;;! ^^^^^^^^ +( + (if_statement + "if" @branch.start @condition.domain.start + condition: (_) @condition + consequence: (block) @branch.end @condition.domain.end + ) @dummy + (#not-parent-type? @dummy "if_statement") + (#child-range! @condition 0 -1 true true) +) + +;;!! else if () {} +;;! ^^^^^^^^^^^^^ +(if_statement + "else" @branch.start @condition.domain.start + alternative: (if_statement + condition: (_) @condition + consequence: (block) @branch.end @condition.domain.end + (#child-range! @condition 0 -1 true true) + ) +) + +;;!! else {} +;;! ^^^^^^^ +(if_statement + "else" @branch.start + alternative: (block) @branch.end +) + +;;!! for (int i = 0; i < 5; ++i) {} +;;! ^^^^^ +;;! ------------------------------ +(for_statement + condition: (_) @condition +) @_.domain + +;;!! switch (value) {} +;;! ^^^^^ +;;! ----------------- +(switch_expression + condition: (_) @condition @switchStatementSubject + (#child-range! @condition 0 -1 true true) + (#child-range! @switchStatementSubject 0 -1 true true) +) @_.domain + +;;!! while (value) {} +;;! ^^^^^ +;;! ---------------- +(while_statement + condition: (_) @condition + (#child-range! @condition 0 -1 true true) +) @_.domain From 26993bfdf18d0017ab2d4697bd7f24feb180f06a Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sat, 18 Nov 2023 17:00:57 +0100 Subject: [PATCH 02/20] Added test --- .../recorded/languages/java/changeIfState.yml | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeIfState.yml diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeIfState.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeIfState.yml new file mode 100644 index 0000000000..99a71256d2 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeIfState.yml @@ -0,0 +1,38 @@ +languageId: java +command: + version: 6 + spokenForm: change if state + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: ifStatement} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + if (true) { + + } + else if (true) { + + } + } + } + selections: + - anchor: {line: 6, character: 12} + active: {line: 6, character: 12} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + + } + } + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} From f433bec3ea0e15b22e0675cbbc0f00026333e1b4 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sat, 18 Nov 2023 17:27:23 +0100 Subject: [PATCH 03/20] added comments --- queries/java.scm | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/queries/java.scm b/queries/java.scm index a3711474bb..0f60c997a4 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -40,6 +40,8 @@ name: (_) @className ) @class @className.domain +;;!! void myFunk() {} +;;! ^^^^^^^^^^^^^^^^ (method_declaration (identifier) @functionName ) @namedFunction @functionName.domain @@ -47,23 +49,39 @@ (identifier) @functionName ) @namedFunction @functionName.domain +;;!! ((value) -> true) +;;! ^^^^^^^^^^^^^^^ (lambda_expression) @anonymousFunction +;;!! if (value) {} +;;! ^^^^^^^^^^^^^ ( (if_statement) @ifStatement (#not-parent-type? @ifStatement "if_statement") ) +;;!! "string" +;;! ^^^^^^^^ (string_literal) @string @textFragment +;;!! // comment +;;! ^^^^^^^^^^ [ (line_comment) (block_comment) ] @comment @textFragment +;;!! int[] values = {1, 2, 3}; +;;! ^^^^^^^^^ (array_initializer) @list -(block) @map +;;!! List value = new ArrayList() {{ add("a"); }}; +;;! ^^^^^^^^^^^^^^^ +(object_creation_expression + (class_body + (block) @map + ) +) [ (method_invocation) @@ -117,15 +135,6 @@ condition: (_) @condition ) @_.domain -;;!! switch (value) {} -;;! ^^^^^ -;;! ----------------- -(switch_expression - condition: (_) @condition @switchStatementSubject - (#child-range! @condition 0 -1 true true) - (#child-range! @switchStatementSubject 0 -1 true true) -) @_.domain - ;;!! while (value) {} ;;! ^^^^^ ;;! ---------------- @@ -133,3 +142,11 @@ condition: (_) @condition (#child-range! @condition 0 -1 true true) ) @_.domain + +;;!! switch (value) {} +;;! ^^^^^ +;;! ----------------- +(switch_expression + condition: (_) @switchStatementSubject + (#child-range! @switchStatementSubject 0 -1 true true) +) @_.domain From 7684f35c2093a1b7898d31cb1934dcf91ecd3b75 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sat, 18 Nov 2023 17:39:03 +0100 Subject: [PATCH 04/20] Added ternary support --- .../recorded/languages/java/changeBranch4.yml | 33 +++++++++++++++++++ .../recorded/languages/java/changeBranch5.yml | 33 +++++++++++++++++++ .../languages/java/changeCondition3.yml | 33 +++++++++++++++++++ queries/java.scm | 9 +++++ 4 files changed, 108 insertions(+) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch4.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch5.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition3.yml diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch4.yml new file mode 100644 index 0000000000..fdd3478822 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch4.yml @@ -0,0 +1,33 @@ +languageId: java +command: + version: 6 + spokenForm: change branch + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: branch} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + true ? 1 : 2 + } + } + selections: + - anchor: {line: 2, character: 15} + active: {line: 2, character: 15} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + true ? : 2 + } + } + selections: + - anchor: {line: 2, character: 15} + active: {line: 2, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch5.yml new file mode 100644 index 0000000000..7f9af7cf21 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch5.yml @@ -0,0 +1,33 @@ +languageId: java +command: + version: 6 + spokenForm: change branch + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: branch} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + true ? 1 : 2 + } + } + selections: + - anchor: {line: 2, character: 19} + active: {line: 2, character: 19} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + true ? 1 : + } + } + selections: + - anchor: {line: 2, character: 19} + active: {line: 2, character: 19} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition3.yml new file mode 100644 index 0000000000..8bd757a2a0 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition3.yml @@ -0,0 +1,33 @@ +languageId: java +command: + version: 6 + spokenForm: change condition + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: condition} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + true ? 1 : 2 + } + } + selections: + - anchor: {line: 2, character: 15} + active: {line: 2, character: 15} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + ? 1 : 2 + } + } + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} diff --git a/queries/java.scm b/queries/java.scm index 0f60c997a4..892816098a 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -150,3 +150,12 @@ condition: (_) @switchStatementSubject (#child-range! @switchStatementSubject 0 -1 true true) ) @_.domain + +;;!! true ? 1 : 2 +(ternary_expression + condition: (_) @condition + consequence: (_) @branch +) @condition.domain +(ternary_expression + alternative: (_) @branch +) From 5256b120ae707eab579362837544ce02f8c6fc80 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sat, 18 Nov 2023 23:29:32 +0100 Subject: [PATCH 05/20] Added domain and iteration --- .../languages/java/changeEveryBranch.yml | 43 ++++++++++++++++++ .../languages/java/changeEveryBranch2.yml | 41 +++++++++++++++++ .../languages/java/changeEveryBranch3.yml | 39 ++++++++++++++++ .../languages/java/changeEveryCondition.yml | 45 +++++++++++++++++++ .../languages/java/changeEveryCondition2.yml | 41 +++++++++++++++++ queries/java.scm | 22 +++++++++ 6 files changed, 231 insertions(+) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch3.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition2.yml diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch.yml new file mode 100644 index 0000000000..6bafca6f1b --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch.yml @@ -0,0 +1,43 @@ +languageId: java +command: + version: 6 + spokenForm: change every branch + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: everyScope + scopeType: {type: branch} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + switch (true) { + case "0": + return "zero"; + case "1": + return "one"; + } + } + } + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + switch (true) { + + + } + } + } + selections: + - anchor: {line: 3, character: 12} + active: {line: 3, character: 12} + - anchor: {line: 4, character: 12} + active: {line: 4, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch2.yml new file mode 100644 index 0000000000..078cb8695b --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch2.yml @@ -0,0 +1,41 @@ +languageId: java +command: + version: 6 + spokenForm: change every branch + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: everyScope + scopeType: {type: branch} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + switch (true) { + case "0" -> "zero"; + case "1" -> "one"; + } + } + } + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + switch (true) { + + + } + } + } + selections: + - anchor: {line: 3, character: 12} + active: {line: 3, character: 12} + - anchor: {line: 4, character: 12} + active: {line: 4, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch3.yml new file mode 100644 index 0000000000..9e1c3983ac --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch3.yml @@ -0,0 +1,39 @@ +languageId: java +command: + version: 6 + spokenForm: change every branch + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: everyScope + scopeType: {type: branch} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + switch (true) { + true ? 0 : 1 + } + } + } + selections: + - anchor: {line: 3, character: 12} + active: {line: 3, character: 12} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + switch (true) { + true ? : + } + } + } + selections: + - anchor: {line: 3, character: 19} + active: {line: 3, character: 19} + - anchor: {line: 3, character: 22} + active: {line: 3, character: 22} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition.yml new file mode 100644 index 0000000000..6ceb8d0f89 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition.yml @@ -0,0 +1,45 @@ +languageId: java +command: + version: 6 + spokenForm: change every condition + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: everyScope + scopeType: {type: condition} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + switch (true) { + case "0": + return "zero"; + case "1": + return "one"; + } + } + } + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + switch (true) { + case : + return "zero"; + case : + return "one"; + } + } + } + selections: + - anchor: {line: 3, character: 17} + active: {line: 3, character: 17} + - anchor: {line: 5, character: 17} + active: {line: 5, character: 17} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition2.yml new file mode 100644 index 0000000000..22407febb7 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition2.yml @@ -0,0 +1,41 @@ +languageId: java +command: + version: 6 + spokenForm: change every condition + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: everyScope + scopeType: {type: condition} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + switch (true) { + case "0" -> "zero"; + case "1" -> "one"; + } + } + } + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + switch (true) { + case -> "zero"; + case -> "one"; + } + } + } + selections: + - anchor: {line: 3, character: 17} + active: {line: 3, character: 17} + - anchor: {line: 4, character: 17} + active: {line: 4, character: 17} diff --git a/queries/java.scm b/queries/java.scm index 892816098a..e92e8f618c 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -98,6 +98,26 @@ (switch_rule) ] @branch +;;!! case "0": return "zero"; +;;! ^^^ +;;! ------------------------ +(switch_block_statement_group + (switch_label + (_) @condition + ) +) @condition.domain + +;;!! case "0" -> "zero"; +;;! ^^^ +;;! ------------------- +(switch_rule + (switch_label + (_) @condition + ) +) @condition.domain + +(switch_expression) @branch.iteration @condition.iteration + ;;!! if () {} ;;! ^^^^^^^^ ( @@ -159,3 +179,5 @@ (ternary_expression alternative: (_) @branch ) + +(ternary_expression) @branch.iteration From cd49f5c26e068b0e595267851185da6babcf200a Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sat, 18 Nov 2023 23:56:20 +0100 Subject: [PATCH 06/20] migrate name --- .../cursorless-engine/src/languages/java.ts | 6 ---- .../languages/java/changeEveryName.yml | 33 +++++++++++++++++++ queries/java.scm | 22 +++++++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryName.yml diff --git a/packages/cursorless-engine/src/languages/java.ts b/packages/cursorless-engine/src/languages/java.ts index c1532ff7ce..19e41b6d20 100644 --- a/packages/cursorless-engine/src/languages/java.ts +++ b/packages/cursorless-engine/src/languages/java.ts @@ -29,12 +29,6 @@ const nodeMatchers: Partial< childRangeSelector(["argument_list", ";"], []), ), ), - name: [ - "*[declarator][name]", - "assignment_expression[left]", - "*[name]", - "formal_parameter.identifier!", - ], type: trailingMatcher([ "generic_type.type_arguments.type_identifier", "generic_type.type_identifier", diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryName.yml new file mode 100644 index 0000000000..b2620ee4f0 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryName.yml @@ -0,0 +1,33 @@ +languageId: java +command: + version: 6 + spokenForm: change every name + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: everyScope + scopeType: {type: name} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk(final String value, final int value) { + } + } + selections: + - anchor: {line: 1, character: 23} + active: {line: 1, character: 23} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk(final String , final int ) { + } + } + selections: + - anchor: {line: 1, character: 36} + active: {line: 1, character: 36} + - anchor: {line: 1, character: 48} + active: {line: 1, character: 48} diff --git a/queries/java.scm b/queries/java.scm index e92e8f618c..a168435976 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -180,4 +180,26 @@ alternative: (_) @branch ) +;;!! true ? 1 : 2 +;;! ^^^^^^^^^^^^ (ternary_expression) @branch.iteration + +(_ + name: (_) @name +) @_.domain + +;;!! void myFunk(int value) {} +;;! ^^^^^ +;;! ------------------------- +(formal_parameters + (formal_parameter + (identifier) @name + ) @_.domain +) @_.iteration + +;;!! int value = 0; +;;! ^^^^^ +;;! -------------- +(assignment_expression + left: (_) @name +) @_.domain From da056691f2f05481c56575ed7aa01bd6bf61fa24 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 19 Nov 2023 00:00:15 +0100 Subject: [PATCH 07/20] Added test --- .../recorded/languages/java/changeName.yml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeName.yml diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeName.yml new file mode 100644 index 0000000000..8a86cfa14e --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeName.yml @@ -0,0 +1,37 @@ +languageId: java +command: + version: 6 + spokenForm: change name + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: name} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + for (final int value : values) { + + } + } + } + selections: + - anchor: {line: 3, character: 12} + active: {line: 3, character: 12} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + for (final int : values) { + + } + } + } + selections: + - anchor: {line: 2, character: 23} + active: {line: 2, character: 23} From 1f57754a49c0a3c26507fb84e6970b2b97a2e082 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 19 Nov 2023 00:02:01 +0100 Subject: [PATCH 08/20] Add test --- .../recorded/languages/java/changeValue.yml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue.yml diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue.yml new file mode 100644 index 0000000000..d15a32f005 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue.yml @@ -0,0 +1,37 @@ +languageId: java +command: + version: 6 + spokenForm: change value + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: value} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + for (final int value : values) { + + } + } + } + selections: + - anchor: {line: 3, character: 12} + active: {line: 3, character: 12} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk() { + for (final int value : ) { + + } + } + } + selections: + - anchor: {line: 2, character: 31} + active: {line: 2, character: 31} From 7eda891785dbd254aaaf81db42361c56769572c7 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 19 Nov 2023 00:51:58 +0100 Subject: [PATCH 09/20] Migrate type --- .../cursorless-engine/src/languages/java.ts | 10 ---- .../recorded/languages/java/changeType2.yml | 47 +++++++++++++++++++ .../recorded/languages/java/changeType3.yml | 39 +++++++++++++++ .../recorded/languages/java/changeType4.yml | 33 +++++++++++++ .../recorded/languages/java/changeType5.yml | 33 +++++++++++++ .../{takeTypeGust.yml => clearTypeGust.yml} | 10 ++-- .../{takeTypeGust2.yml => clearTypeGust2.yml} | 10 ++-- .../{takeTypeSoon.yml => clearTypeSoon.yml} | 10 ++-- .../{takeTypeSoon2.yml => clearTypeSoon2.yml} | 10 ++-- .../{takeTypeTrap.yml => clearTypeTrap.yml} | 10 ++-- .../{takeTypeTrap2.yml => clearTypeTrap2.yml} | 10 ++-- .../recorded/languages/java/takeType4.yml | 33 +++++++++++++ queries/java.scm | 41 ++++++++++++++++ 13 files changed, 256 insertions(+), 40 deletions(-) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType3.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType4.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType5.yml rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{takeTypeGust.yml => clearTypeGust.yml} (81%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{takeTypeGust2.yml => clearTypeGust2.yml} (81%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{takeTypeSoon.yml => clearTypeSoon.yml} (80%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{takeTypeSoon2.yml => clearTypeSoon2.yml} (80%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{takeTypeTrap.yml => clearTypeTrap.yml} (80%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{takeTypeTrap2.yml => clearTypeTrap2.yml} (80%) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeType4.yml diff --git a/packages/cursorless-engine/src/languages/java.ts b/packages/cursorless-engine/src/languages/java.ts index 19e41b6d20..a488313c5a 100644 --- a/packages/cursorless-engine/src/languages/java.ts +++ b/packages/cursorless-engine/src/languages/java.ts @@ -29,16 +29,6 @@ const nodeMatchers: Partial< childRangeSelector(["argument_list", ";"], []), ), ), - type: trailingMatcher([ - "generic_type.type_arguments.type_identifier", - "generic_type.type_identifier", - "generic_type.scoped_type_identifier.type_identifier", - "type_identifier", - "local_variable_declaration[type]", - "array_creation_expression[type]", - "formal_parameter[type]", - "method_declaration[type]", - ]), value: leadingMatcher( [ "*[declarator][value]", diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType2.yml new file mode 100644 index 0000000000..1be2dccab6 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType2.yml @@ -0,0 +1,47 @@ +languageId: java +command: + version: 6 + spokenForm: change type + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: type} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + private MyClass () { + Map map = new HashMap(); + List list = new ArrayList(); + } + } + selections: + - anchor: {line: 2, character: 12} + active: {line: 2, character: 12} + - anchor: {line: 3, character: 12} + active: {line: 3, character: 12} + - anchor: {line: 2, character: 42} + active: {line: 2, character: 42} + - anchor: {line: 3, character: 36} + active: {line: 3, character: 36} + marks: {} +finalState: + documentContents: |- + public class MyClass { + private MyClass () { + map = new (); + list = new (); + } + } + selections: + - anchor: {line: 2, character: 12} + active: {line: 2, character: 12} + - anchor: {line: 2, character: 23} + active: {line: 2, character: 23} + - anchor: {line: 3, character: 12} + active: {line: 3, character: 12} + - anchor: {line: 3, character: 24} + active: {line: 3, character: 24} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType3.yml new file mode 100644 index 0000000000..820968d708 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType3.yml @@ -0,0 +1,39 @@ +languageId: java +command: + version: 6 + spokenForm: change type + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: type} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + private MyClass () { + Map map = new HashMap(); + List list = new ArrayList(); + } + } + selections: + - anchor: {line: 2, character: 32} + active: {line: 2, character: 32} + - anchor: {line: 3, character: 25} + active: {line: 3, character: 25} + marks: {} +finalState: + documentContents: |- + public class MyClass { + private MyClass () { + map = new HashMap(); + list = new ArrayList(); + } + } + selections: + - anchor: {line: 2, character: 12} + active: {line: 2, character: 12} + - anchor: {line: 3, character: 12} + active: {line: 3, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType4.yml new file mode 100644 index 0000000000..0cd08281b8 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType4.yml @@ -0,0 +1,33 @@ +languageId: java +command: + version: 6 + spokenForm: change type + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: type} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + private MyClass (String hello) { + int[] values = new int[5]; + } + } + selections: + - anchor: {line: 2, character: 27} + active: {line: 2, character: 27} + marks: {} +finalState: + documentContents: |- + public class MyClass { + private MyClass (String hello) { + int[] values = new [5]; + } + } + selections: + - anchor: {line: 2, character: 27} + active: {line: 2, character: 27} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType5.yml new file mode 100644 index 0000000000..97a06ede7e --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType5.yml @@ -0,0 +1,33 @@ +languageId: java +command: + version: 6 + spokenForm: change type + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: type} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk() { + + } + } + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public myFunk() { + + } + } + selections: + - anchor: {line: 1, character: 11} + active: {line: 1, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust.yml similarity index 81% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust.yml index 57df12173a..c71d6982fc 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: take type gust - action: setSelection + spokenForm: change type gust + action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -27,9 +27,9 @@ finalState: public class MyClass { private MyClass () { Map map = new HashMap(); - List list = new ArrayList(); + List<> list = new ArrayList(); } } selections: - - anchor: {line: 3, character: 8} - active: {line: 3, character: 20} + - anchor: {line: 3, character: 13} + active: {line: 3, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust2.yml similarity index 81% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust2.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust2.yml index 182e3de0e3..ffe75dfd7f 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust2.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: take type gust - action: setSelection + spokenForm: change type gust + action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -27,9 +27,9 @@ finalState: public class MyClass { private MyClass () { Map map = new HashMap(); - List list = new ArrayList(); + List list = new ArrayList<>(); } } selections: - - anchor: {line: 3, character: 32} - active: {line: 3, character: 49} + - anchor: {line: 3, character: 42} + active: {line: 3, character: 42} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon.yml similarity index 80% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon.yml index 776acf1faa..418f981c17 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: take type sun - action: setSelection + spokenForm: change type sun + action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -26,10 +26,10 @@ finalState: documentContents: |- public class MyClass { private MyClass () { - Map map = new HashMap(); + Map<, String> map = new HashMap(); List list = new ArrayList(); } } selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 27} + - anchor: {line: 2, character: 12} + active: {line: 2, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon2.yml similarity index 80% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon2.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon2.yml index 8cfcb12d16..700e7fe436 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon2.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: take type sun - action: setSelection + spokenForm: change type sun + action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -26,10 +26,10 @@ finalState: documentContents: |- public class MyClass { private MyClass () { - Map map = new HashMap(); + Map map = new HashMap(); List list = new ArrayList(); } } selections: - - anchor: {line: 2, character: 38} - active: {line: 2, character: 61} + - anchor: {line: 2, character: 54} + active: {line: 2, character: 54} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap.yml similarity index 80% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap.yml index f212a2ae55..4e6721dfd3 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: take type trap - action: setSelection + spokenForm: change type trap + action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -26,10 +26,10 @@ finalState: documentContents: |- public class MyClass { private MyClass () { - Map map = new HashMap(); + Map map = new HashMap(); List list = new ArrayList(); } } selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 27} + - anchor: {line: 2, character: 20} + active: {line: 2, character: 20} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap2.yml similarity index 80% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap2.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap2.yml index 8beaf7e7db..343fb97c5a 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap2.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: take type trap - action: setSelection + spokenForm: change type trap + action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -26,10 +26,10 @@ finalState: documentContents: |- public class MyClass { private MyClass () { - Map map = new HashMap(); + Map map = new HashMap<, String>(); List list = new ArrayList(); } } selections: - - anchor: {line: 2, character: 38} - active: {line: 2, character: 61} + - anchor: {line: 2, character: 46} + active: {line: 2, character: 46} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeType4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeType4.yml new file mode 100644 index 0000000000..4a2abc6233 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeType4.yml @@ -0,0 +1,33 @@ +languageId: java +command: + version: 6 + spokenForm: take type + action: + name: setSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: type} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + public void myFunk(int value) { + + } + } + selections: + - anchor: {line: 1, character: 30} + active: {line: 1, character: 30} + marks: {} +finalState: + documentContents: |- + public class MyClass { + public void myFunk(int value) { + + } + } + selections: + - anchor: {line: 1, character: 23} + active: {line: 1, character: 26} diff --git a/queries/java.scm b/queries/java.scm index a168435976..13cb02629a 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -203,3 +203,44 @@ (assignment_expression left: (_) @name ) @_.domain + +;;!! Map +;;! ^^^^^^^ ^^^^^^ +(type_arguments + (type_identifier) @type +) + +;;!! List list = value; +;;! ^^^^^^^^^^^^ +;;! -------------------------- +(local_variable_declaration + type: (_) @type +) @_.domain + +;;!! name = new ArrayList(); +;;! ^^^^^^^^^^^^^^^^^ +;;! ----------------------- +(object_creation_expression + type: (_) @type +) @_.domain + +;;!! name = new int[5]; +;;! ^^^ +;;! ---------- +(array_creation_expression + type: (_) @type +) @_.domain + +;;!! void myFunk(int value) {} +;;! ^^^ +;;! --------- +(formal_parameter + type: (_) @type +) @_.domain + +;;!! int size() {} +;;! ^^^ +;;! ------------- +(method_declaration + type: (_) @type +) @_.domain From d33d3a1f0b0cf7f5b84823f3c8160fbed5b905be Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 19 Nov 2023 00:52:15 +0100 Subject: [PATCH 10/20] clean --- packages/cursorless-engine/src/languages/java.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cursorless-engine/src/languages/java.ts b/packages/cursorless-engine/src/languages/java.ts index a488313c5a..5f2c64f6f9 100644 --- a/packages/cursorless-engine/src/languages/java.ts +++ b/packages/cursorless-engine/src/languages/java.ts @@ -2,7 +2,6 @@ import { createPatternMatchers, argumentMatcher, leadingMatcher, - trailingMatcher, matcher, cascadingMatcher, } from "../util/nodeMatchers"; From 86ad0fe6ebf049f56e2f7e52c222315d2588b0b8 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 19 Nov 2023 01:23:20 +0100 Subject: [PATCH 11/20] migrate callee --- .../cursorless-engine/src/languages/java.ts | 22 ++----------------- .../recorded/languages/java/changeCallee.yml | 6 ++--- .../recorded/languages/java/changeCallee3.yml | 6 ++--- queries/java.scm | 21 ++++++++++++++++++ 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/packages/cursorless-engine/src/languages/java.ts b/packages/cursorless-engine/src/languages/java.ts index 5f2c64f6f9..8439cd8b9c 100644 --- a/packages/cursorless-engine/src/languages/java.ts +++ b/packages/cursorless-engine/src/languages/java.ts @@ -1,33 +1,15 @@ import { - createPatternMatchers, argumentMatcher, + createPatternMatchers, leadingMatcher, - matcher, - cascadingMatcher, } from "../util/nodeMatchers"; -import { childRangeSelector } from "../util/nodeSelectors"; -import { patternFinder } from "../util/nodeFinders"; -import { NodeMatcherAlternative } from "../typings/Types"; import { SimpleScopeTypeType } from "@cursorless/common"; +import { NodeMatcherAlternative } from "../typings/Types"; const nodeMatchers: Partial< Record > = { - functionCallee: cascadingMatcher( - matcher( - patternFinder("method_invocation"), - childRangeSelector(["argument_list"], []), - ), - matcher( - patternFinder("object_creation_expression"), - childRangeSelector(["argument_list"], []), - ), - matcher( - patternFinder("explicit_constructor_invocation"), - childRangeSelector(["argument_list", ";"], []), - ), - ), value: leadingMatcher( [ "*[declarator][value]", diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee.yml index 7d66f2ad85..1ad63c3f09 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee.yml @@ -13,7 +13,7 @@ initialState: active: {line: 0, character: 9} marks: {} finalState: - documentContents: new ().bar(); + documentContents: ().bar(); selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee3.yml index 2e515f2352..7956b3cba9 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee3.yml @@ -13,7 +13,7 @@ initialState: active: {line: 0, character: 12} marks: {} finalState: - documentContents: new (); + documentContents: (); selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} diff --git a/queries/java.scm b/queries/java.scm index 13cb02629a..52855881cd 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -244,3 +244,24 @@ (method_declaration type: (_) @type ) @_.domain + +;;!! new test() +;;! ^^^^^^^^ +;;! ---------- +(object_creation_expression + (argument_list) @functionCallee.end.startOf +) @functionCallee.start.startOf @_.domain + +;;!! new test().bar(); +;;! ^^^^^^^^^^^^^^ +;;! ---------------- +(method_invocation + (argument_list) @functionCallee.end.startOf +) @functionCallee.start.startOf @_.domain + +;;!! super(); +;;! ^^^^^ +;;! ------- +(explicit_constructor_invocation + (argument_list) @functionCallee.end.startOf +) @functionCallee.start.startOf @_.domain From 023925a8f6d0fc76efc15337db5bb10c9592ddcb Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 19 Nov 2023 01:25:53 +0100 Subject: [PATCH 12/20] Update comments --- queries/java.scm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/queries/java.scm b/queries/java.scm index 52855881cd..a703128355 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -83,6 +83,12 @@ ) ) +;;!! foo(1); +;;! ^^^^^^ +;;!! new Foo(1); +;;! ^^^^^^^^^^ +;;!! super(1); +;;! ^^^^^^^^ [ (method_invocation) (object_creation_expression) From 96b331f89bb13ea790aca8a0b25cc3b761d4d011 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 19 Nov 2023 02:08:39 +0100 Subject: [PATCH 13/20] migrate value --- .../cursorless-engine/src/languages/java.ts | 15 +----- .../recorded/languages/java/changeType6.yml | 29 ++++++++++ .../recorded/languages/java/chuckValue2.yml | 31 +++++++++++ .../java/{takeName.yml => clearName2.yml} | 12 ++--- .../java/{takeValue.yml => clearValue4.yml} | 8 +-- .../recorded/languages/java/takeName3.yml | 16 +++--- queries/java.scm | 53 +++++++++++++++---- 7 files changed, 120 insertions(+), 44 deletions(-) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType6.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue2.yml rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{takeName.yml => clearName2.yml} (73%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{takeValue.yml => clearValue4.yml} (76%) diff --git a/packages/cursorless-engine/src/languages/java.ts b/packages/cursorless-engine/src/languages/java.ts index 8439cd8b9c..990ce65bba 100644 --- a/packages/cursorless-engine/src/languages/java.ts +++ b/packages/cursorless-engine/src/languages/java.ts @@ -1,8 +1,4 @@ -import { - argumentMatcher, - createPatternMatchers, - leadingMatcher, -} from "../util/nodeMatchers"; +import { argumentMatcher, createPatternMatchers } from "../util/nodeMatchers"; import { SimpleScopeTypeType } from "@cursorless/common"; import { NodeMatcherAlternative } from "../typings/Types"; @@ -10,15 +6,6 @@ import { NodeMatcherAlternative } from "../typings/Types"; const nodeMatchers: Partial< Record > = { - value: leadingMatcher( - [ - "*[declarator][value]", - "assignment_expression[right]", - "return_statement[0]", - "*[value]", - ], - ["=", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "<<=", ">>="], - ), argumentOrParameter: argumentMatcher("formal_parameters", "argument_list"), }; diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType6.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType6.yml new file mode 100644 index 0000000000..49640ab55d --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType6.yml @@ -0,0 +1,29 @@ +languageId: java +command: + version: 6 + spokenForm: change type + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: type} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + for (final int value : values) { + + } + selections: + - anchor: {line: 1, character: 4} + active: {line: 1, character: 4} + marks: {} +finalState: + documentContents: |- + for (final value : values) { + + } + selections: + - anchor: {line: 0, character: 11} + active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue2.yml new file mode 100644 index 0000000000..a5c949b7bd --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue2.yml @@ -0,0 +1,31 @@ +languageId: java +command: + version: 6 + spokenForm: chuck value + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: value} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + int value = 1; + value += 1; + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + - anchor: {line: 1, character: 0} + active: {line: 1, character: 0} + marks: {} +finalState: + documentContents: |- + int value; + value; + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + - anchor: {line: 1, character: 0} + active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearName2.yml similarity index 73% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearName2.yml index 0f17e05e6d..5bb4e94779 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearName2.yml @@ -1,14 +1,13 @@ languageId: java command: version: 1 - spokenForm: take name - action: setSelection + spokenForm: change name + action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: name} initialState: documentContents: | - public class MyClass { void myFunk () { @@ -20,12 +19,11 @@ initialState: marks: {} finalState: documentContents: | - public class MyClass { - void myFunk () { + void () { } } selections: - - anchor: {line: 2, character: 9} - active: {line: 2, character: 15} + - anchor: {line: 1, character: 9} + active: {line: 1, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearValue4.yml similarity index 76% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeValue.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearValue4.yml index 32d6b2831a..e470fed5cd 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeValue.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearValue4.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: take value - action: setSelection + spokenForm: change value + action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: value} @@ -17,7 +17,7 @@ initialState: finalState: documentContents: | - String value = "hello world"; + String value = ; selections: - anchor: {line: 1, character: 15} - active: {line: 1, character: 28} + active: {line: 1, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName3.yml index 2a80fabb69..646aa3873b 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName3.yml @@ -1,23 +1,21 @@ languageId: java command: version: 1 - spokenForm: take name - action: setSelection + spokenForm: change name + action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: name} initialState: documentContents: | - String value = "hello world"; selections: - - anchor: {line: 1, character: 15} - active: {line: 1, character: 15} + - anchor: {line: 0, character: 15} + active: {line: 0, character: 15} marks: {} finalState: documentContents: | - - String value = "hello world"; + String = "hello world"; selections: - - anchor: {line: 1, character: 7} - active: {line: 1, character: 12} + - anchor: {line: 0, character: 7} + active: {line: 0, character: 7} diff --git a/queries/java.scm b/queries/java.scm index a703128355..8671bf6ab9 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -37,17 +37,17 @@ ] @statement (class_declaration - name: (_) @className -) @class @className.domain + name: (_) @name @className +) @class @_.domain ;;!! void myFunk() {} ;;! ^^^^^^^^^^^^^^^^ (method_declaration - (identifier) @functionName -) @namedFunction @functionName.domain + name: (_) @name @functionName +) @namedFunction @_.domain (constructor_declaration - (identifier) @functionName -) @namedFunction @functionName.domain + name: (_) @name @functionName +) @namedFunction @_.domain ;;!! ((value) -> true) ;;! ^^^^^^^^^^^^^^^ @@ -190,10 +190,6 @@ ;;! ^^^^^^^^^^^^ (ternary_expression) @branch.iteration -(_ - name: (_) @name -) @_.domain - ;;!! void myFunk(int value) {} ;;! ^^^^^ ;;! ------------------------- @@ -271,3 +267,40 @@ (explicit_constructor_invocation (argument_list) @functionCallee.end.startOf ) @functionCallee.start.startOf @_.domain + +;;!! for (int value : values) {} +;;! ^^^^^^ +;;! --------------------------- +(enhanced_for_statement + type: (_) @type + name: (_) @name + value: (_) @value +) @_.domain + +;;!! int value = 1; +;;! ^ +;;! xxxx +;;! -------------- +(local_variable_declaration + (variable_declarator + name: (_) @name @value.removal.start.endOf + value: (_) @value @value.removal.end + ) +) @_.domain + +;;!! value = 1; +;;! ^ +;;! xxxx +;;! ---------- +(assignment_expression + left: (_) @value.removal.start.endOf + right: (_) @value @value.removal.end +) @_.domain + +;;!! return value; +;;! ^^^^^ +;;! ------------- +( + (return_statement) @value @_.domain + (#child-range! @value 1 -2) +) From e27b9f29b2801fe0bce2ad02189bc9b0da35585d Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 19 Nov 2023 19:21:30 +0100 Subject: [PATCH 14/20] Do while --- .../languages/java/changeCondition4.yml | 23 +++++++++++++++++++ queries/java.scm | 5 ++++ 2 files changed, 28 insertions(+) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition4.yml diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition4.yml new file mode 100644 index 0000000000..5d7c1f26b2 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition4.yml @@ -0,0 +1,23 @@ +languageId: java +command: + version: 6 + spokenForm: change condition + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: condition} + usePrePhraseSnapshot: true +initialState: + documentContents: do {} while(true); + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: do {} while(); + selections: + - anchor: {line: 0, character: 12} + active: {line: 0, character: 12} diff --git a/queries/java.scm b/queries/java.scm index 8671bf6ab9..9031bf2858 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -169,6 +169,11 @@ (#child-range! @condition 0 -1 true true) ) @_.domain +(do_statement + condition: (_) @condition + (#child-range! @condition 0 -1 true true) +) @_.domain + ;;!! switch (value) {} ;;! ^^^^^ ;;! ----------------- From df58f04b319720e0fd525c5d433d1d2af090c8b8 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 21 Nov 2023 01:26:23 +0100 Subject: [PATCH 15/20] Update if statement condition --- queries/java.scm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/queries/java.scm b/queries/java.scm index 9031bf2858..b4d8998348 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -128,11 +128,11 @@ ;;! ^^^^^^^^ ( (if_statement - "if" @branch.start @condition.domain.start + "if" @branch.start condition: (_) @condition - consequence: (block) @branch.end @condition.domain.end - ) @dummy - (#not-parent-type? @dummy "if_statement") + consequence: (block) @branch.end + ) @condition.domain + (#not-parent-type? @condition.domain "if_statement") (#child-range! @condition 0 -1 true true) ) From 6cf617eec878fd073a9583a2a164a445c2e06721 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 22 Nov 2023 19:41:28 +0100 Subject: [PATCH 16/20] Include semicolons --- queries/java.scm | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/queries/java.scm b/queries/java.scm index b4d8998348..cc745af7db 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -252,23 +252,29 @@ type: (_) @type ) @_.domain -;;!! new test() +;;!! new test(); ;;! ^^^^^^^^ -;;! ---------- -(object_creation_expression - (argument_list) @functionCallee.end.startOf -) @functionCallee.start.startOf @_.domain +;;! ----------- +(_ + (object_creation_expression + (argument_list) @functionCallee.end.startOf + ) @functionCallee.start.startOf @_.domain.start + ";"? @_.domain.end +) ;;!! new test().bar(); ;;! ^^^^^^^^^^^^^^ -;;! ---------------- -(method_invocation - (argument_list) @functionCallee.end.startOf -) @functionCallee.start.startOf @_.domain +;;! ----------------- +(_ + (method_invocation + (argument_list) @functionCallee.end.startOf + ) @functionCallee.start.startOf @_.domain.start + ";"? @_.domain.end +) ;;!! super(); ;;! ^^^^^ -;;! ------- +;;! -------- (explicit_constructor_invocation (argument_list) @functionCallee.end.startOf ) @functionCallee.start.startOf @_.domain From 05e9094e92f269b9bb71252caa859253ac999305 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 22 Nov 2023 19:52:47 +0100 Subject: [PATCH 17/20] Fixes --- .../recorded/languages/java/chuckValue3.yml | 29 +++++++++++++++++++ queries/java.scm | 26 ++++++++++++----- 2 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue3.yml diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue3.yml new file mode 100644 index 0000000000..45270ba29e --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue3.yml @@ -0,0 +1,29 @@ +languageId: java +command: + version: 6 + spokenForm: chuck value + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: value} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + int a = 2; + } + selections: + - anchor: {line: 1, character: 4} + active: {line: 1, character: 4} + marks: {} +finalState: + documentContents: |- + public class MyClass { + int a; + } + selections: + - anchor: {line: 1, character: 4} + active: {line: 1, character: 4} diff --git a/queries/java.scm b/queries/java.scm index cc745af7db..9cb5f5fb8e 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -207,9 +207,12 @@ ;;!! int value = 0; ;;! ^^^^^ ;;! -------------- -(assignment_expression - left: (_) @name -) @_.domain +(_ + (assignment_expression + left: (_) @name + ) @_.domain.start + ";"? @_.domain.end +) ;;!! Map ;;! ^^^^^^^ ^^^^^^ @@ -298,15 +301,24 @@ value: (_) @value @value.removal.end ) ) @_.domain +(field_declaration + (variable_declarator + name: (_) @name @value.removal.start.endOf + value: (_) @value @value.removal.end + ) +) @_.domain ;;!! value = 1; ;;! ^ ;;! xxxx ;;! ---------- -(assignment_expression - left: (_) @value.removal.start.endOf - right: (_) @value @value.removal.end -) @_.domain +(_ + (assignment_expression + left: (_) @value.removal.start.endOf + right: (_) @value @value.removal.end + ) @_.domain.start + ";"? @_.domain.end +) ;;!! return value; ;;! ^^^^^ From 7c9acc09a7668cdb242def7230aa2d2d2893244a Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 22 Nov 2023 19:58:40 +0100 Subject: [PATCH 18/20] Optional value --- queries/java.scm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/queries/java.scm b/queries/java.scm index 9cb5f5fb8e..90ede31f0e 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -298,13 +298,13 @@ (local_variable_declaration (variable_declarator name: (_) @name @value.removal.start.endOf - value: (_) @value @value.removal.end + value: (_)? @value @value.removal.end ) ) @_.domain (field_declaration (variable_declarator name: (_) @name @value.removal.start.endOf - value: (_) @value @value.removal.end + value: (_)? @value @value.removal.end ) ) @_.domain From 739980158df2d4ebb4ddabb9d0a572166e3b6e0b Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Thu, 23 Nov 2023 03:00:41 +0100 Subject: [PATCH 19/20] Update removal range of if statement --- .../recorded/languages/java/chuckBranch.yml | 46 +++++++++++++++++++ queries/java.scm | 5 +- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckBranch.yml diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckBranch.yml new file mode 100644 index 0000000000..95094db96d --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckBranch.yml @@ -0,0 +1,46 @@ +languageId: java +command: + version: 6 + spokenForm: chuck branch + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: branch} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + public class MyClass { + void myFunk () { + if (true) { + + } + else if (false) { + + } + else { + + } + } + } + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} + marks: {} +finalState: + documentContents: |- + public class MyClass { + void myFunk () { + if (false) { + + } + else { + + } + } + } + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} diff --git a/queries/java.scm b/queries/java.scm index 90ede31f0e..fd24d54ec3 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -128,9 +128,10 @@ ;;! ^^^^^^^^ ( (if_statement - "if" @branch.start + "if" @branch.start @branch.removal.start condition: (_) @condition - consequence: (block) @branch.end + consequence: (block) @branch.end @branch.removal.end + alternative: (if_statement)? @branch.removal.end.startOf ) @condition.domain (#not-parent-type? @condition.domain "if_statement") (#child-range! @condition 0 -1 true true) From 8b8792db18ad3a85b3b6173df49f27453d097134 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sat, 25 Nov 2023 10:58:07 +0100 Subject: [PATCH 20/20] Use leading and trailing --- queries/java.scm | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/queries/java.scm b/queries/java.scm index fd24d54ec3..5f5ed5fea2 100644 --- a/queries/java.scm +++ b/queries/java.scm @@ -205,16 +205,6 @@ ) @_.domain ) @_.iteration -;;!! int value = 0; -;;! ^^^^^ -;;! -------------- -(_ - (assignment_expression - left: (_) @name - ) @_.domain.start - ";"? @_.domain.end -) - ;;!! Map ;;! ^^^^^^^ ^^^^^^ (type_arguments @@ -298,14 +288,14 @@ ;;! -------------- (local_variable_declaration (variable_declarator - name: (_) @name @value.removal.start.endOf - value: (_)? @value @value.removal.end + name: (_) @name @name.trailing.start.endOf @value.leading.start.endOf + value: (_)? @value @name.trailing.end.startOf @value.leading.end.startOf ) ) @_.domain (field_declaration (variable_declarator - name: (_) @name @value.removal.start.endOf - value: (_)? @value @value.removal.end + name: (_) @name @name.trailing.start.endOf @value.leading.start.endOf + value: (_)? @value @name.trailing.end.startOf @value.leading.end.startOf ) ) @_.domain @@ -315,8 +305,8 @@ ;;! ---------- (_ (assignment_expression - left: (_) @value.removal.start.endOf - right: (_) @value @value.removal.end + left: (_) @name @name.trailing.start.endOf @value.leading.start.endOf + right: (_) @value @name.trailing.end.startOf @value.leading.end.startOf ) @_.domain.start ";"? @_.domain.end )