diff --git a/data/playground/lua/lua.lua b/data/playground/lua/lua.lua new file mode 100644 index 0000000000..7673cb7220 --- /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 76f57d6216..618a9b3dc4 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 0000000000..17e2bd8d12 --- /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 0000000000..d55446ad05 --- /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 0000000000..af707cdb31 --- /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 0000000000..ddf39a380b --- /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 0000000000..a8520aa736 --- /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 0000000000..6b3eedecff --- /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 0000000000..a4b799ca7a --- /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 0000000000..61d0b7a0f2 --- /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 0000000000..fea6b7a7d2 --- /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 0000000000..5211c20dba --- /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 0000000000..3682b8b651 --- /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 0000000000..e1d1d4b8c2 --- /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 0000000000..86c83ab5af --- /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 0000000000..06802e045d --- /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 0000000000..849765d0c9 --- /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 0000000000..ad80c87ae4 --- /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 0000000000..f86b34630e --- /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 0000000000..277c830a92 --- /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 0000000000..d453f1ff21 --- /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 0000000000..1906e84703 --- /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 0000000000..59a7975d92 --- /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 0000000000..8af4bd4791 --- /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 0000000000..d5a25add4d --- /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 0000000000..3e0de207f5 --- /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 0000000000..3ec98a9cdc --- /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 0000000000..9ade8e188a --- /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 0000000000..ead7c7d2a4 --- /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 0000000000..8e26cf7f6c --- /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 0000000000..062f8d5390 --- /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 0000000000..d2ebe53dd0 --- /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 0000000000..aede3b01d9 --- /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 0000000000..dcbe2ce46e --- /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 0000000000..78f9721c88 --- /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 0000000000..27f9f6542b --- /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 0000000000..2b37895abf --- /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 0000000000..773ad85061 --- /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 0000000000..9b415c190b --- /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 0000000000..d9c7b87b81 --- /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 0000000000..5c17921b12 --- /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 0000000000..7d796ad01e --- /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 0000000000..bd70cdc83d --- /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 0000000000..9bd9b6ba0e --- /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 0000000000..25c9d49f2a --- /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 0000000000..20e001180e --- /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 0000000000..d922c928de --- /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 0000000000..cbb86ec2a4 --- /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 0000000000..b74dbc1331 --- /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 0000000000..0636e4e0dc --- /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 0000000000..a869646a86 --- /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 0000000000..6c167887b4 --- /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 0000000000..925e70be86 --- /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 0000000000..82d413e820 --- /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