From aa768597e66990f4799e60324147e87a48c3adb3 Mon Sep 17 00:00:00 2001 From: Aaron Adams Date: Wed, 20 Mar 2024 01:26:38 +0800 Subject: [PATCH] Initial lua support (#1962) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What Adds support for the `lua` programming language ## Checklist - [x] Recorded tests for the new language - [x] Used `"change"` / `"clear"` instead of` "take"` for selection tests to make recorded tests easier to read - [x] Added a few specific tests that use `"chuck"` instead of `"change"` to test removal behaviour when it's interesting, especially: - [x] `"chuck arg"` with single argument in list - [x] `"chuck arg"` with multiple arguments in list - [x] `"chuck item"` with single argument in list - [x] `"chuck item"` with multiple arguments in list - [x] Added `@textFragment` captures. Usually you want to put these on comment and string nodes. This enables `"take round"` to work within comments and strings. - [x] Added a test for `"change round"` inside a string, eg `"hello (there)"` - [-] Supported` "type"` both for type annotations (eg `foo: string`) and declarations (eg `interface Foo {}`) (and added tests for this behaviour 😊) - [x] Supported` "item"` both for map pairs and list entries (with tests of course) ## Scope Support | Supported | Tested | Term | Capture | Definition | Comment | | - | - | - | - | - | - | | ✓ | ✓ | `list` | `@list` | List type equivalent | - | | ✓ | ✓ | `inside list` | `@list.interior` | Inside of a list | - | | ✓ | ✓ | `map` | `@map` | Dictionary type equivalent | - | | ✓ | ✓ | `inside map` | `@map.interior` | Inside of a dictionary | - | | ✓ | ✓ | `key` | `@collectionKey` | Dictionary key equivalent | - | | ✓ | ✓ | `funk` | `@namedFunction` | A named function declaration | - | | ✓ | ✓ | `inside funk` | `@namedFunction.interior` | The inside of a lambda declaration | - | | ✓ | ✓ | `funk name` | `@functionName` | Name of declared function | - | | ✓ | ✓ | `lambda` | `@anonymousFunction` | A lambda declaration | - | | ✓ | ✓ | `inside lambda` | `@anonymousFunction.interior` | The inside of a lambda declaration | - | | ✓ | ✓ | `name` | `@name` | Variable name | - | | ✓ | ✓ | `value` | `@value` | Right-hand-side value of an assignment | - | | ✓ | ✓ | `value` | `@value` | Value returned from a function | - | | ✓ | ✓ | `value` | `@value` | Value of a key-value pair | - | | ✓ | ✓ | `state` | `@statement` | Any single coded statement | - | | ✓ | ✓ | `if state` | `@ifStatement` | An if conditional block | - | | ✓ | ✓ | `condition` | `@condition` | Condition of an if block | - | | ✓ | ✓ | `condition` | `@condition` | Condition of a while loop | - | | ✓ | ✓ | `condition` | `@condition` | Condition of a do while style loop | - | | - | - | `condition` | `@condition` | Condition of a for loop | - | | ✓ | ✓ | `condition` | `@condition` | Condition of a ternary expression | - | | ✓ | ✓ | `branch` | `@branch` | The resulting code associated with a conditional expression | - | | ✓ | ✓ | `comment` | `@comment` | Code comment | - | | ✓ | ✓ | `string` | `@string` | Single line strings | - | | ✗ | ✗ | `string` | `@string` | Multi-line strings | https://github.com/cursorless-dev/cursorless/pull/1962#issuecomment-1783674916 | | ✓ | ✓ | - | `@textFragment` | Used to capture string-type nodes (strings and comments) | - | | ✓ | ✓ | `call` | `@functionCall` | A function call (not a function definition) | - | | ✓ | ✓ | `callee` | `@functionCallee` | Name of the function being called | - | | ✓ | ✓ | `arg` | `@argumentOrParameter` | Arguments to functions and calls | - | | _ | _ | `class` | `@class` | Class or structure declaration | - | | _ | _ | `inside class` | `@class.interior` | The inside of a class declaration | - | | _ | _ | `class name` | `@className` | Name of class or structure declaration | - | | _ | _ | `type` | `@type` | Type declarations | - | --------- Co-authored-by: fidgetingbits Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com> --- data/playground/lua/lua.lua | 131 ++++++++ .../getLanguageScopeSupport.ts | 3 + packages/common/src/scopeSupportFacets/lua.ts | 21 ++ .../languages/lua/bringArgAirAfterBat.yml | 50 +++ .../recorded/languages/lua/changeArg.yml | 29 ++ .../recorded/languages/lua/changeArg2.yml | 25 ++ .../recorded/languages/lua/changeCall.yml | 25 ++ .../recorded/languages/lua/changeComment.yml | 25 ++ .../recorded/languages/lua/changeComment2.yml | 27 ++ .../languages/lua/changeCondition.yml | 23 ++ .../languages/lua/changeCondition2.yml | 33 ++ .../languages/lua/changeCondition3.yml | 33 ++ .../recorded/languages/lua/changeFunkName.yml | 29 ++ .../recorded/languages/lua/changeIfState.yml | 30 ++ .../languages/lua/changeInsideLambda.yml | 37 +++ .../languages/lua/changeInsideList.yml | 26 ++ .../recorded/languages/lua/changeItem.yml | 23 ++ .../recorded/languages/lua/changeKey.yml | 41 +++ .../recorded/languages/lua/changeLambda.yml | 34 ++ .../recorded/languages/lua/changeList.yml | 41 +++ .../recorded/languages/lua/changeMap.yml | 19 ++ .../recorded/languages/lua/changeName.yml | 23 ++ .../recorded/languages/lua/changeName2.yml | 23 ++ .../recorded/languages/lua/changeRound.yml | 25 ++ .../recorded/languages/lua/changeState.yml | 25 ++ .../recorded/languages/lua/changeState2.yml | 37 +++ .../recorded/languages/lua/changeState3.yml | 34 ++ .../recorded/languages/lua/changeState4.yml | 37 +++ .../recorded/languages/lua/changeString.yml | 25 ++ .../recorded/languages/lua/changeValue.yml | 23 ++ .../recorded/languages/lua/changeValue2.yml | 38 +++ .../recorded/languages/lua/changeValue3.yml | 41 +++ .../recorded/languages/lua/changeValue4.yml | 34 ++ .../recorded/languages/lua/changeValue5.yml | 23 ++ .../recorded/languages/lua/chuckArg.yml | 37 +++ .../recorded/languages/lua/chuckArg2.yml | 37 +++ .../recorded/languages/lua/chuckItem.yml | 23 ++ .../recorded/languages/lua/chuckItem2.yml | 37 +++ .../recorded/languages/lua/chuckItem3.yml | 23 ++ .../recorded/languages/lua/chuckKey.yml | 29 ++ .../recorded/languages/lua/chuckName.yml | 25 ++ .../recorded/languages/lua/chuckName2.yml | 25 ++ .../recorded/languages/lua/chuckName3.yml | 23 ++ .../recorded/languages/lua/chuckName4.yml | 23 ++ .../recorded/languages/lua/chuckValue.yml | 23 ++ .../suite/fixtures/scopes/lua/branch.if.scope | 52 +++ .../fixtures/scopes/lua/functionCallee.scope | 13 + .../src/suite/fixtures/scopes/lua/map.scope | 24 ++ .../fixtures/scopes/lua/name.assignment.scope | 20 ++ .../fixtures/scopes/lua/name.variable.scope | 24 ++ .../fixtures/scopes/lua/namedFunction.scope | 32 ++ .../scopes/lua/value.assignment.scope | 20 ++ .../fixtures/scopes/lua/value.variable.scope | 20 ++ queries/lua.scm | 298 ++++++++++++++++++ 54 files changed, 1901 insertions(+) create mode 100644 data/playground/lua/lua.lua create mode 100644 packages/common/src/scopeSupportFacets/lua.ts create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/bringArgAirAfterBat.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeArg.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeArg2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCall.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeComment.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeComment2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition3.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeFunkName.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeIfState.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeInsideLambda.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeInsideList.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeItem.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeKey.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeLambda.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeList.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeMap.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeName.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeName2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeRound.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState3.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState4.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeString.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue3.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue4.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue5.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckArg.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckArg2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem3.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckKey.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName2.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName3.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName4.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckValue.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/branch.if.scope create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/functionCallee.scope create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/map.scope create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/name.assignment.scope create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/name.variable.scope create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/namedFunction.scope create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/value.assignment.scope create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/value.variable.scope create mode 100644 queries/lua.scm diff --git a/data/playground/lua/lua.lua b/data/playground/lua/lua.lua new file mode 100644 index 000000000..7673cb722 --- /dev/null +++ b/data/playground/lua/lua.lua @@ -0,0 +1,131 @@ +-- This is a single-line comment + +--[[ + This is a multi-line comment. + It spans multiple lines. +--]] + +-- Variables +local a = 42 +local b, c = "Hello", "World" + +-- Data Types +local number = 3.14 +local boolean = true +local string = "Lua is awesome!" +local table = { 1, 2, 3 } +local nilValue = nil + +-- Conditional Constructs +local x = 10 +local y = 20 + +-- if-then-else +if x < y then + print("x is less than y") +elseif x > y then + print("x is greater than y") +else + print("x is equal to y") +end + +-- ternary conditional (short if-then-else) +local max = x > y and x or y +print("The maximum value is: " .. max) + +-- Functions +function add(x, b) + return x + y +end + +local sum = add(5, 7) +print("Sum:", sum) + +-- Tables +local person = { + name = "John", + age = 30, + hobbies = { "reading", "gaming", "programming" }, + address = { + street = "123 Main St", + city = "Example City", + }, +} + +-- String manipulation +local concatString = "Hello " .. "World" + +-- Metatables and metatable operations +local mt = { + __add = function(a, b) + return a + b + end, + __sub = function(a, b) + return a - b + end, +} + +setmetatable(a, mt) + +-- Closures +function makeCounter() + local count = 0 + return function() + count = count + 1 + return count + end +end + +local counter = makeCounter() + +-- Coroutines +local co = coroutine.create(function() + for i = 1, 3 do + print("Coroutine", i) + coroutine.yield() + end +end) + +-- Error handling +local success, result = pcall(function() + error("This is an error") +end) + +if not success then + print("Error:", result) +end + +-- Loop Constructs +-- while loop +local i = 1 +i = 2 +while i <= 5 do + print("While loop iteration: " .. i) + i = i + 1 +end + +-- repeat-until loop +i = 1 +repeat + print("Repeat-Until loop iteration: " .. i) + i = i + 1 +until i > 5 + +-- for loop +for j = 1, 5 do + print("For loop iteration: " .. j) +end + +-- numeric for loop with step +for k = 10, 1, -1 do + print("Numeric for loop with step: " .. k) +end + +-- for-in loop (iterating over a table) +local fruits = { "apple", "banana", "cherry" } +for key, value in pairs(fruits) do + print("For-In loop: " .. key .. " = " .. value) +end + +-- ternary +local max = x > y and x or y diff --git a/packages/common/src/scopeSupportFacets/getLanguageScopeSupport.ts b/packages/common/src/scopeSupportFacets/getLanguageScopeSupport.ts index 76f57d621..618a9b3dc 100644 --- a/packages/common/src/scopeSupportFacets/getLanguageScopeSupport.ts +++ b/packages/common/src/scopeSupportFacets/getLanguageScopeSupport.ts @@ -3,6 +3,7 @@ import { javaScopeSupport } from "./java"; import { javascriptScopeSupport } from "./javascript"; import { jsonScopeSupport } from "./json"; import { pythonScopeSupport } from "./python"; +import { luaScopeSupport } from "./lua"; import { LanguageScopeSupportFacetMap } from "./scopeSupportFacets.types"; import { talonScopeSupport } from "./talon"; import { typescriptScopeSupport } from "./typescript"; @@ -25,6 +26,8 @@ export function getLanguageScopeSupport( return talonScopeSupport; case "typescript": return typescriptScopeSupport; + case "lua": + return luaScopeSupport; } throw Error(`Unsupported language: '${languageId}'`); } diff --git a/packages/common/src/scopeSupportFacets/lua.ts b/packages/common/src/scopeSupportFacets/lua.ts new file mode 100644 index 000000000..17e2bd8d1 --- /dev/null +++ b/packages/common/src/scopeSupportFacets/lua.ts @@ -0,0 +1,21 @@ +/* eslint-disable @typescript-eslint/naming-convention */ + +import { + LanguageScopeSupportFacetMap, + ScopeSupportFacetLevel, +} from "./scopeSupportFacets.types"; + +const { supported, notApplicable } = ScopeSupportFacetLevel; + +export const luaScopeSupport: LanguageScopeSupportFacetMap = { + "key.attribute": notApplicable, + tags: notApplicable, + "name.assignment": supported, + "name.variable": supported, + "value.assignment": supported, + "value.variable": supported, + functionCallee: supported, + map: supported, + "branch.if": supported, + namedFunction: supported, +}; diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/bringArgAirAfterBat.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/bringArgAirAfterBat.yml new file mode 100644 index 000000000..d55446ad0 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/bringArgAirAfterBat.yml @@ -0,0 +1,50 @@ +languageId: lua +command: + version: 6 + spokenForm: bring arg air after bat + action: + name: replaceWithTarget + source: + type: primitive + mark: {type: decoratedSymbol, symbolColor: default, character: a} + modifiers: + - type: containingScope + scopeType: {type: argumentOrParameter} + destination: + type: primitive + insertionMode: after + target: + type: primitive + mark: {type: decoratedSymbol, symbolColor: default, character: b} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function makeCounter(a, b) + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 0, character: 21} + active: {line: 0, character: 21} + marks: + default.a: + start: {line: 0, character: 21} + end: {line: 0, character: 22} + default.b: + start: {line: 0, character: 24} + end: {line: 0, character: 25} +finalState: + documentContents: |- + function makeCounter(a, b, a) + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 0, character: 21} + active: {line: 0, character: 21} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeArg.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeArg.yml new file mode 100644 index 000000000..af707cdb3 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeArg.yml @@ -0,0 +1,29 @@ +languageId: lua +command: + version: 6 + spokenForm: change arg + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: argumentOrParameter} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function add(x, b) + return x + y + end + selections: + - anchor: {line: 0, character: 13} + active: {line: 0, character: 13} + marks: {} +finalState: + documentContents: |- + function add(, b) + return x + y + end + selections: + - anchor: {line: 0, character: 13} + active: {line: 0, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeArg2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeArg2.yml new file mode 100644 index 000000000..ddf39a380 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeArg2.yml @@ -0,0 +1,25 @@ +languageId: lua +command: + version: 6 + spokenForm: change arg + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: argumentOrParameter} + usePrePhraseSnapshot: true +initialState: + documentContents: | + local sum = add(5, 7) + selections: + - anchor: {line: 0, character: 16} + active: {line: 0, character: 16} + marks: {} +finalState: + documentContents: | + local sum = add(, 7) + selections: + - anchor: {line: 0, character: 16} + active: {line: 0, character: 16} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCall.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCall.yml new file mode 100644 index 000000000..a8520aa73 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCall.yml @@ -0,0 +1,25 @@ +languageId: lua +command: + version: 6 + spokenForm: change call + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: functionCall} + usePrePhraseSnapshot: true +initialState: + documentContents: | + print("a is greater than 10") + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: |+ + + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeComment.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeComment.yml new file mode 100644 index 000000000..6b3eedecf --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeComment.yml @@ -0,0 +1,25 @@ +languageId: lua +command: + version: 6 + spokenForm: change comment + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: comment} + usePrePhraseSnapshot: true +initialState: + documentContents: | + -- This is a single-line comment + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: |+ + + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeComment2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeComment2.yml new file mode 100644 index 000000000..a4b799ca7 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeComment2.yml @@ -0,0 +1,27 @@ +languageId: lua +command: + version: 6 + spokenForm: change comment + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: comment} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + --[[ + This is a multi-line comment. + It spans multiple lines. + --]] + selections: + - anchor: {line: 2, character: 4} + active: {line: 2, character: 4} + marks: {} +finalState: + documentContents: "" + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition.yml new file mode 100644 index 000000000..61d0b7a0f --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: change condition + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: condition} + usePrePhraseSnapshot: true +initialState: + documentContents: local max = x > y and x or y + selections: + - anchor: {line: 0, character: 12} + active: {line: 0, character: 12} + marks: {} +finalState: + documentContents: local max = and x or y + selections: + - anchor: {line: 0, character: 12} + active: {line: 0, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition2.yml new file mode 100644 index 000000000..fea6b7a7d --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition2.yml @@ -0,0 +1,33 @@ +languageId: lua +command: + version: 6 + spokenForm: change condition + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: condition} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + local i = 1 + while i <= 5 do + print("While loop iteration: " .. i) + i = i + 1 + end + selections: + - anchor: {line: 1, character: 7} + active: {line: 1, character: 7} + marks: {} +finalState: + documentContents: |- + local i = 1 + while do + print("While loop iteration: " .. i) + i = i + 1 + end + selections: + - anchor: {line: 1, character: 6} + active: {line: 1, character: 6} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition3.yml new file mode 100644 index 000000000..5211c20db --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeCondition3.yml @@ -0,0 +1,33 @@ +languageId: lua +command: + version: 6 + spokenForm: change condition + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: condition} + usePrePhraseSnapshot: true +initialState: + documentContents: | + i = 1 + repeat + print("Repeat-Until loop iteration: " .. i) + i = i + 1 + until i > 5 + selections: + - anchor: {line: 4, character: 6} + active: {line: 4, character: 6} + marks: {} +finalState: + documentContents: | + i = 1 + repeat + print("Repeat-Until loop iteration: " .. i) + i = i + 1 + until + selections: + - anchor: {line: 4, character: 6} + active: {line: 4, character: 6} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeFunkName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeFunkName.yml new file mode 100644 index 000000000..3682b8b65 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeFunkName.yml @@ -0,0 +1,29 @@ +languageId: lua +command: + version: 6 + spokenForm: change funk name + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: functionName} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function add(x, b) + return x + y + end + selections: + - anchor: {line: 1, character: 7} + active: {line: 1, character: 7} + marks: {} +finalState: + documentContents: |- + function (x, b) + return x + y + end + selections: + - anchor: {line: 0, character: 9} + active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeIfState.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeIfState.yml new file mode 100644 index 000000000..e1d1d4b8c --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeIfState.yml @@ -0,0 +1,30 @@ +languageId: lua +command: + version: 6 + spokenForm: change if state + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: ifStatement} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + if a > 10 then + print("a is greater than 10") + elseif a < 10 then + print("a is less than 10") + else + print("a is equal to 10") + end + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: "" + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeInsideLambda.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeInsideLambda.yml new file mode 100644 index 000000000..86c83ab5a --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeInsideLambda.yml @@ -0,0 +1,37 @@ +languageId: lua +command: + version: 6 + spokenForm: change inside lambda + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - {type: interiorOnly} + - type: containingScope + scopeType: {type: anonymousFunction} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function makeCounter() + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 3, character: 19} + active: {line: 3, character: 19} + marks: {} +finalState: + documentContents: |- + function makeCounter() + local count = 0 + return function() + + end + end + selections: + - anchor: {line: 3, character: 8} + active: {line: 3, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeInsideList.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeInsideList.yml new file mode 100644 index 000000000..06802e045 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeInsideList.yml @@ -0,0 +1,26 @@ +languageId: lua +command: + version: 6 + spokenForm: change inside list + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - {type: interiorOnly} + - type: containingScope + scopeType: {type: list} + usePrePhraseSnapshot: true +initialState: + documentContents: | + foo = {"a", "b", "c"}, + selections: + - anchor: {line: 0, character: 9} + active: {line: 0, character: 9} + marks: {} +finalState: + documentContents: | + foo = {}, + selections: + - anchor: {line: 0, character: 7} + active: {line: 0, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeItem.yml new file mode 100644 index 000000000..849765d0c --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeItem.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: change item + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: collectionItem} + usePrePhraseSnapshot: true +initialState: + documentContents: local table = {1, 2, 3} + selections: + - anchor: {line: 0, character: 18} + active: {line: 0, character: 18} + marks: {} +finalState: + documentContents: local table = {1, , 3} + selections: + - anchor: {line: 0, character: 18} + active: {line: 0, character: 18} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeKey.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeKey.yml new file mode 100644 index 000000000..ad80c87ae --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeKey.yml @@ -0,0 +1,41 @@ +languageId: lua +command: + version: 6 + spokenForm: change key + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: collectionKey} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + local person = { + name = "John", + age = 30, + hobbies = {"reading", "gaming", "programming"}, + address = { + street = "123 Main St", + city = "Example City" + } + } + selections: + - anchor: {line: 2, character: 6} + active: {line: 2, character: 6} + marks: {} +finalState: + documentContents: |- + local person = { + name = "John", + = 30, + hobbies = {"reading", "gaming", "programming"}, + address = { + street = "123 Main St", + city = "Example City" + } + } + selections: + - anchor: {line: 2, character: 4} + active: {line: 2, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeLambda.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeLambda.yml new file mode 100644 index 000000000..f86b34630 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeLambda.yml @@ -0,0 +1,34 @@ +languageId: lua +command: + version: 6 + spokenForm: change lambda + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: anonymousFunction} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function makeCounter() + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 3, character: 12} + active: {line: 3, character: 12} + marks: {} +finalState: + documentContents: |- + function makeCounter() + local count = 0 + return + end + selections: + - anchor: {line: 2, character: 11} + active: {line: 2, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeList.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeList.yml new file mode 100644 index 000000000..277c830a9 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeList.yml @@ -0,0 +1,41 @@ +languageId: lua +command: + version: 6 + spokenForm: change list + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: list} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + local person = { + name = "John", + age = 30, + hobbies = {"reading", "gaming", "programming"}, + address = { + street = "123 Main St", + city = "Example City" + } + } + selections: + - anchor: {line: 3, character: 17} + active: {line: 3, character: 17} + marks: {} +finalState: + documentContents: |- + local person = { + name = "John", + age = 30, + hobbies = , + address = { + street = "123 Main St", + city = "Example City" + } + } + selections: + - anchor: {line: 3, character: 14} + active: {line: 3, character: 14} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeMap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeMap.yml new file mode 100644 index 000000000..d453f1ff2 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeMap.yml @@ -0,0 +1,19 @@ +languageId: lua +command: + version: 6 + spokenForm: change map + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: map} + usePrePhraseSnapshot: true +initialState: + documentContents: local table = {1, 2, 3} + selections: + - anchor: {line: 0, character: 18} + active: {line: 0, character: 18} + marks: {} +thrownError: {name: NoContainingScopeError} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeName.yml new file mode 100644 index 000000000..1906e8470 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeName.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: change name + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: name} + usePrePhraseSnapshot: true +initialState: + documentContents: local a = 42 + selections: + - anchor: {line: 0, character: 12} + active: {line: 0, character: 12} + marks: {} +finalState: + documentContents: local = 42 + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeName2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeName2.yml new file mode 100644 index 000000000..59a7975d9 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeName2.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: change name + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: name} + usePrePhraseSnapshot: true +initialState: + documentContents: local i = 1 + selections: + - anchor: {line: 0, character: 2} + active: {line: 0, character: 2} + marks: {} +finalState: + documentContents: local = 1 + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeRound.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeRound.yml new file mode 100644 index 000000000..8af4bd479 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeRound.yml @@ -0,0 +1,25 @@ +languageId: lua +command: + version: 6 + spokenForm: change round + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: surroundingPair, delimiter: parentheses} + usePrePhraseSnapshot: true +initialState: + documentContents: | + local string = "Lua is (awesome)!" + selections: + - anchor: {line: 0, character: 30} + active: {line: 0, character: 30} + marks: {} +finalState: + documentContents: | + local string = "Lua is !" + selections: + - anchor: {line: 0, character: 23} + active: {line: 0, character: 23} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState.yml new file mode 100644 index 000000000..d5a25add4 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState.yml @@ -0,0 +1,25 @@ +languageId: lua +command: + version: 6 + spokenForm: change state + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: statement} + usePrePhraseSnapshot: true +initialState: + documentContents: | + local sum = add(5, 7) + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} + marks: {} +finalState: + documentContents: |+ + + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState2.yml new file mode 100644 index 000000000..3e0de207f --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState2.yml @@ -0,0 +1,37 @@ +languageId: lua +command: + version: 6 + spokenForm: change state + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: statement} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function makeCounter() + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 1, character: 12} + active: {line: 1, character: 12} + marks: {} +finalState: + documentContents: |- + function makeCounter() + + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 1, character: 4} + active: {line: 1, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState3.yml new file mode 100644 index 000000000..3ec98a9cd --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState3.yml @@ -0,0 +1,34 @@ +languageId: lua +command: + version: 6 + spokenForm: change state + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: statement} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function makeCounter() + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} + marks: {} +finalState: + documentContents: |- + function makeCounter() + local count = 0 + + end + selections: + - anchor: {line: 2, character: 4} + active: {line: 2, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState4.yml new file mode 100644 index 000000000..9ade8e188 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeState4.yml @@ -0,0 +1,37 @@ +languageId: lua +command: + version: 6 + spokenForm: change state + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: statement} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function makeCounter() + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 3, character: 11} + active: {line: 3, character: 11} + marks: {} +finalState: + documentContents: |- + function makeCounter() + local count = 0 + return function() + + return count + end + end + selections: + - anchor: {line: 3, character: 8} + active: {line: 3, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeString.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeString.yml new file mode 100644 index 000000000..ead7c7d2a --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeString.yml @@ -0,0 +1,25 @@ +languageId: lua +command: + version: 6 + spokenForm: change string + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: surroundingPair, delimiter: string} + usePrePhraseSnapshot: true +initialState: + documentContents: | + local string = "Lua is awesome!" + selections: + - anchor: {line: 0, character: 19} + active: {line: 0, character: 19} + marks: {} +finalState: + documentContents: | + local string = + selections: + - anchor: {line: 0, character: 15} + active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue.yml new file mode 100644 index 000000000..8e26cf7f6 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: change value + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: value} + usePrePhraseSnapshot: true +initialState: + documentContents: local a = 42 + selections: + - anchor: {line: 0, character: 12} + active: {line: 0, character: 12} + marks: {} +finalState: + documentContents: "local a = " + selections: + - anchor: {line: 0, character: 10} + active: {line: 0, character: 10} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue2.yml new file mode 100644 index 000000000..062f8d539 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue2.yml @@ -0,0 +1,38 @@ +languageId: lua +command: + version: 6 + spokenForm: change value + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: value} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + local person = { + name = "John", + age = 30, + hobbies = {"reading", "gaming", "programming"}, + address = { + street = "123 Main St", + city = "Example City" + } + } + selections: + - anchor: {line: 4, character: 10} + active: {line: 4, character: 10} + marks: {} +finalState: + documentContents: |- + local person = { + name = "John", + age = 30, + hobbies = {"reading", "gaming", "programming"}, + address = + } + selections: + - anchor: {line: 4, character: 14} + active: {line: 4, character: 14} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue3.yml new file mode 100644 index 000000000..d2ebe53dd --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue3.yml @@ -0,0 +1,41 @@ +languageId: lua +command: + version: 6 + spokenForm: change value + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: value} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + local person = { + name = "John", + age = 30, + hobbies = {"reading", "gaming", "programming"}, + address = { + street = "123 Main St", + city = "Example City" + } + } + selections: + - anchor: {line: 5, character: 11} + active: {line: 5, character: 11} + marks: {} +finalState: + documentContents: |- + local person = { + name = "John", + age = 30, + hobbies = {"reading", "gaming", "programming"}, + address = { + street = , + city = "Example City" + } + } + selections: + - anchor: {line: 5, character: 17} + active: {line: 5, character: 17} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue4.yml new file mode 100644 index 000000000..aede3b01d --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue4.yml @@ -0,0 +1,34 @@ +languageId: lua +command: + version: 6 + spokenForm: change value + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: value} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function makeCounter() + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 2, character: 8} + active: {line: 2, character: 8} + marks: {} +finalState: + documentContents: |- + function makeCounter() + local count = 0 + return + end + selections: + - anchor: {line: 2, character: 11} + active: {line: 2, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue5.yml new file mode 100644 index 000000000..dcbe2ce46 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/changeValue5.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: change value + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: value} + usePrePhraseSnapshot: true +initialState: + documentContents: local i = 1 + selections: + - anchor: {line: 0, character: 2} + active: {line: 0, character: 2} + marks: {} +finalState: + documentContents: "local i = " + selections: + - anchor: {line: 0, character: 10} + active: {line: 0, character: 10} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckArg.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckArg.yml new file mode 100644 index 000000000..78f9721c8 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckArg.yml @@ -0,0 +1,37 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck arg + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: argumentOrParameter} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function makeCounter(a, b) + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 0, character: 22} + active: {line: 0, character: 22} + marks: {} +finalState: + documentContents: |- + function makeCounter(b) + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 0, character: 21} + active: {line: 0, character: 21} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckArg2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckArg2.yml new file mode 100644 index 000000000..27f9f6542 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckArg2.yml @@ -0,0 +1,37 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck arg + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: argumentOrParameter} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + function makeCounter(a) + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 0, character: 22} + active: {line: 0, character: 22} + marks: {} +finalState: + documentContents: |- + function makeCounter() + local count = 0 + return function() + count = count + 1 + return count + end + end + selections: + - anchor: {line: 0, character: 21} + active: {line: 0, character: 21} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem.yml new file mode 100644 index 000000000..2b37895ab --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck item + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: collectionItem} + usePrePhraseSnapshot: true +initialState: + documentContents: local table = {1, 2, 3} + selections: + - anchor: {line: 0, character: 18} + active: {line: 0, character: 18} + marks: {} +finalState: + documentContents: local table = {1, 3} + selections: + - anchor: {line: 0, character: 18} + active: {line: 0, character: 18} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem2.yml new file mode 100644 index 000000000..773ad8506 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem2.yml @@ -0,0 +1,37 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck item + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: collectionItem} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + local person = { + name = "John", + age = 30, + hobbies = {"reading", "gaming", "programming"}, + address = { + street = "123 Main St", + city = "Example City" + } + } + selections: + - anchor: {line: 4, character: 6} + active: {line: 4, character: 6} + marks: {} +finalState: + documentContents: |- + local person = { + name = "John", + age = 30, + hobbies = {"reading", "gaming", "programming"} + } + selections: + - anchor: {line: 3, character: 50} + active: {line: 3, character: 50} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem3.yml new file mode 100644 index 000000000..9b415c190 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckItem3.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck item + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: collectionItem} + usePrePhraseSnapshot: true +initialState: + documentContents: hobbies = {"reading"} + selections: + - anchor: {line: 0, character: 19} + active: {line: 0, character: 19} + marks: {} +finalState: + documentContents: hobbies = {} + selections: + - anchor: {line: 0, character: 11} + active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckKey.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckKey.yml new file mode 100644 index 000000000..d9c7b87b8 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckKey.yml @@ -0,0 +1,29 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck key + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: collectionKey} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + local person = { + name = "John", + } + selections: + - anchor: {line: 1, character: 8} + active: {line: 1, character: 8} + marks: {} +finalState: + documentContents: |- + local person = { + "John", + } + selections: + - anchor: {line: 1, character: 4} + active: {line: 1, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName.yml new file mode 100644 index 000000000..5c17921b1 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName.yml @@ -0,0 +1,25 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck name + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: name} + usePrePhraseSnapshot: true +initialState: + documentContents: | + local a = 42 + selections: + - anchor: {line: 0, character: 3} + active: {line: 0, character: 3} + marks: {} +finalState: + documentContents: | + 42 + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName2.yml new file mode 100644 index 000000000..7d796ad01 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName2.yml @@ -0,0 +1,25 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck name + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: name} + usePrePhraseSnapshot: true +initialState: + documentContents: | + a = 42 + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} + marks: {} +finalState: + documentContents: | + 42 + selections: + - anchor: {line: 0, character: 2} + active: {line: 0, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName3.yml new file mode 100644 index 000000000..bd70cdc83 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName3.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck name + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: name} + usePrePhraseSnapshot: true +initialState: + documentContents: local a,b = "Hello", "World" + selections: + - anchor: {line: 0, character: 28} + active: {line: 0, character: 28} + marks: {} +finalState: + documentContents: "\"Hello\", \"World\"" + selections: + - anchor: {line: 0, character: 16} + active: {line: 0, character: 16} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName4.yml new file mode 100644 index 000000000..9bd9b6ba0 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckName4.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck name + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: name} + usePrePhraseSnapshot: true +initialState: + documentContents: a,b = "Hello", "World" + selections: + - anchor: {line: 0, character: 22} + active: {line: 0, character: 22} + marks: {} +finalState: + documentContents: "\"Hello\", \"World\"" + selections: + - anchor: {line: 0, character: 16} + active: {line: 0, character: 16} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckValue.yml new file mode 100644 index 000000000..25c9d49f2 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/lua/chuckValue.yml @@ -0,0 +1,23 @@ +languageId: lua +command: + version: 6 + spokenForm: chuck value + action: + name: remove + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: value} + usePrePhraseSnapshot: true +initialState: + documentContents: local table = {1, 2, 3} + selections: + - anchor: {line: 0, character: 23} + active: {line: 0, character: 23} + marks: {} +finalState: + documentContents: local table + selections: + - anchor: {line: 0, character: 11} + active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/branch.if.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/branch.if.scope new file mode 100644 index 000000000..20e001180 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/branch.if.scope @@ -0,0 +1,52 @@ +if x < y then + print("x is less than y") +elseif x > y then + print("x is greater than y") +else + print("x is equal to y") +end +--- + +[#1 Content] = +[#1 Removal] = +[#1 Domain] = 0:0-1:29 + >------------- +0| if x < y then +1| print("x is less than y") + -----------------------------< + +[#1 Interior] = 1:4-1:29 + >-------------------------< +1| print("x is less than y") + +[#1 Insertion delimiter] = "\n" + + +[#2 Content] = +[#2 Removal] = +[#2 Domain] = 2:0-3:32 + >----------------- +2| elseif x > y then +3| print("x is greater than y") + --------------------------------< + +[#2 Interior] = 3:4-3:32 + >----------------------------< +3| print("x is greater than y") + +[#2 Insertion delimiter] = "\n" + + +[#3 Content] = +[#3 Removal] = +[#3 Domain] = 4:0-5:28 + >---- +4| else +5| print("x is equal to y") + ----------------------------< + +[#3 Interior] = 5:4-5:28 + >------------------------< +5| print("x is equal to y") + +[#3 Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/functionCallee.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/functionCallee.scope new file mode 100644 index 000000000..d922c928d --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/functionCallee.scope @@ -0,0 +1,13 @@ +print("a is greater than 10") +--- + +[Content] = +[Removal] = 0:0-0:5 + >-----< +0| print("a is greater than 10") + +[Domain] = 0:0-0:29 + >-----------------------------< +0| print("a is greater than 10") + +[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/map.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/map.scope new file mode 100644 index 000000000..cbb86ec2a --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/map.scope @@ -0,0 +1,24 @@ +foo = { bar = "a", baz = "b" } +--- + +[Content] = +[Domain] = 0:6-0:30 + >------------------------< +0| foo = { bar = "a", baz = "b" } + +[Removal] = 0:5-0:30 + >-------------------------< +0| foo = { bar = "a", baz = "b" } + +[Leading delimiter] = 0:5-0:6 + >-< +0| foo = { bar = "a", baz = "b" } + +[Interior: Content] = 0:8-0:28 + >--------------------< +0| foo = { bar = "a", baz = "b" } +[Interior: Removal] = 0:7-0:29 + >----------------------< +0| foo = { bar = "a", baz = "b" } + +[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/name.assignment.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/name.assignment.scope new file mode 100644 index 000000000..b74dbc133 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/name.assignment.scope @@ -0,0 +1,20 @@ +a, b = 1, 2 +--- + +[Content] = 0:0-0:4 + >----< +0| a, b = 1, 2 + +[Removal] = 0:0-0:7 + >-------< +0| a, b = 1, 2 + +[Trailing delimiter] = 0:4-0:7 + >---< +0| a, b = 1, 2 + +[Domain] = 0:0-0:11 + >-----------< +0| a, b = 1, 2 + +[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/name.variable.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/name.variable.scope new file mode 100644 index 000000000..0636e4e0d --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/name.variable.scope @@ -0,0 +1,24 @@ +local a, b = 1, 2 +--- + +[Content] = 0:6-0:10 + >----< +0| local a, b = 1, 2 + +[Removal] = 0:0-0:13 + >-------------< +0| local a, b = 1, 2 + +[Leading delimiter] = 0:5-0:6 + >-< +0| local a, b = 1, 2 + +[Trailing delimiter] = 0:10-0:11 + >-< +0| local a, b = 1, 2 + +[Domain] = 0:0-0:17 + >-----------------< +0| local a, b = 1, 2 + +[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/namedFunction.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/namedFunction.scope new file mode 100644 index 000000000..a869646a8 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/namedFunction.scope @@ -0,0 +1,32 @@ +function makeCounter() + local count = 0 + return function() + count = count + 1 + return count + end +end +--- + +[Content] = +[Removal] = +[Domain] = 0:0-6:3 + >---------------------- +0| function makeCounter() +1| local count = 0 +2| return function() +3| count = count + 1 +4| return count +5| end +6| end + ---< + +[Interior] = 1:4-5:7 + >--------------- +1| local count = 0 +2| return function() +3| count = count + 1 +4| return count +5| end + -------< + +[Insertion delimiter] = "\n\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/value.assignment.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/value.assignment.scope new file mode 100644 index 000000000..6c167887b --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/value.assignment.scope @@ -0,0 +1,20 @@ +a, b = 1, 2 +--- + +[Content] = 0:7-0:11 + >----< +0| a, b = 1, 2 + +[Removal] = 0:4-0:11 + >-------< +0| a, b = 1, 2 + +[Leading delimiter] = 0:4-0:7 + >---< +0| a, b = 1, 2 + +[Domain] = 0:0-0:11 + >-----------< +0| a, b = 1, 2 + +[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/value.variable.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/value.variable.scope new file mode 100644 index 000000000..925e70be8 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/lua/value.variable.scope @@ -0,0 +1,20 @@ +local a, b = 1, 2 +--- + +[Content] = 0:13-0:17 + >----< +0| local a, b = 1, 2 + +[Removal] = 0:10-0:17 + >-------< +0| local a, b = 1, 2 + +[Leading delimiter] = 0:10-0:13 + >---< +0| local a, b = 1, 2 + +[Domain] = 0:0-0:17 + >-----------------< +0| local a, b = 1, 2 + +[Insertion delimiter] = " " diff --git a/queries/lua.scm b/queries/lua.scm new file mode 100644 index 000000000..82d413e82 --- /dev/null +++ b/queries/lua.scm @@ -0,0 +1,298 @@ +;; Statements +[ + (variable_declaration) + (break_statement) + (do_statement) + (empty_statement) + (for_statement) + (goto_statement) + (if_statement) + (label_statement) + (repeat_statement) + (return_statement) + (while_statement) +] @statement + +;; Only treat function declarions and calls as statements if they +;; aren't part of assignments, etc +( + [ + (function_declaration) + (function_call) + ] @statement + (#not-parent-type? @statement expression_list) +) +[ + (block) + (chunk) +] @statement.iteration @namedFunction.iteration @functionCall.iteration + +;; Duplicate above due to 3 label node limit +[ + (block) + (chunk) +] @ifStatement.iteration @value.iteration @name.iteration + +;; Capture assignment only if without variable prefix +;;!! count = count + 1 +;;! ^^^^^^^^^^^^^^^^^ +( + (assignment_statement) @statement + (#not-parent-type? @statement variable_declaration) +) + +;; Conditionals +;;!! if x < y then +;;! ---^^^^^----- +;;! ---xxxxxx---- +;;!! end +;;! --- +(if_statement + _ @condition.domain.start.startOf + condition: (_) @condition + consequence: (_) + !alternative + "end" @condition.domain.end.endOf +) + +;;!! if x < y then +;;! ---^^^^^----- +;;! ---xxxxxx---- +;;!! elseif x < y then +(if_statement + _ @_.domain.start.startOf + condition: (_) @condition + consequence: (_) @_.domain.end.endOf + alternative: (_) +) + +;;!! elseif x < y then +;;! -------^^^^^----- +;;! -------xxxxxx---- +(elseif_statement + condition: (_) @condition +) @_.domain + +;;!! +(if_statement + "if" @branch.start + consequence: (_) @branch.end @branch.interior +) @ifStatement @branch.iteration @condition.iteration + +;;!! if x < y then +;;!! print("x smaller") +;;!! else +;;! ^^^^ +;;!! print("x bigger") +;;! ^^^^^^^^^^^^^^^^^ +;;!! end +[ + (elseif_statement + consequence: (_) @branch.interior + ) + (else_statement + body: (_) @branch.interior + ) +] @branch @_.domain + +;;!! while i <= 5 do +;;! ^^^^^^ +;;! xxxxxx +(while_statement + condition: (_) @condition +) @_.domain + +;;!! repeat +;;!! ... +;;!! until i > 5 +;;! ^^^^^ +;;! xxxxx +(repeat_statement + condition: (_) @condition +) @_.domain + +;; Lists and maps +(table_constructor + "{" @_.interior.start.endOf @value.iteration.start.endOf @collectionKey.iteration.start.endOf + (field + name: (_) + ) + "}" @_.interior.end.startOf @value.iteration.end.startOf @collectionKey.iteration.end.startOf +) @map +;;!! a = { foo = "bar" } +;;! ^^^-------- +;;! xxxxxx----- +;;!! a = { foo = "bar" } +;;! ------^^^^^ +;;! ---xxxxxxxx +(field + name: (_) @collectionKey @value.leading.endOf + value: (_) @value @collectionKey.trailing.startOf +) @_.domain + +;; In lua everything is a map, but a map that omits keys for entries +;; is similar enough to a list to warrant having that scope. +;;!! a = { "1", "2", "3" } +;;! ^^^^^^^^^^^^^^^^^ +(table_constructor + "{" @_.interior.start.endOf + (field + !name + ) + "}" @_.interior.end.startOf +) @list + +;; Strings + +(comment) @comment @textFragment +(string) @string +(string_content) @textFragment + +;; Functions + +;; callee: +;;!! local sum = add(5, 7) +;;! ^^^------ +;; call: +;;!! local sum = add(5, 7) +;;! ^^^^^^^^^ +(function_call + name: (_) @functionCallee +) @_.domain @functionCall + +;;!!local sum = add(5, 7) +;;! ^--- +;;! xxx- +( + (arguments + (_)? @_.leading.endOf + . + (_) @argumentOrParameter + . + (_)? @_.trailing.startOf + ) @_dummy + (#single-or-multi-line-delimiter! @argumentOrParameter @_dummy ", " ",\n") +) + +;;!!local sum = add(5, 7) +;;! **** +(arguments + "(" @argumentOrParameter.iteration.start.endOf + ")" @argumentOrParameter.iteration.end.startOf +) + +;;!!function add(5, 7) +;;! ^--- +;;! xxx- +( + (parameters + (_)? @_.leading.endOf + . + (_) @argumentOrParameter + . + (_)? @_.trailing.startOf + ) @_dummy + (#single-or-multi-line-delimiter! @argumentOrParameter @_dummy ", " ",\n") +) + +;;!!function add(5, 7) +;;! **** +(parameters + "(" @argumentOrParameter.iteration.start.endOf + ")" @argumentOrParameter.iteration.end.startOf +) + +;; funk name: +;;!! function add(x, b) return x + y end +;;! ---------^^^----------------------- +;; inside funk: +;;!! function add(x, b) return x + y end +;;! -------------------^^^^^^^^^^^^---- +;;! funk: +;;!! function add(x, b) return x + y end +;;! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +(function_declaration + name: (_) @functionName + body: (_)? @namedFunction.interior +) @functionName.domain @namedFunction + +;; inside lambda: +;;!! __add = function(a, b) return a + b end +;;! ---------------^^^^^^^^^^^^---- +;; lambda: +;;!! __add = function(a, b) return a + b end +;;! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +(function_definition + !name + body: (_)? @_.interior +) @anonymousFunction + +;; Names and values + +;; Handle variable assignments +;;!! a = 42 +;;! ^----- +;;! xxxx-- +( + (assignment_statement + (variable_list) @name + (_) @_.trailing.startOf + ) @_dummy @_.domain + (#not-parent-type? @_dummy variable_declaration) +) +;; Handle variable declarations +;;!! local a = 42 +;;! ------^----- +;;! xxxxxxxxxx-- +local_declaration: (variable_declaration + (assignment_statement + (variable_list) @name + (_) @_.removal.end.startOf + ) +) @_.domain @_.removal.start.startOf + +;; Handle assignment values +;;!! a = 42 +;;! ----^^ +;;! -xxxxx +( + (assignment_statement + (_) @_.leading.endOf + (expression_list) @value + ) @_dummy @_.domain + (#not-parent-type? @_dummy variable_declaration) +) + +;; Handle variable declaration values +;;!! local a = 42 +;;! ----------^^ +;;! -------xxxxx +local_declaration: (variable_declaration + (assignment_statement + (_) @_.leading.endOf + (expression_list) @value + ) +) @_.domain + +;;!! return a + b +;;! -------^^^^^ +;;! ------xxxxxx +(return_statement + (_) @value +) @_.domain + +;; match a ternary condition +;;!! local max = x > y and x or y +;;! ^^^^^ +;;! xxxxx +(binary_expression + left: (binary_expression + left: (binary_expression) @condition + . + "and" + ) +) + +;; Structures and object access + +;; (method_index_expression) @private.fieldAccess