From 8dd40cf16e08d38bbe409a3eab053f9d83fae3fa Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Fri, 15 Oct 2021 12:51:29 +0100 Subject: [PATCH 01/35] Initial working version --- src/actions/Wrap.ts | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/actions/Wrap.ts b/src/actions/Wrap.ts index cdf26f22da..da9d818265 100644 --- a/src/actions/Wrap.ts +++ b/src/actions/Wrap.ts @@ -1,4 +1,4 @@ -import { Selection } from "vscode"; +import { Selection, SnippetString } from "vscode"; import { flatten } from "lodash"; import { Action, @@ -8,19 +8,54 @@ import { SelectionWithEditor, TypedSelection, } from "../typings/Types"; -import { runOnTargetsForEachEditor } from "../util/targetUtils"; +import { + ensureSingleEditor, + runOnTargetsForEachEditor, +} from "../util/targetUtils"; import { decorationSleep } from "../util/editDisplayUtils"; import { performEditsAndUpdateSelections } from "../util/updateSelections"; import { selectionWithEditorFromPositions } from "../util/selectionUtils"; export default class Wrap implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + targetPreferences: ActionPreferences[] = [ + { insideOutsideType: "inside", selectionType: "line" }, + ]; constructor(private graph: Graph) { this.run = this.run.bind(this); } async run( + [targets]: [TypedSelection[]], + leftOrSnippetName: string, + right?: string + ): Promise { + if (right != null) { + return this.handlePairedDelimiter([targets], leftOrSnippetName, right); + } else { + return this.handleSnippet([targets], leftOrSnippetName); + } + } + + async handleSnippet( + [targets]: [TypedSelection[]], + snippetName: string + ): Promise { + const editor = ensureSingleEditor(targets); + + const snippetString = new SnippetString( + "try {\n\t$TM_SELECTED_TEXT\n} catch ($1) {\n\t$0\n}" + ); + + await editor.insertSnippet( + snippetString, + targets.map((target) => target.selection.selection) + ); + + return {}; + } + + async handlePairedDelimiter( [targets]: [TypedSelection[]], left: string, right: string From 61fc7bc0a3839ec346be98c186d4716d9dc51ac4 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Fri, 15 Oct 2021 15:50:15 +0100 Subject: [PATCH 02/35] Almost done --- src/actions/Wrap.ts | 41 +------------ src/actions/WrapWithSnippet.ts | 61 +++++++++++++++++++ src/actions/index.ts | 2 + src/core/inferFullTargets.ts | 3 +- src/languages/cpp.ts | 22 ++++++- src/languages/csharp.ts | 18 +++++- src/languages/index.ts | 45 +++++++++----- src/languages/java.ts | 22 ++++++- src/languages/python.ts | 22 ++++++- src/languages/typescript.ts | 17 +++++- .../languages/cpp/elseStateWrapThis.yml | 25 ++++++++ .../recorded/languages/cpp/ifElseWrapThis.yml | 25 ++++++++ .../languages/cpp/ifStateWrapThis.yml | 23 +++++++ .../languages/cpp/tryCatchWrapThis.yml | 25 ++++++++ .../languages/cpp/tryCatchWrapThis2.yml | 42 +++++++++++++ .../languages/csharp/elseStateWrapThis.yml | 25 ++++++++ .../languages/csharp/ifElseWrapThis.yml | 25 ++++++++ .../languages/csharp/ifStateWrapThis.yml | 23 +++++++ .../languages/csharp/tryCatchWrapThis.yml | 25 ++++++++ .../languages/csharp/tryCatchWrapThis2.yml | 42 +++++++++++++ .../languages/java/elseStateWrapThis.yml | 25 ++++++++ .../languages/java/ifElseWrapThis.yml | 25 ++++++++ .../languages/java/ifStateWrapThis.yml | 23 +++++++ .../languages/java/tryCatchWrapThis.yml | 25 ++++++++ .../languages/java/tryCatchWrapThis2.yml | 42 +++++++++++++ .../languages/python/elseStateWrapThis.yml | 24 ++++++++ .../languages/python/ifElseWrapThis.yml | 24 ++++++++ .../languages/python/ifStateWrapThis.yml | 22 +++++++ .../languages/python/tryCatchWrapThis.yml | 24 ++++++++ .../languages/python/tryCatchWrapThis2.yml | 38 ++++++++++++ .../fixtures/recorded/languages/script.sh | 4 ++ .../typescript/elseStateWrapThis.yml | 25 ++++++++ .../languages/typescript/ifElseWrapThis.yml | 25 ++++++++ .../languages/typescript/ifStateWrapThis.yml | 23 +++++++ .../languages/typescript/tryCatchWrapThis.yml | 25 ++++++++ .../typescript/tryCatchWrapThis2.yml | 42 +++++++++++++ src/typings/Types.ts | 10 ++- 37 files changed, 896 insertions(+), 63 deletions(-) create mode 100644 src/actions/WrapWithSnippet.ts create mode 100644 src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml create mode 100644 src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml create mode 100644 src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml create mode 100644 src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml create mode 100644 src/test/suite/fixtures/recorded/languages/script.sh create mode 100644 src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml create mode 100644 src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml diff --git a/src/actions/Wrap.ts b/src/actions/Wrap.ts index da9d818265..cdf26f22da 100644 --- a/src/actions/Wrap.ts +++ b/src/actions/Wrap.ts @@ -1,4 +1,4 @@ -import { Selection, SnippetString } from "vscode"; +import { Selection } from "vscode"; import { flatten } from "lodash"; import { Action, @@ -8,54 +8,19 @@ import { SelectionWithEditor, TypedSelection, } from "../typings/Types"; -import { - ensureSingleEditor, - runOnTargetsForEachEditor, -} from "../util/targetUtils"; +import { runOnTargetsForEachEditor } from "../util/targetUtils"; import { decorationSleep } from "../util/editDisplayUtils"; import { performEditsAndUpdateSelections } from "../util/updateSelections"; import { selectionWithEditorFromPositions } from "../util/selectionUtils"; export default class Wrap implements Action { - targetPreferences: ActionPreferences[] = [ - { insideOutsideType: "inside", selectionType: "line" }, - ]; + targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; constructor(private graph: Graph) { this.run = this.run.bind(this); } async run( - [targets]: [TypedSelection[]], - leftOrSnippetName: string, - right?: string - ): Promise { - if (right != null) { - return this.handlePairedDelimiter([targets], leftOrSnippetName, right); - } else { - return this.handleSnippet([targets], leftOrSnippetName); - } - } - - async handleSnippet( - [targets]: [TypedSelection[]], - snippetName: string - ): Promise { - const editor = ensureSingleEditor(targets); - - const snippetString = new SnippetString( - "try {\n\t$TM_SELECTED_TEXT\n} catch ($1) {\n\t$0\n}" - ); - - await editor.insertSnippet( - snippetString, - targets.map((target) => target.selection.selection) - ); - - return {}; - } - - async handlePairedDelimiter( [targets]: [TypedSelection[]], left: string, right: string diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts new file mode 100644 index 0000000000..8e60e110d7 --- /dev/null +++ b/src/actions/WrapWithSnippet.ts @@ -0,0 +1,61 @@ +import { SnippetString } from "vscode"; +import { snippets } from "../languages"; +import { + Action, + ActionPreferences, + ActionReturnValue, + Graph, + SnippetName, + TypedSelection, +} from "../typings/Types"; +import displayPendingEditDecorations from "../util/editDisplayUtils"; +import { ensureSingleEditor } from "../util/targetUtils"; + +export default class WrapWithSnippet implements Action { + targetPreferences: ActionPreferences[] = [ + { + insideOutsideType: "inside", + modifier: { + type: "containingScope", + scopeType: "statement", + includeSiblings: false, + }, + }, + ]; + + constructor(private graph: Graph) { + this.run = this.run.bind(this); + } + + async run( + [targets]: [TypedSelection[]], + snippetName: SnippetName + ): Promise { + const editor = ensureSingleEditor(targets); + + const languageId = editor.document.languageId; + const languageSnippets = snippets[languageId]; + if (languageSnippets == null) { + throw new Error(`Snippets not supported for language ${languageId}`); + } + + const snippetString = languageSnippets[snippetName]; + if (snippetString == null) { + throw new Error( + `Snippet ${snippetName} not supported for language ${languageId}` + ); + } + + await displayPendingEditDecorations( + targets, + this.graph.editStyles.pendingModification0 + ); + + await editor.insertSnippet( + snippetString, + targets.map((target) => target.selection.selection) + ); + + return {}; + } +} diff --git a/src/actions/index.ts b/src/actions/index.ts index 3428a6c159..07659408ec 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -27,6 +27,7 @@ import { CopyLinesUp, CopyLinesDown } from "./CopyLines"; import SetBreakpoint from "./SetBreakpoint"; import { Sort, Reverse } from "./Sort"; import Call from "./Call"; +import WrapWithSnippet from "./WrapWithSnippet"; class Actions implements ActionRecord { constructor(private graph: Graph) {} @@ -66,6 +67,7 @@ class Actions implements ActionRecord { toggleLineComment = new CommentLines(this.graph); unfoldRegion = new Unfold(this.graph); wrapWithPairedDelimiter = new Wrap(this.graph); + wrapWithSnippet = new WrapWithSnippet(this.graph); } export default Actions; diff --git a/src/core/inferFullTargets.ts b/src/core/inferFullTargets.ts index 30bb24821f..663bc47387 100644 --- a/src/core/inferFullTargets.ts +++ b/src/core/inferFullTargets.ts @@ -123,7 +123,8 @@ function inferPrimitiveTarget( actionPreferences.insideOutsideType; const modifier = target.modifier ?? - getPreviousAttribute(previousTargetsForAttributes, "modifier") ?? { + getPreviousAttribute(previousTargetsForAttributes, "modifier") ?? + actionPreferences.modifier ?? { type: "identity", }; diff --git a/src/languages/cpp.ts b/src/languages/cpp.ts index b4d8fb3949..846aac03bc 100644 --- a/src/languages/cpp.ts +++ b/src/languages/cpp.ts @@ -3,7 +3,12 @@ import { argumentMatcher, prefixedMatcher, } from "../util/nodeMatchers"; -import { NodeMatcherAlternative, ScopeType } from "../typings/Types"; +import { + NodeMatcherAlternative, + ScopeType, + SnippetName, +} from "../typings/Types"; +import { SnippetString } from "vscode"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-cpp/master/src/node-types.json | jq '[.[] | select(.type == "compound_statement") | .children.types[].type] + [.[] | select(.type == "_statement") | .subtypes[].type]' @@ -106,4 +111,17 @@ const nodeMatchers: Partial> = { attribute: "attribute", }; -export default createPatternMatchers(nodeMatchers); +export const patternMatchers = createPatternMatchers(nodeMatchers); + +export const snippets: Partial> = { + tryCatchStatement: new SnippetString( + "try {\n\t$TM_SELECTED_TEXT\n} catch ($1) {\n\t$0\n}" + ), + ifStatement: new SnippetString("if ($1) {\n\t$TM_SELECTED_TEXT\n}"), + ifElseStatementIfBranch: new SnippetString( + "if ($1) {\n\t$TM_SELECTED_TEXT\n} else {\n\t$0\n}" + ), + ifElseStatementElseBranch: new SnippetString( + "if ($1) {\n\t$0\n} else {\n\t$TM_SELECTED_TEXT\n}" + ), +}; diff --git a/src/languages/csharp.ts b/src/languages/csharp.ts index 59ccc7440d..51a216cbe2 100644 --- a/src/languages/csharp.ts +++ b/src/languages/csharp.ts @@ -6,13 +6,14 @@ import { matcher, typeMatcher, } from "../util/nodeMatchers"; -import { NodeMatcher, ScopeType } from "../typings/Types"; +import { NodeMatcher, ScopeType, SnippetName } from "../typings/Types"; import { getNameNode } from "../util/treeSitterUtils"; import { nodeFinder, typedNodeFinder } from "../util/nodeFinders"; import { delimitedSelector, selectWithLeadingDelimiter, } from "../util/nodeSelectors"; +import { SnippetString } from "vscode"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-c-sharp/master/src/node-types.json \ @@ -242,4 +243,17 @@ const nodeMatchers: Partial> = { name: matcher(getNameNode), }; -export default createPatternMatchers(nodeMatchers); +export const patternMatchers = createPatternMatchers(nodeMatchers); + +export const snippets: Partial> = { + tryCatchStatement: new SnippetString( + "try {\n\t$TM_SELECTED_TEXT\n} catch ($1) {\n\t$0\n}" + ), + ifStatement: new SnippetString("if ($1) {\n\t$TM_SELECTED_TEXT\n}"), + ifElseStatementIfBranch: new SnippetString( + "if ($1) {\n\t$TM_SELECTED_TEXT\n} else {\n\t$0\n}" + ), + ifElseStatementElseBranch: new SnippetString( + "if ($1) {\n\t$0\n} else {\n\t$TM_SELECTED_TEXT\n}" + ), +}; diff --git a/src/languages/index.ts b/src/languages/index.ts index 64e8fa9723..483ce45dd1 100644 --- a/src/languages/index.ts +++ b/src/languages/index.ts @@ -6,26 +6,43 @@ import { NodeMatcherValue, ScopeType, SelectionWithEditor, + SnippetName, } from "../typings/Types"; -import cpp from "./cpp"; -import csharp from "./csharp"; -import java from "./java"; +import * as cpp from "./cpp"; +import * as csharp from "./csharp"; +import * as java from "./java"; import json from "./json"; -import python from "./python"; -import typescript from "./typescript"; +import * as python from "./python"; +import * as typescript from "./typescript"; +import { SnippetString } from "vscode"; const languageMatchers: Record> = { - c: cpp, - cpp: cpp, - csharp: csharp, - java, - javascript: typescript, - javascriptreact: typescript, + c: cpp.patternMatchers, + cpp: cpp.patternMatchers, + csharp: csharp.patternMatchers, + java: java.patternMatchers, + javascript: typescript.patternMatchers, + javascriptreact: typescript.patternMatchers, json, jsonc: json, - python, - typescript, - typescriptreact: typescript, + python: python.patternMatchers, + typescript: typescript.patternMatchers, + typescriptreact: typescript.patternMatchers, +}; + +export const snippets: Record< + string, + Partial> +> = { + c: cpp.snippets, + cpp: cpp.snippets, + csharp: csharp.snippets, + java: java.snippets, + javascript: typescript.snippets, + javascriptreact: typescript.snippets, + python: python.snippets, + typescript: typescript.snippets, + typescriptreact: typescript.snippets, }; export function getNodeMatcher( diff --git a/src/languages/java.ts b/src/languages/java.ts index fb3921b013..cac6c044c4 100644 --- a/src/languages/java.ts +++ b/src/languages/java.ts @@ -3,7 +3,12 @@ import { argumentMatcher, prefixedMatcher, } from "../util/nodeMatchers"; -import { NodeMatcherAlternative, ScopeType } from "../typings/Types"; +import { + NodeMatcherAlternative, + ScopeType, + SnippetName, +} from "../typings/Types"; +import { SnippetString } from "vscode"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-java/master/src/node-types.json | jq '[.[] | select(.type == "statement" or .type == "declaration") | .subtypes[].type]' @@ -67,4 +72,17 @@ const nodeMatchers: Partial> = { argumentOrParameter: argumentMatcher("formal_parameters", "argument_list"), }; -export default createPatternMatchers(nodeMatchers); +export const patternMatchers = createPatternMatchers(nodeMatchers); + +export const snippets: Partial> = { + tryCatchStatement: new SnippetString( + "try {\n\t$TM_SELECTED_TEXT\n} catch ($1) {\n\t$0\n}" + ), + ifStatement: new SnippetString("if ($1) {\n\t$TM_SELECTED_TEXT\n}"), + ifElseStatementIfBranch: new SnippetString( + "if ($1) {\n\t$TM_SELECTED_TEXT\n} else {\n\t$0\n}" + ), + ifElseStatementElseBranch: new SnippetString( + "if ($1) {\n\t$0\n} else {\n\t$TM_SELECTED_TEXT\n}" + ), +}; diff --git a/src/languages/python.ts b/src/languages/python.ts index 824c9d4df0..d596691d41 100644 --- a/src/languages/python.ts +++ b/src/languages/python.ts @@ -7,7 +7,12 @@ import { cascadingMatcher, patternMatcher, } from "../util/nodeMatchers"; -import { NodeMatcherAlternative, ScopeType } from "../typings/Types"; +import { + NodeMatcherAlternative, + ScopeType, + SnippetName, +} from "../typings/Types"; +import { SnippetString } from "vscode"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-python/d6210ceab11e8d812d4ab59c07c81458ec6e5184/src/node-types.json \ @@ -73,4 +78,17 @@ const nodeMatchers: Partial> = { argumentOrParameter: argumentMatcher("parameters", "argument_list"), }; -export default createPatternMatchers(nodeMatchers); +export const patternMatchers = createPatternMatchers(nodeMatchers); + +export const snippets: Partial> = { + tryCatchStatement: new SnippetString( + "try:\n\t$TM_SELECTED_TEXT\nexcept $1:\n\t$0" + ), + ifStatement: new SnippetString("if $1:\n\t$TM_SELECTED_TEXT"), + ifElseStatementIfBranch: new SnippetString( + "if $1:\n\t$TM_SELECTED_TEXT\nelse:\n\t$0" + ), + ifElseStatementElseBranch: new SnippetString( + "if $1:\n\t$0\nelse:\n\t$TM_SELECTED_TEXT" + ), +}; diff --git a/src/languages/typescript.ts b/src/languages/typescript.ts index f60a79d3bf..90ad4d6b9f 100644 --- a/src/languages/typescript.ts +++ b/src/languages/typescript.ts @@ -11,9 +11,11 @@ import { NodeMatcherAlternative, ScopeType, SelectionWithEditor, + SnippetName, } from "../typings/Types"; import { selectWithLeadingDelimiter } from "../util/nodeSelectors"; import { patternFinder } from "../util/nodeFinders"; +import { SnippetString } from "vscode"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-typescript/4c20b54771e4b390ee058af2930feb2cd55f2bf8/typescript/src/node-types.json \ @@ -170,4 +172,17 @@ const nodeMatchers: Partial> = { xmlEndTag: getEndTag, }; -export default createPatternMatchers(nodeMatchers); +export const patternMatchers = createPatternMatchers(nodeMatchers); + +export const snippets: Partial> = { + tryCatchStatement: new SnippetString( + "try {\n\t$TM_SELECTED_TEXT\n} catch ($1) {\n\t$0\n}" + ), + ifStatement: new SnippetString("if ($1) {\n\t$TM_SELECTED_TEXT\n}"), + ifElseStatementIfBranch: new SnippetString( + "if ($1) {\n\t$TM_SELECTED_TEXT\n} else {\n\t$0\n}" + ), + ifElseStatementElseBranch: new SnippetString( + "if ($1) {\n\t$0\n} else {\n\t$TM_SELECTED_TEXT\n}" + ), +}; diff --git a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml new file mode 100644 index 0000000000..170ab59454 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: else state wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifElseStatementElseBranch] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + + } else { + int foo = 0; + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml new file mode 100644 index 0000000000..d91dc1e30d --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: if else wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifElseStatementIfBranch] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + int foo = 0; + } else { + + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml new file mode 100644 index 0000000000..3c46a27ba7 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml @@ -0,0 +1,23 @@ +spokenForm: if state wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifStatement] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + int foo = 0; + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml new file mode 100644 index 0000000000..815b9ca24d --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: try catch wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [tryCatchStatement] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + try { + int foo = 0; + } catch () { + + } + selections: + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml new file mode 100644 index 0000000000..18029ef956 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml @@ -0,0 +1,42 @@ +spokenForm: try catch wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [tryCatchStatement] +marks: {} +initialState: + documentContents: |- + if (true) { + int foo = 0; + } + + int bar = 1; + selections: + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} +finalState: + documentContents: |- + try { + if (true) { + int foo = 0; + } + } catch () { + + } + + try { + int bar = 1; + } catch () { + + } + selections: + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml new file mode 100644 index 0000000000..170ab59454 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: else state wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifElseStatementElseBranch] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + + } else { + int foo = 0; + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml new file mode 100644 index 0000000000..d91dc1e30d --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: if else wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifElseStatementIfBranch] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + int foo = 0; + } else { + + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml new file mode 100644 index 0000000000..3c46a27ba7 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml @@ -0,0 +1,23 @@ +spokenForm: if state wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifStatement] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + int foo = 0; + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml new file mode 100644 index 0000000000..815b9ca24d --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: try catch wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [tryCatchStatement] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + try { + int foo = 0; + } catch () { + + } + selections: + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml new file mode 100644 index 0000000000..18029ef956 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml @@ -0,0 +1,42 @@ +spokenForm: try catch wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [tryCatchStatement] +marks: {} +initialState: + documentContents: |- + if (true) { + int foo = 0; + } + + int bar = 1; + selections: + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} +finalState: + documentContents: |- + try { + if (true) { + int foo = 0; + } + } catch () { + + } + + try { + int bar = 1; + } catch () { + + } + selections: + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml new file mode 100644 index 0000000000..170ab59454 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: else state wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifElseStatementElseBranch] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + + } else { + int foo = 0; + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml new file mode 100644 index 0000000000..d91dc1e30d --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: if else wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifElseStatementIfBranch] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + int foo = 0; + } else { + + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml new file mode 100644 index 0000000000..3c46a27ba7 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml @@ -0,0 +1,23 @@ +spokenForm: if state wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifStatement] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + int foo = 0; + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml new file mode 100644 index 0000000000..815b9ca24d --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: try catch wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [tryCatchStatement] +marks: {} +initialState: + documentContents: int foo = 0; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + try { + int foo = 0; + } catch () { + + } + selections: + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml new file mode 100644 index 0000000000..18029ef956 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml @@ -0,0 +1,42 @@ +spokenForm: try catch wrap this +languageId: java +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [tryCatchStatement] +marks: {} +initialState: + documentContents: |- + if (true) { + int foo = 0; + } + + int bar = 1; + selections: + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} +finalState: + documentContents: |- + try { + if (true) { + int foo = 0; + } + } catch () { + + } + + try { + int bar = 1; + } catch () { + + } + selections: + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml new file mode 100644 index 0000000000..164203c7fd --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml @@ -0,0 +1,24 @@ +spokenForm: else state wrap this +languageId: python +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifElseStatementElseBranch] +marks: {} +initialState: + documentContents: foo = "hello" + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} +finalState: + documentContents: |- + if : + + else: + foo = "hello" + selections: + - anchor: {line: 0, character: 3} + active: {line: 0, character: 3} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml new file mode 100644 index 0000000000..ea9c16feb3 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml @@ -0,0 +1,24 @@ +spokenForm: if else wrap this +languageId: python +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifElseStatementIfBranch] +marks: {} +initialState: + documentContents: foo = "hello" + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} +finalState: + documentContents: |- + if : + foo = "hello" + else: + + selections: + - anchor: {line: 0, character: 3} + active: {line: 0, character: 3} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml new file mode 100644 index 0000000000..a86e2fae3b --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml @@ -0,0 +1,22 @@ +spokenForm: if state wrap this +languageId: python +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifStatement] +marks: {} +initialState: + documentContents: foo = "hello" + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} +finalState: + documentContents: |- + if : + foo = "hello" + selections: + - anchor: {line: 0, character: 3} + active: {line: 0, character: 3} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml new file mode 100644 index 0000000000..25ec1eafe9 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml @@ -0,0 +1,24 @@ +spokenForm: try catch wrap this +languageId: python +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [tryCatchStatement] +marks: {} +initialState: + documentContents: foo = "hello" + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} +finalState: + documentContents: |- + try: + foo = "hello" + except : + + selections: + - anchor: {line: 2, character: 7} + active: {line: 2, character: 7} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml new file mode 100644 index 0000000000..6a31f245fd --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml @@ -0,0 +1,38 @@ +spokenForm: try catch wrap this +languageId: python +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [tryCatchStatement] +marks: {} +initialState: + documentContents: |- + if True: + foo = "hello" + + bar = "hello" + selections: + - anchor: {line: 3, character: 0} + active: {line: 3, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} +finalState: + documentContents: |- + try: + if True: + foo = "hello" + except : + + + try: + bar = "hello" + except : + + selections: + - anchor: {line: 8, character: 7} + active: {line: 8, character: 7} + - anchor: {line: 3, character: 7} + active: {line: 3, character: 7} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/script.sh b/src/test/suite/fixtures/recorded/languages/script.sh new file mode 100644 index 0000000000..540c7c3f6d --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/script.sh @@ -0,0 +1,4 @@ +cp java/try* csharp +cp java/ifElseW* csharp +cp java/ifStateW* csharp +cp java/else* csharp \ No newline at end of file diff --git a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml new file mode 100644 index 0000000000..a585f09aee --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: else state wrap this +languageId: typescript +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifElseStatementElseBranch] +marks: {} +initialState: + documentContents: const foo = "hello"; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + + } else { + const foo = "hello"; + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml new file mode 100644 index 0000000000..d182ded181 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: if else wrap this +languageId: typescript +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifElseStatementIfBranch] +marks: {} +initialState: + documentContents: const foo = "hello"; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + const foo = "hello"; + } else { + + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml new file mode 100644 index 0000000000..d82562c0f3 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml @@ -0,0 +1,23 @@ +spokenForm: if state wrap this +languageId: typescript +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [ifStatement] +marks: {} +initialState: + documentContents: const foo = "hello"; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + if () { + const foo = "hello"; + } + selections: + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml new file mode 100644 index 0000000000..7e03dca9fa --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml @@ -0,0 +1,25 @@ +spokenForm: try catch wrap this +languageId: typescript +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [tryCatchStatement] +marks: {} +initialState: + documentContents: const foo = "hello"; + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} +finalState: + documentContents: |- + try { + const foo = "hello"; + } catch () { + + } + selections: + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml new file mode 100644 index 0000000000..616c215070 --- /dev/null +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml @@ -0,0 +1,42 @@ +spokenForm: try catch wrap this +languageId: typescript +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + mark: {type: cursor} + extraArgs: [tryCatchStatement] +marks: {} +initialState: + documentContents: |- + if (true) { + const foo = "hello"; + } + + const bar = "hello"; + selections: + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} +finalState: + documentContents: |- + try { + if (true) { + const foo = "hello"; + } + } catch () { + + } + + try { + const bar = "hello"; + } catch () { + + } + selections: + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/typings/Types.ts b/src/typings/Types.ts index c582d98f49..5ce6bd45ea 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -258,6 +258,7 @@ export interface ActionPreferences { position?: Position; insideOutsideType: InsideOutsideType; selectionType?: SelectionType; + modifier?: Modifier; } export interface SelectionWithContext { @@ -311,7 +312,14 @@ export type ActionType = | "toggleLineBreakpoint" | "toggleLineComment" | "unfoldRegion" - | "wrapWithPairedDelimiter"; + | "wrapWithPairedDelimiter" + | "wrapWithSnippet"; + +export type SnippetName = + | "ifElseStatementElseBranch" + | "ifElseStatementIfBranch" + | "ifStatement" + | "tryCatchStatement"; export type ActionRecord = Record; From 357719e8433cec7a5fb24caff7f3491c88ef2dfc Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Fri, 15 Oct 2021 15:52:59 +0100 Subject: [PATCH 03/35] Change languageId --- .../suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml | 2 +- .../suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml | 2 +- .../suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml | 2 +- .../suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml | 2 +- .../suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml | 2 +- .../fixtures/recorded/languages/csharp/elseStateWrapThis.yml | 2 +- .../suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml | 2 +- .../fixtures/recorded/languages/csharp/ifStateWrapThis.yml | 2 +- .../fixtures/recorded/languages/csharp/tryCatchWrapThis.yml | 2 +- .../fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml index 170ab59454..aa7f3a0e6e 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml @@ -1,5 +1,5 @@ spokenForm: else state wrap this -languageId: java +languageId: cpp command: actionName: wrapWithSnippet partialTargets: diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml index d91dc1e30d..0d0864c896 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml @@ -1,5 +1,5 @@ spokenForm: if else wrap this -languageId: java +languageId: cpp command: actionName: wrapWithSnippet partialTargets: diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml index 3c46a27ba7..4599c44816 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml @@ -1,5 +1,5 @@ spokenForm: if state wrap this -languageId: java +languageId: cpp command: actionName: wrapWithSnippet partialTargets: diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml index 815b9ca24d..d6c5b8b131 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml @@ -1,5 +1,5 @@ spokenForm: try catch wrap this -languageId: java +languageId: cpp command: actionName: wrapWithSnippet partialTargets: diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml index 18029ef956..eed1506d2d 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml @@ -1,5 +1,5 @@ spokenForm: try catch wrap this -languageId: java +languageId: cpp command: actionName: wrapWithSnippet partialTargets: diff --git a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml index 170ab59454..12a5b32c21 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml @@ -1,5 +1,5 @@ spokenForm: else state wrap this -languageId: java +languageId: csharp command: actionName: wrapWithSnippet partialTargets: diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml index d91dc1e30d..ef77c34678 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml @@ -1,5 +1,5 @@ spokenForm: if else wrap this -languageId: java +languageId: csharp command: actionName: wrapWithSnippet partialTargets: diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml index 3c46a27ba7..a36bbd1a1e 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml @@ -1,5 +1,5 @@ spokenForm: if state wrap this -languageId: java +languageId: csharp command: actionName: wrapWithSnippet partialTargets: diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml index 815b9ca24d..3363231c93 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml @@ -1,5 +1,5 @@ spokenForm: try catch wrap this -languageId: java +languageId: csharp command: actionName: wrapWithSnippet partialTargets: diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml index 18029ef956..0af3be588f 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml @@ -1,5 +1,5 @@ spokenForm: try catch wrap this -languageId: java +languageId: csharp command: actionName: wrapWithSnippet partialTargets: From 180f374df7cec225558f959a1d8dd8b037d49aa5 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Fri, 15 Oct 2021 17:58:48 +0100 Subject: [PATCH 04/35] Remove accidental file --- src/test/suite/fixtures/recorded/languages/script.sh | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 src/test/suite/fixtures/recorded/languages/script.sh diff --git a/src/test/suite/fixtures/recorded/languages/script.sh b/src/test/suite/fixtures/recorded/languages/script.sh deleted file mode 100644 index 540c7c3f6d..0000000000 --- a/src/test/suite/fixtures/recorded/languages/script.sh +++ /dev/null @@ -1,4 +0,0 @@ -cp java/try* csharp -cp java/ifElseW* csharp -cp java/ifStateW* csharp -cp java/else* csharp \ No newline at end of file From cfa46fc8363d0a888c902c0de4af185d41f5476d Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sun, 17 Oct 2021 16:05:13 +0100 Subject: [PATCH 05/35] Attempt at complex version --- package.json | 22 ++++++++++++++ src/actions/WrapWithSnippet.ts | 52 +++++++++++++++++++++++----------- 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 70fe8801b4..aa4e18741d 100644 --- a/package.json +++ b/package.json @@ -400,6 +400,28 @@ "verticalOffset": 0 } } + }, + "cursorless.wrapperSnippets": { + "description": "Snippets to use with the wrap with snippet action", + "type": "object", + "scope": "language-overridable", + "additionalProperties": { + "type": "object", + "properties": { + "snippet": { + "type": "string" + }, + "name": { + "type": "string" + }, + "langId": { + "type": "string" + }, + "defaultScopeType": { + "type": "string" + } + } + } } } } diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 8e60e110d7..d7d8ba8d5a 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -1,4 +1,4 @@ -import { SnippetString } from "vscode"; +import { commands, SnippetString, workspace } from "vscode"; import { snippets } from "../languages"; import { Action, @@ -11,6 +11,15 @@ import { import displayPendingEditDecorations from "../util/editDisplayUtils"; import { ensureSingleEditor } from "../util/targetUtils"; +interface UserLanguageSnippet { + snippet?: string; + name?: string; + langId?: string; + defaultScopeType?: string; +} + +type UserLanguageSnippetMap = Record; + export default class WrapWithSnippet implements Action { targetPreferences: ActionPreferences[] = [ { @@ -33,29 +42,40 @@ export default class WrapWithSnippet implements Action { ): Promise { const editor = ensureSingleEditor(targets); - const languageId = editor.document.languageId; - const languageSnippets = snippets[languageId]; - if (languageSnippets == null) { - throw new Error(`Snippets not supported for language ${languageId}`); - } + await this.graph.actions.setSelection.run([targets]); - const snippetString = languageSnippets[snippetName]; - if (snippetString == null) { - throw new Error( - `Snippet ${snippetName} not supported for language ${languageId}` - ); - } + const languageId = editor.document.languageId; + const snippet = this.getSnippet(languageId, snippetName); await displayPendingEditDecorations( targets, this.graph.editStyles.pendingModification0 ); - await editor.insertSnippet( - snippetString, - targets.map((target) => target.selection.selection) - ); + if (snippet.snippet != null) { + await editor.insertSnippet(snippet.snippet); + } else { + await commands.executeCommand("editor.action.codeAction", { + kind: "refactor.extract.constant", + preferred: true, + }); + } return {}; } + + private getSnippet(languageId: string, snippetName: string) { + const languageSnippets = snippets[languageId]; + + const userLanguageSnippets = workspace + .getConfiguration("cursorless") + .get(`wrapperSnippets`); + const snippetString = languageSnippets[snippetName]; + if (snippetString == null) { + throw new Error( + `Snippet ${snippetName} not supported for language ${languageId}` + ); + } + return snippetString; + } } From df99a07841cb5d9c79d8edeac9c102aec390c0a0 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 14:20:34 +0100 Subject: [PATCH 06/35] Initial version using integer placeholders --- .eslintrc.json | 6 +- .vscode/launch.json | 19 + images/tryWrapFine.gif | Bin 0 -> 46451 bytes package.json | 256 +++- src/actions/BringMoveSwap.ts | 2 +- src/actions/Call.ts | 2 +- src/actions/Clear.ts | 2 +- src/actions/CommandAction.ts | 2 +- src/actions/CopyLines.ts | 2 +- src/actions/CutCopyPaste.ts | 2 +- src/actions/Delete.ts | 2 +- src/actions/EditNewLine.ts | 2 +- src/actions/ExtractVariable.ts | 2 +- src/actions/Find.ts | 2 +- src/actions/Fold.ts | 2 +- src/actions/GetText.ts | 2 +- src/actions/InsertEmptyLines.ts | 2 +- src/actions/Replace.ts | 2 +- src/actions/Scroll.ts | 2 +- src/actions/SetBreakpoint.ts | 2 +- src/actions/SetSelection.ts | 2 +- src/actions/Sort.ts | 2 +- src/actions/Wrap.ts | 4 +- src/actions/WrapWithSnippet.ts | 169 ++- src/extension.ts | 2 +- src/languages/cpp.ts | 22 +- src/languages/csharp.ts | 18 +- src/languages/index.ts | 45 +- src/languages/java.ts | 22 +- src/languages/python.ts | 22 +- src/languages/typescript.ts | 17 +- .../recorded/inference/bringOddToLine.yml | 44 +- .../recorded/inference/bringOddToState.yml | 46 +- .../recorded/inference/bringOddToToken.yml | 44 +- .../inference/takeOddPastEndOfState.yml | 57 +- .../recorded/inference/takeOddPastLine.yml | 47 +- .../recorded/inference/takeOddPastState.yml | 57 +- .../recorded/inference/takeOddPastToken.yml | 47 +- .../languages/cpp/elseStateWrapThis.yml | 5 +- .../recorded/languages/cpp/ifElseWrapThis.yml | 5 +- .../languages/cpp/ifStateWrapThis.yml | 5 +- .../languages/cpp/tryCatchWrapThis.yml | 5 +- .../languages/cpp/tryCatchWrapThis2.yml | 7 +- .../languages/csharp/elseStateWrapThis.yml | 5 +- .../languages/csharp/ifElseWrapThis.yml | 5 +- .../languages/csharp/ifStateWrapThis.yml | 5 +- .../languages/csharp/tryCatchWrapThis.yml | 5 +- .../languages/csharp/tryCatchWrapThis2.yml | 7 +- .../languages/java/elseStateWrapThis.yml | 5 +- .../languages/java/ifElseWrapThis.yml | 5 +- .../languages/java/ifStateWrapThis.yml | 5 +- .../languages/java/tryCatchWrapThis.yml | 5 +- .../languages/java/tryCatchWrapThis2.yml | 7 +- .../languages/python/elseStateWrapThis.yml | 5 +- .../languages/python/ifElseWrapThis.yml | 5 +- .../languages/python/ifStateWrapThis.yml | 5 +- .../languages/python/tryCatchWrapThis.yml | 5 +- .../languages/python/tryCatchWrapThis2.yml | 7 +- .../typescript/elseStateWrapThis.yml | 5 +- .../languages/typescript/ifElseWrapThis.yml | 5 +- .../languages/typescript/ifStateWrapThis.yml | 5 +- .../languages/typescript/tryCatchWrapThis.yml | 5 +- .../typescript/tryCatchWrapThis2.yml | 7 +- src/test/suite/recorded.test.ts | 32 +- src/typings/Types.ts | 15 +- src/util/updateSelections.ts | 2 +- src/vendor/charCode.ts | 436 +++++++ src/vendor/snippetParser.ts | 1083 +++++++++++++++++ tsconfig.json | 1 + yarn.lock | 131 +- 70 files changed, 2253 insertions(+), 562 deletions(-) create mode 100644 images/tryWrapFine.gif create mode 100644 src/vendor/charCode.ts create mode 100644 src/vendor/snippetParser.ts diff --git a/.eslintrc.json b/.eslintrc.json index 62e6178c38..96c67090d4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -21,5 +21,9 @@ ], "no-throw-literal": "warn", "semi": "off" - } + }, + "ignorePatterns": [ + "**/vendor/*.ts", + "**/vendor/*.js" + ] } \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index ef8fe33cdb..8e4aec3cce 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -36,6 +36,25 @@ "${workspaceFolder}/out/test/**/*.js" ], "preLaunchTask": "${defaultBuildTask}" + }, + { + "name": "Update fixtures", + "type": "extensionHost", + "request": "launch", + "env": { + "CURSORLESS_TEST": "true", + "CURSORLESS_TEST_UPDATE_FIXTURES": "true", + }, + "args": [ + "--disable-extension", + "asvetliakov.vscode-neovim", + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" + ], + "outFiles": [ + "${workspaceFolder}/out/test/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" } ] } \ No newline at end of file diff --git a/images/tryWrapFine.gif b/images/tryWrapFine.gif new file mode 100644 index 0000000000000000000000000000000000000000..d02b9e13c30ca00d98ec085a955b7953e8bad95f GIT binary patch literal 46451 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 ActionPreferences[] = () => [ { insideOutsideType: null }, { insideOutsideType: null }, ]; diff --git a/src/actions/Call.ts b/src/actions/Call.ts index ee63f5adf4..fc5a72554c 100644 --- a/src/actions/Call.ts +++ b/src/actions/Call.ts @@ -8,7 +8,7 @@ import { import { ensureSingleTarget } from "../util/targetUtils"; export default class Call implements Action { - targetPreferences: ActionPreferences[] = [ + getTargetPreferences: () => ActionPreferences[] = () => [ { insideOutsideType: "inside" }, { insideOutsideType: "inside" }, ]; diff --git a/src/actions/Clear.ts b/src/actions/Clear.ts index 2e9056a82d..01a97c64fe 100644 --- a/src/actions/Clear.ts +++ b/src/actions/Clear.ts @@ -9,7 +9,7 @@ import { ensureSingleEditor } from "../util/targetUtils"; import { setSelectionsAndFocusEditor } from "../util/setSelectionsAndFocusEditor"; export default class Clear implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; constructor(private graph: Graph) { this.run = this.run.bind(this); diff --git a/src/actions/CommandAction.ts b/src/actions/CommandAction.ts index 39cbc5793d..42aa2ca2e3 100644 --- a/src/actions/CommandAction.ts +++ b/src/actions/CommandAction.ts @@ -18,7 +18,7 @@ import { callFunctionAndUpdateSelections } from "../util/updateSelections"; import { ensureSingleEditor } from "../util/targetUtils"; export default class CommandAction implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; private ensureSingleEditor: boolean; constructor( diff --git a/src/actions/CopyLines.ts b/src/actions/CopyLines.ts index c3f40f8192..82d39e9cb8 100644 --- a/src/actions/CopyLines.ts +++ b/src/actions/CopyLines.ts @@ -14,7 +14,7 @@ import unifyRanges from "../util/unifyRanges"; import expandToContainingLine from "../util/expandToContainingLine"; class CopyLines implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; constructor(private graph: Graph, private isUp: boolean) { this.run = this.run.bind(this); diff --git a/src/actions/CutCopyPaste.ts b/src/actions/CutCopyPaste.ts index 396075afa3..762b43241e 100644 --- a/src/actions/CutCopyPaste.ts +++ b/src/actions/CutCopyPaste.ts @@ -12,7 +12,7 @@ import { getOutsideOverflow } from "../util/targetUtils"; import { zip } from "lodash"; export class Cut implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: null }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: null }]; constructor(private graph: Graph) { this.run = this.run.bind(this); diff --git a/src/actions/Delete.ts b/src/actions/Delete.ts index 5190370c33..cd02f2b61e 100644 --- a/src/actions/Delete.ts +++ b/src/actions/Delete.ts @@ -11,7 +11,7 @@ import { flatten } from "lodash"; import { performEditsAndUpdateSelections } from "../util/updateSelections"; export default class Delete implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "outside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "outside" }]; constructor(private graph: Graph) { this.run = this.run.bind(this); diff --git a/src/actions/EditNewLine.ts b/src/actions/EditNewLine.ts index 2505cdcad4..9616de7360 100644 --- a/src/actions/EditNewLine.ts +++ b/src/actions/EditNewLine.ts @@ -8,7 +8,7 @@ import { import { commands, Selection } from "vscode"; class EditNewLine implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; constructor(private graph: Graph, private isAbove: boolean) { this.run = this.run.bind(this); diff --git a/src/actions/ExtractVariable.ts b/src/actions/ExtractVariable.ts index 2c51e737b5..f9fe28df9b 100644 --- a/src/actions/ExtractVariable.ts +++ b/src/actions/ExtractVariable.ts @@ -9,7 +9,7 @@ import { ensureSingleTarget } from "../util/targetUtils"; import { commands } from "vscode"; export default class ExtractVariable implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; constructor(private graph: Graph) { this.run = this.run.bind(this); diff --git a/src/actions/Find.ts b/src/actions/Find.ts index a8e61d02bf..26d5ad5239 100644 --- a/src/actions/Find.ts +++ b/src/actions/Find.ts @@ -9,7 +9,7 @@ import { commands } from "vscode"; import { ensureSingleTarget } from "../util/targetUtils"; export class FindInFiles implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; constructor(private graph: Graph) { this.run = this.run.bind(this); diff --git a/src/actions/Fold.ts b/src/actions/Fold.ts index 1448b02ddd..622e78536c 100644 --- a/src/actions/Fold.ts +++ b/src/actions/Fold.ts @@ -9,7 +9,7 @@ import { import { ensureSingleEditor } from "../util/targetUtils"; class FoldAction implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "outside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "outside" }]; constructor(private command: string) { this.run = this.run.bind(this); diff --git a/src/actions/GetText.ts b/src/actions/GetText.ts index d071929a8a..f06f1c5077 100644 --- a/src/actions/GetText.ts +++ b/src/actions/GetText.ts @@ -9,7 +9,7 @@ import displayPendingEditDecorations from "../util/editDisplayUtils"; import { ensureSingleTarget } from "../util/targetUtils"; export default class GetText implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; constructor(private graph: Graph) { this.run = this.run.bind(this); diff --git a/src/actions/InsertEmptyLines.ts b/src/actions/InsertEmptyLines.ts index 7e61ae9514..248088edba 100644 --- a/src/actions/InsertEmptyLines.ts +++ b/src/actions/InsertEmptyLines.ts @@ -12,7 +12,7 @@ import { performEditsAndUpdateSelections } from "../util/updateSelections"; import { flatten } from "lodash"; class InsertEmptyLines implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; constructor( private graph: Graph, diff --git a/src/actions/Replace.ts b/src/actions/Replace.ts index 0812552486..95a3490cb5 100644 --- a/src/actions/Replace.ts +++ b/src/actions/Replace.ts @@ -14,7 +14,7 @@ import { performEditsAndUpdateSelections } from "../util/updateSelections"; type RangeGenerator = { start: number }; export default class implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: null }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: null }]; constructor(private graph: Graph) { this.run = this.run.bind(this); diff --git a/src/actions/Scroll.ts b/src/actions/Scroll.ts index 901c9e4f29..3684276587 100644 --- a/src/actions/Scroll.ts +++ b/src/actions/Scroll.ts @@ -11,7 +11,7 @@ import { commands, window, workspace } from "vscode"; import { focusEditor } from "../util/setSelectionsAndFocusEditor"; class Scroll implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; constructor(private graph: Graph, private at: string) { this.run = this.run.bind(this); diff --git a/src/actions/SetBreakpoint.ts b/src/actions/SetBreakpoint.ts index 160d83da15..82db116266 100644 --- a/src/actions/SetBreakpoint.ts +++ b/src/actions/SetBreakpoint.ts @@ -25,7 +25,7 @@ function getBreakpoints(uri: Uri, range: Range) { } export default class SetBreakpoint implements Action { - targetPreferences: ActionPreferences[] = [ + getTargetPreferences: () => ActionPreferences[] = () => [ { insideOutsideType: "inside", selectionType: "line" }, ]; diff --git a/src/actions/SetSelection.ts b/src/actions/SetSelection.ts index 41337a2f2e..64f4014792 100644 --- a/src/actions/SetSelection.ts +++ b/src/actions/SetSelection.ts @@ -10,7 +10,7 @@ import { Selection } from "vscode"; import { setSelectionsAndFocusEditor } from "../util/setSelectionsAndFocusEditor"; export class SetSelection implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; constructor(private graph: Graph) { this.run = this.run.bind(this); diff --git a/src/actions/Sort.ts b/src/actions/Sort.ts index b70d405b97..28fe9588f9 100644 --- a/src/actions/Sort.ts +++ b/src/actions/Sort.ts @@ -7,7 +7,7 @@ import { } from "../typings/Types"; export class Sort implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [{ insideOutsideType: "inside" }]; constructor(private graph: Graph) { this.run = this.run.bind(this); diff --git a/src/actions/Wrap.ts b/src/actions/Wrap.ts index cdf26f22da..a062bc53db 100644 --- a/src/actions/Wrap.ts +++ b/src/actions/Wrap.ts @@ -14,7 +14,9 @@ import { performEditsAndUpdateSelections } from "../util/updateSelections"; import { selectionWithEditorFromPositions } from "../util/selectionUtils"; export default class Wrap implements Action { - targetPreferences: ActionPreferences[] = [{ insideOutsideType: "inside" }]; + getTargetPreferences: () => ActionPreferences[] = () => [ + { insideOutsideType: "inside" }, + ]; constructor(private graph: Graph) { this.run = this.run.bind(this); diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index d7d8ba8d5a..a44b77afec 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -1,36 +1,69 @@ -import { commands, SnippetString, workspace } from "vscode"; -import { snippets } from "../languages"; +import { SnippetString, workspace } from "vscode"; import { Action, ActionPreferences, ActionReturnValue, Graph, - SnippetName, + ScopeType, TypedSelection, } from "../typings/Types"; import displayPendingEditDecorations from "../util/editDisplayUtils"; import { ensureSingleEditor } from "../util/targetUtils"; +import { callFunctionAndUpdateSelections } from "../util/updateSelections"; +import { SnippetParser, Variable } from "../vendor/snippetParser"; -interface UserLanguageSnippet { - snippet?: string; - name?: string; - langId?: string; - defaultScopeType?: string; +interface SnippetScope { + langIds?: string[]; + scopeType?: ScopeType; } -type UserLanguageSnippetMap = Record; +type SnippetBody = string[]; + +interface SnippetDefinition { + body: SnippetBody; + scope?: SnippetScope; +} + +interface Snippet { + definitions: SnippetDefinition[]; + defaultScopeTypes: Record; + description?: string; +} + +type UserSnippetMap = Record; export default class WrapWithSnippet implements Action { - targetPreferences: ActionPreferences[] = [ - { - insideOutsideType: "inside", - modifier: { - type: "containingScope", - scopeType: "statement", - includeSiblings: false, + snippetParser = new SnippetParser(); + + getTargetPreferences(snippetLocation: string): ActionPreferences[] { + const snippetMap = workspace + .getConfiguration("cursorless.experimental") + .get("snippets")!; + + const [snippetName, placeholderName] = + parseSnippetLocation(snippetLocation); + const snippet = snippetMap[snippetName]; + + if (snippet == null) { + throw new Error(`Couldn't find snippet ${snippetName}`); + } + + const defaultScopeType = snippet.defaultScopeTypes[placeholderName]; + + return [ + { + insideOutsideType: "inside", + modifier: + defaultScopeType == null + ? undefined + : { + type: "containingScope", + scopeType: defaultScopeType, + includeSiblings: false, + }, }, - }, - ]; + ]; + } constructor(private graph: Graph) { this.run = this.run.bind(this); @@ -38,44 +71,92 @@ export default class WrapWithSnippet implements Action { async run( [targets]: [TypedSelection[]], - snippetName: SnippetName + snippetLocation: string ): Promise { + const snippetMap = workspace + .getConfiguration("cursorless.experimental") + .get("snippets")!; + + const [snippetName, placeholderName] = + parseSnippetLocation(snippetLocation); + const snippet = snippetMap[snippetName]; + const editor = ensureSingleEditor(targets); - await this.graph.actions.setSelection.run([targets]); + const definition = findMatchingSnippetDefinition(targets[0], snippet); - const languageId = editor.document.languageId; - const snippet = this.getSnippet(languageId, snippetName); + if (definition == null) { + throw new Error("Couldn't find matching snippet definition"); + } + + const parsedSnippet = this.snippetParser.parse(definition.body.join("\n")); + + const placeholderIndex = parseInt(placeholderName); + + const placeholder = parsedSnippet.placeholders.find( + (placeholder) => placeholder.index === placeholderIndex + ); + + if (placeholder == null) { + throw new Error(`Couldn't find placeholder ${placeholderName}`); + } + + parsedSnippet.replace(placeholder, [new Variable("TM_SELECTED_TEXT")]); + + const snippetString = new SnippetString(parsedSnippet.toTextmateString()); await displayPendingEditDecorations( targets, this.graph.editStyles.pendingModification0 ); - if (snippet.snippet != null) { - await editor.insertSnippet(snippet.snippet); - } else { - await commands.executeCommand("editor.action.codeAction", { - kind: "refactor.extract.constant", - preferred: true, - }); - } + const targetSelections = targets.map( + (target) => target.selection.selection + ); + + const [updatedTargetSelections] = await callFunctionAndUpdateSelections( + () => editor.insertSnippet(snippetString, targetSelections), + editor, + [targetSelections] + ); - return {}; + return { + thatMark: updatedTargetSelections.map((selection) => ({ + editor, + selection, + })), + }; } +} - private getSnippet(languageId: string, snippetName: string) { - const languageSnippets = snippets[languageId]; - - const userLanguageSnippets = workspace - .getConfiguration("cursorless") - .get(`wrapperSnippets`); - const snippetString = languageSnippets[snippetName]; - if (snippetString == null) { - throw new Error( - `Snippet ${snippetName} not supported for language ${languageId}` - ); +function parseSnippetLocation(snippetLocation: string): [string, string] { + const [snippetName, placeholderName] = snippetLocation.split("/"); + return [snippetName, placeholderName]; +} + +function findMatchingSnippetDefinition( + typedSelection: TypedSelection, + snippet: Snippet +) { + return snippet.definitions.find(({ scope }) => { + if (scope == null) { + return true; } - return snippetString; - } + + const { langIds, scopeType } = scope; + + if ( + langIds != null && + !langIds.includes(typedSelection.selection.editor.document.languageId) + ) { + return false; + } + + if (scopeType != null) { + // TODO: Implement scope types by refactoring code out of processScopeType + throw new Error("Scope types not yet implemented"); + } + + return true; + }); } diff --git a/src/extension.ts b/src/extension.ts index 8cf689afc2..a95a2dbe06 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -128,7 +128,7 @@ export async function activate(context: vscode.ExtensionContext) { const targets = inferFullTargets( partialTargets, - action.targetPreferences + action.getTargetPreferences(...extraArgs) ); const processedTargetsContext: ProcessedTargetsContext = { diff --git a/src/languages/cpp.ts b/src/languages/cpp.ts index 846aac03bc..b4d8fb3949 100644 --- a/src/languages/cpp.ts +++ b/src/languages/cpp.ts @@ -3,12 +3,7 @@ import { argumentMatcher, prefixedMatcher, } from "../util/nodeMatchers"; -import { - NodeMatcherAlternative, - ScopeType, - SnippetName, -} from "../typings/Types"; -import { SnippetString } from "vscode"; +import { NodeMatcherAlternative, ScopeType } from "../typings/Types"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-cpp/master/src/node-types.json | jq '[.[] | select(.type == "compound_statement") | .children.types[].type] + [.[] | select(.type == "_statement") | .subtypes[].type]' @@ -111,17 +106,4 @@ const nodeMatchers: Partial> = { attribute: "attribute", }; -export const patternMatchers = createPatternMatchers(nodeMatchers); - -export const snippets: Partial> = { - tryCatchStatement: new SnippetString( - "try {\n\t$TM_SELECTED_TEXT\n} catch ($1) {\n\t$0\n}" - ), - ifStatement: new SnippetString("if ($1) {\n\t$TM_SELECTED_TEXT\n}"), - ifElseStatementIfBranch: new SnippetString( - "if ($1) {\n\t$TM_SELECTED_TEXT\n} else {\n\t$0\n}" - ), - ifElseStatementElseBranch: new SnippetString( - "if ($1) {\n\t$0\n} else {\n\t$TM_SELECTED_TEXT\n}" - ), -}; +export default createPatternMatchers(nodeMatchers); diff --git a/src/languages/csharp.ts b/src/languages/csharp.ts index 51a216cbe2..59ccc7440d 100644 --- a/src/languages/csharp.ts +++ b/src/languages/csharp.ts @@ -6,14 +6,13 @@ import { matcher, typeMatcher, } from "../util/nodeMatchers"; -import { NodeMatcher, ScopeType, SnippetName } from "../typings/Types"; +import { NodeMatcher, ScopeType } from "../typings/Types"; import { getNameNode } from "../util/treeSitterUtils"; import { nodeFinder, typedNodeFinder } from "../util/nodeFinders"; import { delimitedSelector, selectWithLeadingDelimiter, } from "../util/nodeSelectors"; -import { SnippetString } from "vscode"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-c-sharp/master/src/node-types.json \ @@ -243,17 +242,4 @@ const nodeMatchers: Partial> = { name: matcher(getNameNode), }; -export const patternMatchers = createPatternMatchers(nodeMatchers); - -export const snippets: Partial> = { - tryCatchStatement: new SnippetString( - "try {\n\t$TM_SELECTED_TEXT\n} catch ($1) {\n\t$0\n}" - ), - ifStatement: new SnippetString("if ($1) {\n\t$TM_SELECTED_TEXT\n}"), - ifElseStatementIfBranch: new SnippetString( - "if ($1) {\n\t$TM_SELECTED_TEXT\n} else {\n\t$0\n}" - ), - ifElseStatementElseBranch: new SnippetString( - "if ($1) {\n\t$0\n} else {\n\t$TM_SELECTED_TEXT\n}" - ), -}; +export default createPatternMatchers(nodeMatchers); diff --git a/src/languages/index.ts b/src/languages/index.ts index 483ce45dd1..64e8fa9723 100644 --- a/src/languages/index.ts +++ b/src/languages/index.ts @@ -6,43 +6,26 @@ import { NodeMatcherValue, ScopeType, SelectionWithEditor, - SnippetName, } from "../typings/Types"; -import * as cpp from "./cpp"; -import * as csharp from "./csharp"; -import * as java from "./java"; +import cpp from "./cpp"; +import csharp from "./csharp"; +import java from "./java"; import json from "./json"; -import * as python from "./python"; -import * as typescript from "./typescript"; -import { SnippetString } from "vscode"; +import python from "./python"; +import typescript from "./typescript"; const languageMatchers: Record> = { - c: cpp.patternMatchers, - cpp: cpp.patternMatchers, - csharp: csharp.patternMatchers, - java: java.patternMatchers, - javascript: typescript.patternMatchers, - javascriptreact: typescript.patternMatchers, + c: cpp, + cpp: cpp, + csharp: csharp, + java, + javascript: typescript, + javascriptreact: typescript, json, jsonc: json, - python: python.patternMatchers, - typescript: typescript.patternMatchers, - typescriptreact: typescript.patternMatchers, -}; - -export const snippets: Record< - string, - Partial> -> = { - c: cpp.snippets, - cpp: cpp.snippets, - csharp: csharp.snippets, - java: java.snippets, - javascript: typescript.snippets, - javascriptreact: typescript.snippets, - python: python.snippets, - typescript: typescript.snippets, - typescriptreact: typescript.snippets, + python, + typescript, + typescriptreact: typescript, }; export function getNodeMatcher( diff --git a/src/languages/java.ts b/src/languages/java.ts index cac6c044c4..fb3921b013 100644 --- a/src/languages/java.ts +++ b/src/languages/java.ts @@ -3,12 +3,7 @@ import { argumentMatcher, prefixedMatcher, } from "../util/nodeMatchers"; -import { - NodeMatcherAlternative, - ScopeType, - SnippetName, -} from "../typings/Types"; -import { SnippetString } from "vscode"; +import { NodeMatcherAlternative, ScopeType } from "../typings/Types"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-java/master/src/node-types.json | jq '[.[] | select(.type == "statement" or .type == "declaration") | .subtypes[].type]' @@ -72,17 +67,4 @@ const nodeMatchers: Partial> = { argumentOrParameter: argumentMatcher("formal_parameters", "argument_list"), }; -export const patternMatchers = createPatternMatchers(nodeMatchers); - -export const snippets: Partial> = { - tryCatchStatement: new SnippetString( - "try {\n\t$TM_SELECTED_TEXT\n} catch ($1) {\n\t$0\n}" - ), - ifStatement: new SnippetString("if ($1) {\n\t$TM_SELECTED_TEXT\n}"), - ifElseStatementIfBranch: new SnippetString( - "if ($1) {\n\t$TM_SELECTED_TEXT\n} else {\n\t$0\n}" - ), - ifElseStatementElseBranch: new SnippetString( - "if ($1) {\n\t$0\n} else {\n\t$TM_SELECTED_TEXT\n}" - ), -}; +export default createPatternMatchers(nodeMatchers); diff --git a/src/languages/python.ts b/src/languages/python.ts index d596691d41..824c9d4df0 100644 --- a/src/languages/python.ts +++ b/src/languages/python.ts @@ -7,12 +7,7 @@ import { cascadingMatcher, patternMatcher, } from "../util/nodeMatchers"; -import { - NodeMatcherAlternative, - ScopeType, - SnippetName, -} from "../typings/Types"; -import { SnippetString } from "vscode"; +import { NodeMatcherAlternative, ScopeType } from "../typings/Types"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-python/d6210ceab11e8d812d4ab59c07c81458ec6e5184/src/node-types.json \ @@ -78,17 +73,4 @@ const nodeMatchers: Partial> = { argumentOrParameter: argumentMatcher("parameters", "argument_list"), }; -export const patternMatchers = createPatternMatchers(nodeMatchers); - -export const snippets: Partial> = { - tryCatchStatement: new SnippetString( - "try:\n\t$TM_SELECTED_TEXT\nexcept $1:\n\t$0" - ), - ifStatement: new SnippetString("if $1:\n\t$TM_SELECTED_TEXT"), - ifElseStatementIfBranch: new SnippetString( - "if $1:\n\t$TM_SELECTED_TEXT\nelse:\n\t$0" - ), - ifElseStatementElseBranch: new SnippetString( - "if $1:\n\t$0\nelse:\n\t$TM_SELECTED_TEXT" - ), -}; +export default createPatternMatchers(nodeMatchers); diff --git a/src/languages/typescript.ts b/src/languages/typescript.ts index 90ad4d6b9f..f60a79d3bf 100644 --- a/src/languages/typescript.ts +++ b/src/languages/typescript.ts @@ -11,11 +11,9 @@ import { NodeMatcherAlternative, ScopeType, SelectionWithEditor, - SnippetName, } from "../typings/Types"; import { selectWithLeadingDelimiter } from "../util/nodeSelectors"; import { patternFinder } from "../util/nodeFinders"; -import { SnippetString } from "vscode"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-typescript/4c20b54771e4b390ee058af2930feb2cd55f2bf8/typescript/src/node-types.json \ @@ -172,17 +170,4 @@ const nodeMatchers: Partial> = { xmlEndTag: getEndTag, }; -export const patternMatchers = createPatternMatchers(nodeMatchers); - -export const snippets: Partial> = { - tryCatchStatement: new SnippetString( - "try {\n\t$TM_SELECTED_TEXT\n} catch ($1) {\n\t$0\n}" - ), - ifStatement: new SnippetString("if ($1) {\n\t$TM_SELECTED_TEXT\n}"), - ifElseStatementIfBranch: new SnippetString( - "if ($1) {\n\t$TM_SELECTED_TEXT\n} else {\n\t$0\n}" - ), - ifElseStatementElseBranch: new SnippetString( - "if ($1) {\n\t$0\n} else {\n\t$TM_SELECTED_TEXT\n}" - ), -}; +export default createPatternMatchers(nodeMatchers); diff --git a/src/test/suite/fixtures/recorded/inference/bringOddToLine.yml b/src/test/suite/fixtures/recorded/inference/bringOddToLine.yml index e6561cfad0..5e02da4c70 100644 --- a/src/test/suite/fixtures/recorded/inference/bringOddToLine.yml +++ b/src/test/suite/fixtures/recorded/inference/bringOddToLine.yml @@ -4,51 +4,33 @@ command: actionName: replaceWithTarget partialTargets: - type: primitive - mark: { type: decoratedSymbol, symbolColor: default, character: o } - - { type: primitive, selectionType: line } + mark: {type: decoratedSymbol, symbolColor: default, character: o} + - {type: primitive, selectionType: line} extraArgs: [] marks: default.o: - start: { line: 0, character: 0 } - end: { line: 0, character: 5 } + start: {line: 0, character: 0} + end: {line: 0, character: 5} initialState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 2, character: 18 } - active: { line: 2, character: 18 } + - anchor: {line: 2, character: 18} + active: {line: 2, character: 18} finalState: documentContents: |- const foo = "hello"; const selections: - - anchor: { line: 2, character: 5 } - active: { line: 2, character: 5 } + - anchor: {line: 2, character: 5} + active: {line: 2, character: 5} thatMark: - - anchor: { line: 2, character: 0 } - active: { line: 2, character: 5 } + - anchor: {line: 2, character: 0} + active: {line: 2, character: 5} sourceMark: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 5 } -fullTargets: - [ - { - type: primitive, - mark: { type: decoratedSymbol, symbolColor: default, character: o }, - selectionType: token, - position: contents, - insideOutsideType: null, - modifier: { type: identity }, - }, - { - type: primitive, - mark: { type: cursor }, - selectionType: line, - position: contents, - insideOutsideType: null, - modifier: { type: identity }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 0, character: 5} +fullTargets: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: o}, selectionType: token, position: contents, insideOutsideType: null, modifier: {type: identity}}, {type: primitive, mark: {type: cursor}, selectionType: line, position: contents, insideOutsideType: null, modifier: {type: identity}}] diff --git a/src/test/suite/fixtures/recorded/inference/bringOddToState.yml b/src/test/suite/fixtures/recorded/inference/bringOddToState.yml index ebbd5b66e3..48b8b02800 100644 --- a/src/test/suite/fixtures/recorded/inference/bringOddToState.yml +++ b/src/test/suite/fixtures/recorded/inference/bringOddToState.yml @@ -4,54 +4,34 @@ command: actionName: replaceWithTarget partialTargets: - type: primitive - mark: { type: decoratedSymbol, symbolColor: default, character: o } + mark: {type: decoratedSymbol, symbolColor: default, character: o} - type: primitive - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false } + modifier: {type: containingScope, scopeType: statement, includeSiblings: false} extraArgs: [] marks: default.o: - start: { line: 0, character: 0 } - end: { line: 0, character: 5 } + start: {line: 0, character: 0} + end: {line: 0, character: 5} initialState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 2, character: 18 } - active: { line: 2, character: 18 } + - anchor: {line: 2, character: 18} + active: {line: 2, character: 18} finalState: documentContents: |- const foo = "hello"; const selections: - - anchor: { line: 2, character: 5 } - active: { line: 2, character: 5 } + - anchor: {line: 2, character: 5} + active: {line: 2, character: 5} thatMark: - - anchor: { line: 2, character: 0 } - active: { line: 2, character: 5 } + - anchor: {line: 2, character: 0} + active: {line: 2, character: 5} sourceMark: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 5 } -fullTargets: - [ - { - type: primitive, - mark: { type: decoratedSymbol, symbolColor: default, character: o }, - selectionType: token, - position: contents, - insideOutsideType: null, - modifier: { type: identity }, - }, - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: null, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 0, character: 5} +fullTargets: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: o}, selectionType: token, position: contents, insideOutsideType: null, modifier: {type: identity}}, {type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: null, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/inference/bringOddToToken.yml b/src/test/suite/fixtures/recorded/inference/bringOddToToken.yml index d832d75a0b..6d827359e5 100644 --- a/src/test/suite/fixtures/recorded/inference/bringOddToToken.yml +++ b/src/test/suite/fixtures/recorded/inference/bringOddToToken.yml @@ -4,51 +4,33 @@ command: actionName: replaceWithTarget partialTargets: - type: primitive - mark: { type: decoratedSymbol, symbolColor: default, character: o } - - { type: primitive, selectionType: token } + mark: {type: decoratedSymbol, symbolColor: default, character: o} + - {type: primitive, selectionType: token} extraArgs: [] marks: default.o: - start: { line: 0, character: 0 } - end: { line: 0, character: 5 } + start: {line: 0, character: 0} + end: {line: 0, character: 5} initialState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 2, character: 18 } - active: { line: 2, character: 18 } + - anchor: {line: 2, character: 18} + active: {line: 2, character: 18} finalState: documentContents: |- const foo = "hello"; const bar = "const"; selections: - - anchor: { line: 2, character: 18 } - active: { line: 2, character: 18 } + - anchor: {line: 2, character: 18} + active: {line: 2, character: 18} thatMark: - - anchor: { line: 2, character: 13 } - active: { line: 2, character: 18 } + - anchor: {line: 2, character: 13} + active: {line: 2, character: 18} sourceMark: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 5 } -fullTargets: - [ - { - type: primitive, - mark: { type: decoratedSymbol, symbolColor: default, character: o }, - selectionType: token, - position: contents, - insideOutsideType: null, - modifier: { type: identity }, - }, - { - type: primitive, - mark: { type: cursorToken }, - selectionType: token, - position: contents, - insideOutsideType: null, - modifier: { type: identity }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 0, character: 5} +fullTargets: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: o}, selectionType: token, position: contents, insideOutsideType: null, modifier: {type: identity}}, {type: primitive, mark: {type: cursorToken}, selectionType: token, position: contents, insideOutsideType: null, modifier: {type: identity}}] diff --git a/src/test/suite/fixtures/recorded/inference/takeOddPastEndOfState.yml b/src/test/suite/fixtures/recorded/inference/takeOddPastEndOfState.yml index 7c381cbc4e..f0387c468d 100644 --- a/src/test/suite/fixtures/recorded/inference/takeOddPastEndOfState.yml +++ b/src/test/suite/fixtures/recorded/inference/takeOddPastEndOfState.yml @@ -6,71 +6,36 @@ command: - type: range start: type: primitive - mark: { type: decoratedSymbol, symbolColor: default, character: o } + mark: {type: decoratedSymbol, symbolColor: default, character: o} end: type: primitive position: after insideOutsideType: inside - modifier: - { - type: containingScope, - scopeType: statement, - includeSiblings: false, - } + modifier: {type: containingScope, scopeType: statement, includeSiblings: false} excludeStart: false excludeEnd: false extraArgs: [] marks: default.o: - start: { line: 0, character: 0 } - end: { line: 0, character: 5 } + start: {line: 0, character: 0} + end: {line: 0, character: 5} initialState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 2, character: 18 } - active: { line: 2, character: 18 } + - anchor: {line: 2, character: 18} + active: {line: 2, character: 18} finalState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 20 } + - anchor: {line: 0, character: 0} + active: {line: 0, character: 20} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 20 } -fullTargets: - [ - { - type: range, - excludeAnchor: false, - excludeActive: false, - anchor: - { - type: primitive, - mark: { type: decoratedSymbol, symbolColor: default, character: o }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: { type: identity }, - }, - active: - { - type: primitive, - mark: { type: decoratedSymbol, symbolColor: default, character: o }, - selectionType: token, - position: after, - insideOutsideType: inside, - modifier: - { - type: containingScope, - scopeType: statement, - includeSiblings: false, - }, - }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 0, character: 20} +fullTargets: [{type: range, excludeAnchor: false, excludeActive: false, anchor: {type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: o}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: identity}}, active: {type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: o}, selectionType: token, position: after, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}}] diff --git a/src/test/suite/fixtures/recorded/inference/takeOddPastLine.yml b/src/test/suite/fixtures/recorded/inference/takeOddPastLine.yml index e32c69a870..ea955fcf7d 100644 --- a/src/test/suite/fixtures/recorded/inference/takeOddPastLine.yml +++ b/src/test/suite/fixtures/recorded/inference/takeOddPastLine.yml @@ -6,57 +6,32 @@ command: - type: range start: type: primitive - mark: { type: decoratedSymbol, symbolColor: default, character: o } - end: { type: primitive, selectionType: line } + mark: {type: decoratedSymbol, symbolColor: default, character: o} + end: {type: primitive, selectionType: line} excludeStart: false excludeEnd: false extraArgs: [] marks: default.o: - start: { line: 0, character: 0 } - end: { line: 0, character: 5 } + start: {line: 0, character: 0} + end: {line: 0, character: 5} initialState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 2, character: 18 } - active: { line: 2, character: 18 } + - anchor: {line: 2, character: 18} + active: {line: 2, character: 18} finalState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 20 } + - anchor: {line: 0, character: 0} + active: {line: 2, character: 20} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 20 } -fullTargets: - [ - { - type: range, - excludeAnchor: false, - excludeActive: false, - anchor: - { - type: primitive, - mark: { type: decoratedSymbol, symbolColor: default, character: o }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: { type: identity }, - }, - active: - { - type: primitive, - mark: { type: cursor }, - selectionType: line, - position: contents, - insideOutsideType: inside, - modifier: { type: identity }, - }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 20} +fullTargets: [{type: range, excludeAnchor: false, excludeActive: false, anchor: {type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: o}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: identity}}, active: {type: primitive, mark: {type: cursor}, selectionType: line, position: contents, insideOutsideType: inside, modifier: {type: identity}}}] diff --git a/src/test/suite/fixtures/recorded/inference/takeOddPastState.yml b/src/test/suite/fixtures/recorded/inference/takeOddPastState.yml index 7d34dbaf64..0680bddeae 100644 --- a/src/test/suite/fixtures/recorded/inference/takeOddPastState.yml +++ b/src/test/suite/fixtures/recorded/inference/takeOddPastState.yml @@ -6,69 +6,34 @@ command: - type: range start: type: primitive - mark: { type: decoratedSymbol, symbolColor: default, character: o } + mark: {type: decoratedSymbol, symbolColor: default, character: o} end: type: primitive - modifier: - { - type: containingScope, - scopeType: statement, - includeSiblings: false, - } + modifier: {type: containingScope, scopeType: statement, includeSiblings: false} excludeStart: false excludeEnd: false extraArgs: [] marks: default.o: - start: { line: 0, character: 0 } - end: { line: 0, character: 5 } + start: {line: 0, character: 0} + end: {line: 0, character: 5} initialState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 2, character: 18 } - active: { line: 2, character: 18 } + - anchor: {line: 2, character: 18} + active: {line: 2, character: 18} finalState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 20 } + - anchor: {line: 0, character: 0} + active: {line: 2, character: 20} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 20 } -fullTargets: - [ - { - type: range, - excludeAnchor: false, - excludeActive: false, - anchor: - { - type: primitive, - mark: { type: decoratedSymbol, symbolColor: default, character: o }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: { type: identity }, - }, - active: - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { - type: containingScope, - scopeType: statement, - includeSiblings: false, - }, - }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 20} +fullTargets: [{type: range, excludeAnchor: false, excludeActive: false, anchor: {type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: o}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: identity}}, active: {type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}}] diff --git a/src/test/suite/fixtures/recorded/inference/takeOddPastToken.yml b/src/test/suite/fixtures/recorded/inference/takeOddPastToken.yml index 88ab411deb..717de5f597 100644 --- a/src/test/suite/fixtures/recorded/inference/takeOddPastToken.yml +++ b/src/test/suite/fixtures/recorded/inference/takeOddPastToken.yml @@ -6,57 +6,32 @@ command: - type: range start: type: primitive - mark: { type: decoratedSymbol, symbolColor: default, character: o } - end: { type: primitive, selectionType: token } + mark: {type: decoratedSymbol, symbolColor: default, character: o} + end: {type: primitive, selectionType: token} excludeStart: false excludeEnd: false extraArgs: [] marks: default.o: - start: { line: 0, character: 0 } - end: { line: 0, character: 5 } + start: {line: 0, character: 0} + end: {line: 0, character: 5} initialState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 2, character: 18 } - active: { line: 2, character: 18 } + - anchor: {line: 2, character: 18} + active: {line: 2, character: 18} finalState: documentContents: |- const foo = "hello"; const bar = "hello"; selections: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 18 } + - anchor: {line: 0, character: 0} + active: {line: 2, character: 18} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 18 } -fullTargets: - [ - { - type: range, - excludeAnchor: false, - excludeActive: false, - anchor: - { - type: primitive, - mark: { type: decoratedSymbol, symbolColor: default, character: o }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: { type: identity }, - }, - active: - { - type: primitive, - mark: { type: cursorToken }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: { type: identity }, - }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 18} +fullTargets: [{type: range, excludeAnchor: false, excludeActive: false, anchor: {type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: o}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: identity}}, active: {type: primitive, mark: {type: cursorToken}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: identity}}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml index aa7f3a0e6e..e97efa8048 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifElseStatementElseBranch] + extraArgs: [cursorless.wrappers.ifElseStatementElseBranch] marks: {} initialState: documentContents: int foo = 0; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml index 0d0864c896..a46fb8bda6 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifElseStatementIfBranch] + extraArgs: [cursorless.wrappers.ifElseStatementIfBranch] marks: {} initialState: documentContents: int foo = 0; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml index 4599c44816..7381d6b65c 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifStatement] + extraArgs: [cursorless.wrappers.ifStatement] marks: {} initialState: documentContents: int foo = 0; @@ -20,4 +20,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml index d6c5b8b131..2aa91b64f2 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [tryCatchStatement] + extraArgs: [cursorless.wrappers.tryCatchStatement] marks: {} initialState: documentContents: int foo = 0; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 2, character: 9} active: {line: 2, character: 9} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml index eed1506d2d..6d8dfe24a1 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [tryCatchStatement] + extraArgs: [cursorless.wrappers.tryCatchStatement] marks: {} initialState: documentContents: |- @@ -39,4 +39,9 @@ finalState: active: {line: 10, character: 9} - anchor: {line: 4, character: 9} active: {line: 4, character: 9} + thatMark: + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml index 12a5b32c21..febd815ae5 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifElseStatementElseBranch] + extraArgs: [cursorless.wrappers.ifElseStatementElseBranch] marks: {} initialState: documentContents: int foo = 0; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml index ef77c34678..9dd5be1282 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifElseStatementIfBranch] + extraArgs: [cursorless.wrappers.ifElseStatementIfBranch] marks: {} initialState: documentContents: int foo = 0; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml index a36bbd1a1e..7ed80f880c 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifStatement] + extraArgs: [cursorless.wrappers.ifStatement] marks: {} initialState: documentContents: int foo = 0; @@ -20,4 +20,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml index 3363231c93..639dae0017 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [tryCatchStatement] + extraArgs: [cursorless.wrappers.tryCatchStatement] marks: {} initialState: documentContents: int foo = 0; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 2, character: 9} active: {line: 2, character: 9} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml index 0af3be588f..b6938c49ad 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [tryCatchStatement] + extraArgs: [cursorless.wrappers.tryCatchStatement] marks: {} initialState: documentContents: |- @@ -39,4 +39,9 @@ finalState: active: {line: 10, character: 9} - anchor: {line: 4, character: 9} active: {line: 4, character: 9} + thatMark: + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml index 170ab59454..a4f17515b0 100644 --- a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifElseStatementElseBranch] + extraArgs: [cursorless.wrappers.ifElseStatementElseBranch] marks: {} initialState: documentContents: int foo = 0; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml index d91dc1e30d..a9b5f9f429 100644 --- a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifElseStatementIfBranch] + extraArgs: [cursorless.wrappers.ifElseStatementIfBranch] marks: {} initialState: documentContents: int foo = 0; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml index 3c46a27ba7..fd5b749bc2 100644 --- a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifStatement] + extraArgs: [cursorless.wrappers.ifStatement] marks: {} initialState: documentContents: int foo = 0; @@ -20,4 +20,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml index 815b9ca24d..d638d27cde 100644 --- a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [tryCatchStatement] + extraArgs: [cursorless.wrappers.tryCatchStatement] marks: {} initialState: documentContents: int foo = 0; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 2, character: 9} active: {line: 2, character: 9} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml index 18029ef956..9c2adca7b5 100644 --- a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [tryCatchStatement] + extraArgs: [cursorless.wrappers.tryCatchStatement] marks: {} initialState: documentContents: |- @@ -39,4 +39,9 @@ finalState: active: {line: 10, character: 9} - anchor: {line: 4, character: 9} active: {line: 4, character: 9} + thatMark: + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml index 164203c7fd..7bd547e53f 100644 --- a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifElseStatementElseBranch] + extraArgs: [cursorless.wrappers.ifElseStatementElseBranch] marks: {} initialState: documentContents: foo = "hello" @@ -21,4 +21,7 @@ finalState: selections: - anchor: {line: 0, character: 3} active: {line: 0, character: 3} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 3, character: 17} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml index ea9c16feb3..f869d39a57 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifElseStatementIfBranch] + extraArgs: [cursorless.wrappers.ifElseStatementIfBranch] marks: {} initialState: documentContents: foo = "hello" @@ -21,4 +21,7 @@ finalState: selections: - anchor: {line: 0, character: 3} active: {line: 0, character: 3} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 3, character: 4} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml index a86e2fae3b..831ee25426 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifStatement] + extraArgs: [cursorless.wrappers.ifStatement] marks: {} initialState: documentContents: foo = "hello" @@ -19,4 +19,7 @@ finalState: selections: - anchor: {line: 0, character: 3} active: {line: 0, character: 3} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 1, character: 17} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml index 25ec1eafe9..7018ec4df1 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [tryCatchStatement] + extraArgs: [cursorless.wrappers.tryCatchStatement] marks: {} initialState: documentContents: foo = "hello" @@ -21,4 +21,7 @@ finalState: selections: - anchor: {line: 2, character: 7} active: {line: 2, character: 7} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 3, character: 4} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml index 6a31f245fd..f485628a00 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [tryCatchStatement] + extraArgs: [cursorless.wrappers.tryCatchStatement] marks: {} initialState: documentContents: |- @@ -35,4 +35,9 @@ finalState: active: {line: 8, character: 7} - anchor: {line: 3, character: 7} active: {line: 3, character: 7} + thatMark: + - anchor: {line: 6, character: 0} + active: {line: 9, character: 4} + - anchor: {line: 0, character: 0} + active: {line: 4, character: 4} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml index a585f09aee..5670277bef 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifElseStatementElseBranch] + extraArgs: [cursorless.wrappers.ifElseStatementElseBranch] marks: {} initialState: documentContents: const foo = "hello"; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml index d182ded181..66ba292df2 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifElseStatementIfBranch] + extraArgs: [cursorless.wrappers.ifElseStatementIfBranch] marks: {} initialState: documentContents: const foo = "hello"; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml index d82562c0f3..3c83a61073 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [ifStatement] + extraArgs: [cursorless.wrappers.ifStatement] marks: {} initialState: documentContents: const foo = "hello"; @@ -20,4 +20,7 @@ finalState: selections: - anchor: {line: 0, character: 4} active: {line: 0, character: 4} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml index 7e03dca9fa..e4109e201d 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [tryCatchStatement] + extraArgs: [cursorless.wrappers.tryCatchStatement] marks: {} initialState: documentContents: const foo = "hello"; @@ -22,4 +22,7 @@ finalState: selections: - anchor: {line: 2, character: 9} active: {line: 2, character: 9} + thatMark: + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml index 616c215070..2eba0d47f9 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml @@ -5,7 +5,7 @@ command: partialTargets: - type: primitive mark: {type: cursor} - extraArgs: [tryCatchStatement] + extraArgs: [cursorless.wrappers.tryCatchStatement] marks: {} initialState: documentContents: |- @@ -39,4 +39,9 @@ finalState: active: {line: 10, character: 9} - anchor: {line: 4, character: 9} active: {line: 4, character: 9} + thatMark: + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 9b7d9ddc13..1aba830eca 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -1,4 +1,5 @@ import * as assert from "assert"; +import serialize from "../../testUtil/serialize"; import { promises as fsp } from "fs"; import * as path from "path"; import * as yaml from "js-yaml"; @@ -59,6 +60,12 @@ async function runTest(file: string) { }); const editor = await vscode.window.showTextDocument(document); + if (!fixture.initialState.documentContents.includes("\n")) { + await editor.edit((editBuilder) => { + editBuilder.setEndOfLine(vscode.EndOfLine.LF); + }); + } + await parseTreeApi.loadLanguage(document.languageId); editor.selections = fixture.initialState.selections.map(createSelection); @@ -118,15 +125,20 @@ async function runTest(file: string) { excludeFields ); - assert.deepStrictEqual( - resultState, - fixture.finalState, - "Unexpected final state" - ); + if (process.env.CURSORLESS_TEST_UPDATE_FIXTURES === "true") { + const outputFixture = { ...fixture, finalState: resultState, returnValue }; + await fsp.writeFile(file, serialize(outputFixture)); + } else { + assert.deepStrictEqual( + resultState, + fixture.finalState, + "Unexpected final state" + ); - assert.deepStrictEqual( - returnValue, - fixture.returnValue, - "Unexpected return value" - ); + assert.deepStrictEqual( + returnValue, + fixture.returnValue, + "Unexpected return value" + ); + } } diff --git a/src/typings/Types.ts b/src/typings/Types.ts index 5ce6bd45ea..d5a64edcf2 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -1,6 +1,6 @@ import { SyntaxNode } from "web-tree-sitter"; import * as vscode from "vscode"; -import { Location } from "vscode"; +import { Location, Selection } from "vscode"; import { HatStyleName } from "../core/constants"; import { EditStyles } from "../core/editStyles"; import NavigationMap from "../core/NavigationMap"; @@ -274,7 +274,12 @@ export interface ActionReturnValue { export interface Action { run(targets: TypedSelection[][], ...args: any[]): Promise; - targetPreferences: ActionPreferences[]; + + /** + * Used to define default values for parts of target during inference. + * @param args Extra args to command + */ + getTargetPreferences(...args: any[]): ActionPreferences[]; } export type ActionType = @@ -315,12 +320,6 @@ export type ActionType = | "wrapWithPairedDelimiter" | "wrapWithSnippet"; -export type SnippetName = - | "ifElseStatementElseBranch" - | "ifElseStatementIfBranch" - | "ifStatement" - | "tryCatchStatement"; - export type ActionRecord = Record; export interface Graph { diff --git a/src/util/updateSelections.ts b/src/util/updateSelections.ts index 3e3d6e1531..14309d6066 100644 --- a/src/util/updateSelections.ts +++ b/src/util/updateSelections.ts @@ -148,7 +148,7 @@ class SelectionUpdater { * @returns The initial selections updated based upon what happened in the function */ export async function callFunctionAndUpdateSelections( - func: () => Thenable, + func: () => Thenable, editor: TextEditor, selectionMatrix: Selection[][] ): Promise { diff --git a/src/vendor/charCode.ts b/src/vendor/charCode.ts new file mode 100644 index 0000000000..0e69131699 --- /dev/null +++ b/src/vendor/charCode.ts @@ -0,0 +1,436 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See https://github.com/microsoft/vscode/blob/d31496c866683bdbccfc85bc11a3107d6c789b52/LICENSE.txt + *--------------------------------------------------------------------------------------------*/ +// From https://raw.githubusercontent.com/microsoft/vscode/d31496c866683bdbccfc85bc11a3107d6c789b52/src/vs/base/common/charCode.ts + +// Names from https://blog.codinghorror.com/ascii-pronunciation-rules-for-programmers/ + +/** + * An inlined enum containing useful character codes (to be used with String.charCodeAt). + * Please leave the const keyword such that it gets inlined when compiled to JavaScript! + */ +export const enum CharCode { + Null = 0, + /** + * The `\b` character. + */ + Backspace = 8, + /** + * The `\t` character. + */ + Tab = 9, + /** + * The `\n` character. + */ + LineFeed = 10, + /** + * The `\r` character. + */ + CarriageReturn = 13, + Space = 32, + /** + * The `!` character. + */ + ExclamationMark = 33, + /** + * The `"` character. + */ + DoubleQuote = 34, + /** + * The `#` character. + */ + Hash = 35, + /** + * The `$` character. + */ + DollarSign = 36, + /** + * The `%` character. + */ + PercentSign = 37, + /** + * The `&` character. + */ + Ampersand = 38, + /** + * The `'` character. + */ + SingleQuote = 39, + /** + * The `(` character. + */ + OpenParen = 40, + /** + * The `)` character. + */ + CloseParen = 41, + /** + * The `*` character. + */ + Asterisk = 42, + /** + * The `+` character. + */ + Plus = 43, + /** + * The `,` character. + */ + Comma = 44, + /** + * The `-` character. + */ + Dash = 45, + /** + * The `.` character. + */ + Period = 46, + /** + * The `/` character. + */ + Slash = 47, + + Digit0 = 48, + Digit1 = 49, + Digit2 = 50, + Digit3 = 51, + Digit4 = 52, + Digit5 = 53, + Digit6 = 54, + Digit7 = 55, + Digit8 = 56, + Digit9 = 57, + + /** + * The `:` character. + */ + Colon = 58, + /** + * The `;` character. + */ + Semicolon = 59, + /** + * The `<` character. + */ + LessThan = 60, + /** + * The `=` character. + */ + Equals = 61, + /** + * The `>` character. + */ + GreaterThan = 62, + /** + * The `?` character. + */ + QuestionMark = 63, + /** + * The `@` character. + */ + AtSign = 64, + + A = 65, + B = 66, + C = 67, + D = 68, + E = 69, + F = 70, + G = 71, + H = 72, + I = 73, + J = 74, + K = 75, + L = 76, + M = 77, + N = 78, + O = 79, + P = 80, + Q = 81, + R = 82, + S = 83, + T = 84, + U = 85, + V = 86, + W = 87, + X = 88, + Y = 89, + Z = 90, + + /** + * The `[` character. + */ + OpenSquareBracket = 91, + /** + * The `\` character. + */ + Backslash = 92, + /** + * The `]` character. + */ + CloseSquareBracket = 93, + /** + * The `^` character. + */ + Caret = 94, + /** + * The `_` character. + */ + Underline = 95, + /** + * The ``(`)`` character. + */ + BackTick = 96, + + a = 97, + b = 98, + c = 99, + d = 100, + e = 101, + f = 102, + g = 103, + h = 104, + i = 105, + j = 106, + k = 107, + l = 108, + m = 109, + n = 110, + o = 111, + p = 112, + q = 113, + r = 114, + s = 115, + t = 116, + u = 117, + v = 118, + w = 119, + x = 120, + y = 121, + z = 122, + + /** + * The `{` character. + */ + OpenCurlyBrace = 123, + /** + * The `|` character. + */ + Pipe = 124, + /** + * The `}` character. + */ + CloseCurlyBrace = 125, + /** + * The `~` character. + */ + Tilde = 126, + + U_Combining_Grave_Accent = 0x0300, // U+0300 Combining Grave Accent + U_Combining_Acute_Accent = 0x0301, // U+0301 Combining Acute Accent + U_Combining_Circumflex_Accent = 0x0302, // U+0302 Combining Circumflex Accent + U_Combining_Tilde = 0x0303, // U+0303 Combining Tilde + U_Combining_Macron = 0x0304, // U+0304 Combining Macron + U_Combining_Overline = 0x0305, // U+0305 Combining Overline + U_Combining_Breve = 0x0306, // U+0306 Combining Breve + U_Combining_Dot_Above = 0x0307, // U+0307 Combining Dot Above + U_Combining_Diaeresis = 0x0308, // U+0308 Combining Diaeresis + U_Combining_Hook_Above = 0x0309, // U+0309 Combining Hook Above + U_Combining_Ring_Above = 0x030A, // U+030A Combining Ring Above + U_Combining_Double_Acute_Accent = 0x030B, // U+030B Combining Double Acute Accent + U_Combining_Caron = 0x030C, // U+030C Combining Caron + U_Combining_Vertical_Line_Above = 0x030D, // U+030D Combining Vertical Line Above + U_Combining_Double_Vertical_Line_Above = 0x030E, // U+030E Combining Double Vertical Line Above + U_Combining_Double_Grave_Accent = 0x030F, // U+030F Combining Double Grave Accent + U_Combining_Candrabindu = 0x0310, // U+0310 Combining Candrabindu + U_Combining_Inverted_Breve = 0x0311, // U+0311 Combining Inverted Breve + U_Combining_Turned_Comma_Above = 0x0312, // U+0312 Combining Turned Comma Above + U_Combining_Comma_Above = 0x0313, // U+0313 Combining Comma Above + U_Combining_Reversed_Comma_Above = 0x0314, // U+0314 Combining Reversed Comma Above + U_Combining_Comma_Above_Right = 0x0315, // U+0315 Combining Comma Above Right + U_Combining_Grave_Accent_Below = 0x0316, // U+0316 Combining Grave Accent Below + U_Combining_Acute_Accent_Below = 0x0317, // U+0317 Combining Acute Accent Below + U_Combining_Left_Tack_Below = 0x0318, // U+0318 Combining Left Tack Below + U_Combining_Right_Tack_Below = 0x0319, // U+0319 Combining Right Tack Below + U_Combining_Left_Angle_Above = 0x031A, // U+031A Combining Left Angle Above + U_Combining_Horn = 0x031B, // U+031B Combining Horn + U_Combining_Left_Half_Ring_Below = 0x031C, // U+031C Combining Left Half Ring Below + U_Combining_Up_Tack_Below = 0x031D, // U+031D Combining Up Tack Below + U_Combining_Down_Tack_Below = 0x031E, // U+031E Combining Down Tack Below + U_Combining_Plus_Sign_Below = 0x031F, // U+031F Combining Plus Sign Below + U_Combining_Minus_Sign_Below = 0x0320, // U+0320 Combining Minus Sign Below + U_Combining_Palatalized_Hook_Below = 0x0321, // U+0321 Combining Palatalized Hook Below + U_Combining_Retroflex_Hook_Below = 0x0322, // U+0322 Combining Retroflex Hook Below + U_Combining_Dot_Below = 0x0323, // U+0323 Combining Dot Below + U_Combining_Diaeresis_Below = 0x0324, // U+0324 Combining Diaeresis Below + U_Combining_Ring_Below = 0x0325, // U+0325 Combining Ring Below + U_Combining_Comma_Below = 0x0326, // U+0326 Combining Comma Below + U_Combining_Cedilla = 0x0327, // U+0327 Combining Cedilla + U_Combining_Ogonek = 0x0328, // U+0328 Combining Ogonek + U_Combining_Vertical_Line_Below = 0x0329, // U+0329 Combining Vertical Line Below + U_Combining_Bridge_Below = 0x032A, // U+032A Combining Bridge Below + U_Combining_Inverted_Double_Arch_Below = 0x032B, // U+032B Combining Inverted Double Arch Below + U_Combining_Caron_Below = 0x032C, // U+032C Combining Caron Below + U_Combining_Circumflex_Accent_Below = 0x032D, // U+032D Combining Circumflex Accent Below + U_Combining_Breve_Below = 0x032E, // U+032E Combining Breve Below + U_Combining_Inverted_Breve_Below = 0x032F, // U+032F Combining Inverted Breve Below + U_Combining_Tilde_Below = 0x0330, // U+0330 Combining Tilde Below + U_Combining_Macron_Below = 0x0331, // U+0331 Combining Macron Below + U_Combining_Low_Line = 0x0332, // U+0332 Combining Low Line + U_Combining_Double_Low_Line = 0x0333, // U+0333 Combining Double Low Line + U_Combining_Tilde_Overlay = 0x0334, // U+0334 Combining Tilde Overlay + U_Combining_Short_Stroke_Overlay = 0x0335, // U+0335 Combining Short Stroke Overlay + U_Combining_Long_Stroke_Overlay = 0x0336, // U+0336 Combining Long Stroke Overlay + U_Combining_Short_Solidus_Overlay = 0x0337, // U+0337 Combining Short Solidus Overlay + U_Combining_Long_Solidus_Overlay = 0x0338, // U+0338 Combining Long Solidus Overlay + U_Combining_Right_Half_Ring_Below = 0x0339, // U+0339 Combining Right Half Ring Below + U_Combining_Inverted_Bridge_Below = 0x033A, // U+033A Combining Inverted Bridge Below + U_Combining_Square_Below = 0x033B, // U+033B Combining Square Below + U_Combining_Seagull_Below = 0x033C, // U+033C Combining Seagull Below + U_Combining_X_Above = 0x033D, // U+033D Combining X Above + U_Combining_Vertical_Tilde = 0x033E, // U+033E Combining Vertical Tilde + U_Combining_Double_Overline = 0x033F, // U+033F Combining Double Overline + U_Combining_Grave_Tone_Mark = 0x0340, // U+0340 Combining Grave Tone Mark + U_Combining_Acute_Tone_Mark = 0x0341, // U+0341 Combining Acute Tone Mark + U_Combining_Greek_Perispomeni = 0x0342, // U+0342 Combining Greek Perispomeni + U_Combining_Greek_Koronis = 0x0343, // U+0343 Combining Greek Koronis + U_Combining_Greek_Dialytika_Tonos = 0x0344, // U+0344 Combining Greek Dialytika Tonos + U_Combining_Greek_Ypogegrammeni = 0x0345, // U+0345 Combining Greek Ypogegrammeni + U_Combining_Bridge_Above = 0x0346, // U+0346 Combining Bridge Above + U_Combining_Equals_Sign_Below = 0x0347, // U+0347 Combining Equals Sign Below + U_Combining_Double_Vertical_Line_Below = 0x0348, // U+0348 Combining Double Vertical Line Below + U_Combining_Left_Angle_Below = 0x0349, // U+0349 Combining Left Angle Below + U_Combining_Not_Tilde_Above = 0x034A, // U+034A Combining Not Tilde Above + U_Combining_Homothetic_Above = 0x034B, // U+034B Combining Homothetic Above + U_Combining_Almost_Equal_To_Above = 0x034C, // U+034C Combining Almost Equal To Above + U_Combining_Left_Right_Arrow_Below = 0x034D, // U+034D Combining Left Right Arrow Below + U_Combining_Upwards_Arrow_Below = 0x034E, // U+034E Combining Upwards Arrow Below + U_Combining_Grapheme_Joiner = 0x034F, // U+034F Combining Grapheme Joiner + U_Combining_Right_Arrowhead_Above = 0x0350, // U+0350 Combining Right Arrowhead Above + U_Combining_Left_Half_Ring_Above = 0x0351, // U+0351 Combining Left Half Ring Above + U_Combining_Fermata = 0x0352, // U+0352 Combining Fermata + U_Combining_X_Below = 0x0353, // U+0353 Combining X Below + U_Combining_Left_Arrowhead_Below = 0x0354, // U+0354 Combining Left Arrowhead Below + U_Combining_Right_Arrowhead_Below = 0x0355, // U+0355 Combining Right Arrowhead Below + U_Combining_Right_Arrowhead_And_Up_Arrowhead_Below = 0x0356, // U+0356 Combining Right Arrowhead And Up Arrowhead Below + U_Combining_Right_Half_Ring_Above = 0x0357, // U+0357 Combining Right Half Ring Above + U_Combining_Dot_Above_Right = 0x0358, // U+0358 Combining Dot Above Right + U_Combining_Asterisk_Below = 0x0359, // U+0359 Combining Asterisk Below + U_Combining_Double_Ring_Below = 0x035A, // U+035A Combining Double Ring Below + U_Combining_Zigzag_Above = 0x035B, // U+035B Combining Zigzag Above + U_Combining_Double_Breve_Below = 0x035C, // U+035C Combining Double Breve Below + U_Combining_Double_Breve = 0x035D, // U+035D Combining Double Breve + U_Combining_Double_Macron = 0x035E, // U+035E Combining Double Macron + U_Combining_Double_Macron_Below = 0x035F, // U+035F Combining Double Macron Below + U_Combining_Double_Tilde = 0x0360, // U+0360 Combining Double Tilde + U_Combining_Double_Inverted_Breve = 0x0361, // U+0361 Combining Double Inverted Breve + U_Combining_Double_Rightwards_Arrow_Below = 0x0362, // U+0362 Combining Double Rightwards Arrow Below + U_Combining_Latin_Small_Letter_A = 0x0363, // U+0363 Combining Latin Small Letter A + U_Combining_Latin_Small_Letter_E = 0x0364, // U+0364 Combining Latin Small Letter E + U_Combining_Latin_Small_Letter_I = 0x0365, // U+0365 Combining Latin Small Letter I + U_Combining_Latin_Small_Letter_O = 0x0366, // U+0366 Combining Latin Small Letter O + U_Combining_Latin_Small_Letter_U = 0x0367, // U+0367 Combining Latin Small Letter U + U_Combining_Latin_Small_Letter_C = 0x0368, // U+0368 Combining Latin Small Letter C + U_Combining_Latin_Small_Letter_D = 0x0369, // U+0369 Combining Latin Small Letter D + U_Combining_Latin_Small_Letter_H = 0x036A, // U+036A Combining Latin Small Letter H + U_Combining_Latin_Small_Letter_M = 0x036B, // U+036B Combining Latin Small Letter M + U_Combining_Latin_Small_Letter_R = 0x036C, // U+036C Combining Latin Small Letter R + U_Combining_Latin_Small_Letter_T = 0x036D, // U+036D Combining Latin Small Letter T + U_Combining_Latin_Small_Letter_V = 0x036E, // U+036E Combining Latin Small Letter V + U_Combining_Latin_Small_Letter_X = 0x036F, // U+036F Combining Latin Small Letter X + + /** + * Unicode Character 'LINE SEPARATOR' (U+2028) + * http://www.fileformat.info/info/unicode/char/2028/index.htm + */ + LINE_SEPARATOR = 0x2028, + /** + * Unicode Character 'PARAGRAPH SEPARATOR' (U+2029) + * http://www.fileformat.info/info/unicode/char/2029/index.htm + */ + PARAGRAPH_SEPARATOR = 0x2029, + /** + * Unicode Character 'NEXT LINE' (U+0085) + * http://www.fileformat.info/info/unicode/char/0085/index.htm + */ + NEXT_LINE = 0x0085, + + // http://www.fileformat.info/info/unicode/category/Sk/list.htm + U_CIRCUMFLEX = 0x005E, // U+005E CIRCUMFLEX + U_GRAVE_ACCENT = 0x0060, // U+0060 GRAVE ACCENT + U_DIAERESIS = 0x00A8, // U+00A8 DIAERESIS + U_MACRON = 0x00AF, // U+00AF MACRON + U_ACUTE_ACCENT = 0x00B4, // U+00B4 ACUTE ACCENT + U_CEDILLA = 0x00B8, // U+00B8 CEDILLA + U_MODIFIER_LETTER_LEFT_ARROWHEAD = 0x02C2, // U+02C2 MODIFIER LETTER LEFT ARROWHEAD + U_MODIFIER_LETTER_RIGHT_ARROWHEAD = 0x02C3, // U+02C3 MODIFIER LETTER RIGHT ARROWHEAD + U_MODIFIER_LETTER_UP_ARROWHEAD = 0x02C4, // U+02C4 MODIFIER LETTER UP ARROWHEAD + U_MODIFIER_LETTER_DOWN_ARROWHEAD = 0x02C5, // U+02C5 MODIFIER LETTER DOWN ARROWHEAD + U_MODIFIER_LETTER_CENTRED_RIGHT_HALF_RING = 0x02D2, // U+02D2 MODIFIER LETTER CENTRED RIGHT HALF RING + U_MODIFIER_LETTER_CENTRED_LEFT_HALF_RING = 0x02D3, // U+02D3 MODIFIER LETTER CENTRED LEFT HALF RING + U_MODIFIER_LETTER_UP_TACK = 0x02D4, // U+02D4 MODIFIER LETTER UP TACK + U_MODIFIER_LETTER_DOWN_TACK = 0x02D5, // U+02D5 MODIFIER LETTER DOWN TACK + U_MODIFIER_LETTER_PLUS_SIGN = 0x02D6, // U+02D6 MODIFIER LETTER PLUS SIGN + U_MODIFIER_LETTER_MINUS_SIGN = 0x02D7, // U+02D7 MODIFIER LETTER MINUS SIGN + U_BREVE = 0x02D8, // U+02D8 BREVE + U_DOT_ABOVE = 0x02D9, // U+02D9 DOT ABOVE + U_RING_ABOVE = 0x02DA, // U+02DA RING ABOVE + U_OGONEK = 0x02DB, // U+02DB OGONEK + U_SMALL_TILDE = 0x02DC, // U+02DC SMALL TILDE + U_DOUBLE_ACUTE_ACCENT = 0x02DD, // U+02DD DOUBLE ACUTE ACCENT + U_MODIFIER_LETTER_RHOTIC_HOOK = 0x02DE, // U+02DE MODIFIER LETTER RHOTIC HOOK + U_MODIFIER_LETTER_CROSS_ACCENT = 0x02DF, // U+02DF MODIFIER LETTER CROSS ACCENT + U_MODIFIER_LETTER_EXTRA_HIGH_TONE_BAR = 0x02E5, // U+02E5 MODIFIER LETTER EXTRA-HIGH TONE BAR + U_MODIFIER_LETTER_HIGH_TONE_BAR = 0x02E6, // U+02E6 MODIFIER LETTER HIGH TONE BAR + U_MODIFIER_LETTER_MID_TONE_BAR = 0x02E7, // U+02E7 MODIFIER LETTER MID TONE BAR + U_MODIFIER_LETTER_LOW_TONE_BAR = 0x02E8, // U+02E8 MODIFIER LETTER LOW TONE BAR + U_MODIFIER_LETTER_EXTRA_LOW_TONE_BAR = 0x02E9, // U+02E9 MODIFIER LETTER EXTRA-LOW TONE BAR + U_MODIFIER_LETTER_YIN_DEPARTING_TONE_MARK = 0x02EA, // U+02EA MODIFIER LETTER YIN DEPARTING TONE MARK + U_MODIFIER_LETTER_YANG_DEPARTING_TONE_MARK = 0x02EB, // U+02EB MODIFIER LETTER YANG DEPARTING TONE MARK + U_MODIFIER_LETTER_UNASPIRATED = 0x02ED, // U+02ED MODIFIER LETTER UNASPIRATED + U_MODIFIER_LETTER_LOW_DOWN_ARROWHEAD = 0x02EF, // U+02EF MODIFIER LETTER LOW DOWN ARROWHEAD + U_MODIFIER_LETTER_LOW_UP_ARROWHEAD = 0x02F0, // U+02F0 MODIFIER LETTER LOW UP ARROWHEAD + U_MODIFIER_LETTER_LOW_LEFT_ARROWHEAD = 0x02F1, // U+02F1 MODIFIER LETTER LOW LEFT ARROWHEAD + U_MODIFIER_LETTER_LOW_RIGHT_ARROWHEAD = 0x02F2, // U+02F2 MODIFIER LETTER LOW RIGHT ARROWHEAD + U_MODIFIER_LETTER_LOW_RING = 0x02F3, // U+02F3 MODIFIER LETTER LOW RING + U_MODIFIER_LETTER_MIDDLE_GRAVE_ACCENT = 0x02F4, // U+02F4 MODIFIER LETTER MIDDLE GRAVE ACCENT + U_MODIFIER_LETTER_MIDDLE_DOUBLE_GRAVE_ACCENT = 0x02F5, // U+02F5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT + U_MODIFIER_LETTER_MIDDLE_DOUBLE_ACUTE_ACCENT = 0x02F6, // U+02F6 MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT + U_MODIFIER_LETTER_LOW_TILDE = 0x02F7, // U+02F7 MODIFIER LETTER LOW TILDE + U_MODIFIER_LETTER_RAISED_COLON = 0x02F8, // U+02F8 MODIFIER LETTER RAISED COLON + U_MODIFIER_LETTER_BEGIN_HIGH_TONE = 0x02F9, // U+02F9 MODIFIER LETTER BEGIN HIGH TONE + U_MODIFIER_LETTER_END_HIGH_TONE = 0x02FA, // U+02FA MODIFIER LETTER END HIGH TONE + U_MODIFIER_LETTER_BEGIN_LOW_TONE = 0x02FB, // U+02FB MODIFIER LETTER BEGIN LOW TONE + U_MODIFIER_LETTER_END_LOW_TONE = 0x02FC, // U+02FC MODIFIER LETTER END LOW TONE + U_MODIFIER_LETTER_SHELF = 0x02FD, // U+02FD MODIFIER LETTER SHELF + U_MODIFIER_LETTER_OPEN_SHELF = 0x02FE, // U+02FE MODIFIER LETTER OPEN SHELF + U_MODIFIER_LETTER_LOW_LEFT_ARROW = 0x02FF, // U+02FF MODIFIER LETTER LOW LEFT ARROW + U_GREEK_LOWER_NUMERAL_SIGN = 0x0375, // U+0375 GREEK LOWER NUMERAL SIGN + U_GREEK_TONOS = 0x0384, // U+0384 GREEK TONOS + U_GREEK_DIALYTIKA_TONOS = 0x0385, // U+0385 GREEK DIALYTIKA TONOS + U_GREEK_KORONIS = 0x1FBD, // U+1FBD GREEK KORONIS + U_GREEK_PSILI = 0x1FBF, // U+1FBF GREEK PSILI + U_GREEK_PERISPOMENI = 0x1FC0, // U+1FC0 GREEK PERISPOMENI + U_GREEK_DIALYTIKA_AND_PERISPOMENI = 0x1FC1, // U+1FC1 GREEK DIALYTIKA AND PERISPOMENI + U_GREEK_PSILI_AND_VARIA = 0x1FCD, // U+1FCD GREEK PSILI AND VARIA + U_GREEK_PSILI_AND_OXIA = 0x1FCE, // U+1FCE GREEK PSILI AND OXIA + U_GREEK_PSILI_AND_PERISPOMENI = 0x1FCF, // U+1FCF GREEK PSILI AND PERISPOMENI + U_GREEK_DASIA_AND_VARIA = 0x1FDD, // U+1FDD GREEK DASIA AND VARIA + U_GREEK_DASIA_AND_OXIA = 0x1FDE, // U+1FDE GREEK DASIA AND OXIA + U_GREEK_DASIA_AND_PERISPOMENI = 0x1FDF, // U+1FDF GREEK DASIA AND PERISPOMENI + U_GREEK_DIALYTIKA_AND_VARIA = 0x1FED, // U+1FED GREEK DIALYTIKA AND VARIA + U_GREEK_DIALYTIKA_AND_OXIA = 0x1FEE, // U+1FEE GREEK DIALYTIKA AND OXIA + U_GREEK_VARIA = 0x1FEF, // U+1FEF GREEK VARIA + U_GREEK_OXIA = 0x1FFD, // U+1FFD GREEK OXIA + U_GREEK_DASIA = 0x1FFE, // U+1FFE GREEK DASIA + + + U_OVERLINE = 0x203E, // Unicode Character 'OVERLINE' + + /** + * UTF-8 BOM + * Unicode Character 'ZERO WIDTH NO-BREAK SPACE' (U+FEFF) + * http://www.fileformat.info/info/unicode/char/feff/index.htm + */ + UTF8_BOM = 65279 +} diff --git a/src/vendor/snippetParser.ts b/src/vendor/snippetParser.ts new file mode 100644 index 0000000000..350da2d931 --- /dev/null +++ b/src/vendor/snippetParser.ts @@ -0,0 +1,1083 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the MIT License. See https://github.com/microsoft/vscode/blob/d31496c866683bdbccfc85bc11a3107d6c789b52/LICENSE.txt + *--------------------------------------------------------------------------------------------*/ + // From https://raw.githubusercontent.com/microsoft/vscode/d31496c866683bdbccfc85bc11a3107d6c789b52/src/vs/editor/contrib/snippet/snippetParser.ts + +import { CharCode } from './charCode'; + +export const enum TokenType { + Dollar, + Colon, + Comma, + CurlyOpen, + CurlyClose, + Backslash, + Forwardslash, + Pipe, + Int, + VariableName, + Format, + Plus, + Dash, + QuestionMark, + EOF +} + +export interface Token { + type: TokenType; + pos: number; + len: number; +} + + +export class Scanner { + + private static _table: { [ch: number]: TokenType } = { + [CharCode.DollarSign]: TokenType.Dollar, + [CharCode.Colon]: TokenType.Colon, + [CharCode.Comma]: TokenType.Comma, + [CharCode.OpenCurlyBrace]: TokenType.CurlyOpen, + [CharCode.CloseCurlyBrace]: TokenType.CurlyClose, + [CharCode.Backslash]: TokenType.Backslash, + [CharCode.Slash]: TokenType.Forwardslash, + [CharCode.Pipe]: TokenType.Pipe, + [CharCode.Plus]: TokenType.Plus, + [CharCode.Dash]: TokenType.Dash, + [CharCode.QuestionMark]: TokenType.QuestionMark, + }; + + static isDigitCharacter(ch: number): boolean { + return ch >= CharCode.Digit0 && ch <= CharCode.Digit9; + } + + static isVariableCharacter(ch: number): boolean { + return ch === CharCode.Underline + || (ch >= CharCode.a && ch <= CharCode.z) + || (ch >= CharCode.A && ch <= CharCode.Z); + } + + value: string = ''; + pos: number = 0; + + text(value: string) { + this.value = value; + this.pos = 0; + } + + tokenText(token: Token): string { + return this.value.substr(token.pos, token.len); + } + + next(): Token { + + if (this.pos >= this.value.length) { + return { type: TokenType.EOF, pos: this.pos, len: 0 }; + } + + let pos = this.pos; + let len = 0; + let ch = this.value.charCodeAt(pos); + let type: TokenType; + + // static types + type = Scanner._table[ch]; + if (typeof type === 'number') { + this.pos += 1; + return { type, pos, len: 1 }; + } + + // number + if (Scanner.isDigitCharacter(ch)) { + type = TokenType.Int; + do { + len += 1; + ch = this.value.charCodeAt(pos + len); + } while (Scanner.isDigitCharacter(ch)); + + this.pos += len; + return { type, pos, len }; + } + + // variable name + if (Scanner.isVariableCharacter(ch)) { + type = TokenType.VariableName; + do { + ch = this.value.charCodeAt(pos + (++len)); + } while (Scanner.isVariableCharacter(ch) || Scanner.isDigitCharacter(ch)); + + this.pos += len; + return { type, pos, len }; + } + + + // format + type = TokenType.Format; + do { + len += 1; + ch = this.value.charCodeAt(pos + len); + } while ( + !isNaN(ch) + && typeof Scanner._table[ch] === 'undefined' // not static token + && !Scanner.isDigitCharacter(ch) // not number + && !Scanner.isVariableCharacter(ch) // not variable + ); + + this.pos += len; + return { type, pos, len }; + } +} + +export abstract class Marker { + + readonly _markerBrand: any; + + public parent!: Marker; + protected _children: Marker[] = []; + + appendChild(child: Marker): this { + if (child instanceof Text && this._children[this._children.length - 1] instanceof Text) { + // this and previous child are text -> merge them + (this._children[this._children.length - 1]).value += child.value; + } else { + // normal adoption of child + child.parent = this; + this._children.push(child); + } + return this; + } + + replace(child: Marker, others: Marker[]): void { + const { parent } = child; + const idx = parent.children.indexOf(child); + const newChildren = parent.children.slice(0); + newChildren.splice(idx, 1, ...others); + parent._children = newChildren; + + (function _fixParent(children: Marker[], parent: Marker) { + for (const child of children) { + child.parent = parent; + _fixParent(child.children, child); + } + })(others, parent); + } + + get children(): Marker[] { + return this._children; + } + + get snippet(): TextmateSnippet | undefined { + let candidate: Marker = this; + while (true) { + if (!candidate) { + return undefined; + } + if (candidate instanceof TextmateSnippet) { + return candidate; + } + candidate = candidate.parent; + } + } + + toString(): string { + return this.children.reduce((prev, cur) => prev + cur.toString(), ''); + } + + abstract toTextmateString(): string; + + len(): number { + return 0; + } + + abstract clone(): Marker; +} + +export class Text extends Marker { + + static escape(value: string): string { + return value.replace(/\$|}|\\/g, '\\$&'); + } + + constructor(public value: string) { + super(); + } + override toString() { + return this.value; + } + toTextmateString(): string { + return Text.escape(this.value); + } + override len(): number { + return this.value.length; + } + clone(): Text { + return new Text(this.value); + } +} + +export abstract class TransformableMarker extends Marker { + public transform?: Transform; +} + +export class Placeholder extends TransformableMarker { + static compareByIndex(a: Placeholder, b: Placeholder): number { + if (a.index === b.index) { + return 0; + } else if (a.isFinalTabstop) { + return 1; + } else if (b.isFinalTabstop) { + return -1; + } else if (a.index < b.index) { + return -1; + } else if (a.index > b.index) { + return 1; + } else { + return 0; + } + } + + constructor(public index: number) { + super(); + } + + get isFinalTabstop() { + return this.index === 0; + } + + get choice(): Choice | undefined { + return this._children.length === 1 && this._children[0] instanceof Choice + ? this._children[0] as Choice + : undefined; + } + + toTextmateString(): string { + let transformString = ''; + if (this.transform) { + transformString = this.transform.toTextmateString(); + } + if (this.children.length === 0 && !this.transform) { + return `\$${this.index}`; + } else if (this.children.length === 0) { + return `\${${this.index}${transformString}}`; + } else if (this.choice) { + return `\${${this.index}|${this.choice.toTextmateString()}|${transformString}}`; + } else { + return `\${${this.index}:${this.children.map(child => child.toTextmateString()).join('')}${transformString}}`; + } + } + + clone(): Placeholder { + let ret = new Placeholder(this.index); + if (this.transform) { + ret.transform = this.transform.clone(); + } + ret._children = this.children.map(child => child.clone()); + return ret; + } +} + +export class Choice extends Marker { + + readonly options: Text[] = []; + + override appendChild(marker: Marker): this { + if (marker instanceof Text) { + marker.parent = this; + this.options.push(marker); + } + return this; + } + + override toString() { + return this.options[0].value; + } + + toTextmateString(): string { + return this.options + .map(option => option.value.replace(/\||,/g, '\\$&')) + .join(','); + } + + override len(): number { + return this.options[0].len(); + } + + clone(): Choice { + let ret = new Choice(); + this.options.forEach(ret.appendChild, ret); + return ret; + } +} + +export class Transform extends Marker { + + regexp: RegExp = new RegExp(''); + + resolve(value: string): string { + const _this = this; + let didMatch = false; + let ret = value.replace(this.regexp, function () { + didMatch = true; + return _this._replace(Array.prototype.slice.call(arguments, 0, -2)); + }); + // when the regex didn't match and when the transform has + // else branches, then run those + if (!didMatch && this._children.some(child => child instanceof FormatString && Boolean(child.elseValue))) { + ret = this._replace([]); + } + return ret; + } + + private _replace(groups: string[]): string { + let ret = ''; + for (const marker of this._children) { + if (marker instanceof FormatString) { + let value = groups[marker.index] || ''; + value = marker.resolve(value); + ret += value; + } else { + ret += marker.toString(); + } + } + return ret; + } + + override toString(): string { + return ''; + } + + toTextmateString(): string { + return `/${this.regexp.source}/${this.children.map(c => c.toTextmateString())}/${(this.regexp.ignoreCase ? 'i' : '') + (this.regexp.global ? 'g' : '')}`; + } + + clone(): Transform { + let ret = new Transform(); + ret.regexp = new RegExp(this.regexp.source, '' + (this.regexp.ignoreCase ? 'i' : '') + (this.regexp.global ? 'g' : '')); + ret._children = this.children.map(child => child.clone()); + return ret; + } + +} + +export class FormatString extends Marker { + + constructor( + readonly index: number, + readonly shorthandName?: string, + readonly ifValue?: string, + readonly elseValue?: string, + ) { + super(); + } + + resolve(value?: string): string { + if (this.shorthandName === 'upcase') { + return !value ? '' : value.toLocaleUpperCase(); + } else if (this.shorthandName === 'downcase') { + return !value ? '' : value.toLocaleLowerCase(); + } else if (this.shorthandName === 'capitalize') { + return !value ? '' : (value[0].toLocaleUpperCase() + value.substr(1)); + } else if (this.shorthandName === 'pascalcase') { + return !value ? '' : this._toPascalCase(value); + } else if (this.shorthandName === 'camelcase') { + return !value ? '' : this._toCamelCase(value); + } else if (Boolean(value) && typeof this.ifValue === 'string') { + return this.ifValue; + } else if (!Boolean(value) && typeof this.elseValue === 'string') { + return this.elseValue; + } else { + return value || ''; + } + } + + private _toPascalCase(value: string): string { + const match = value.match(/[a-z0-9]+/gi); + if (!match) { + return value; + } + return match.map(word => { + return word.charAt(0).toUpperCase() + + word.substr(1).toLowerCase(); + }) + .join(''); + } + + private _toCamelCase(value: string): string { + const match = value.match(/[a-z0-9]+/gi); + if (!match) { + return value; + } + return match.map((word, index) => { + if (index === 0) { + return word.toLowerCase(); + } else { + return word.charAt(0).toUpperCase() + + word.substr(1).toLowerCase(); + } + }) + .join(''); + } + + toTextmateString(): string { + let value = '${'; + value += this.index; + if (this.shorthandName) { + value += `:/${this.shorthandName}`; + + } else if (this.ifValue && this.elseValue) { + value += `:?${this.ifValue}:${this.elseValue}`; + } else if (this.ifValue) { + value += `:+${this.ifValue}`; + } else if (this.elseValue) { + value += `:-${this.elseValue}`; + } + value += '}'; + return value; + } + + clone(): FormatString { + let ret = new FormatString(this.index, this.shorthandName, this.ifValue, this.elseValue); + return ret; + } +} + +export class Variable extends TransformableMarker { + + constructor(public name: string) { + super(); + } + + resolve(resolver: VariableResolver): boolean { + let value = resolver.resolve(this); + if (this.transform) { + value = this.transform.resolve(value || ''); + } + if (value !== undefined) { + this._children = [new Text(value)]; + return true; + } + return false; + } + + toTextmateString(): string { + let transformString = ''; + if (this.transform) { + transformString = this.transform.toTextmateString(); + } + if (this.children.length === 0) { + return `\${${this.name}${transformString}}`; + } else { + return `\${${this.name}:${this.children.map(child => child.toTextmateString()).join('')}${transformString}}`; + } + } + + clone(): Variable { + const ret = new Variable(this.name); + if (this.transform) { + ret.transform = this.transform.clone(); + } + ret._children = this.children.map(child => child.clone()); + return ret; + } +} + +export interface VariableResolver { + resolve(variable: Variable): string | undefined; +} + +function walk(marker: Marker[], visitor: (marker: Marker) => boolean): void { + const stack = [...marker]; + while (stack.length > 0) { + const marker = stack.shift()!; + const recurse = visitor(marker); + if (!recurse) { + break; + } + stack.unshift(...marker.children); + } +} + +export class TextmateSnippet extends Marker { + + private _placeholders?: { all: Placeholder[], last?: Placeholder }; + + get placeholderInfo() { + if (!this._placeholders) { + // fill in placeholders + let all: Placeholder[] = []; + let last: Placeholder | undefined; + this.walk(function (candidate) { + if (candidate instanceof Placeholder) { + all.push(candidate); + last = !last || last.index < candidate.index ? candidate : last; + } + return true; + }); + this._placeholders = { all, last }; + } + return this._placeholders; + } + + get placeholders(): Placeholder[] { + const { all } = this.placeholderInfo; + return all; + } + + offset(marker: Marker): number { + let pos = 0; + let found = false; + this.walk(candidate => { + if (candidate === marker) { + found = true; + return false; + } + pos += candidate.len(); + return true; + }); + + if (!found) { + return -1; + } + return pos; + } + + fullLen(marker: Marker): number { + let ret = 0; + walk([marker], marker => { + ret += marker.len(); + return true; + }); + return ret; + } + + enclosingPlaceholders(placeholder: Placeholder): Placeholder[] { + let ret: Placeholder[] = []; + let { parent } = placeholder; + while (parent) { + if (parent instanceof Placeholder) { + ret.push(parent); + } + parent = parent.parent; + } + return ret; + } + + resolveVariables(resolver: VariableResolver): this { + this.walk(candidate => { + if (candidate instanceof Variable) { + if (candidate.resolve(resolver)) { + this._placeholders = undefined; + } + } + return true; + }); + return this; + } + + override appendChild(child: Marker) { + this._placeholders = undefined; + return super.appendChild(child); + } + + override replace(child: Marker, others: Marker[]): void { + this._placeholders = undefined; + return super.replace(child, others); + } + + toTextmateString(): string { + return this.children.reduce((prev, cur) => prev + cur.toTextmateString(), ''); + } + + clone(): TextmateSnippet { + let ret = new TextmateSnippet(); + this._children = this.children.map(child => child.clone()); + return ret; + } + + walk(visitor: (marker: Marker) => boolean): void { + walk(this.children, visitor); + } +} + +export class SnippetParser { + + static escape(value: string): string { + return value.replace(/\$|}|\\/g, '\\$&'); + } + + static guessNeedsClipboard(template: string): boolean { + return /\${?CLIPBOARD/.test(template); + } + + private _scanner: Scanner = new Scanner(); + private _token: Token = { type: TokenType.EOF, pos: 0, len: 0 }; + + text(value: string): string { + return this.parse(value).toString(); + } + + parse(value: string, insertFinalTabstop?: boolean, enforceFinalTabstop?: boolean): TextmateSnippet { + + this._scanner.text(value); + this._token = this._scanner.next(); + + const snippet = new TextmateSnippet(); + while (this._parse(snippet)) { + // nothing + } + + // fill in values for placeholders. the first placeholder of an index + // that has a value defines the value for all placeholders with that index + const placeholderDefaultValues = new Map(); + const incompletePlaceholders: Placeholder[] = []; + let placeholderCount = 0; + snippet.walk(marker => { + if (marker instanceof Placeholder) { + placeholderCount += 1; + if (marker.isFinalTabstop) { + placeholderDefaultValues.set(0, undefined); + } else if (!placeholderDefaultValues.has(marker.index) && marker.children.length > 0) { + placeholderDefaultValues.set(marker.index, marker.children); + } else { + incompletePlaceholders.push(marker); + } + } + return true; + }); + for (const placeholder of incompletePlaceholders) { + const defaultValues = placeholderDefaultValues.get(placeholder.index); + if (defaultValues) { + const clone = new Placeholder(placeholder.index); + clone.transform = placeholder.transform; + for (const child of defaultValues) { + clone.appendChild(child.clone()); + } + snippet.replace(placeholder, [clone]); + } + } + + if (!enforceFinalTabstop) { + enforceFinalTabstop = placeholderCount > 0 && insertFinalTabstop; + } + + if (!placeholderDefaultValues.has(0) && enforceFinalTabstop) { + // the snippet uses placeholders but has no + // final tabstop defined -> insert at the end + snippet.appendChild(new Placeholder(0)); + } + + return snippet; + } + + private _accept(type?: TokenType): boolean; + private _accept(type: TokenType | undefined, value: true): string; + private _accept(type: TokenType, value?: boolean): boolean | string { + if (type === undefined || this._token.type === type) { + let ret = !value ? true : this._scanner.tokenText(this._token); + this._token = this._scanner.next(); + return ret; + } + return false; + } + + private _backTo(token: Token): false { + this._scanner.pos = token.pos + token.len; + this._token = token; + return false; + } + + private _until(type: TokenType): false | string { + const start = this._token; + while (this._token.type !== type) { + if (this._token.type === TokenType.EOF) { + return false; + } else if (this._token.type === TokenType.Backslash) { + const nextToken = this._scanner.next(); + if (nextToken.type !== TokenType.Dollar + && nextToken.type !== TokenType.CurlyClose + && nextToken.type !== TokenType.Backslash) { + return false; + } + } + this._token = this._scanner.next(); + } + const value = this._scanner.value.substring(start.pos, this._token.pos).replace(/\\(\$|}|\\)/g, '$1'); + this._token = this._scanner.next(); + return value; + } + + private _parse(marker: Marker): boolean { + return this._parseEscaped(marker) + || this._parseTabstopOrVariableName(marker) + || this._parseComplexPlaceholder(marker) + || this._parseComplexVariable(marker) + || this._parseAnything(marker); + } + + // \$, \\, \} -> just text + private _parseEscaped(marker: Marker): boolean { + let value: string; + if (value = this._accept(TokenType.Backslash, true)) { + // saw a backslash, append escaped token or that backslash + value = this._accept(TokenType.Dollar, true) + || this._accept(TokenType.CurlyClose, true) + || this._accept(TokenType.Backslash, true) + || value; + + marker.appendChild(new Text(value)); + return true; + } + return false; + } + + // $foo -> variable, $1 -> tabstop + private _parseTabstopOrVariableName(parent: Marker): boolean { + let value: string; + const token = this._token; + const match = this._accept(TokenType.Dollar) + && (value = this._accept(TokenType.VariableName, true) || this._accept(TokenType.Int, true)); + + if (!match) { + return this._backTo(token); + } + + parent.appendChild(/^\d+$/.test(value!) + ? new Placeholder(Number(value!)) + : new Variable(value!) + ); + return true; + } + + // ${1:}, ${1} -> placeholder + private _parseComplexPlaceholder(parent: Marker): boolean { + let index: string; + const token = this._token; + const match = this._accept(TokenType.Dollar) + && this._accept(TokenType.CurlyOpen) + && (index = this._accept(TokenType.Int, true)); + + if (!match) { + return this._backTo(token); + } + + const placeholder = new Placeholder(Number(index!)); + + if (this._accept(TokenType.Colon)) { + // ${1:} + while (true) { + + // ...} -> done + if (this._accept(TokenType.CurlyClose)) { + parent.appendChild(placeholder); + return true; + } + + if (this._parse(placeholder)) { + continue; + } + + // fallback + parent.appendChild(new Text('${' + index! + ':')); + placeholder.children.forEach(parent.appendChild, parent); + return true; + } + } else if (placeholder.index > 0 && this._accept(TokenType.Pipe)) { + // ${1|one,two,three|} + const choice = new Choice(); + + while (true) { + if (this._parseChoiceElement(choice)) { + + if (this._accept(TokenType.Comma)) { + // opt, -> more + continue; + } + + if (this._accept(TokenType.Pipe)) { + placeholder.appendChild(choice); + if (this._accept(TokenType.CurlyClose)) { + // ..|} -> done + parent.appendChild(placeholder); + return true; + } + } + } + + this._backTo(token); + return false; + } + + } else if (this._accept(TokenType.Forwardslash)) { + // ${1///} + if (this._parseTransform(placeholder)) { + parent.appendChild(placeholder); + return true; + } + + this._backTo(token); + return false; + + } else if (this._accept(TokenType.CurlyClose)) { + // ${1} + parent.appendChild(placeholder); + return true; + + } else { + // ${1 <- missing curly or colon + return this._backTo(token); + } + } + + private _parseChoiceElement(parent: Choice): boolean { + const token = this._token; + const values: string[] = []; + + while (true) { + if (this._token.type === TokenType.Comma || this._token.type === TokenType.Pipe) { + break; + } + let value: string; + if (value = this._accept(TokenType.Backslash, true)) { + // \, \|, or \\ + value = this._accept(TokenType.Comma, true) + || this._accept(TokenType.Pipe, true) + || this._accept(TokenType.Backslash, true) + || value; + } else { + value = this._accept(undefined, true); + } + if (!value) { + // EOF + this._backTo(token); + return false; + } + values.push(value); + } + + if (values.length === 0) { + this._backTo(token); + return false; + } + + parent.appendChild(new Text(values.join(''))); + return true; + } + + // ${foo:}, ${foo} -> variable + private _parseComplexVariable(parent: Marker): boolean { + let name: string; + const token = this._token; + const match = this._accept(TokenType.Dollar) + && this._accept(TokenType.CurlyOpen) + && (name = this._accept(TokenType.VariableName, true)); + + if (!match) { + return this._backTo(token); + } + + const variable = new Variable(name!); + + if (this._accept(TokenType.Colon)) { + // ${foo:} + while (true) { + + // ...} -> done + if (this._accept(TokenType.CurlyClose)) { + parent.appendChild(variable); + return true; + } + + if (this._parse(variable)) { + continue; + } + + // fallback + parent.appendChild(new Text('${' + name! + ':')); + variable.children.forEach(parent.appendChild, parent); + return true; + } + + } else if (this._accept(TokenType.Forwardslash)) { + // ${foo///} + if (this._parseTransform(variable)) { + parent.appendChild(variable); + return true; + } + + this._backTo(token); + return false; + + } else if (this._accept(TokenType.CurlyClose)) { + // ${foo} + parent.appendChild(variable); + return true; + + } else { + // ${foo <- missing curly or colon + return this._backTo(token); + } + } + + private _parseTransform(parent: TransformableMarker): boolean { + // ...//} + + let transform = new Transform(); + let regexValue = ''; + let regexOptions = ''; + + // (1) /regex + while (true) { + if (this._accept(TokenType.Forwardslash)) { + break; + } + + let escaped: string; + if (escaped = this._accept(TokenType.Backslash, true)) { + escaped = this._accept(TokenType.Forwardslash, true) || escaped; + regexValue += escaped; + continue; + } + + if (this._token.type !== TokenType.EOF) { + regexValue += this._accept(undefined, true); + continue; + } + return false; + } + + // (2) /format + while (true) { + if (this._accept(TokenType.Forwardslash)) { + break; + } + + let escaped: string; + if (escaped = this._accept(TokenType.Backslash, true)) { + escaped = this._accept(TokenType.Backslash, true) || this._accept(TokenType.Forwardslash, true) || escaped; + transform.appendChild(new Text(escaped)); + continue; + } + + if (this._parseFormatString(transform) || this._parseAnything(transform)) { + continue; + } + return false; + } + + // (3) /option + while (true) { + if (this._accept(TokenType.CurlyClose)) { + break; + } + if (this._token.type !== TokenType.EOF) { + regexOptions += this._accept(undefined, true); + continue; + } + return false; + } + + try { + transform.regexp = new RegExp(regexValue, regexOptions); + } catch (e) { + // invalid regexp + return false; + } + + parent.transform = transform; + return true; + } + + private _parseFormatString(parent: Transform): boolean { + + const token = this._token; + if (!this._accept(TokenType.Dollar)) { + return false; + } + + let complex = false; + if (this._accept(TokenType.CurlyOpen)) { + complex = true; + } + + let index = this._accept(TokenType.Int, true); + + if (!index) { + this._backTo(token); + return false; + + } else if (!complex) { + // $1 + parent.appendChild(new FormatString(Number(index))); + return true; + + } else if (this._accept(TokenType.CurlyClose)) { + // ${1} + parent.appendChild(new FormatString(Number(index))); + return true; + + } else if (!this._accept(TokenType.Colon)) { + this._backTo(token); + return false; + } + + if (this._accept(TokenType.Forwardslash)) { + // ${1:/upcase} + let shorthand = this._accept(TokenType.VariableName, true); + if (!shorthand || !this._accept(TokenType.CurlyClose)) { + this._backTo(token); + return false; + } else { + parent.appendChild(new FormatString(Number(index), shorthand)); + return true; + } + + } else if (this._accept(TokenType.Plus)) { + // ${1:+} + let ifValue = this._until(TokenType.CurlyClose); + if (ifValue) { + parent.appendChild(new FormatString(Number(index), undefined, ifValue, undefined)); + return true; + } + + } else if (this._accept(TokenType.Dash)) { + // ${2:-} + let elseValue = this._until(TokenType.CurlyClose); + if (elseValue) { + parent.appendChild(new FormatString(Number(index), undefined, undefined, elseValue)); + return true; + } + + } else if (this._accept(TokenType.QuestionMark)) { + // ${2:?:} + let ifValue = this._until(TokenType.Colon); + if (ifValue) { + let elseValue = this._until(TokenType.CurlyClose); + if (elseValue) { + parent.appendChild(new FormatString(Number(index), undefined, ifValue, elseValue)); + return true; + } + } + + } else { + // ${1:} + let elseValue = this._until(TokenType.CurlyClose); + if (elseValue) { + parent.appendChild(new FormatString(Number(index), undefined, undefined, elseValue)); + return true; + } + } + + this._backTo(token); + return false; + } + + private _parseAnything(marker: Marker): boolean { + if (this._token.type !== TokenType.EOF) { + marker.appendChild(new Text(this._scanner.tokenText(this._token))); + this._accept(undefined); + return true; + } + return false; + } +} diff --git a/tsconfig.json b/tsconfig.json index 6535d82cd7..66e7cd1762 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,7 @@ }, "exclude": [ "node_modules", + "src/vendor", ".vscode-test" ] } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b44493b364..7dc83022e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -90,7 +90,7 @@ "@tootallnate/once@1": version "1.1.2" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/glob@^7.1.3": @@ -230,7 +230,7 @@ acorn@^7.4.0: agent-base@6: version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" @@ -315,14 +315,14 @@ astral-regex@^2.0.0: integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== big-integer@^1.6.17: - version "1.6.48" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz" - integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + version "1.6.50" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.50.tgz#299a4be8bd441c73dcc492ed46b7169c34e92e70" + integrity sha512-+O2uoQWFRo8ysZNo/rjtri2jIwjr3XfeAgRjAUADRqGG+ZITvyn8J1kvXLTaKVr3hhGXk+f23tKfdzmklVM9vQ== binary-extensions@^2.0.0: version "2.2.0" @@ -331,7 +331,7 @@ binary-extensions@^2.0.0: binary@~0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= dependencies: buffers "~0.1.1" @@ -339,12 +339,12 @@ binary@~0.3.0: bluebird@~3.4.1: version "3.4.7" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -364,12 +364,12 @@ browser-stdout@1.3.1: buffer-indexof-polyfill@~1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== buffers@~0.1.1: version "0.1.1" - resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= callsites@^3.0.0: @@ -384,7 +384,7 @@ camelcase@^6.0.0: chainsaw@~0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= dependencies: traverse ">=0.3.0 <0.4" @@ -456,13 +456,13 @@ color-name@~1.1.4: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cross-spawn@^7.0.2: version "7.0.3" @@ -473,7 +473,14 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -debug@4, debug@4.3.1, debug@^4.0.1, debug@^4.1.1: +debug@4: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@4.3.1, debug@^4.0.1, debug@^4.1.1: version "4.3.1" resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -511,7 +518,7 @@ doctrine@^3.0.0: duplexer2@~0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= dependencies: readable-stream "^2.0.2" @@ -742,7 +749,7 @@ flatted@^3.1.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@~2.3.1: @@ -752,7 +759,7 @@ fsevents@~2.3.1: fstream@^1.0.12: version "1.0.12" - resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: graceful-fs "^4.1.2" @@ -777,7 +784,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@7.1.6, glob@^7.1.3: +glob@7.1.6: version "7.1.6" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -789,6 +796,18 @@ glob@7.1.6, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" @@ -821,9 +840,9 @@ globby@^11.0.1: slash "^3.0.0" graceful-fs@^4.1.2, graceful-fs@^4.2.2: - version "4.2.6" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== growl@1.10.5: version "1.10.5" @@ -847,7 +866,7 @@ he@1.2.0: http-proxy-agent@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" @@ -856,7 +875,7 @@ http-proxy-agent@^4.0.1: https-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: agent-base "6" @@ -892,7 +911,7 @@ imurmurhash@^0.1.4: inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" @@ -900,7 +919,7 @@ inflight@^1.0.4: inherits@2, inherits@~2.0.0, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== is-binary-path@~2.1.0: @@ -949,7 +968,7 @@ isarray@0.0.1: isarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: @@ -1014,7 +1033,7 @@ levn@^0.4.1: listenercount@~1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= locate-path@^6.0.0: @@ -1063,19 +1082,19 @@ micromatch@^4.0.2: minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@^1.2.5: version "1.2.5" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== "mkdirp@>=0.5 0": version "0.5.5" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" @@ -1113,7 +1132,7 @@ mocha@^8.1.3: ms@2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3: @@ -1149,7 +1168,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: once@^1.3.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" @@ -1194,7 +1213,7 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-key@^3.1.0: @@ -1226,7 +1245,7 @@ prelude-ls@^1.2.1: process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== progress@^2.0.0: @@ -1253,7 +1272,7 @@ randombytes@^2.1.0: readable-stream@^2.0.2, readable-stream@~2.3.6: version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" @@ -1298,14 +1317,14 @@ reusify@^1.0.4: rimraf@2: version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" @@ -1324,7 +1343,7 @@ safe-buffer@^5.1.0: safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== semver@^7.2.1, semver@^7.3.2: @@ -1343,7 +1362,7 @@ serialize-javascript@5.0.1: setimmediate@~1.0.4: version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= shebang-command@^2.0.0: @@ -1408,7 +1427,7 @@ string-width@^4.1.0, string-width@^4.2.0: string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" @@ -1482,7 +1501,7 @@ to-regex-range@^5.0.1: "traverse@>=0.3.0 <0.4": version "0.3.9" - resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= tslib@^1.8.1: @@ -1514,14 +1533,14 @@ type-fest@^0.8.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typescript@^4.1.2: - version "4.1.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz" - integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== +typescript@^4.4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== unzipper@^0.10.11: version "0.10.11" - resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== dependencies: big-integer "^1.6.17" @@ -1544,7 +1563,7 @@ uri-js@^4.2.2: util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= v8-compile-cache@^2.0.3: @@ -1553,9 +1572,9 @@ v8-compile-cache@^2.0.3: integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== vscode-test@^1.4.1: - version "1.5.0" - resolved "https://registry.npmjs.org/vscode-test/-/vscode-test-1.5.0.tgz" - integrity sha512-svwE/mhBBqrB77C1U7pkUKfUmxnkzg0dLGi1vEmitsleu88oNsqZEhG3ANZrL/Ia4m0CW0oYEKRw2EojpFxLlQ== + version "1.6.1" + resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-1.6.1.tgz#44254c67036de92b00fdd72f6ace5f1854e1a563" + integrity sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA== dependencies: http-proxy-agent "^4.0.1" https-proxy-agent "^5.0.0" @@ -1597,7 +1616,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= y18n@^5.0.5: From a52473fc44a1f029d15dc129e79e317f4f804d37 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 14:49:31 +0100 Subject: [PATCH 07/35] Working using names --- .eslintrc.json | 4 +- images/nestWrapNearPastDrum.gif | Bin 0 -> 242559 bytes package.json | 60 +- src/actions/WrapWithSnippet.ts | 39 +- src/vendor/{ => snippet}/charCode.ts | 0 src/vendor/{ => snippet}/snippetParser.ts | 0 src/vendor/snippet/snippetVariables.ts | 40 + yarn-error.log | 2383 +++++++++++++++++++++ 8 files changed, 2463 insertions(+), 63 deletions(-) create mode 100644 images/nestWrapNearPastDrum.gif rename src/vendor/{ => snippet}/charCode.ts (100%) mode change 100644 => 100755 rename src/vendor/{ => snippet}/snippetParser.ts (100%) create mode 100644 src/vendor/snippet/snippetVariables.ts create mode 100644 yarn-error.log diff --git a/.eslintrc.json b/.eslintrc.json index 96c67090d4..b9145f7a53 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -23,7 +23,7 @@ "semi": "off" }, "ignorePatterns": [ - "**/vendor/*.ts", - "**/vendor/*.js" + "**/vendor/**/*.ts", + "**/vendor/**/*.js" ] } \ No newline at end of file diff --git a/images/nestWrapNearPastDrum.gif b/images/nestWrapNearPastDrum.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6106af7c3e9170a05abc4186d6a9570bff1b69b GIT binary patch literal 242559 zcmWifc{J4T7so%d7-I}(?7OiKsm4BtX6%H4 zk)#lzQlW)P{Jy`x?sM+Bf86ujd(QLR*Lhzv3sby~R|_N#918%_N1Qe$4)#Vwl8M?0 z90UaX=lTr=tpG=W%716z|6!^BSr`-!Z~_Q0n1hXz3juHwQIw>ps5q~vyaZZCQW67T0YDohE`3Y^ z1eN6$mJtJ#&=Pns8-`CoPCywWC95EO{5UTLD|7-Yd_qM`122eGmDE*|0kl*AeKkNv zMowNHtDuC%Dyk?csT@~PJ&9A*kk(gI)znbe(bU)0#_Qm<4fOO*0g9G@v^}7G7NKU( zd%{gv{k*sqSy$Hhl%Ap7DIdTL04z~}6971(feQfOF97^^C9%RlqMojyKEg8kG=ZpM z=&xZOtm6=dcerE*W_JR^iJ~XWB-BiGfU_99gN&X(m?I8^ASzm!DBD`7I9i`@AsCq2 z;N0Ehi6q>42X${}jSH??fgbo!Po3}pWy`SRq)R7k<5bU)b;Ep5McWVnCsV-71_*Qn zqC9|DGC(vmGB!G6YHnd+X?4cJ-iBmLI_qp_=iq4Xe$Ls|)y>1?e4M+Rua)mrPqH`3 zKQWk?;B`LO&o3w_AUZ7kQuxLA=;$l1A!#0$QZE`(BaG?Mri>W#^vf1E63*n3!>@-# z7e-y8UXDq*63a+Pq{d%P2mY&YiWpD?07a5Oh89qc0U7|H695{efeu;TySl(A0L%a` zg%^GDFI`EwnFi)826Hulx$lFyyTK@$rbimyyFfpv>~uIi7`Sl>D7Xxi6C&!3Vq44- z$3W;8AoK@-cMIVC4)9WKijr+hGaPQ^IyaTLw^0&q(5__{#$T@>cXyqkS9$dglWt7d z=gv8mth(RY^sM{j*|0@!-1cg&paAu$Kuad@AP?v-2cFgdb9aHaZNR5T05vH&B{e-Y z?K*>zmPE}-PbtpG%*jYA&C1Tp&Zx*QC{8P?$;qrLDXOh3YpJZNsVZ--D!*S-*I2`R zP*>eu)p-AQU2ju!%iWgtmiry;9S=LYdb=Jz>gnr$#2Wgq`Qb+Z2rh2k!X#2pbBnu= zwn!T$bIV#mO`RC&pMPSeN3X!8i+x;Tztg%81>KEVNy1 z{DH}3-Hx`6X{OP2N$ZF0AD_Feo^$N`bKLz^K>z&;-JT|he^;c`F+97-R~Y2=S_f2| zHE~nh3=5--bgKI(D+kTI;(6i+QahktHv}nv`nEiH{YdKUqu$@&(ZObpk0oP59(--P zFQs$TL%PAuA8vh{-~IG8dR*!|3REy)nF?26xF$#rZxn`byAG3+JgpnZP6tZzEHD@z zw~~rU!M=9( ze-yE(%r(e$xRoNQrSu`+;as3R{kV6De7tK+@>&6#{+LLyZ(-ni$%VwR?3=-A9K5CM z{UY_HqGOk9i?yp8H!9+P{jMrM9rIDXTm&SFEs{OY;?UpGkRh7rl=+<1(KOba!ry7g zO;^6_uAE(+p{tz3ejm+;`>L&d}U+ea?Az ztK;*a|8cgkxK)=!J6Xmb zaBV36VZy^r!|z|8U{Vj3@3Fp?x;`?x+3Wb2tO{!|d^i0dcen z-!*B0>5)Ip1;@pEq<5cLX_u>w_1#vHdTL==E-+4BX<m*kVL_lxkj5tk9c$MwiwSp1Alp8diS3-3K>S)z+pZE*;>g&HfgTwN_Wj$FT z-M#%9dy=6`&U?%ryw<_#XpU
    XpDR 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�~nC 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

    gWQ8LjqloE;tJjy$Blrj1 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 WxE#>XN?c}L^;mJ3WMYE=wEhQ_8QDJo literal 0 HcmV?d00001 diff --git a/package.json b/package.json index a102e23e06..4fb5a3f83a 100644 --- a/package.json +++ b/package.json @@ -421,7 +421,7 @@ ] }, "body": [ - "if ($1) {\n\t$2\n}" + "if ($condition) {\n\t$consequence\n}" ] }, { @@ -431,12 +431,12 @@ ] }, "body": [ - "if $1:\n\t$2" + "if $condition:\n\t$consequence" ] } ], "defaultScopeTypes": { - "2": "statement" + "consequence": "statement" }, "description": "If statement" }, @@ -466,13 +466,13 @@ ] }, "body": [ - "try:\n\t$1\nexcept $2:\n\t$3" + "try:\n\t$body\nexcept $error:\n\t$exceptBody" ] } ], "defaultScopeTypes": { - "1": "statement", - "3": "statement" + "body": "statement", + "exceptBody": "statement" }, "description": "Try catch statement" }, @@ -492,7 +492,7 @@ ] }, "body": [ - "if ($1) {\n\t$2\n} else {\n\t$3\n}" + "if ($condition) {\n\t$consequence\n} else {\n\t$alternative\n}" ] }, { @@ -502,13 +502,13 @@ ] }, "body": [ - "if $1:\n\t$2\nelse:\n\t$3" + "if $condition:\n\t$consequence\nelse:\n\t$alternative" ] } ], "defaultScopeTypes": { - "2": "statement", - "3": "statement" + "consequence": "statement", + "alternative": "statement" }, "description": "If else statement" } @@ -612,45 +612,7 @@ } } } - }, - "snippets": [ - { - "language": "c", - "path": "./snippets/cpp.json" - }, - { - "language": "cpp", - "path": "./snippets/cpp.json" - }, - { - "language": "csharp", - "path": "./snippets/csharp.json" - }, - { - "language": "java", - "path": "./snippets/java.json" - }, - { - "language": "javascript", - "path": "./snippets/typescript.json" - }, - { - "language": "javascriptreact", - "path": "./snippets/typescript.json" - }, - { - "language": "python", - "path": "./snippets/python.json" - }, - { - "language": "typescript", - "path": "./snippets/typescript.json" - }, - { - "language": "typescriptreact", - "path": "./snippets/typescript.json" - } - ] + } }, "scripts": { "vscode:prepublish": "npm run -S esbuild-base -- --minify", diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index a44b77afec..50c8b8bc15 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -10,7 +10,12 @@ import { import displayPendingEditDecorations from "../util/editDisplayUtils"; import { ensureSingleEditor } from "../util/targetUtils"; import { callFunctionAndUpdateSelections } from "../util/updateSelections"; -import { SnippetParser, Variable } from "../vendor/snippetParser"; +import { + Placeholder, + SnippetParser, + Variable, +} from "../vendor/snippet/snippetParser"; +import { KnownSnippetVariableNames } from "../vendor/snippet/snippetVariables"; interface SnippetScope { langIds?: string[]; @@ -91,19 +96,29 @@ export default class WrapWithSnippet implements Action { const parsedSnippet = this.snippetParser.parse(definition.body.join("\n")); - const placeholderIndex = parseInt(placeholderName); - - const placeholder = parsedSnippet.placeholders.find( - (placeholder) => placeholder.index === placeholderIndex - ); - - if (placeholder == null) { - throw new Error(`Couldn't find placeholder ${placeholderName}`); - } - - parsedSnippet.replace(placeholder, [new Variable("TM_SELECTED_TEXT")]); + var placeholderIndex = 1; + parsedSnippet.walk((candidate) => { + if (candidate instanceof Placeholder) { + placeholderIndex = Math.max(placeholderIndex, candidate.index + 1); + } + return true; + }); + + parsedSnippet.walk((candidate) => { + if (candidate instanceof Variable) { + if (candidate.name === placeholderName) { + candidate.name = "TM_SELECTED_TEXT"; + } else if (!KnownSnippetVariableNames[candidate.name]) { + candidate.parent.replace(candidate, [ + new Placeholder(placeholderIndex++), + ]); + } + } + return true; + }); const snippetString = new SnippetString(parsedSnippet.toTextmateString()); + console.log(`snippetString: ${parsedSnippet.toTextmateString()}`); await displayPendingEditDecorations( targets, diff --git a/src/vendor/charCode.ts b/src/vendor/snippet/charCode.ts old mode 100644 new mode 100755 similarity index 100% rename from src/vendor/charCode.ts rename to src/vendor/snippet/charCode.ts diff --git a/src/vendor/snippetParser.ts b/src/vendor/snippet/snippetParser.ts similarity index 100% rename from src/vendor/snippetParser.ts rename to src/vendor/snippet/snippetParser.ts diff --git a/src/vendor/snippet/snippetVariables.ts b/src/vendor/snippet/snippetVariables.ts new file mode 100644 index 0000000000..5fa0ab7723 --- /dev/null +++ b/src/vendor/snippet/snippetVariables.ts @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See https://github.com/microsoft/vscode/blob/d31496c866683bdbccfc85bc11a3107d6c789b52/LICENSE.txt + *--------------------------------------------------------------------------------------------*/ +// From https://github.com/microsoft/vscode/blob/d31496c866683bdbccfc85bc11a3107d6c789b52/src/vs/editor/contrib/snippet/snippetVariables.ts + +export const KnownSnippetVariableNames: { [key: string]: true } = Object.freeze({ + 'CURRENT_YEAR': true, + 'CURRENT_YEAR_SHORT': true, + 'CURRENT_MONTH': true, + 'CURRENT_DATE': true, + 'CURRENT_HOUR': true, + 'CURRENT_MINUTE': true, + 'CURRENT_SECOND': true, + 'CURRENT_DAY_NAME': true, + 'CURRENT_DAY_NAME_SHORT': true, + 'CURRENT_MONTH_NAME': true, + 'CURRENT_MONTH_NAME_SHORT': true, + 'CURRENT_SECONDS_UNIX': true, + 'SELECTION': true, + 'CLIPBOARD': true, + 'TM_SELECTED_TEXT': true, + 'TM_CURRENT_LINE': true, + 'TM_CURRENT_WORD': true, + 'TM_LINE_INDEX': true, + 'TM_LINE_NUMBER': true, + 'TM_FILENAME': true, + 'TM_FILENAME_BASE': true, + 'TM_DIRECTORY': true, + 'TM_FILEPATH': true, + 'RELATIVE_FILEPATH': true, + 'BLOCK_COMMENT_START': true, + 'BLOCK_COMMENT_END': true, + 'LINE_COMMENT': true, + 'WORKSPACE_NAME': true, + 'WORKSPACE_FOLDER': true, + 'RANDOM': true, + 'RANDOM_HEX': true, + 'UUID': true +}); \ No newline at end of file diff --git a/yarn-error.log b/yarn-error.log new file mode 100644 index 0000000000..f40b1d9b7b --- /dev/null +++ b/yarn-error.log @@ -0,0 +1,2383 @@ +Arguments: + /Users/pokey/n/bin/node /usr/local/Cellar/yarn/1.22.10/libexec/bin/yarn.js run esbuild + +PATH: + /Users/pokey/google-cloud-sdk/bin:/Users/pokey/torch-cl/install/bin:/Users/pokey/.rbenv/shims:/usr/local/opt/ruby/bin:/usr/local/Cellar/pyenv-virtualenv/1.1.5/shims:/Users/pokey/.pyenv/shims:/Users/pokey/n/bin:/Users/pokey/.gem/bin:/Users/pokey/bin:/usr/local/bin:/Users/pokey/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/texbin:/opt/X11/bin:/Library/Apple/usr/bin:/usr/local/git/bin:/Users/pokey/pokey-home-files/bin:/usr/local/texlive/2011/bin/x86_64-linux:/Users/pokey/bin:/usr/local/ssl/bin:/Users/pokey/bin:/Users/pokey/packer:/Library/TeX/Root/bin/x86_64-darwin:/usr/local/sbin:/Users/pokey/.cargo/bin:/usr/local/Cellar/qt@5.5/5.5.1_1/bin:/Users/pokey/.fzf/bin + +Yarn version: + 1.22.10 + +Node version: + 12.16.1 + +Platform: + darwin x64 + +Trace: + SyntaxError: /Users/pokey/src/cursorless-vscode/package.json: Unexpected token } in JSON at position 9678 + at JSON.parse () + at /usr/local/Cellar/yarn/1.22.10/libexec/lib/cli.js:1625:59 + at Generator.next () + at step (/usr/local/Cellar/yarn/1.22.10/libexec/lib/cli.js:310:30) + at /usr/local/Cellar/yarn/1.22.10/libexec/lib/cli.js:321:13 + +npm manifest: + { + "name": "cursorless", + "displayName": "Cursorless", + "description": "Don't let the cursor slow you down", + "icon": "images/icon.png", + "galleryBanner": { + "color": "#00001A", + "theme": "dark" + }, + "version": "0.22.0", + "publisher": "pokey", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/pokey/cursorless-vscode.git" + }, + "engines": { + "vscode": "^1.53.0" + }, + "extensionKind": [ + "workspace" + ], + "categories": [ + "Other" + ], + "extensionDependencies": [ + "pokey.parse-tree" + ], + "activationEvents": [ + "*" + ], + "main": "./dist/extension.js", + "capabilities": { + "untrustedWorkspaces": { + "supported": true + } + }, + "contributes": { + "commands": [ + { + "command": "cursorless.command", + "title": "Cursorless: Perform command" + }, + { + "command": "cursorless.toggleDecorations", + "title": "Cursorless: Toggle decorations" + }, + { + "command": "cursorless.recomputeDecorationStyles", + "title": "Cursorless: Recompute decoration styles" + }, + { + "command": "cursorless.recordTestCase", + "title": "Cursorless: Record test case" + } + ], + "colors": [ + { + "id": "cursorless.pendingDeleteBackground", + "description": "Background color to use for ranges about to be deleted", + "defaults": { + "dark": "#ff00008a", + "light": "#ff00008a", + "highContrast": "#ff00008a" + } + }, + { + "id": "cursorless.referencedBackground", + "description": "Background color to use for ranges that are being referenced", + "defaults": { + "dark": "#00a2ff4d", + "light": "#00a2ff4d", + "highContrast": "#00a2ff4d" + } + }, + { + "id": "cursorless.justAddedBackground", + "description": "Background color to use for ranges that have just been added", + "defaults": { + "dark": "#09ff005b", + "light": "#09ff005b", + "highContrast": "#09ff005b" + } + }, + { + "id": "cursorless.pendingModification0Background", + "description": "Background color to use for ranges that are being changed", + "defaults": { + "dark": "#8c00ff86", + "light": "#8c00ff86", + "highContrast": "#8c00ff86" + } + }, + { + "id": "cursorless.pendingModification1Background", + "description": "Background color to use for ranges that are being changed", + "defaults": { + "dark": "#ff009d7e", + "light": "#ff009d7e", + "highContrast": "#ff009d7e" + } + } + ], + "configuration": { + "title": "Cursorless", + "properties": { + "cursorless.showOnStart": { + "type": "boolean", + "default": true, + "description": "Whether to show decorations on vscode start." + }, + "cursorless.pendingEditDecorationTime": { + "type": "integer", + "default": 100, + "description": "How long in milliseconds to show a pending edit decoration" + }, + "cursorless.showAdditionalHighlightBeforeScroll": { + "type": "boolean", + "default": false, + "description": "Whether to show a highlight before scrolling in addition to after" + }, + "cursorless.hatSizeAdjustment": { + "type": "number", + "default": 0, + "description": "Percentage to increase or decrease hat size; positive increases size" + }, + "cursorless.hatVerticalOffset": { + "type": "number", + "default": 0, + "description": "How much to vertically shift the hats as a percentage of font size; positive is up" + }, + "cursorless.colors.dark": { + "description": "Colors to use for dark theme", + "type": "object", + "properties": { + "default": { + "type": "string" + }, + "blue": { + "type": "string" + }, + "green": { + "type": "string" + }, + "red": { + "type": "string" + }, + "pink": { + "type": "string" + }, + "yellow": { + "type": "string" + } + }, + "default": { + "default": "#aaa7bb", + "blue": "#089ad3", + "green": "#36B33F", + "red": "#E02D28", + "pink": "#E06CAA", + "yellow": "#E5C02C" + }, + "additionalProperties": false + }, + "cursorless.colors.light": { + "description": "Colors to use for light theme", + "type": "object", + "properties": { + "default": { + "type": "string" + }, + "blue": { + "type": "string" + }, + "green": { + "type": "string" + }, + "red": { + "type": "string" + }, + "pink": { + "type": "string" + }, + "yellow": { + "type": "string" + } + }, + "default": { + "default": "#757180", + "blue": "#089ad3", + "green": "#36B33F", + "red": "#E02D28", + "pink": "#e0679f", + "yellow": "#edb62b" + }, + "additionalProperties": false + }, + "cursorless.hatEnablement.colors": { + "description": "Which colors to enable", + "type": "object", + "properties": { + "blue": { + "type": "boolean" + }, + "green": { + "type": "boolean" + }, + "red": { + "type": "boolean" + }, + "pink": { + "type": "boolean" + }, + "yellow": { + "type": "boolean" + } + }, + "default": { + "blue": true, + "green": true, + "red": true, + "pink": true, + "yellow": true + }, + "additionalProperties": false + }, + "cursorless.hatEnablement.shapes": { + "markdownDescription": "Which shapes to enable. See the [docs](https://github.com/pokey/cursorless-talon/blob/main/docs/README.md#shapes) if you're not sure which shape name corresponds to which hat shape.", + "type": "object", + "properties": { + "ex": { + "type": "boolean" + }, + "fox": { + "type": "boolean" + }, + "wing": { + "type": "boolean" + }, + "hole": { + "type": "boolean" + }, + "frame": { + "type": "boolean" + }, + "curve": { + "type": "boolean" + }, + "eye": { + "type": "boolean" + }, + "play": { + "type": "boolean" + }, + "bolt": { + "type": "boolean" + }, + "crosshairs": { + "type": "boolean" + } + }, + "default": { + "ex": false, + "fox": false, + "wing": false, + "hole": false, + "frame": false, + "curve": false, + "eye": false, + "play": false, + "bolt": false, + "crosshairs": false + }, + "additionalProperties": false + }, + "cursorless.hatPenalties.colors": { + "description": "How much to penalize each hat color. Number of syllables is a good default", + "type": "object", + "properties": { + "blue": { + "type": "number" + }, + "green": { + "type": "number" + }, + "red": { + "type": "number" + }, + "pink": { + "type": "number" + }, + "yellow": { + "type": "number" + } + }, + "default": { + "blue": 1, + "green": 1, + "red": 1, + "pink": 1, + "yellow": 1 + }, + "additionalProperties": false + }, + "cursorless.hatPenalties.shapes": { + "description": "How much to penalize each hat shape. Number of syllables is a good default", + "type": "object", + "properties": { + "ex": { + "type": "number" + }, + "fox": { + "type": "number" + }, + "wing": { + "type": "number" + }, + "hole": { + "type": "number" + }, + "frame": { + "type": "number" + }, + "curve": { + "type": "number" + }, + "eye": { + "type": "number" + }, + "play": { + "type": "number" + }, + "bolt": { + "type": "number" + }, + "crosshairs": { + "type": "number" + } + }, + "default": { + "ex": 1, + "fox": 1, + "wing": 1, + "hole": 1, + "frame": 1, + "curve": 1, + "eye": 1, + "play": 1, + "bolt": 1, + "crosshairs": 1 + }, + "additionalProperties": false + }, + "cursorless.individualHatAdjustments": { + "description": "Separate adjustments for each hat shape", + "type": "object", + "default": { + "default": { + "sizeAdjustment": 0, + "verticalOffset": 0 + }, + "ex": { + "sizeAdjustment": 0, + "verticalOffset": 0 + }, + "fox": { + "sizeAdjustment": 0, + "verticalOffset": 0 + }, + "wing": { + "sizeAdjustment": 0, + "verticalOffset": 0 + }, + "hole": { + "sizeAdjustment": 0, + "verticalOffset": 0 + }, + "frame": { + "sizeAdjustment": 0, + "verticalOffset": 0 + }, + "curve": { + "sizeAdjustment": 0, + "verticalOffset": 0 + }, + "eye": { + "sizeAdjustment": 0, + "verticalOffset": 0 + }, + "play": { + "sizeAdjustment": 0, + "verticalOffset": 0 + }, + "bolt": { + "sizeAdjustment": 0, + "verticalOffset": 0 + }, + "crosshairs": { + "sizeAdjustment": 0, + "verticalOffset": 0 + } + } + }, + "cursorless.experimental.snippets": { + "description": "Snippets for use in cursorless", + "type": "object", + "default": { + "ifStatement": { + "definitions": [ + { + "scope": { + "langIds": [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp" + ] + }, + "body": [ + "if ($condition) {\n\t$consequence\n}" + ] + }, + { + "scope": { + "langIds": [ + "python" + ] + }, + "body": [ + "if $condition:\n\t$consequence" + ] + } + ], + "defaultScopeTypes": { + "consequence": "statement", + }, + "description": "If statement" + }, + "tryCatchStatement": { + "definitions": [ + { + "scope": { + "langIds": [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp" + ] + }, + "body": [ + "try {\n\t$1\n} catch ($2) {\n\t$3\n}" + ] + }, + { + "scope": { + "langIds": [ + "python" + ] + }, + "body": [ + "try:\n\t$body\nexcept $error:\n\t$exceptBody" + ] + } + ], + "defaultScopeTypes": { + "body": "statement", + "exceptBody": "statement" + }, + "description": "Try catch statement" + }, + "ifElseStatement": { + "definitions": [ + { + "scope": { + "langIds": [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp" + ] + }, + "body": [ + "if ($condition) {\n\t$consequence\n} else {\n\t$alternative\n}" + ] + }, + { + "scope": { + "langIds": [ + "python" + ] + }, + "body": [ + "if $condition:\n\t$consequence\nelse:\n\t$alternative" + ] + } + ], + "defaultScopeTypes": { + "consequence": "statement", + "alternative": "statement" + }, + "description": "If else statement" + } + }, + "additionalProperties": { + "type": "object", + "properties": { + "definitions": { + "type": "list", + "items": { + "type": "object", + "properties": { + "scope": { + "type": "object", + "desription": "Scopes where this snippet is active", + "properties": { + "langIds": { + "type": "list", + "items": { + "type": "string" + } + }, + "scopeType": { + "type": "string", + "enum": [ + "argumentOrParameter", + "anonymousFunction", + "attribute", + "class", + "className", + "collectionItem", + "collectionKey", + "comment", + "functionCall", + "functionName", + "ifStatement", + "list", + "map", + "name", + "namedFunction", + "regularExpression", + "statement", + "string", + "type", + "value", + "xmlBothTags", + "xmlElement", + "xmlEndTag", + "xmlStartTag" + ] + } + } + }, + "body": { + "type": "string", + "description": "Inline snippet text" + } + }, + "required": [ + "body" + ] + } + }, + "defaultScopeType": { + "type": "string", + "enum": [ + "argumentOrParameter", + "anonymousFunction", + "attribute", + "class", + "className", + "collectionItem", + "collectionKey", + "comment", + "functionCall", + "functionName", + "ifStatement", + "list", + "map", + "name", + "namedFunction", + "regularExpression", + "statement", + "string", + "type", + "value", + "xmlBothTags", + "xmlElement", + "xmlEndTag", + "xmlStartTag" + ] + }, + "description": { + "type": "string", + "description": "Description of the snippet" + } + }, + "required": [ + "definitions" + ] + } + } + } + }, + "snippets": [ + { + "language": "c", + "path": "./snippets/cpp.json" + }, + { + "language": "cpp", + "path": "./snippets/cpp.json" + }, + { + "language": "csharp", + "path": "./snippets/csharp.json" + }, + { + "language": "java", + "path": "./snippets/java.json" + }, + { + "language": "javascript", + "path": "./snippets/typescript.json" + }, + { + "language": "javascriptreact", + "path": "./snippets/typescript.json" + }, + { + "language": "python", + "path": "./snippets/python.json" + }, + { + "language": "typescript", + "path": "./snippets/typescript.json" + }, + { + "language": "typescriptreact", + "path": "./snippets/typescript.json" + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run -S esbuild-base -- --minify", + "esbuild-base": "esbuild ./src/extension.ts --bundle --outfile=dist/extension.js --external:vscode --format=cjs --platform=node", + "esbuild": "npm run -S esbuild-base -- --sourcemap", + "esbuild-watch": "npm run -S esbuild-base -- --sourcemap --watch", + "test-compile": "tsc -p ./", + "compile": "tsc -p ./", + "watch": "tsc -watch -p ./", + "pretest": "yarn run compile && yarn run lint && yarn run esbuild", + "lint": "eslint src --ext ts", + "test": "node ./out/test/runTest.js" + }, + "devDependencies": { + "@types/glob": "^7.1.3", + "@types/js-yaml": "^4.0.2", + "@types/mocha": "^8.0.4", + "@types/node": "^12.11.7", + "@types/sinon": "^10.0.2", + "@types/vscode": "^1.53.0", + "@typescript-eslint/eslint-plugin": "^4.9.0", + "@typescript-eslint/parser": "^4.9.0", + "esbuild": "^0.11.12", + "eslint": "^7.15.0", + "fast-xml-parser": "^3.20.0", + "glob": "^7.1.7", + "js-yaml": "^4.1.0", + "mocha": "^8.1.3", + "sinon": "^11.1.1", + "typescript": "^4.4.4", + "vscode-test": "^1.4.1" + }, + "dependencies": { + "@types/lodash": "^4.14.168", + "immutability-helper": "^3.1.1", + "lodash": "^4.17.21" + } + } + +yarn manifest: + No manifest + +Lockfile: + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + # yarn lockfile v1 + + + "@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + + "@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + + "@babel/highlight@^7.10.4": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + + "@eslint/eslintrc@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz" + integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.20" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + + "@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + + "@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + + "@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + + "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + + "@sinonjs/fake-timers@^7.0.4", "@sinonjs/fake-timers@^7.1.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" + integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== + dependencies: + "@sinonjs/commons" "^1.7.0" + + "@sinonjs/samsam@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.0.2.tgz#a0117d823260f282c04bff5f8704bdc2ac6910bb" + integrity sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + + "@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + + "@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + + "@types/glob@^7.1.3": + version "7.1.3" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + + "@types/js-yaml@^4.0.2": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.2.tgz" + integrity sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA== + + "@types/json-schema@^7.0.3": + version "7.0.7" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + + "@types/lodash@^4.14.168": + version "4.14.168" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz" + integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== + + "@types/minimatch@*": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + + "@types/mocha@^8.0.4": + version "8.2.0" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz" + integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== + + "@types/node@*", "@types/node@^12.11.7": + version "12.20.0" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.0.tgz" + integrity sha512-0/41wHcurotvSOTHQUFkgL702c3pyWR1mToSrrX3pGPvGfpHTv3Ksx0M4UVuU5VJfjVb62Eyr1eKO1tWNUCg2Q== + + "@types/sinon@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.2.tgz#f360d2f189c0fd433d14aeb97b9d705d7e4cc0e4" + integrity sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw== + dependencies: + "@sinonjs/fake-timers" "^7.1.0" + + "@types/vscode@^1.53.0": + version "1.53.0" + resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.53.0.tgz" + integrity sha512-XjFWbSPOM0EKIT2XhhYm3D3cx3nn3lshMUcWNy1eqefk+oqRuBq8unVb6BYIZqXy9lQZyeUl7eaBCOZWv+LcXQ== + + "@typescript-eslint/eslint-plugin@^4.9.0": + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.0.tgz" + integrity sha512-DJgdGZW+8CFUTz5C/dnn4ONcUm2h2T0itWD85Ob5/V27Ndie8hUoX5HKyGssvR8sUMkAIlUc/AMK67Lqa3kBIQ== + dependencies: + "@typescript-eslint/experimental-utils" "4.15.0" + "@typescript-eslint/scope-manager" "4.15.0" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + lodash "^4.17.15" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + + "@typescript-eslint/experimental-utils@4.15.0": + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.0.tgz" + integrity sha512-V4vaDWvxA2zgesg4KPgEGiomWEBpJXvY4ZX34Y3qxK8LUm5I87L+qGIOTd9tHZOARXNRt9pLbblSKiYBlGMawg== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.15.0" + "@typescript-eslint/types" "4.15.0" + "@typescript-eslint/typescript-estree" "4.15.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + + "@typescript-eslint/parser@^4.9.0": + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.0.tgz" + integrity sha512-L6Dtbq8Bc7g2aZwnIBETpmUa9XDKCMzKVwAArnGp5Mn7PRNFjf3mUzq8UeBjL3K8t311hvevnyqXAMSmxO8Gpg== + dependencies: + "@typescript-eslint/scope-manager" "4.15.0" + "@typescript-eslint/types" "4.15.0" + "@typescript-eslint/typescript-estree" "4.15.0" + debug "^4.1.1" + + "@typescript-eslint/scope-manager@4.15.0": + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.0.tgz" + integrity sha512-CSNBZnCC2jEA/a+pR9Ljh8Y+5TY5qgbPz7ICEk9WCpSEgT6Pi7H2RIjxfrrbUXvotd6ta+i27sssKEH8Azm75g== + dependencies: + "@typescript-eslint/types" "4.15.0" + "@typescript-eslint/visitor-keys" "4.15.0" + + "@typescript-eslint/types@4.15.0": + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.0.tgz" + integrity sha512-su4RHkJhS+iFwyqyXHcS8EGPlUVoC+XREfy5daivjLur9JP8GhvTmDipuRpcujtGC4M+GYhUOJCPDE3rC5NJrg== + + "@typescript-eslint/typescript-estree@4.15.0": + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.0.tgz" + integrity sha512-jG6xTmcNbi6xzZq0SdWh7wQ9cMb2pqXaUp6bUZOMsIlu5aOlxGxgE/t6L/gPybybQGvdguajXGkZKSndZJpksA== + dependencies: + "@typescript-eslint/types" "4.15.0" + "@typescript-eslint/visitor-keys" "4.15.0" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + semver "^7.3.2" + tsutils "^3.17.1" + + "@typescript-eslint/visitor-keys@4.15.0": + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.0.tgz" + integrity sha512-RnDtJwOwFucWFAMjG3ghCG/ikImFJFEg20DI7mn4pHEx3vC48lIAoyjhffvfHmErRDboUPC7p9Z2il4CLb7qxA== + dependencies: + "@typescript-eslint/types" "4.15.0" + eslint-visitor-keys "^2.0.0" + + "@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + + acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + + acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + + agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + + ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + + ajv@^7.0.2: + version "7.1.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz" + integrity sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + + ansi-colors@4.1.1, ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + + ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + + ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + + ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + + ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + + anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + + argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + + argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + + array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + + astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + + balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + + big-integer@^1.6.17: + version "1.6.50" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.50.tgz#299a4be8bd441c73dcc492ed46b7169c34e92e70" + integrity sha512-+O2uoQWFRo8ysZNo/rjtri2jIwjr3XfeAgRjAUADRqGG+ZITvyn8J1kvXLTaKVr3hhGXk+f23tKfdzmklVM9vQ== + + binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + + binary@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + + bluebird@~3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= + + brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + + braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + + browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + + buffer-indexof-polyfill@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" + integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== + + buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= + + callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + + camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + + chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= + dependencies: + traverse ">=0.3.0 <0.4" + + chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + + chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + + chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + + cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + + color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + + color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + + color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + + color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + + concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + + core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + + cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + + debug@4: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + + debug@4.3.1, debug@^4.0.1, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + + decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + + deep-is@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + + diff@5.0.0, diff@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + + dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + + doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + + duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + + emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + + enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + + esbuild@^0.11.12: + version "0.11.12" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.11.12.tgz" + integrity sha512-c8cso/1RwVj+fbDvLtUgSG4ZJQ0y9Zdrl6Ot/GAjyy4pdMCHaFnDMts5gqFnWRPLajWtEnI+3hlET4R9fVoZng== + + escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + + escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + + escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + + eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + + eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + + eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + + eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + + eslint@^7.15.0: + version "7.20.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz" + integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.3.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + file-entry-cache "^6.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.20" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + + espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + + esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + + esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + + esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + + estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + + estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + + esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + + fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + + fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + + fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + + fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + + fast-xml-parser@^3.20.0: + version "3.20.0" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.20.0.tgz#b9ce9ddbc44d2cb7e38f846c5929c667bbf0936d" + integrity sha512-cMQwDJYVDjMPU56DviszewgMKuNzuf4NQSBuDf9RgZ6FKm5QEMxW05Za8lvnuL6moxoeZVUWBlL733WmovvV6g== + dependencies: + strnum "^1.0.3" + + fastq@^1.6.0: + version "1.10.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz" + integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== + dependencies: + reusify "^1.0.4" + + file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== + dependencies: + flat-cache "^3.0.4" + + fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + + find-up@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + + flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + + flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + + flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + + fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + + fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + + fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + + functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + + get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + + glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + + glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + + glob@^7.1.3: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + + glob@^7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + + globals@^12.1.0: + version "12.4.0" + resolved "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + + globby@^11.0.1: + version "11.0.2" + resolved "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + + graceful-fs@^4.1.2, graceful-fs@^4.2.2: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + + growl@1.10.5: + version "1.10.5" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + + has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + + has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + + he@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + + http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + + https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + + ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + + ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + + immutability-helper@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz" + integrity sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ== + + import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + + imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + + inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + + inherits@2, inherits@~2.0.0, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + + is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + + is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + + is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + + is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + + is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + + is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + + isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + + isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + + isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + + js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + + js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + + js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + + js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + + json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + + json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + + json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + + just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== + + levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + + listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" + integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= + + locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + + lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + + lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + + log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + + lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + + merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + + micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + + minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + + minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + + "mkdirp@>=0.5 0": + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + + mocha@^8.1.3: + version "8.3.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-8.3.0.tgz" + integrity sha512-TQqyC89V1J/Vxx0DhJIXlq9gbbL9XFNdeLQ1+JsnZsVaSOV1z3tWfw0qZmQJGQRIfkvZcs7snQnZnOCKoldq1Q== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + + ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + + ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + + nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + + natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + + nise@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.0.tgz#713ef3ed138252daef20ec035ab62b7a28be645c" + integrity sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^7.0.4" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + + normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + + once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + + optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + + p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + + p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + + parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + + path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + + path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + + path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + + path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + + path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + + picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + + prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + + process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + + progress@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + + punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + + queue-microtask@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz" + integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== + + randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + + readable-stream@^2.0.2, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + + readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + + regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + + require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + + require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + + resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + + reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + + rimraf@2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + + rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + + run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + + safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + + safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + + semver@^7.2.1, semver@^7.3.2: + version "7.3.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + + serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + + setimmediate@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + + shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + + shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + + sinon@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-11.1.1.tgz#99a295a8b6f0fadbbb7e004076f3ae54fc6eab91" + integrity sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg== + dependencies: + "@sinonjs/commons" "^1.8.3" + "@sinonjs/fake-timers" "^7.1.0" + "@sinonjs/samsam" "^6.0.2" + diff "^5.0.0" + nise "^5.1.0" + supports-color "^7.2.0" + + slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + + slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + + sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + + "string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + + string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + + string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + + strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + + strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + + strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + + strnum@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.3.tgz#bbc438bcb35fbbfc9c1e82f73097665b6ec6959e" + integrity sha512-GVoRjsqAYZkAH16GDzfTuafuwKxzKdaaCQyLaWf37gOP1e2PPbAKWoME1OmO+c4RCKMfNrrPRDLFCNBFU45N/A== + + supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + + supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + + supports-color@^7.1.0, supports-color@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + + table@^6.0.4: + version "6.0.7" + resolved "https://registry.npmjs.org/table/-/table-6.0.7.tgz" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + dependencies: + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + + text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + + to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + + "traverse@>=0.3.0 <0.4": + version "0.3.9" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + + tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + + tsutils@^3.17.1: + version "3.20.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz" + integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== + dependencies: + tslib "^1.8.1" + + type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + + type-detect@4.0.8, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + + type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + + typescript@^4.4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== + + unzipper@^0.10.11: + version "0.10.11" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" + integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== + dependencies: + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "^1.0.12" + graceful-fs "^4.2.2" + listenercount "~1.0.1" + readable-stream "~2.3.6" + setimmediate "~1.0.4" + + uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + + util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + + v8-compile-cache@^2.0.3: + version "2.2.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + + vscode-test@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-1.6.1.tgz#44254c67036de92b00fdd72f6ace5f1854e1a563" + integrity sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA== + dependencies: + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + rimraf "^3.0.2" + unzipper "^0.10.11" + + which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + + wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + + word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + + workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== + + wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + + wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + + y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + + yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + + yargs-parser@20.2.4, yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + + yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + + yargs@16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + + yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 2a84b421864de4e86a3fba9846e7089b81980826 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 14:51:01 +0100 Subject: [PATCH 08/35] Fix tests --- .../languages/cpp/elseStateWrapThis.yml | 29 +++++++++---- .../recorded/languages/cpp/ifElseWrapThis.yml | 29 +++++++++---- .../languages/cpp/ifStateWrapThis.yml | 29 +++++++++---- .../languages/cpp/tryCatchWrapThis.yml | 29 +++++++++---- .../languages/cpp/tryCatchWrapThis2.yml | 41 +++++++++++------- .../languages/csharp/elseStateWrapThis.yml | 29 +++++++++---- .../languages/csharp/ifElseWrapThis.yml | 29 +++++++++---- .../languages/csharp/ifStateWrapThis.yml | 29 +++++++++---- .../languages/csharp/tryCatchWrapThis.yml | 29 +++++++++---- .../languages/csharp/tryCatchWrapThis2.yml | 41 +++++++++++------- .../languages/java/elseStateWrapThis.yml | 29 +++++++++---- .../languages/java/ifElseWrapThis.yml | 29 +++++++++---- .../languages/java/ifStateWrapThis.yml | 29 +++++++++---- .../languages/java/tryCatchWrapThis.yml | 29 +++++++++---- .../languages/java/tryCatchWrapThis2.yml | 41 +++++++++++------- .../languages/python/elseStateWrapThis.yml | 29 +++++++++---- .../languages/python/ifElseWrapThis.yml | 31 ++++++++----- .../languages/python/ifStateWrapThis.yml | 29 +++++++++---- .../languages/python/tryCatchWrapThis.yml | 31 ++++++++----- .../languages/python/tryCatchWrapThis2.yml | 43 ++++++++++++------- .../typescript/elseStateWrapThis.yml | 29 +++++++++---- .../languages/typescript/ifElseWrapThis.yml | 29 +++++++++---- .../languages/typescript/ifStateWrapThis.yml | 29 +++++++++---- .../languages/typescript/tryCatchWrapThis.yml | 29 +++++++++---- .../typescript/tryCatchWrapThis2.yml | 41 +++++++++++------- 25 files changed, 533 insertions(+), 258 deletions(-) diff --git a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml index e97efa8048..9b2de0fff5 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifElseStatementElseBranch] + mark: { type: cursor } + extraArgs: [ifElseStatement/alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml index a46fb8bda6..71716206d7 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifElseStatementIfBranch] + mark: { type: cursor } + extraArgs: [ifElseStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml index 7381d6b65c..8f389aba93 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml @@ -4,23 +4,34 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifStatement] + mark: { type: cursor } + extraArgs: [ifStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 2, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 2, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml index 2aa91b64f2..1d546a0730 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.tryCatchStatement] + mark: { type: cursor } + extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- try { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 2, character: 9} - active: {line: 2, character: 9} + - anchor: { line: 2, character: 9 } + active: { line: 2, character: 9 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml index 6d8dfe24a1..f380d3d000 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml @@ -4,8 +4,8 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.tryCatchStatement] + mark: { type: cursor } + extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: |- @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 4, character: 0 } + active: { line: 4, character: 0 } + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try { @@ -35,13 +35,24 @@ finalState: } selections: - - anchor: {line: 10, character: 9} - active: {line: 10, character: 9} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} + - anchor: { line: 10, character: 9 } + active: { line: 10, character: 9 } + - anchor: { line: 4, character: 9 } + active: { line: 4, character: 9 } thatMark: - - anchor: {line: 8, character: 0} - active: {line: 12, character: 1} - - anchor: {line: 0, character: 0} - active: {line: 6, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 8, character: 0 } + active: { line: 12, character: 1 } + - anchor: { line: 0, character: 0 } + active: { line: 6, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml index febd815ae5..a33aeaa0a0 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifElseStatementElseBranch] + mark: { type: cursor } + extraArgs: [ifElseStatement/alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml index 9dd5be1282..09c23e3400 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifElseStatementIfBranch] + mark: { type: cursor } + extraArgs: [ifElseStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml index 7ed80f880c..89834114ba 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml @@ -4,23 +4,34 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifStatement] + mark: { type: cursor } + extraArgs: [ifStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 2, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 2, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml index 639dae0017..16fb3a8969 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.tryCatchStatement] + mark: { type: cursor } + extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- try { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 2, character: 9} - active: {line: 2, character: 9} + - anchor: { line: 2, character: 9 } + active: { line: 2, character: 9 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml index b6938c49ad..52e2402bde 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml @@ -4,8 +4,8 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.tryCatchStatement] + mark: { type: cursor } + extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: |- @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 4, character: 0 } + active: { line: 4, character: 0 } + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try { @@ -35,13 +35,24 @@ finalState: } selections: - - anchor: {line: 10, character: 9} - active: {line: 10, character: 9} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} + - anchor: { line: 10, character: 9 } + active: { line: 10, character: 9 } + - anchor: { line: 4, character: 9 } + active: { line: 4, character: 9 } thatMark: - - anchor: {line: 8, character: 0} - active: {line: 12, character: 1} - - anchor: {line: 0, character: 0} - active: {line: 6, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 8, character: 0 } + active: { line: 12, character: 1 } + - anchor: { line: 0, character: 0 } + active: { line: 6, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml index a4f17515b0..5b9cd52b3e 100644 --- a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifElseStatementElseBranch] + mark: { type: cursor } + extraArgs: [ifElseStatement/alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml index a9b5f9f429..3c3191fdad 100644 --- a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifElseStatementIfBranch] + mark: { type: cursor } + extraArgs: [ifElseStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml index fd5b749bc2..0ff193423e 100644 --- a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml @@ -4,23 +4,34 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifStatement] + mark: { type: cursor } + extraArgs: [ifStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 2, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 2, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml index d638d27cde..2b06144aff 100644 --- a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.tryCatchStatement] + mark: { type: cursor } + extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- try { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 2, character: 9} - active: {line: 2, character: 9} + - anchor: { line: 2, character: 9 } + active: { line: 2, character: 9 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml index 9c2adca7b5..04a3129979 100644 --- a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml @@ -4,8 +4,8 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.tryCatchStatement] + mark: { type: cursor } + extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: |- @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 4, character: 0 } + active: { line: 4, character: 0 } + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try { @@ -35,13 +35,24 @@ finalState: } selections: - - anchor: {line: 10, character: 9} - active: {line: 10, character: 9} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} + - anchor: { line: 10, character: 9 } + active: { line: 10, character: 9 } + - anchor: { line: 4, character: 9 } + active: { line: 4, character: 9 } thatMark: - - anchor: {line: 8, character: 0} - active: {line: 12, character: 1} - - anchor: {line: 0, character: 0} - active: {line: 6, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 8, character: 0 } + active: { line: 12, character: 1 } + - anchor: { line: 0, character: 0 } + active: { line: 6, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml index 7bd547e53f..e84aa342db 100644 --- a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifElseStatementElseBranch] + mark: { type: cursor } + extraArgs: [ifElseStatement/alternative] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- if : @@ -19,9 +19,20 @@ finalState: else: foo = "hello" selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} + - anchor: { line: 0, character: 3 } + active: { line: 0, character: 3 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 3, character: 17} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 3, character: 17 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml index f869d39a57..b056b8d8b1 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml @@ -4,24 +4,35 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifElseStatementIfBranch] + mark: { type: cursor } + extraArgs: [ifElseStatement/consequence] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- if : foo = "hello" else: - + selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} + - anchor: { line: 0, character: 3 } + active: { line: 0, character: 3 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 3, character: 4} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 3, character: 4 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml index 831ee25426..ee4502babc 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml @@ -4,22 +4,33 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifStatement] + mark: { type: cursor } + extraArgs: [ifStatement/consequence] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- if : foo = "hello" selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} + - anchor: { line: 0, character: 3 } + active: { line: 0, character: 3 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 1, character: 17} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 1, character: 17 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml index 7018ec4df1..15eeb50b16 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml @@ -4,24 +4,35 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.tryCatchStatement] + mark: { type: cursor } + extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try: foo = "hello" except : - + selections: - - anchor: {line: 2, character: 7} - active: {line: 2, character: 7} + - anchor: { line: 2, character: 7 } + active: { line: 2, character: 7 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 3, character: 4} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 3, character: 4 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml index f485628a00..aa52268858 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml @@ -4,8 +4,8 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.tryCatchStatement] + mark: { type: cursor } + extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: |- @@ -14,10 +14,10 @@ initialState: bar = "hello" selections: - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 3, character: 0 } + active: { line: 3, character: 0 } + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try: @@ -29,15 +29,26 @@ finalState: try: bar = "hello" except : - + selections: - - anchor: {line: 8, character: 7} - active: {line: 8, character: 7} - - anchor: {line: 3, character: 7} - active: {line: 3, character: 7} + - anchor: { line: 8, character: 7 } + active: { line: 8, character: 7 } + - anchor: { line: 3, character: 7 } + active: { line: 3, character: 7 } thatMark: - - anchor: {line: 6, character: 0} - active: {line: 9, character: 4} - - anchor: {line: 0, character: 0} - active: {line: 4, character: 4} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 6, character: 0 } + active: { line: 9, character: 4 } + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 4 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml index 5670277bef..00094e731a 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifElseStatementElseBranch] + mark: { type: cursor } + extraArgs: [ifElseStatement/alternative] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: const foo = "hello"; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml index 66ba292df2..8b81231430 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifElseStatementIfBranch] + mark: { type: cursor } + extraArgs: [ifElseStatement/consequence] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml index 3c83a61073..191acfda7f 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml @@ -4,23 +4,34 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.ifStatement] + mark: { type: cursor } + extraArgs: [ifStatement/consequence] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { const foo = "hello"; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 2, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 2, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml index e4109e201d..9ba22c47e5 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.tryCatchStatement] + mark: { type: cursor } + extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- try { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 2, character: 9} - active: {line: 2, character: 9} + - anchor: { line: 2, character: 9 } + active: { line: 2, character: 9 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml index 2eba0d47f9..90f9ccb6d9 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml @@ -4,8 +4,8 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [cursorless.wrappers.tryCatchStatement] + mark: { type: cursor } + extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: |- @@ -15,10 +15,10 @@ initialState: const bar = "hello"; selections: - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 4, character: 0 } + active: { line: 4, character: 0 } + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try { @@ -35,13 +35,24 @@ finalState: } selections: - - anchor: {line: 10, character: 9} - active: {line: 10, character: 9} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} + - anchor: { line: 10, character: 9 } + active: { line: 10, character: 9 } + - anchor: { line: 4, character: 9 } + active: { line: 4, character: 9 } thatMark: - - anchor: {line: 8, character: 0} - active: {line: 12, character: 1} - - anchor: {line: 0, character: 0} - active: {line: 6, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 8, character: 0 } + active: { line: 12, character: 1 } + - anchor: { line: 0, character: 0 } + active: { line: 6, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] From f41120434c7925018d6892a1c9aab0c7057e69e4 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 14:59:11 +0100 Subject: [PATCH 09/35] Fix tests --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4fb5a3f83a..d2ba361932 100644 --- a/package.json +++ b/package.json @@ -456,7 +456,7 @@ ] }, "body": [ - "try {\n\t$1\n} catch ($2) {\n\t$3\n}" + "try {\n\t$body\n} catch ($error) {\n\t$exceptBody\n}" ] }, { From b9e1ac1b15836cc513da7e8acac04f204e73af88 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 15:03:58 +0100 Subject: [PATCH 10/35] Fix schema --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d2ba361932..cfe98ab686 100644 --- a/package.json +++ b/package.json @@ -517,7 +517,7 @@ "type": "object", "properties": { "definitions": { - "type": "list", + "type": "array", "items": { "type": "object", "properties": { @@ -526,7 +526,7 @@ "desription": "Scopes where this snippet is active", "properties": { "langIds": { - "type": "list", + "type": "array", "items": { "type": "string" } From 90d5a5b3c5d28370cb0eac8627e2b2293d45deea Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 15:21:29 +0100 Subject: [PATCH 11/35] Fixes --- package.json | 66 ++++++++++++++++++---------------- src/actions/WrapWithSnippet.ts | 17 +++++---- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index cfe98ab686..eb35344a75 100644 --- a/package.json +++ b/package.json @@ -563,8 +563,11 @@ } }, "body": { - "type": "string", - "description": "Inline snippet text" + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline snippet text; entries joined by newline" } }, "required": [ @@ -572,34 +575,37 @@ ] } }, - "defaultScopeType": { - "type": "string", - "enum": [ - "argumentOrParameter", - "anonymousFunction", - "attribute", - "class", - "className", - "collectionItem", - "collectionKey", - "comment", - "functionCall", - "functionName", - "ifStatement", - "list", - "map", - "name", - "namedFunction", - "regularExpression", - "statement", - "string", - "type", - "value", - "xmlBothTags", - "xmlElement", - "xmlEndTag", - "xmlStartTag" - ] + "defaultScopeTypes": { + "type": "object", + "additionalProperties": { + "type": "string", + "enum": [ + "argumentOrParameter", + "anonymousFunction", + "attribute", + "class", + "className", + "collectionItem", + "collectionKey", + "comment", + "functionCall", + "functionName", + "ifStatement", + "list", + "map", + "name", + "namedFunction", + "regularExpression", + "statement", + "string", + "type", + "value", + "xmlBothTags", + "xmlElement", + "xmlEndTag", + "xmlStartTag" + ] + } }, "description": { "type": "string", diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 50c8b8bc15..8e3ef03f17 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -1,4 +1,4 @@ -import { SnippetString, workspace } from "vscode"; +import { commands, SnippetString, workspace } from "vscode"; import { Action, ActionPreferences, @@ -109,15 +109,15 @@ export default class WrapWithSnippet implements Action { if (candidate.name === placeholderName) { candidate.name = "TM_SELECTED_TEXT"; } else if (!KnownSnippetVariableNames[candidate.name]) { - candidate.parent.replace(candidate, [ - new Placeholder(placeholderIndex++), - ]); + const placeholder = new Placeholder(placeholderIndex++); + candidate.children.forEach((child) => placeholder.appendChild(child)); + candidate.parent.replace(candidate, [placeholder]); } } return true; }); - const snippetString = new SnippetString(parsedSnippet.toTextmateString()); + const snippetString = parsedSnippet.toTextmateString(); console.log(`snippetString: ${parsedSnippet.toTextmateString()}`); await displayPendingEditDecorations( @@ -129,8 +129,13 @@ export default class WrapWithSnippet implements Action { (target) => target.selection.selection ); + await this.graph.actions.setSelection.run([targets]); + const [updatedTargetSelections] = await callFunctionAndUpdateSelections( - () => editor.insertSnippet(snippetString, targetSelections), + () => + commands.executeCommand("editor.action.insertSnippet", { + snippet: snippetString, + }), editor, [targetSelections] ); From 8b86f107d7dc3179ef1b83d0114cbf438755d597 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 15:24:06 +0100 Subject: [PATCH 12/35] Fix python tests --- .../suite/fixtures/recorded/languages/python/ifElseWrapThis.yml | 2 +- .../fixtures/recorded/languages/python/tryCatchWrapThis.yml | 2 +- .../fixtures/recorded/languages/python/tryCatchWrapThis2.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml index b056b8d8b1..b4d29860bb 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml @@ -17,7 +17,7 @@ finalState: if : foo = "hello" else: - + selections: - anchor: { line: 0, character: 3 } active: { line: 0, character: 3 } diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml index 15eeb50b16..d38637a6ef 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml @@ -17,7 +17,7 @@ finalState: try: foo = "hello" except : - + selections: - anchor: { line: 2, character: 7 } active: { line: 2, character: 7 } diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml index aa52268858..580a1d6a6a 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml @@ -29,7 +29,7 @@ finalState: try: bar = "hello" except : - + selections: - anchor: { line: 8, character: 7 } active: { line: 8, character: 7 } From 7ccafc24894df09f7cac12d3d94f4243516695ce Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 15:26:58 +0100 Subject: [PATCH 13/35] Cleanup yaml formatting --- .../languages/cpp/elseStateWrapThis.yml | 27 ++++--------- .../recorded/languages/cpp/ifElseWrapThis.yml | 27 ++++--------- .../languages/cpp/ifStateWrapThis.yml | 27 ++++--------- .../languages/cpp/tryCatchWrapThis.yml | 27 ++++--------- .../languages/cpp/tryCatchWrapThis2.yml | 39 +++++++------------ .../languages/csharp/elseStateWrapThis.yml | 27 ++++--------- .../languages/csharp/ifElseWrapThis.yml | 27 ++++--------- .../languages/csharp/ifStateWrapThis.yml | 27 ++++--------- .../languages/csharp/tryCatchWrapThis.yml | 27 ++++--------- .../languages/csharp/tryCatchWrapThis2.yml | 39 +++++++------------ .../languages/java/elseStateWrapThis.yml | 27 ++++--------- .../languages/java/ifElseWrapThis.yml | 27 ++++--------- .../languages/java/ifStateWrapThis.yml | 27 ++++--------- .../languages/java/tryCatchWrapThis.yml | 27 ++++--------- .../languages/java/tryCatchWrapThis2.yml | 39 +++++++------------ .../languages/python/elseStateWrapThis.yml | 27 ++++--------- .../languages/python/ifElseWrapThis.yml | 27 ++++--------- .../languages/python/ifStateWrapThis.yml | 27 ++++--------- .../languages/python/tryCatchWrapThis.yml | 27 ++++--------- .../languages/python/tryCatchWrapThis2.yml | 39 +++++++------------ .../typescript/elseStateWrapThis.yml | 27 ++++--------- .../languages/typescript/ifElseWrapThis.yml | 27 ++++--------- .../languages/typescript/ifStateWrapThis.yml | 27 ++++--------- .../languages/typescript/tryCatchWrapThis.yml | 27 ++++--------- .../typescript/tryCatchWrapThis2.yml | 39 +++++++------------ 25 files changed, 230 insertions(+), 505 deletions(-) diff --git a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml index 9b2de0fff5..014c8d544a 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement/alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml index 71716206d7..adc39fbe6e 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml index 8f389aba93..f421c6f60e 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml @@ -4,34 +4,23 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml index 1d546a0730..a9d9ee9401 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- try { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 2, character: 9 } - active: { line: 2, character: 9 } + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml index f380d3d000..80628fb2a3 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml @@ -4,7 +4,7 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement/body] marks: {} initialState: @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: { line: 4, character: 0 } - active: { line: 4, character: 0 } - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try { @@ -35,24 +35,13 @@ finalState: } selections: - - anchor: { line: 10, character: 9 } - active: { line: 10, character: 9 } - - anchor: { line: 4, character: 9 } - active: { line: 4, character: 9 } + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} thatMark: - - anchor: { line: 8, character: 0 } - active: { line: 12, character: 1 } - - anchor: { line: 0, character: 0 } - active: { line: 6, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml index a33aeaa0a0..61ba8c0f5c 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement/alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml index 09c23e3400..1a92630457 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml index 89834114ba..bf8b2c012f 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml @@ -4,34 +4,23 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml index 16fb3a8969..a9fb1a55ac 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- try { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 2, character: 9 } - active: { line: 2, character: 9 } + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml index 52e2402bde..20d6235484 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml @@ -4,7 +4,7 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement/body] marks: {} initialState: @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: { line: 4, character: 0 } - active: { line: 4, character: 0 } - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try { @@ -35,24 +35,13 @@ finalState: } selections: - - anchor: { line: 10, character: 9 } - active: { line: 10, character: 9 } - - anchor: { line: 4, character: 9 } - active: { line: 4, character: 9 } + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} thatMark: - - anchor: { line: 8, character: 0 } - active: { line: 12, character: 1 } - - anchor: { line: 0, character: 0 } - active: { line: 6, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml index 5b9cd52b3e..0b4f405273 100644 --- a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement/alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml index 3c3191fdad..30a22f7943 100644 --- a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml index 0ff193423e..d68eb48db6 100644 --- a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml @@ -4,34 +4,23 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifStatement/consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml index 2b06144aff..bcff1caa85 100644 --- a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- try { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 2, character: 9 } - active: { line: 2, character: 9 } + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml index 04a3129979..1b3bef41a8 100644 --- a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml @@ -4,7 +4,7 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement/body] marks: {} initialState: @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: { line: 4, character: 0 } - active: { line: 4, character: 0 } - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try { @@ -35,24 +35,13 @@ finalState: } selections: - - anchor: { line: 10, character: 9 } - active: { line: 10, character: 9 } - - anchor: { line: 4, character: 9 } - active: { line: 4, character: 9 } + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} thatMark: - - anchor: { line: 8, character: 0 } - active: { line: 12, character: 1 } - - anchor: { line: 0, character: 0 } - active: { line: 6, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml index e84aa342db..a0f3549599 100644 --- a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement/alternative] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- if : @@ -19,20 +19,9 @@ finalState: else: foo = "hello" selections: - - anchor: { line: 0, character: 3 } - active: { line: 0, character: 3 } + - anchor: {line: 0, character: 3} + active: {line: 0, character: 3} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 3, character: 17 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 3, character: 17} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml index b4d29860bb..cf02818fbe 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement/consequence] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- if : @@ -19,20 +19,9 @@ finalState: else: selections: - - anchor: { line: 0, character: 3 } - active: { line: 0, character: 3 } + - anchor: {line: 0, character: 3} + active: {line: 0, character: 3} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 3, character: 4 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 3, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml index ee4502babc..1051c31353 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml @@ -4,33 +4,22 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifStatement/consequence] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- if : foo = "hello" selections: - - anchor: { line: 0, character: 3 } - active: { line: 0, character: 3 } + - anchor: {line: 0, character: 3} + active: {line: 0, character: 3} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 1, character: 17 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 1, character: 17} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml index d38637a6ef..f352eac5d7 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try: @@ -19,20 +19,9 @@ finalState: except : selections: - - anchor: { line: 2, character: 7 } - active: { line: 2, character: 7 } + - anchor: {line: 2, character: 7} + active: {line: 2, character: 7} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 3, character: 4 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 3, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml index 580a1d6a6a..2a5460b027 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml @@ -4,7 +4,7 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement/body] marks: {} initialState: @@ -14,10 +14,10 @@ initialState: bar = "hello" selections: - - anchor: { line: 3, character: 0 } - active: { line: 3, character: 0 } - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 3, character: 0} + active: {line: 3, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try: @@ -31,24 +31,13 @@ finalState: except : selections: - - anchor: { line: 8, character: 7 } - active: { line: 8, character: 7 } - - anchor: { line: 3, character: 7 } - active: { line: 3, character: 7 } + - anchor: {line: 8, character: 7} + active: {line: 8, character: 7} + - anchor: {line: 3, character: 7} + active: {line: 3, character: 7} thatMark: - - anchor: { line: 6, character: 0 } - active: { line: 9, character: 4 } - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 4 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 6, character: 0} + active: {line: 9, character: 4} + - anchor: {line: 0, character: 0} + active: {line: 4, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml index 00094e731a..1f194a3898 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement/alternative] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: const foo = "hello"; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml index 8b81231430..c13631e87c 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement/consequence] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml index 191acfda7f..6b466b0c8c 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml @@ -4,34 +4,23 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifStatement/consequence] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { const foo = "hello"; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml index 9ba22c47e5..9a1d75cd63 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement/body] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- try { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 2, character: 9 } - active: { line: 2, character: 9 } + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml index 90f9ccb6d9..c04bf2d2e2 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml @@ -4,7 +4,7 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement/body] marks: {} initialState: @@ -15,10 +15,10 @@ initialState: const bar = "hello"; selections: - - anchor: { line: 4, character: 0 } - active: { line: 4, character: 0 } - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try { @@ -35,24 +35,13 @@ finalState: } selections: - - anchor: { line: 10, character: 9 } - active: { line: 10, character: 9 } - - anchor: { line: 4, character: 9 } - active: { line: 4, character: 9 } + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} thatMark: - - anchor: { line: 8, character: 0 } - active: { line: 12, character: 1 } - - anchor: { line: 0, character: 0 } - active: { line: 6, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] From 1df155c12ff7f5214dde77aa64d4f6f73edc9c12 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 16:00:36 +0100 Subject: [PATCH 14/35] Support snippet overrides --- package.json | 90 +----------------------- src/actions/WrapWithSnippet.ts | 23 +++--- src/actions/defaultSnippetDefinitions.ts | 75 ++++++++++++++++++++ src/typings/snippet.ts | 13 ++++ 4 files changed, 99 insertions(+), 102 deletions(-) create mode 100644 src/actions/defaultSnippetDefinitions.ts create mode 100644 src/typings/snippet.ts diff --git a/package.json b/package.json index eb35344a75..4b2a2ea530 100644 --- a/package.json +++ b/package.json @@ -406,70 +406,14 @@ "type": "object", "default": { "ifStatement": { - "definitions": [ - { - "scope": { - "langIds": [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp" - ] - }, - "body": [ - "if ($condition) {\n\t$consequence\n}" - ] - }, - { - "scope": { - "langIds": [ - "python" - ] - }, - "body": [ - "if $condition:\n\t$consequence" - ] - } - ], + "definitions": [], "defaultScopeTypes": { "consequence": "statement" }, "description": "If statement" }, "tryCatchStatement": { - "definitions": [ - { - "scope": { - "langIds": [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp" - ] - }, - "body": [ - "try {\n\t$body\n} catch ($error) {\n\t$exceptBody\n}" - ] - }, - { - "scope": { - "langIds": [ - "python" - ] - }, - "body": [ - "try:\n\t$body\nexcept $error:\n\t$exceptBody" - ] - } - ], + "definitions": [], "defaultScopeTypes": { "body": "statement", "exceptBody": "statement" @@ -477,35 +421,7 @@ "description": "Try catch statement" }, "ifElseStatement": { - "definitions": [ - { - "scope": { - "langIds": [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp" - ] - }, - "body": [ - "if ($condition) {\n\t$consequence\n} else {\n\t$alternative\n}" - ] - }, - { - "scope": { - "langIds": [ - "python" - ] - }, - "body": [ - "if $condition:\n\t$consequence\nelse:\n\t$alternative" - ] - } - ], + "definitions": [], "defaultScopeTypes": { "consequence": "statement", "alternative": "statement" diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 8e3ef03f17..983177a244 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -1,4 +1,5 @@ import { commands, SnippetString, workspace } from "vscode"; +import { SnippetDefinition } from "../typings/snippet"; import { Action, ActionPreferences, @@ -16,18 +17,7 @@ import { Variable, } from "../vendor/snippet/snippetParser"; import { KnownSnippetVariableNames } from "../vendor/snippet/snippetVariables"; - -interface SnippetScope { - langIds?: string[]; - scopeType?: ScopeType; -} - -type SnippetBody = string[]; - -interface SnippetDefinition { - body: SnippetBody; - scope?: SnippetScope; -} +import defaultSnippetDefinitions from "./defaultSnippetDefinitions"; interface Snippet { definitions: SnippetDefinition[]; @@ -88,7 +78,10 @@ export default class WrapWithSnippet implements Action { const editor = ensureSingleEditor(targets); - const definition = findMatchingSnippetDefinition(targets[0], snippet); + const definition = findMatchingSnippetDefinition(targets[0], [ + ...snippet.definitions, + ...(defaultSnippetDefinitions[snippetName] ?? []), + ]); if (definition == null) { throw new Error("Couldn't find matching snippet definition"); @@ -156,9 +149,9 @@ function parseSnippetLocation(snippetLocation: string): [string, string] { function findMatchingSnippetDefinition( typedSelection: TypedSelection, - snippet: Snippet + definitions: SnippetDefinition[] ) { - return snippet.definitions.find(({ scope }) => { + return definitions.find(({ scope }) => { if (scope == null) { return true; } diff --git a/src/actions/defaultSnippetDefinitions.ts b/src/actions/defaultSnippetDefinitions.ts new file mode 100644 index 0000000000..a8f07a8ef6 --- /dev/null +++ b/src/actions/defaultSnippetDefinitions.ts @@ -0,0 +1,75 @@ +import { SnippetDefinition } from "../typings/snippet"; + +const defaultSnippetDefinitions: Record = { + ifStatement: [ + { + scope: { + langIds: [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp", + ], + }, + body: ["if ($condition) {\n\t$consequence\n}"], + }, + { + scope: { + langIds: ["python"], + }, + body: ["if $condition:\n\t$consequence"], + }, + ], + tryCatchStatement: [ + { + scope: { + langIds: [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp", + ], + }, + body: ["try {\n\t$body\n} catch ($error) {\n\t$exceptBody\n}"], + }, + { + scope: { + langIds: ["python"], + }, + body: ["try:\n\t$body\nexcept $error:\n\t$exceptBody"], + }, + ], + ifElseStatement: [ + { + scope: { + langIds: [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp", + ], + }, + body: ["if ($condition) {\n\t$consequence\n} else {\n\t$alternative\n}"], + }, + { + scope: { + langIds: ["python"], + }, + body: ["if $condition:\n\t$consequence\nelse:\n\t$alternative"], + }, + ], +}; + +export default defaultSnippetDefinitions; diff --git a/src/typings/snippet.ts b/src/typings/snippet.ts new file mode 100644 index 0000000000..83e3f16898 --- /dev/null +++ b/src/typings/snippet.ts @@ -0,0 +1,13 @@ +import { ScopeType } from "./Types"; + +export interface SnippetScope { + langIds?: string[]; + scopeType?: ScopeType; +} + +export type SnippetBody = string[]; + +export interface SnippetDefinition { + body: SnippetBody; + scope?: SnippetScope; +} From 638849907223ac3af36074f8e1f321f7b5ea684a Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 16:11:09 +0100 Subject: [PATCH 15/35] Fix inference --- src/core/inferFullTargets.ts | 15 ++++----- .../recorded/inference/ifWrapTokenFine.yml | 31 +++++++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml diff --git a/src/core/inferFullTargets.ts b/src/core/inferFullTargets.ts index 663bc47387..734ea7dfa0 100644 --- a/src/core/inferFullTargets.ts +++ b/src/core/inferFullTargets.ts @@ -93,9 +93,8 @@ function inferPrimitiveTarget( previousTargets: PartialTarget[], actionPreferences: ActionPreferences ): PrimitiveTarget { - const previousTargetsForAttributes = hasContent(target) - ? [] - : previousTargets; + const targetHasContent = hasContent(target); + const previousTargetsForAttributes = targetHasContent ? [] : previousTargets; const maybeSelectionType = target.selectionType ?? @@ -111,20 +110,22 @@ function inferPrimitiveTarget( const position = target.position ?? getPreviousPosition(previousTargets) ?? - actionPreferences.position ?? + (targetHasContent ? null : actionPreferences.position) ?? "contents"; const selectionType = - maybeSelectionType ?? actionPreferences.selectionType ?? "token"; + maybeSelectionType ?? + (targetHasContent ? null : actionPreferences.selectionType) ?? + "token"; const insideOutsideType = target.insideOutsideType ?? getPreviousAttribute(previousTargetsForAttributes, "insideOutsideType") ?? - actionPreferences.insideOutsideType; + (targetHasContent ? null : actionPreferences.insideOutsideType); const modifier = target.modifier ?? getPreviousAttribute(previousTargetsForAttributes, "modifier") ?? - actionPreferences.modifier ?? { + (targetHasContent ? null : actionPreferences.modifier) ?? { type: "identity", }; diff --git a/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml b/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml new file mode 100644 index 0000000000..98db207251 --- /dev/null +++ b/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml @@ -0,0 +1,31 @@ +spokenForm: if wrap token fine +languageId: typescript +command: + actionName: wrapWithSnippet + partialTargets: + - type: primitive + selectionType: token + mark: {type: decoratedSymbol, symbolColor: default, character: f} + extraArgs: [ifStatement/consequence] +marks: + default.f: + start: {line: 0, character: 6} + end: {line: 0, character: 9} +initialState: + documentContents: | + const foo = "hello"; + selections: + - anchor: {line: 1, character: 0} + active: {line: 1, character: 0} +finalState: + documentContents: | + const if () { + foo + } = "hello"; + selections: + - anchor: {line: 0, character: 10} + active: {line: 0, character: 10} + thatMark: + - anchor: {line: 0, character: 6} + active: {line: 2, character: 1} +fullTargets: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: f}, selectionType: token, position: contents, insideOutsideType: null, modifier: {type: identity}}] From b1a53e283df98b8c08ca6fddc8db19800f13e5ad Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 16:23:31 +0100 Subject: [PATCH 16/35] Cleanup --- src/actions/WrapWithSnippet.ts | 64 +++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 983177a244..adcef0fb4f 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -14,6 +14,7 @@ import { callFunctionAndUpdateSelections } from "../util/updateSelections"; import { Placeholder, SnippetParser, + TextmateSnippet, Variable, } from "../vendor/snippet/snippetParser"; import { KnownSnippetVariableNames } from "../vendor/snippet/snippetVariables"; @@ -78,6 +79,7 @@ export default class WrapWithSnippet implements Action { const editor = ensureSingleEditor(targets); + // Find snippet definition matching context, preferring user definitions const definition = findMatchingSnippetDefinition(targets[0], [ ...snippet.definitions, ...(defaultSnippetDefinitions[snippetName] ?? []), @@ -89,29 +91,9 @@ export default class WrapWithSnippet implements Action { const parsedSnippet = this.snippetParser.parse(definition.body.join("\n")); - var placeholderIndex = 1; - parsedSnippet.walk((candidate) => { - if (candidate instanceof Placeholder) { - placeholderIndex = Math.max(placeholderIndex, candidate.index + 1); - } - return true; - }); - - parsedSnippet.walk((candidate) => { - if (candidate instanceof Variable) { - if (candidate.name === placeholderName) { - candidate.name = "TM_SELECTED_TEXT"; - } else if (!KnownSnippetVariableNames[candidate.name]) { - const placeholder = new Placeholder(placeholderIndex++); - candidate.children.forEach((child) => placeholder.appendChild(child)); - candidate.parent.replace(candidate, [placeholder]); - } - } - return true; - }); + transformSnippetVariables(parsedSnippet, placeholderName); const snippetString = parsedSnippet.toTextmateString(); - console.log(`snippetString: ${parsedSnippet.toTextmateString()}`); await displayPendingEditDecorations( targets, @@ -142,6 +124,46 @@ export default class WrapWithSnippet implements Action { } } +/** + * Replaces the snippet variable with name `placeholderName` with TM_SELECTED_TEXT + * + * Also replaces any unknown variables with placeholders. We do this so it's + * easier to leave one of the placeholders blank. We may make it so that you + * can disable this with a setting in the future + * @param parsedSnippet The parsed textmate snippet to operate on + * @param placeholderName The variable name to replace with TM_SELECTED_TEXT + */ +function transformSnippetVariables( + parsedSnippet: TextmateSnippet, + placeholderName: string +) { + var placeholderIndex = getMaxPlaceholderIndex(parsedSnippet) + 1; + + parsedSnippet.walk((candidate) => { + if (candidate instanceof Variable) { + if (candidate.name === placeholderName) { + candidate.name = "TM_SELECTED_TEXT"; + } else if (!KnownSnippetVariableNames[candidate.name]) { + const placeholder = new Placeholder(placeholderIndex++); + candidate.children.forEach((child) => placeholder.appendChild(child)); + candidate.parent.replace(candidate, [placeholder]); + } + } + return true; + }); +} + +function getMaxPlaceholderIndex(parsedSnippet: TextmateSnippet) { + var placeholderIndex = 1; + parsedSnippet.walk((candidate) => { + if (candidate instanceof Placeholder) { + placeholderIndex = Math.max(placeholderIndex, candidate.index + 1); + } + return true; + }); + return placeholderIndex; +} + function parseSnippetLocation(snippetLocation: string): [string, string] { const [snippetName, placeholderName] = snippetLocation.split("/"); return [snippetName, placeholderName]; From 2e9f7b10b2cd0e5c241c5585d2ec950b7382b330 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 16:29:10 +0100 Subject: [PATCH 17/35] CI fix --- src/core/inferFullTargets.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/core/inferFullTargets.ts b/src/core/inferFullTargets.ts index 734ea7dfa0..3a113f172a 100644 --- a/src/core/inferFullTargets.ts +++ b/src/core/inferFullTargets.ts @@ -93,8 +93,9 @@ function inferPrimitiveTarget( previousTargets: PartialTarget[], actionPreferences: ActionPreferences ): PrimitiveTarget { - const targetHasContent = hasContent(target); - const previousTargetsForAttributes = targetHasContent ? [] : previousTargets; + const previousTargetsForAttributes = hasContent(target) + ? [] + : previousTargets; const maybeSelectionType = target.selectionType ?? @@ -110,22 +111,22 @@ function inferPrimitiveTarget( const position = target.position ?? getPreviousPosition(previousTargets) ?? - (targetHasContent ? null : actionPreferences.position) ?? + actionPreferences.position ?? "contents"; const selectionType = maybeSelectionType ?? - (targetHasContent ? null : actionPreferences.selectionType) ?? + (target.modifier == null ? actionPreferences.selectionType : null) ?? "token"; const insideOutsideType = target.insideOutsideType ?? getPreviousAttribute(previousTargetsForAttributes, "insideOutsideType") ?? - (targetHasContent ? null : actionPreferences.insideOutsideType); + actionPreferences.insideOutsideType; const modifier = target.modifier ?? getPreviousAttribute(previousTargetsForAttributes, "modifier") ?? - (targetHasContent ? null : actionPreferences.modifier) ?? { + (target.selectionType == null ? actionPreferences.modifier : null) ?? { type: "identity", }; From 58c5b8380dbc46aac038105f2acb5a753d06d9e9 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 16:35:10 +0100 Subject: [PATCH 18/35] Cleanup --- src/actions/WrapWithSnippet.ts | 13 ++++--------- src/typings/snippet.ts | 6 ++++++ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index adcef0fb4f..85ac64f89e 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -1,11 +1,10 @@ -import { commands, SnippetString, workspace } from "vscode"; -import { SnippetDefinition } from "../typings/snippet"; +import { commands, workspace } from "vscode"; +import { Snippet, SnippetDefinition } from "../typings/snippet"; import { Action, ActionPreferences, ActionReturnValue, Graph, - ScopeType, TypedSelection, } from "../typings/Types"; import displayPendingEditDecorations from "../util/editDisplayUtils"; @@ -20,12 +19,6 @@ import { import { KnownSnippetVariableNames } from "../vendor/snippet/snippetVariables"; import defaultSnippetDefinitions from "./defaultSnippetDefinitions"; -interface Snippet { - definitions: SnippetDefinition[]; - defaultScopeTypes: Record; - description?: string; -} - type UserSnippetMap = Record; export default class WrapWithSnippet implements Action { @@ -106,6 +99,8 @@ export default class WrapWithSnippet implements Action { await this.graph.actions.setSelection.run([targets]); + // NB: We used the command "editor.action.insertSnippet" instead of calling editor.insertSnippet + // because the latter doesn't support special variables like CLIPBOARD const [updatedTargetSelections] = await callFunctionAndUpdateSelections( () => commands.executeCommand("editor.action.insertSnippet", { diff --git a/src/typings/snippet.ts b/src/typings/snippet.ts index 83e3f16898..ffae72fc06 100644 --- a/src/typings/snippet.ts +++ b/src/typings/snippet.ts @@ -11,3 +11,9 @@ export interface SnippetDefinition { body: SnippetBody; scope?: SnippetScope; } + +export interface Snippet { + definitions: SnippetDefinition[]; + defaultScopeTypes: Record; + description?: string; +} From d74102916d0936e58aeb3675a46440db38c47732 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 16:43:49 +0100 Subject: [PATCH 19/35] Remove yarn-error.log --- yarn-error.log | 2383 ------------------------------------------------ 1 file changed, 2383 deletions(-) delete mode 100644 yarn-error.log diff --git a/yarn-error.log b/yarn-error.log deleted file mode 100644 index f40b1d9b7b..0000000000 --- a/yarn-error.log +++ /dev/null @@ -1,2383 +0,0 @@ -Arguments: - /Users/pokey/n/bin/node /usr/local/Cellar/yarn/1.22.10/libexec/bin/yarn.js run esbuild - -PATH: - /Users/pokey/google-cloud-sdk/bin:/Users/pokey/torch-cl/install/bin:/Users/pokey/.rbenv/shims:/usr/local/opt/ruby/bin:/usr/local/Cellar/pyenv-virtualenv/1.1.5/shims:/Users/pokey/.pyenv/shims:/Users/pokey/n/bin:/Users/pokey/.gem/bin:/Users/pokey/bin:/usr/local/bin:/Users/pokey/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/texbin:/opt/X11/bin:/Library/Apple/usr/bin:/usr/local/git/bin:/Users/pokey/pokey-home-files/bin:/usr/local/texlive/2011/bin/x86_64-linux:/Users/pokey/bin:/usr/local/ssl/bin:/Users/pokey/bin:/Users/pokey/packer:/Library/TeX/Root/bin/x86_64-darwin:/usr/local/sbin:/Users/pokey/.cargo/bin:/usr/local/Cellar/qt@5.5/5.5.1_1/bin:/Users/pokey/.fzf/bin - -Yarn version: - 1.22.10 - -Node version: - 12.16.1 - -Platform: - darwin x64 - -Trace: - SyntaxError: /Users/pokey/src/cursorless-vscode/package.json: Unexpected token } in JSON at position 9678 - at JSON.parse () - at /usr/local/Cellar/yarn/1.22.10/libexec/lib/cli.js:1625:59 - at Generator.next () - at step (/usr/local/Cellar/yarn/1.22.10/libexec/lib/cli.js:310:30) - at /usr/local/Cellar/yarn/1.22.10/libexec/lib/cli.js:321:13 - -npm manifest: - { - "name": "cursorless", - "displayName": "Cursorless", - "description": "Don't let the cursor slow you down", - "icon": "images/icon.png", - "galleryBanner": { - "color": "#00001A", - "theme": "dark" - }, - "version": "0.22.0", - "publisher": "pokey", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/pokey/cursorless-vscode.git" - }, - "engines": { - "vscode": "^1.53.0" - }, - "extensionKind": [ - "workspace" - ], - "categories": [ - "Other" - ], - "extensionDependencies": [ - "pokey.parse-tree" - ], - "activationEvents": [ - "*" - ], - "main": "./dist/extension.js", - "capabilities": { - "untrustedWorkspaces": { - "supported": true - } - }, - "contributes": { - "commands": [ - { - "command": "cursorless.command", - "title": "Cursorless: Perform command" - }, - { - "command": "cursorless.toggleDecorations", - "title": "Cursorless: Toggle decorations" - }, - { - "command": "cursorless.recomputeDecorationStyles", - "title": "Cursorless: Recompute decoration styles" - }, - { - "command": "cursorless.recordTestCase", - "title": "Cursorless: Record test case" - } - ], - "colors": [ - { - "id": "cursorless.pendingDeleteBackground", - "description": "Background color to use for ranges about to be deleted", - "defaults": { - "dark": "#ff00008a", - "light": "#ff00008a", - "highContrast": "#ff00008a" - } - }, - { - "id": "cursorless.referencedBackground", - "description": "Background color to use for ranges that are being referenced", - "defaults": { - "dark": "#00a2ff4d", - "light": "#00a2ff4d", - "highContrast": "#00a2ff4d" - } - }, - { - "id": "cursorless.justAddedBackground", - "description": "Background color to use for ranges that have just been added", - "defaults": { - "dark": "#09ff005b", - "light": "#09ff005b", - "highContrast": "#09ff005b" - } - }, - { - "id": "cursorless.pendingModification0Background", - "description": "Background color to use for ranges that are being changed", - "defaults": { - "dark": "#8c00ff86", - "light": "#8c00ff86", - "highContrast": "#8c00ff86" - } - }, - { - "id": "cursorless.pendingModification1Background", - "description": "Background color to use for ranges that are being changed", - "defaults": { - "dark": "#ff009d7e", - "light": "#ff009d7e", - "highContrast": "#ff009d7e" - } - } - ], - "configuration": { - "title": "Cursorless", - "properties": { - "cursorless.showOnStart": { - "type": "boolean", - "default": true, - "description": "Whether to show decorations on vscode start." - }, - "cursorless.pendingEditDecorationTime": { - "type": "integer", - "default": 100, - "description": "How long in milliseconds to show a pending edit decoration" - }, - "cursorless.showAdditionalHighlightBeforeScroll": { - "type": "boolean", - "default": false, - "description": "Whether to show a highlight before scrolling in addition to after" - }, - "cursorless.hatSizeAdjustment": { - "type": "number", - "default": 0, - "description": "Percentage to increase or decrease hat size; positive increases size" - }, - "cursorless.hatVerticalOffset": { - "type": "number", - "default": 0, - "description": "How much to vertically shift the hats as a percentage of font size; positive is up" - }, - "cursorless.colors.dark": { - "description": "Colors to use for dark theme", - "type": "object", - "properties": { - "default": { - "type": "string" - }, - "blue": { - "type": "string" - }, - "green": { - "type": "string" - }, - "red": { - "type": "string" - }, - "pink": { - "type": "string" - }, - "yellow": { - "type": "string" - } - }, - "default": { - "default": "#aaa7bb", - "blue": "#089ad3", - "green": "#36B33F", - "red": "#E02D28", - "pink": "#E06CAA", - "yellow": "#E5C02C" - }, - "additionalProperties": false - }, - "cursorless.colors.light": { - "description": "Colors to use for light theme", - "type": "object", - "properties": { - "default": { - "type": "string" - }, - "blue": { - "type": "string" - }, - "green": { - "type": "string" - }, - "red": { - "type": "string" - }, - "pink": { - "type": "string" - }, - "yellow": { - "type": "string" - } - }, - "default": { - "default": "#757180", - "blue": "#089ad3", - "green": "#36B33F", - "red": "#E02D28", - "pink": "#e0679f", - "yellow": "#edb62b" - }, - "additionalProperties": false - }, - "cursorless.hatEnablement.colors": { - "description": "Which colors to enable", - "type": "object", - "properties": { - "blue": { - "type": "boolean" - }, - "green": { - "type": "boolean" - }, - "red": { - "type": "boolean" - }, - "pink": { - "type": "boolean" - }, - "yellow": { - "type": "boolean" - } - }, - "default": { - "blue": true, - "green": true, - "red": true, - "pink": true, - "yellow": true - }, - "additionalProperties": false - }, - "cursorless.hatEnablement.shapes": { - "markdownDescription": "Which shapes to enable. See the [docs](https://github.com/pokey/cursorless-talon/blob/main/docs/README.md#shapes) if you're not sure which shape name corresponds to which hat shape.", - "type": "object", - "properties": { - "ex": { - "type": "boolean" - }, - "fox": { - "type": "boolean" - }, - "wing": { - "type": "boolean" - }, - "hole": { - "type": "boolean" - }, - "frame": { - "type": "boolean" - }, - "curve": { - "type": "boolean" - }, - "eye": { - "type": "boolean" - }, - "play": { - "type": "boolean" - }, - "bolt": { - "type": "boolean" - }, - "crosshairs": { - "type": "boolean" - } - }, - "default": { - "ex": false, - "fox": false, - "wing": false, - "hole": false, - "frame": false, - "curve": false, - "eye": false, - "play": false, - "bolt": false, - "crosshairs": false - }, - "additionalProperties": false - }, - "cursorless.hatPenalties.colors": { - "description": "How much to penalize each hat color. Number of syllables is a good default", - "type": "object", - "properties": { - "blue": { - "type": "number" - }, - "green": { - "type": "number" - }, - "red": { - "type": "number" - }, - "pink": { - "type": "number" - }, - "yellow": { - "type": "number" - } - }, - "default": { - "blue": 1, - "green": 1, - "red": 1, - "pink": 1, - "yellow": 1 - }, - "additionalProperties": false - }, - "cursorless.hatPenalties.shapes": { - "description": "How much to penalize each hat shape. Number of syllables is a good default", - "type": "object", - "properties": { - "ex": { - "type": "number" - }, - "fox": { - "type": "number" - }, - "wing": { - "type": "number" - }, - "hole": { - "type": "number" - }, - "frame": { - "type": "number" - }, - "curve": { - "type": "number" - }, - "eye": { - "type": "number" - }, - "play": { - "type": "number" - }, - "bolt": { - "type": "number" - }, - "crosshairs": { - "type": "number" - } - }, - "default": { - "ex": 1, - "fox": 1, - "wing": 1, - "hole": 1, - "frame": 1, - "curve": 1, - "eye": 1, - "play": 1, - "bolt": 1, - "crosshairs": 1 - }, - "additionalProperties": false - }, - "cursorless.individualHatAdjustments": { - "description": "Separate adjustments for each hat shape", - "type": "object", - "default": { - "default": { - "sizeAdjustment": 0, - "verticalOffset": 0 - }, - "ex": { - "sizeAdjustment": 0, - "verticalOffset": 0 - }, - "fox": { - "sizeAdjustment": 0, - "verticalOffset": 0 - }, - "wing": { - "sizeAdjustment": 0, - "verticalOffset": 0 - }, - "hole": { - "sizeAdjustment": 0, - "verticalOffset": 0 - }, - "frame": { - "sizeAdjustment": 0, - "verticalOffset": 0 - }, - "curve": { - "sizeAdjustment": 0, - "verticalOffset": 0 - }, - "eye": { - "sizeAdjustment": 0, - "verticalOffset": 0 - }, - "play": { - "sizeAdjustment": 0, - "verticalOffset": 0 - }, - "bolt": { - "sizeAdjustment": 0, - "verticalOffset": 0 - }, - "crosshairs": { - "sizeAdjustment": 0, - "verticalOffset": 0 - } - } - }, - "cursorless.experimental.snippets": { - "description": "Snippets for use in cursorless", - "type": "object", - "default": { - "ifStatement": { - "definitions": [ - { - "scope": { - "langIds": [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp" - ] - }, - "body": [ - "if ($condition) {\n\t$consequence\n}" - ] - }, - { - "scope": { - "langIds": [ - "python" - ] - }, - "body": [ - "if $condition:\n\t$consequence" - ] - } - ], - "defaultScopeTypes": { - "consequence": "statement", - }, - "description": "If statement" - }, - "tryCatchStatement": { - "definitions": [ - { - "scope": { - "langIds": [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp" - ] - }, - "body": [ - "try {\n\t$1\n} catch ($2) {\n\t$3\n}" - ] - }, - { - "scope": { - "langIds": [ - "python" - ] - }, - "body": [ - "try:\n\t$body\nexcept $error:\n\t$exceptBody" - ] - } - ], - "defaultScopeTypes": { - "body": "statement", - "exceptBody": "statement" - }, - "description": "Try catch statement" - }, - "ifElseStatement": { - "definitions": [ - { - "scope": { - "langIds": [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp" - ] - }, - "body": [ - "if ($condition) {\n\t$consequence\n} else {\n\t$alternative\n}" - ] - }, - { - "scope": { - "langIds": [ - "python" - ] - }, - "body": [ - "if $condition:\n\t$consequence\nelse:\n\t$alternative" - ] - } - ], - "defaultScopeTypes": { - "consequence": "statement", - "alternative": "statement" - }, - "description": "If else statement" - } - }, - "additionalProperties": { - "type": "object", - "properties": { - "definitions": { - "type": "list", - "items": { - "type": "object", - "properties": { - "scope": { - "type": "object", - "desription": "Scopes where this snippet is active", - "properties": { - "langIds": { - "type": "list", - "items": { - "type": "string" - } - }, - "scopeType": { - "type": "string", - "enum": [ - "argumentOrParameter", - "anonymousFunction", - "attribute", - "class", - "className", - "collectionItem", - "collectionKey", - "comment", - "functionCall", - "functionName", - "ifStatement", - "list", - "map", - "name", - "namedFunction", - "regularExpression", - "statement", - "string", - "type", - "value", - "xmlBothTags", - "xmlElement", - "xmlEndTag", - "xmlStartTag" - ] - } - } - }, - "body": { - "type": "string", - "description": "Inline snippet text" - } - }, - "required": [ - "body" - ] - } - }, - "defaultScopeType": { - "type": "string", - "enum": [ - "argumentOrParameter", - "anonymousFunction", - "attribute", - "class", - "className", - "collectionItem", - "collectionKey", - "comment", - "functionCall", - "functionName", - "ifStatement", - "list", - "map", - "name", - "namedFunction", - "regularExpression", - "statement", - "string", - "type", - "value", - "xmlBothTags", - "xmlElement", - "xmlEndTag", - "xmlStartTag" - ] - }, - "description": { - "type": "string", - "description": "Description of the snippet" - } - }, - "required": [ - "definitions" - ] - } - } - } - }, - "snippets": [ - { - "language": "c", - "path": "./snippets/cpp.json" - }, - { - "language": "cpp", - "path": "./snippets/cpp.json" - }, - { - "language": "csharp", - "path": "./snippets/csharp.json" - }, - { - "language": "java", - "path": "./snippets/java.json" - }, - { - "language": "javascript", - "path": "./snippets/typescript.json" - }, - { - "language": "javascriptreact", - "path": "./snippets/typescript.json" - }, - { - "language": "python", - "path": "./snippets/python.json" - }, - { - "language": "typescript", - "path": "./snippets/typescript.json" - }, - { - "language": "typescriptreact", - "path": "./snippets/typescript.json" - } - ] - }, - "scripts": { - "vscode:prepublish": "npm run -S esbuild-base -- --minify", - "esbuild-base": "esbuild ./src/extension.ts --bundle --outfile=dist/extension.js --external:vscode --format=cjs --platform=node", - "esbuild": "npm run -S esbuild-base -- --sourcemap", - "esbuild-watch": "npm run -S esbuild-base -- --sourcemap --watch", - "test-compile": "tsc -p ./", - "compile": "tsc -p ./", - "watch": "tsc -watch -p ./", - "pretest": "yarn run compile && yarn run lint && yarn run esbuild", - "lint": "eslint src --ext ts", - "test": "node ./out/test/runTest.js" - }, - "devDependencies": { - "@types/glob": "^7.1.3", - "@types/js-yaml": "^4.0.2", - "@types/mocha": "^8.0.4", - "@types/node": "^12.11.7", - "@types/sinon": "^10.0.2", - "@types/vscode": "^1.53.0", - "@typescript-eslint/eslint-plugin": "^4.9.0", - "@typescript-eslint/parser": "^4.9.0", - "esbuild": "^0.11.12", - "eslint": "^7.15.0", - "fast-xml-parser": "^3.20.0", - "glob": "^7.1.7", - "js-yaml": "^4.1.0", - "mocha": "^8.1.3", - "sinon": "^11.1.1", - "typescript": "^4.4.4", - "vscode-test": "^1.4.1" - }, - "dependencies": { - "@types/lodash": "^4.14.168", - "immutability-helper": "^3.1.1", - "lodash": "^4.17.21" - } - } - -yarn manifest: - No manifest - -Lockfile: - # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. - # yarn lockfile v1 - - - "@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - - "@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== - - "@babel/highlight@^7.10.4": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz" - integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - chalk "^2.0.0" - js-tokens "^4.0.0" - - "@eslint/eslintrc@^0.3.0": - version "0.3.0" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz" - integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - lodash "^4.17.20" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - - "@nodelib/fs.scandir@2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz" - integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== - dependencies: - "@nodelib/fs.stat" "2.0.4" - run-parallel "^1.1.9" - - "@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": - version "2.0.4" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz" - integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== - - "@nodelib/fs.walk@^1.2.3": - version "1.2.6" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz" - integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== - dependencies: - "@nodelib/fs.scandir" "2.1.4" - fastq "^1.6.0" - - "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - - "@sinonjs/fake-timers@^7.0.4", "@sinonjs/fake-timers@^7.1.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== - dependencies: - "@sinonjs/commons" "^1.7.0" - - "@sinonjs/samsam@^6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.0.2.tgz#a0117d823260f282c04bff5f8704bdc2ac6910bb" - integrity sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ== - dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - - "@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== - - "@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - - "@types/glob@^7.1.3": - version "7.1.3" - resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - - "@types/js-yaml@^4.0.2": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.2.tgz" - integrity sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA== - - "@types/json-schema@^7.0.3": - version "7.0.7" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== - - "@types/lodash@^4.14.168": - version "4.14.168" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz" - integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== - - "@types/minimatch@*": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - - "@types/mocha@^8.0.4": - version "8.2.0" - resolved "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz" - integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== - - "@types/node@*", "@types/node@^12.11.7": - version "12.20.0" - resolved "https://registry.npmjs.org/@types/node/-/node-12.20.0.tgz" - integrity sha512-0/41wHcurotvSOTHQUFkgL702c3pyWR1mToSrrX3pGPvGfpHTv3Ksx0M4UVuU5VJfjVb62Eyr1eKO1tWNUCg2Q== - - "@types/sinon@^10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.2.tgz#f360d2f189c0fd433d14aeb97b9d705d7e4cc0e4" - integrity sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw== - dependencies: - "@sinonjs/fake-timers" "^7.1.0" - - "@types/vscode@^1.53.0": - version "1.53.0" - resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.53.0.tgz" - integrity sha512-XjFWbSPOM0EKIT2XhhYm3D3cx3nn3lshMUcWNy1eqefk+oqRuBq8unVb6BYIZqXy9lQZyeUl7eaBCOZWv+LcXQ== - - "@typescript-eslint/eslint-plugin@^4.9.0": - version "4.15.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.0.tgz" - integrity sha512-DJgdGZW+8CFUTz5C/dnn4ONcUm2h2T0itWD85Ob5/V27Ndie8hUoX5HKyGssvR8sUMkAIlUc/AMK67Lqa3kBIQ== - dependencies: - "@typescript-eslint/experimental-utils" "4.15.0" - "@typescript-eslint/scope-manager" "4.15.0" - debug "^4.1.1" - functional-red-black-tree "^1.0.1" - lodash "^4.17.15" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" - - "@typescript-eslint/experimental-utils@4.15.0": - version "4.15.0" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.0.tgz" - integrity sha512-V4vaDWvxA2zgesg4KPgEGiomWEBpJXvY4ZX34Y3qxK8LUm5I87L+qGIOTd9tHZOARXNRt9pLbblSKiYBlGMawg== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.15.0" - "@typescript-eslint/types" "4.15.0" - "@typescript-eslint/typescript-estree" "4.15.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - - "@typescript-eslint/parser@^4.9.0": - version "4.15.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.0.tgz" - integrity sha512-L6Dtbq8Bc7g2aZwnIBETpmUa9XDKCMzKVwAArnGp5Mn7PRNFjf3mUzq8UeBjL3K8t311hvevnyqXAMSmxO8Gpg== - dependencies: - "@typescript-eslint/scope-manager" "4.15.0" - "@typescript-eslint/types" "4.15.0" - "@typescript-eslint/typescript-estree" "4.15.0" - debug "^4.1.1" - - "@typescript-eslint/scope-manager@4.15.0": - version "4.15.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.0.tgz" - integrity sha512-CSNBZnCC2jEA/a+pR9Ljh8Y+5TY5qgbPz7ICEk9WCpSEgT6Pi7H2RIjxfrrbUXvotd6ta+i27sssKEH8Azm75g== - dependencies: - "@typescript-eslint/types" "4.15.0" - "@typescript-eslint/visitor-keys" "4.15.0" - - "@typescript-eslint/types@4.15.0": - version "4.15.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.0.tgz" - integrity sha512-su4RHkJhS+iFwyqyXHcS8EGPlUVoC+XREfy5daivjLur9JP8GhvTmDipuRpcujtGC4M+GYhUOJCPDE3rC5NJrg== - - "@typescript-eslint/typescript-estree@4.15.0": - version "4.15.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.0.tgz" - integrity sha512-jG6xTmcNbi6xzZq0SdWh7wQ9cMb2pqXaUp6bUZOMsIlu5aOlxGxgE/t6L/gPybybQGvdguajXGkZKSndZJpksA== - dependencies: - "@typescript-eslint/types" "4.15.0" - "@typescript-eslint/visitor-keys" "4.15.0" - debug "^4.1.1" - globby "^11.0.1" - is-glob "^4.0.1" - semver "^7.3.2" - tsutils "^3.17.1" - - "@typescript-eslint/visitor-keys@4.15.0": - version "4.15.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.0.tgz" - integrity sha512-RnDtJwOwFucWFAMjG3ghCG/ikImFJFEg20DI7mn4pHEx3vC48lIAoyjhffvfHmErRDboUPC7p9Z2il4CLb7qxA== - dependencies: - "@typescript-eslint/types" "4.15.0" - eslint-visitor-keys "^2.0.0" - - "@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - - acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== - - acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - - agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - - ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - - ajv@^7.0.2: - version "7.1.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz" - integrity sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - - ansi-colors@4.1.1, ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - - ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - - ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - - ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - - ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - - anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - - argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - - argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - - array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - - astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - - balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - - big-integer@^1.6.17: - version "1.6.50" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.50.tgz#299a4be8bd441c73dcc492ed46b7169c34e92e70" - integrity sha512-+O2uoQWFRo8ysZNo/rjtri2jIwjr3XfeAgRjAUADRqGG+ZITvyn8J1kvXLTaKVr3hhGXk+f23tKfdzmklVM9vQ== - - binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - - binary@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - - bluebird@~3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= - - brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - - braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - - browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - - buffer-indexof-polyfill@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" - integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== - - buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= - - callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - - camelcase@^6.0.0: - version "6.2.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - - chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= - dependencies: - traverse ">=0.3.0 <0.4" - - chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - - chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - - chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - - cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - - color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - - color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - - color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - - color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - - concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - - core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - - cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - - debug@4: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - - debug@4.3.1, debug@^4.0.1, debug@^4.1.1: - version "4.3.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - - decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - - deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - - diff@5.0.0, diff@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - - dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - - doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - - duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - - emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - - enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - - esbuild@^0.11.12: - version "0.11.12" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.11.12.tgz" - integrity sha512-c8cso/1RwVj+fbDvLtUgSG4ZJQ0y9Zdrl6Ot/GAjyy4pdMCHaFnDMts5gqFnWRPLajWtEnI+3hlET4R9fVoZng== - - escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - - escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - - escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - - eslint-scope@^5.0.0, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - - eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - - eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - - eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== - - eslint@^7.15.0: - version "7.20.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz" - integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.3.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - file-entry-cache "^6.0.0" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash "^4.17.20" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.4" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - - espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - - esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - - esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - - esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - - estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - - estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - - esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - - fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - - fast-glob@^3.1.1: - version "3.2.5" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" - - fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - - fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - - fast-xml-parser@^3.20.0: - version "3.20.0" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.20.0.tgz#b9ce9ddbc44d2cb7e38f846c5929c667bbf0936d" - integrity sha512-cMQwDJYVDjMPU56DviszewgMKuNzuf4NQSBuDf9RgZ6FKm5QEMxW05Za8lvnuL6moxoeZVUWBlL733WmovvV6g== - dependencies: - strnum "^1.0.3" - - fastq@^1.6.0: - version "1.10.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz" - integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== - dependencies: - reusify "^1.0.4" - - file-entry-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz" - integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== - dependencies: - flat-cache "^3.0.4" - - fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - - find-up@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - - flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - - flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - - flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== - - fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - - fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - - fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - - functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - - get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - - glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - - glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - - glob@^7.1.3: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - - glob@^7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - - globals@^12.1.0: - version "12.4.0" - resolved "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - - globby@^11.0.1: - version "11.0.2" - resolved "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz" - integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - - graceful-fs@^4.1.2, graceful-fs@^4.2.2: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - - growl@1.10.5: - version "1.10.5" - resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - - has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - - has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - - he@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - - http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - - https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - - ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - - ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - - immutability-helper@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz" - integrity sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ== - - import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - - imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - - inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - - inherits@2, inherits@~2.0.0, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - - is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - - is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - - is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - - is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - - is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - - is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - - isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - - isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - - isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - - js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - - js-yaml@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== - dependencies: - argparse "^2.0.1" - - js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - - js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - - json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - - json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - - json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - - just-extend@^4.0.2: - version "4.2.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" - integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== - - levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - - listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= - - locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - - lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - - lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - - log-symbols@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - - lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - - merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - - micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - - minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - - minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - - "mkdirp@>=0.5 0": - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - - mocha@^8.1.3: - version "8.3.0" - resolved "https://registry.npmjs.org/mocha/-/mocha-8.3.0.tgz" - integrity sha512-TQqyC89V1J/Vxx0DhJIXlq9gbbL9XFNdeLQ1+JsnZsVaSOV1z3tWfw0qZmQJGQRIfkvZcs7snQnZnOCKoldq1Q== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.1" - debug "4.3.1" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.6" - growl "1.10.5" - he "1.2.0" - js-yaml "4.0.0" - log-symbols "4.0.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.20" - serialize-javascript "5.0.1" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - wide-align "1.1.3" - workerpool "6.1.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - - ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - - ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - - nanoid@3.1.20: - version "3.1.20" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" - integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== - - natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - - nise@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.0.tgz#713ef3ed138252daef20ec035ab62b7a28be645c" - integrity sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/fake-timers" "^7.0.4" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" - - normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - - once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - - optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - - p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - - p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - - parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - - path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - - path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - - path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - - path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - - path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - - picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - - prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - - process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - - progress@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - - punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - - queue-microtask@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz" - integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== - - randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - - readable-stream@^2.0.2, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - - readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - - regexpp@^3.0.0, regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - - require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - - require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - - resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - - reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - - rimraf@2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - - rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - - run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - - safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - - safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - - semver@^7.2.1, semver@^7.3.2: - version "7.3.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - - serialize-javascript@5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - - setimmediate@~1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - - shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - - shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - - sinon@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-11.1.1.tgz#99a295a8b6f0fadbbb7e004076f3ae54fc6eab91" - integrity sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg== - dependencies: - "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" "^7.1.0" - "@sinonjs/samsam" "^6.0.2" - diff "^5.0.0" - nise "^5.1.0" - supports-color "^7.2.0" - - slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - - slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - - sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - - "string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - - string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - - string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - - strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - - strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - - strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - - strnum@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.3.tgz#bbc438bcb35fbbfc9c1e82f73097665b6ec6959e" - integrity sha512-GVoRjsqAYZkAH16GDzfTuafuwKxzKdaaCQyLaWf37gOP1e2PPbAKWoME1OmO+c4RCKMfNrrPRDLFCNBFU45N/A== - - supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - - supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - - supports-color@^7.1.0, supports-color@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - - table@^6.0.4: - version "6.0.7" - resolved "https://registry.npmjs.org/table/-/table-6.0.7.tgz" - integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== - dependencies: - ajv "^7.0.2" - lodash "^4.17.20" - slice-ansi "^4.0.0" - string-width "^4.2.0" - - text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - - to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - - "traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= - - tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - - tsutils@^3.17.1: - version "3.20.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz" - integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== - dependencies: - tslib "^1.8.1" - - type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - - type-detect@4.0.8, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - - type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - - typescript@^4.4.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== - - unzipper@^0.10.11: - version "0.10.11" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" - integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== - dependencies: - big-integer "^1.6.17" - binary "~0.3.0" - bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" - duplexer2 "~0.1.4" - fstream "^1.0.12" - graceful-fs "^4.2.2" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" - - uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - - util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - - v8-compile-cache@^2.0.3: - version "2.2.0" - resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz" - integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== - - vscode-test@^1.4.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-1.6.1.tgz#44254c67036de92b00fdd72f6ace5f1854e1a563" - integrity sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA== - dependencies: - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - rimraf "^3.0.2" - unzipper "^0.10.11" - - which@2.0.2, which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - - wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - - word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - - workerpool@6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" - integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== - - wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - - wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - - y18n@^5.0.5: - version "5.0.5" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== - - yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - - yargs-parser@20.2.4, yargs-parser@^20.2.2: - version "20.2.4" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - - yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - - yargs@16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - - yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 30b8163792a5f520617d89a57f3389d64a6d2b99 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Thu, 21 Oct 2021 18:29:34 +0100 Subject: [PATCH 20/35] Update schema docs --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b2a2ea530..873da0686b 100644 --- a/package.json +++ b/package.json @@ -439,7 +439,7 @@ "properties": { "scope": { "type": "object", - "desription": "Scopes where this snippet is active", + "description": "Scopes where this snippet is active", "properties": { "langIds": { "type": "array", @@ -449,6 +449,7 @@ }, "scopeType": { "type": "string", + "description": "Cursorless scopes in which this snippet is active. Allows, for example, to have different snippets to define a function if you're in a class or at global scope.", "enum": [ "argumentOrParameter", "anonymousFunction", @@ -493,6 +494,7 @@ }, "defaultScopeTypes": { "type": "object", + "description": "For each named variable in the snippet, uses the given scope type from this map when wrapping a target without scope type specified", "additionalProperties": { "type": "string", "enum": [ From 36035c62aa5f2336dca1313d9308d456418c2cfd Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Fri, 22 Oct 2021 15:11:09 +0100 Subject: [PATCH 21/35] More dock --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 873da0686b..306005869d 100644 --- a/package.json +++ b/package.json @@ -434,6 +434,7 @@ "properties": { "definitions": { "type": "array", + "descriptions": "List of possible definitions for this snippet", "items": { "type": "object", "properties": { From 57223225fa52d06a8faa26b4878dee4fa5110586 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 14:44:09 +0100 Subject: [PATCH 22/35] Support user snippets dir --- .../ifElseStatement.cursorless-snippets | 45 +++++ .../ifStatement.cursorless-snippets | 40 ++++ .../tryCatchStatement.cursorless-snippets | 45 +++++ package.json | 157 ++-------------- schemas/cursorless-snippets.json | 111 +++++++++++ src/actions/WrapWithSnippet.ts | 21 +-- src/extension.ts | 14 +- src/snippets.ts | 176 ++++++++++++++++++ src/testUtil/walkAsync.ts | 23 +++ src/typings/Types.ts | 5 +- src/typings/snippet.ts | 2 + src/util/graphConstructors.ts | 13 -- src/util/graphFactories.ts | 15 ++ src/util/makeGraph.ts | 18 +- src/util/object.ts | 22 +++ yarn.lock | 7 +- 16 files changed, 536 insertions(+), 178 deletions(-) create mode 100644 cursorless-snippets/ifElseStatement.cursorless-snippets create mode 100644 cursorless-snippets/ifStatement.cursorless-snippets create mode 100644 cursorless-snippets/tryCatchStatement.cursorless-snippets create mode 100644 schemas/cursorless-snippets.json create mode 100644 src/snippets.ts create mode 100644 src/testUtil/walkAsync.ts delete mode 100644 src/util/graphConstructors.ts create mode 100644 src/util/graphFactories.ts create mode 100644 src/util/object.ts diff --git a/cursorless-snippets/ifElseStatement.cursorless-snippets b/cursorless-snippets/ifElseStatement.cursorless-snippets new file mode 100644 index 0000000000..c43dbf1c60 --- /dev/null +++ b/cursorless-snippets/ifElseStatement.cursorless-snippets @@ -0,0 +1,45 @@ +{ + "ifElseStatement": { + "definitions": [ + { + "scope": { + "langIds": [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp" + ] + }, + "body": [ + "if ($condition) {", + "\t$consequence", + "} else {", + "\t$alternative", + "}" + ] + }, + { + "scope": { + "langIds": [ + "python" + ] + }, + "body": [ + "if $condition:", + "\t$consequence", + "else:", + "\t$alternative" + ] + } + ], + "defaultScopeTypes": { + "consequence": "statement", + "alternative": "statement" + }, + "description": "If else statement" + } +} \ No newline at end of file diff --git a/cursorless-snippets/ifStatement.cursorless-snippets b/cursorless-snippets/ifStatement.cursorless-snippets new file mode 100644 index 0000000000..8899c7fb62 --- /dev/null +++ b/cursorless-snippets/ifStatement.cursorless-snippets @@ -0,0 +1,40 @@ +{ + "ifStatement": { + "definitions": [ + { + "scope": { + "langIds": [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp" + ] + }, + "body": [ + "if ($condition) {", + "\t$consequence", + "}" + ] + }, + { + "scope": { + "langIds": [ + "python" + ] + }, + "body": [ + "if $condition:", + "\t$consequence" + ] + } + ], + "defaultScopeTypes": { + "consequence": "statement" + }, + "description": "If statement" + } +} \ No newline at end of file diff --git a/cursorless-snippets/tryCatchStatement.cursorless-snippets b/cursorless-snippets/tryCatchStatement.cursorless-snippets new file mode 100644 index 0000000000..ccf9f1ae99 --- /dev/null +++ b/cursorless-snippets/tryCatchStatement.cursorless-snippets @@ -0,0 +1,45 @@ +{ + "tryCatchStatement": { + "definitions": [ + { + "scope": { + "langIds": [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp" + ] + }, + "body": [ + "try {", + "\t$body", + "} catch ($error) {", + "\t$exceptBody", + "}" + ] + }, + { + "scope": { + "langIds": [ + "python" + ] + }, + "body": [ + "try:", + "\t$body", + "except $error:", + "\t$exceptBody" + ] + } + ], + "defaultScopeTypes": { + "body": "statement", + "exceptBody": "statement" + }, + "description": "Try catch statement" + } +} \ No newline at end of file diff --git a/package.json b/package.json index 306005869d..645669b693 100644 --- a/package.json +++ b/package.json @@ -401,143 +401,26 @@ } } }, - "cursorless.experimental.snippets": { - "description": "Snippets for use in cursorless", - "type": "object", - "default": { - "ifStatement": { - "definitions": [], - "defaultScopeTypes": { - "consequence": "statement" - }, - "description": "If statement" - }, - "tryCatchStatement": { - "definitions": [], - "defaultScopeTypes": { - "body": "statement", - "exceptBody": "statement" - }, - "description": "Try catch statement" - }, - "ifElseStatement": { - "definitions": [], - "defaultScopeTypes": { - "consequence": "statement", - "alternative": "statement" - }, - "description": "If else statement" - } - }, - "additionalProperties": { - "type": "object", - "properties": { - "definitions": { - "type": "array", - "descriptions": "List of possible definitions for this snippet", - "items": { - "type": "object", - "properties": { - "scope": { - "type": "object", - "description": "Scopes where this snippet is active", - "properties": { - "langIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "scopeType": { - "type": "string", - "description": "Cursorless scopes in which this snippet is active. Allows, for example, to have different snippets to define a function if you're in a class or at global scope.", - "enum": [ - "argumentOrParameter", - "anonymousFunction", - "attribute", - "class", - "className", - "collectionItem", - "collectionKey", - "comment", - "functionCall", - "functionName", - "ifStatement", - "list", - "map", - "name", - "namedFunction", - "regularExpression", - "statement", - "string", - "type", - "value", - "xmlBothTags", - "xmlElement", - "xmlEndTag", - "xmlStartTag" - ] - } - } - }, - "body": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Inline snippet text; entries joined by newline" - } - }, - "required": [ - "body" - ] - } - }, - "defaultScopeTypes": { - "type": "object", - "description": "For each named variable in the snippet, uses the given scope type from this map when wrapping a target without scope type specified", - "additionalProperties": { - "type": "string", - "enum": [ - "argumentOrParameter", - "anonymousFunction", - "attribute", - "class", - "className", - "collectionItem", - "collectionKey", - "comment", - "functionCall", - "functionName", - "ifStatement", - "list", - "map", - "name", - "namedFunction", - "regularExpression", - "statement", - "string", - "type", - "value", - "xmlBothTags", - "xmlElement", - "xmlEndTag", - "xmlStartTag" - ] - } - }, - "description": { - "type": "string", - "description": "Description of the snippet" - } - }, - "required": [ - "definitions" - ] - } + "cursorless.experimental.snippetsDir": { + "description": "Directory containing snippets for use in cursorless", + "type": "string" } } - } + }, + "languages": [ + { + "id": "json", + "extensions": [ + ".cursorless-snippets" + ] + } + ], + "jsonValidation": [ + { + "fileMatch": "*.cursorless-snippets", + "url": "./schemas/cursorless-snippets.json" + } + ] }, "scripts": { "vscode:prepublish": "npm run -S esbuild-base -- --minify", @@ -555,7 +438,7 @@ "@types/glob": "^7.1.3", "@types/js-yaml": "^4.0.2", "@types/mocha": "^8.0.4", - "@types/node": "^12.11.7", + "@types/node": "^16.11.3", "@types/sinon": "^10.0.2", "@types/vscode": "^1.53.0", "@typescript-eslint/eslint-plugin": "^4.9.0", @@ -575,4 +458,4 @@ "immutability-helper": "^3.1.1", "lodash": "^4.17.21" } -} \ No newline at end of file +} diff --git a/schemas/cursorless-snippets.json b/schemas/cursorless-snippets.json new file mode 100644 index 0000000000..031a8db0a4 --- /dev/null +++ b/schemas/cursorless-snippets.json @@ -0,0 +1,111 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Snippets for use in cursorless", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "definitions": { + "type": "array", + "descriptions": "List of possible definitions for this snippet", + "items": { + "type": "object", + "properties": { + "scope": { + "type": "object", + "description": "Scopes where this snippet is active", + "properties": { + "langIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "scopeType": { + "type": "string", + "description": "Cursorless scopes in which this snippet is active. Allows, for example, to have different snippets to define a function if you're in a class or at global scope.", + "enum": [ + "argumentOrParameter", + "anonymousFunction", + "attribute", + "class", + "className", + "collectionItem", + "collectionKey", + "comment", + "functionCall", + "functionName", + "ifStatement", + "list", + "map", + "name", + "namedFunction", + "regularExpression", + "statement", + "string", + "type", + "value", + "xmlBothTags", + "xmlElement", + "xmlEndTag", + "xmlStartTag" + ] + } + } + }, + "body": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline snippet text; entries joined by newline" + } + }, + "required": [ + "body" + ] + } + }, + "defaultScopeTypes": { + "type": "object", + "description": "For each named variable in the snippet, uses the given scope type from this map when wrapping a target without scope type specified", + "additionalProperties": { + "type": "string", + "enum": [ + "argumentOrParameter", + "anonymousFunction", + "attribute", + "class", + "className", + "collectionItem", + "collectionKey", + "comment", + "functionCall", + "functionName", + "ifStatement", + "list", + "map", + "name", + "namedFunction", + "regularExpression", + "statement", + "string", + "type", + "value", + "xmlBothTags", + "xmlElement", + "xmlEndTag", + "xmlStartTag" + ] + } + }, + "description": { + "type": "string", + "description": "Description of the snippet" + } + }, + "required": [ + "definitions" + ] + } +} \ No newline at end of file diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 85ac64f89e..26605b6786 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -19,19 +19,14 @@ import { import { KnownSnippetVariableNames } from "../vendor/snippet/snippetVariables"; import defaultSnippetDefinitions from "./defaultSnippetDefinitions"; -type UserSnippetMap = Record; - export default class WrapWithSnippet implements Action { - snippetParser = new SnippetParser(); + private snippetParser = new SnippetParser(); getTargetPreferences(snippetLocation: string): ActionPreferences[] { - const snippetMap = workspace - .getConfiguration("cursorless.experimental") - .get("snippets")!; - const [snippetName, placeholderName] = parseSnippetLocation(snippetLocation); - const snippet = snippetMap[snippetName]; + + const snippet = this.graph.snippets.getSnippet(snippetName); if (snippet == null) { throw new Error(`Couldn't find snippet ${snippetName}`); @@ -62,13 +57,10 @@ export default class WrapWithSnippet implements Action { [targets]: [TypedSelection[]], snippetLocation: string ): Promise { - const snippetMap = workspace - .getConfiguration("cursorless.experimental") - .get("snippets")!; - const [snippetName, placeholderName] = parseSnippetLocation(snippetLocation); - const snippet = snippetMap[snippetName]; + + const snippet = this.graph.snippets.getSnippet(snippetName)!; const editor = ensureSingleEditor(targets); @@ -161,6 +153,9 @@ function getMaxPlaceholderIndex(parsedSnippet: TextmateSnippet) { function parseSnippetLocation(snippetLocation: string): [string, string] { const [snippetName, placeholderName] = snippetLocation.split("/"); + if (snippetName == null || placeholderName == null) { + throw new Error("Snippet location missing slash"); + } return [snippetName, placeholderName]; } diff --git a/src/extension.ts b/src/extension.ts index a95a2dbe06..f3a2ccbffe 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -2,16 +2,17 @@ import * as vscode from "vscode"; import { addDecorationsToEditors } from "./util/addDecorationsToEditor"; import { DEBOUNCE_DELAY } from "./core/constants"; import Decorations from "./core/Decorations"; -import graphConstructors from "./util/graphConstructors"; +import graphFactories from "./util/graphFactories"; import inferFullTargets from "./core/inferFullTargets"; import processTargets from "./processTargets"; import FontMeasurements from "./core/FontMeasurements"; import { ActionType, + Graph, PartialTarget, ProcessedTargetsContext, } from "./typings/Types"; -import makeGraph from "./util/makeGraph"; +import makeGraph, { FactoryMap } from "./util/makeGraph"; import { logBranchTypes } from "./util/debug"; import { TestCase } from "./testUtil/TestCase"; import { ThatMark } from "./core/ThatMark"; @@ -76,7 +77,11 @@ export async function activate(context: vscode.ExtensionContext) { } ); - const graph = makeGraph(graphConstructors); + const graph = makeGraph({ + ...graphFactories, + extensionContext: () => context, + } as FactoryMap); + graph.snippets.init(); const thatMark = new ThatMark(); const sourceMark = new ThatMark(); const testCaseRecorder = new TestCaseRecorder(context); @@ -280,6 +285,9 @@ export async function activate(context: vscode.ExtensionContext) { thatMark, sourceMark, addDecorations, + experimental: { + registerThirdPartySnippets: graph.snippets.registerThirdPartySnippets, + }, }; } diff --git a/src/snippets.ts b/src/snippets.ts new file mode 100644 index 0000000000..cd50ce0df0 --- /dev/null +++ b/src/snippets.ts @@ -0,0 +1,176 @@ +import { readFile, stat } from "fs/promises"; +import { cloneDeep, max } from "lodash"; +import { join } from "path"; +import { workspace } from "vscode"; +import { walkFiles } from "./testUtil/walkAsync"; +import { Snippet, SnippetMap } from "./typings/snippet"; +import { Graph } from "./typings/Types"; +import { mergeStrict } from "./util/object"; + +const SNIPPET_DIR_REFRESH_INTERVAL_MS = 1000; + +/** + * Handles all cursorless snippets, including core, third-party and + * user-defined. Merges these collections and allows looking up snippets by + * name. + */ +export class Snippets { + private coreSnippets!: SnippetMap; + private userSnippets!: SnippetMap; + private mergedSnippets!: SnippetMap; + private thirdPartySnippets: Record = {}; + private userSnippetsDir?: string; + private maxSnippetMtime: number = -1; + + constructor(private graph: Graph) { + this.updateUserSnippetsPath(); + + this.updateUserSnippets = this.updateUserSnippets.bind(this); + this.registerThirdPartySnippets = + this.registerThirdPartySnippets.bind(this); + + const timer = setInterval( + this.updateUserSnippets, + SNIPPET_DIR_REFRESH_INTERVAL_MS + ); + + graph.extensionContext.subscriptions.push( + workspace.onDidChangeConfiguration(() => { + if (this.updateUserSnippetsPath()) { + this.updateUserSnippets(); + } + }), + { + dispose() { + clearInterval(timer); + }, + } + ); + } + + async init() { + const extensionPath = this.graph.extensionContext.extensionPath; + const snippetsDir = join(extensionPath, "cursorless-snippets"); + const snippetFiles = await walkFiles(snippetsDir); + this.coreSnippets = mergeStrict( + ...(await Promise.all( + snippetFiles.map(async (path) => + JSON.parse(await readFile(path, "utf8")) + ) + )) + ); + await this.updateUserSnippets(); + } + + /** + * Updates the userSnippetsDir field if it has change, returning a boolean + * indicating whether there was an update. If there was an update, resets the + * maxSnippetMtime to -1 to ensure snippet update. + * @returns Boolean indicating whether path has changed + */ + private updateUserSnippetsPath(): boolean { + const newUserSnippetsDir = workspace + .getConfiguration("cursorless.experimental") + .get("snippetsDir"); + + if (newUserSnippetsDir === this.userSnippetsDir) { + return false; + } + + // Reset mtime to -1 so that next time we'll update the snippets + this.maxSnippetMtime = -1; + + this.userSnippetsDir = newUserSnippetsDir; + + return true; + } + + async updateUserSnippets() { + const snippetFiles = this.userSnippetsDir + ? await walkFiles(this.userSnippetsDir) + : []; + + const maxSnippetMtime = + max( + (await Promise.all(snippetFiles.map((file) => stat(file)))).map( + (stat) => stat.mtimeMs + ) + ) ?? 0; + + if (maxSnippetMtime <= this.maxSnippetMtime) { + return; + } + + this.maxSnippetMtime = maxSnippetMtime; + + this.userSnippets = mergeStrict( + ...(await Promise.all( + snippetFiles.map(async (path) => + JSON.parse(await readFile(path, "utf8")) + ) + )) + ); + + this.mergeSnippets(); + } + + /** + * Allows extensions to register third-party snippets. Calling this function + * twice with the same extensionId will replace the older snippets. + * + * Note that third-party snippets take precedence over core snippets, but + * user snippets take precedence over both. + * @param extensionId The id of the extension registering the snippets. + * @param snippets The snippets to be registered. + */ + registerThirdPartySnippets(extensionId: string, snippets: SnippetMap) { + this.thirdPartySnippets[extensionId] = snippets; + this.mergeSnippets(); + } + + /** + * Merge core, third-party, and user snippets, with precedence user > third + * party > core. + */ + private mergeSnippets() { + this.mergedSnippets = {}; + + // We make a list of all entries from all sources, in order of increasing + // precedence: user > third party > core. + const entries = [ + ...Object.entries(cloneDeep(this.coreSnippets)), + ...Object.values(this.thirdPartySnippets).flatMap((snippets) => + Object.entries(cloneDeep(snippets)) + ), + ...Object.entries(cloneDeep(this.userSnippets)), + ]; + + entries.forEach(([key, value]) => { + if (this.mergedSnippets.hasOwnProperty(key)) { + const { definitions, defaultScopeTypes, ...rest } = value; + const mergedSnippet = this.mergedSnippets[key]; + + // NB: We make sure that the new definitions appear before the previous + // ones so that they take precedence + mergedSnippet.definitions = definitions.concat( + ...mergedSnippet.definitions + ); + + Object.assign(mergedSnippet.defaultScopeTypes, defaultScopeTypes); + Object.assign(mergedSnippet, rest); + } else { + this.mergedSnippets[key] = value; + } + }); + } + + /** + * Looks in merged collection of snippets for a snippet with key + * `snippetName` + * @param snippetName The name of the snippet to look up + * @returns The named snippet, or undefined if not found + */ + getSnippet(snippetName: string): Snippet | undefined { + return this.mergedSnippets[snippetName]; + } +} diff --git a/src/testUtil/walkAsync.ts b/src/testUtil/walkAsync.ts new file mode 100644 index 0000000000..ff80c4df48 --- /dev/null +++ b/src/testUtil/walkAsync.ts @@ -0,0 +1,23 @@ +import * as path from "path"; +import { readdir } from "fs/promises"; +import { flatten } from "lodash"; + +/** + * Note: Returns full paths + * Based on https://gist.github.com/kethinov/6658166#gistcomment-1941504 + * @param dir + * @param filelist + * @returns + */ +export const walkFiles = async (dir: string): Promise => { + const dirEntries = await readdir(dir, { withFileTypes: true }); + + return flatten( + await Promise.all( + dirEntries.map(async (dirent) => { + const filePath = path.join(dir, dirent.name); + return dirent.isDirectory() ? await walkFiles(filePath) : [filePath]; + }) + ) + ); +}; diff --git a/src/typings/Types.ts b/src/typings/Types.ts index d5a64edcf2..3acc454869 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -1,9 +1,10 @@ import { SyntaxNode } from "web-tree-sitter"; import * as vscode from "vscode"; -import { Location, Selection } from "vscode"; +import { ExtensionContext, Location, Selection } from "vscode"; import { HatStyleName } from "../core/constants"; import { EditStyles } from "../core/editStyles"; import NavigationMap from "../core/NavigationMap"; +import { Snippets } from "../snippets"; /** * A token within a text editor, including the current display line of the token @@ -326,6 +327,8 @@ export interface Graph { readonly actions: ActionRecord; readonly editStyles: EditStyles; readonly navigationMap: NavigationMap; + readonly extensionContext: ExtensionContext; + readonly snippets: Snippets; } export type NodeMatcherValue = { diff --git a/src/typings/snippet.ts b/src/typings/snippet.ts index ffae72fc06..2c33d550a0 100644 --- a/src/typings/snippet.ts +++ b/src/typings/snippet.ts @@ -17,3 +17,5 @@ export interface Snippet { defaultScopeTypes: Record; description?: string; } + +export type SnippetMap = Record; diff --git a/src/util/graphConstructors.ts b/src/util/graphConstructors.ts deleted file mode 100644 index 74d0948b67..0000000000 --- a/src/util/graphConstructors.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Actions from "../actions"; -import { EditStyles } from "../core/editStyles"; -import { Graph } from "../typings/Types"; -import { ConstructorMap } from "./makeGraph"; -import NavigationMap from "../core/NavigationMap"; - -const graphConstructors: ConstructorMap = { - actions: Actions, - editStyles: EditStyles, - navigationMap: NavigationMap, -}; - -export default graphConstructors; diff --git a/src/util/graphFactories.ts b/src/util/graphFactories.ts new file mode 100644 index 0000000000..ef827a3e27 --- /dev/null +++ b/src/util/graphFactories.ts @@ -0,0 +1,15 @@ +import Actions from "../actions"; +import { EditStyles } from "../core/editStyles"; +import { Graph } from "../typings/Types"; +import { FactoryMap } from "./makeGraph"; +import NavigationMap from "../core/NavigationMap"; +import { Snippets } from "../snippets"; + +const graphFactories: Partial> = { + actions: (graph: Graph) => new Actions(graph), + editStyles: () => new EditStyles(), + navigationMap: () => new NavigationMap(), + snippets: (graph: Graph) => new Snippets(graph), +}; + +export default graphFactories; diff --git a/src/util/makeGraph.ts b/src/util/makeGraph.ts index 01b1d400c5..202845b9aa 100644 --- a/src/util/makeGraph.ts +++ b/src/util/makeGraph.ts @@ -1,21 +1,19 @@ -export type ConstructorMap = { - [P in keyof T]: new (t: T) => T[P]; +export type FactoryMap = { + [P in keyof T]: (t: T) => T[P]; }; function makeGetter( graph: GraphType, components: Partial, - constructorMap: ConstructorMap, + factoryMap: FactoryMap, key: K ): () => GraphType[K] { return () => { var returnValue: GraphType[K]; if (components[key] == null) { - const constructor = constructorMap[key] as new ( - graph: GraphType - ) => GraphType[K]; - returnValue = new constructor(graph); + const factory = factoryMap[key] as (graph: GraphType) => GraphType[K]; + returnValue = factory(graph); components[key] = returnValue; } else { returnValue = components[key] as GraphType[K]; @@ -26,17 +24,17 @@ function makeGetter( } export default function makeGraph( - constructorMap: ConstructorMap + factoryMap: FactoryMap ) { const components: Partial = {}; const graph: Partial = {}; - Object.keys(constructorMap).forEach((key: keyof GraphType | PropertyKey) => { + Object.keys(factoryMap).forEach((key: keyof GraphType | PropertyKey) => { Object.defineProperty(graph, key, { get: makeGetter( graph as GraphType, components, - constructorMap, + factoryMap, key as keyof GraphType ), }); diff --git a/src/util/object.ts b/src/util/object.ts new file mode 100644 index 0000000000..4f0b507bd9 --- /dev/null +++ b/src/util/object.ts @@ -0,0 +1,22 @@ +/** + * Merges all objects passed in by key, raising an exception if any two objects share a key + * @param objects The objects to merge + * @returns The merged object + */ +export function mergeStrict( + ...objects: Record[] +): Record { + const returnValue: Record = {}; + + objects.forEach((object: object) => { + for (const [key, value] of Object.entries(object)) { + if (returnValue.hasOwnProperty(key)) { + throw new Error(`Found duplicate property ${key}`); + } + + returnValue[key] = value; + } + }); + + return returnValue; +} diff --git a/yarn.lock b/yarn.lock index 7dc83022e0..51a863035f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -126,11 +126,16 @@ resolved "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz" integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== -"@types/node@*", "@types/node@^12.11.7": +"@types/node@*": version "12.20.0" resolved "https://registry.npmjs.org/@types/node/-/node-12.20.0.tgz" integrity sha512-0/41wHcurotvSOTHQUFkgL702c3pyWR1mToSrrX3pGPvGfpHTv3Ksx0M4UVuU5VJfjVb62Eyr1eKO1tWNUCg2Q== +"@types/node@^16.11.3": + version "16.11.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.3.tgz#fad0b069ec205b0e81429c805d306d2c12e26be1" + integrity sha512-aIYL9Eemcecs1y77XzFGiSc+FdfN58k4J23UEe6+hynf4Wd9g4DzQPwIKL080vSMuubFqy2hWwOzCtJdc6vFKw== + "@types/sinon@^10.0.2": version "10.0.2" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.2.tgz#f360d2f189c0fd433d14aeb97b9d705d7e4cc0e4" From 3da476280e4742923a94a3955c76d237cc0b6c36 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 14:57:32 +0100 Subject: [PATCH 23/35] use json schema ref --- schemas/cursorless-snippets.json | 87 ++++++++++++-------------------- 1 file changed, 33 insertions(+), 54 deletions(-) diff --git a/schemas/cursorless-snippets.json b/schemas/cursorless-snippets.json index 031a8db0a4..9f541f0e83 100644 --- a/schemas/cursorless-snippets.json +++ b/schemas/cursorless-snippets.json @@ -22,34 +22,8 @@ } }, "scopeType": { - "type": "string", + "$ref": "#/$defs/scopeType", "description": "Cursorless scopes in which this snippet is active. Allows, for example, to have different snippets to define a function if you're in a class or at global scope.", - "enum": [ - "argumentOrParameter", - "anonymousFunction", - "attribute", - "class", - "className", - "collectionItem", - "collectionKey", - "comment", - "functionCall", - "functionName", - "ifStatement", - "list", - "map", - "name", - "namedFunction", - "regularExpression", - "statement", - "string", - "type", - "value", - "xmlBothTags", - "xmlElement", - "xmlEndTag", - "xmlStartTag" - ] } } }, @@ -70,33 +44,7 @@ "type": "object", "description": "For each named variable in the snippet, uses the given scope type from this map when wrapping a target without scope type specified", "additionalProperties": { - "type": "string", - "enum": [ - "argumentOrParameter", - "anonymousFunction", - "attribute", - "class", - "className", - "collectionItem", - "collectionKey", - "comment", - "functionCall", - "functionName", - "ifStatement", - "list", - "map", - "name", - "namedFunction", - "regularExpression", - "statement", - "string", - "type", - "value", - "xmlBothTags", - "xmlElement", - "xmlEndTag", - "xmlStartTag" - ] + "$ref": "#/$defs/scopeType" } }, "description": { @@ -107,5 +55,36 @@ "required": [ "definitions" ] + }, + "$defs": { + "scopeType": { + "type": "string", + "enum": [ + "argumentOrParameter", + "anonymousFunction", + "attribute", + "class", + "className", + "collectionItem", + "collectionKey", + "comment", + "functionCall", + "functionName", + "ifStatement", + "list", + "map", + "name", + "namedFunction", + "regularExpression", + "statement", + "string", + "type", + "value", + "xmlBothTags", + "xmlElement", + "xmlEndTag", + "xmlStartTag" + ] + } } } \ No newline at end of file From 541fd3fa741370a22bb6c8c1b17019fcb4b2d566 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 15:33:58 +0100 Subject: [PATCH 24/35] Fix schema --- schemas/cursorless-snippets.json | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/schemas/cursorless-snippets.json b/schemas/cursorless-snippets.json index 9f541f0e83..08a7558013 100644 --- a/schemas/cursorless-snippets.json +++ b/schemas/cursorless-snippets.json @@ -23,7 +23,7 @@ }, "scopeType": { "$ref": "#/$defs/scopeType", - "description": "Cursorless scopes in which this snippet is active. Allows, for example, to have different snippets to define a function if you're in a class or at global scope.", + "description": "Cursorless scopes in which this snippet is active. Allows, for example, to have different snippets to define a function if you're in a class or at global scope." } } }, @@ -51,10 +51,7 @@ "type": "string", "description": "Description of the snippet" } - }, - "required": [ - "definitions" - ] + } }, "$defs": { "scopeType": { From 07fdfcf609804c665fefecf1a6bd383706e06443 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 15:41:32 +0100 Subject: [PATCH 25/35] Wrap with snippet cleanup --- src/actions/WrapWithSnippet.ts | 20 +++---- src/actions/defaultSnippetDefinitions.ts | 75 ------------------------ 2 files changed, 9 insertions(+), 86 deletions(-) delete mode 100644 src/actions/defaultSnippetDefinitions.ts diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 26605b6786..a300373e56 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -17,7 +17,6 @@ import { Variable, } from "../vendor/snippet/snippetParser"; import { KnownSnippetVariableNames } from "../vendor/snippet/snippetVariables"; -import defaultSnippetDefinitions from "./defaultSnippetDefinitions"; export default class WrapWithSnippet implements Action { private snippetParser = new SnippetParser(); @@ -65,10 +64,10 @@ export default class WrapWithSnippet implements Action { const editor = ensureSingleEditor(targets); // Find snippet definition matching context, preferring user definitions - const definition = findMatchingSnippetDefinition(targets[0], [ - ...snippet.definitions, - ...(defaultSnippetDefinitions[snippetName] ?? []), - ]); + const definition = findMatchingSnippetDefinition( + targets[0], + snippet.definitions + ); if (definition == null) { throw new Error("Couldn't find matching snippet definition"); @@ -141,10 +140,10 @@ function transformSnippetVariables( } function getMaxPlaceholderIndex(parsedSnippet: TextmateSnippet) { - var placeholderIndex = 1; + var placeholderIndex = 0; parsedSnippet.walk((candidate) => { if (candidate instanceof Placeholder) { - placeholderIndex = Math.max(placeholderIndex, candidate.index + 1); + placeholderIndex = Math.max(placeholderIndex, candidate.index); } return true; }); @@ -163,6 +162,8 @@ function findMatchingSnippetDefinition( typedSelection: TypedSelection, definitions: SnippetDefinition[] ) { + const languageId = typedSelection.selection.editor.document.languageId; + return definitions.find(({ scope }) => { if (scope == null) { return true; @@ -170,10 +171,7 @@ function findMatchingSnippetDefinition( const { langIds, scopeType } = scope; - if ( - langIds != null && - !langIds.includes(typedSelection.selection.editor.document.languageId) - ) { + if (langIds != null && !langIds.includes(languageId)) { return false; } diff --git a/src/actions/defaultSnippetDefinitions.ts b/src/actions/defaultSnippetDefinitions.ts deleted file mode 100644 index a8f07a8ef6..0000000000 --- a/src/actions/defaultSnippetDefinitions.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { SnippetDefinition } from "../typings/snippet"; - -const defaultSnippetDefinitions: Record = { - ifStatement: [ - { - scope: { - langIds: [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp", - ], - }, - body: ["if ($condition) {\n\t$consequence\n}"], - }, - { - scope: { - langIds: ["python"], - }, - body: ["if $condition:\n\t$consequence"], - }, - ], - tryCatchStatement: [ - { - scope: { - langIds: [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp", - ], - }, - body: ["try {\n\t$body\n} catch ($error) {\n\t$exceptBody\n}"], - }, - { - scope: { - langIds: ["python"], - }, - body: ["try:\n\t$body\nexcept $error:\n\t$exceptBody"], - }, - ], - ifElseStatement: [ - { - scope: { - langIds: [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp", - ], - }, - body: ["if ($condition) {\n\t$consequence\n} else {\n\t$alternative\n}"], - }, - { - scope: { - langIds: ["python"], - }, - body: ["if $condition:\n\t$consequence\nelse:\n\t$alternative"], - }, - ], -}; - -export default defaultSnippetDefinitions; From 7205c6192adc920578f7fac1531c12fc0c9343e4 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 15:42:02 +0100 Subject: [PATCH 26/35] Cleanup --- src/actions/WrapWithSnippet.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index a300373e56..35fd13d5ac 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -1,5 +1,5 @@ -import { commands, workspace } from "vscode"; -import { Snippet, SnippetDefinition } from "../typings/snippet"; +import { commands } from "vscode"; +import { SnippetDefinition } from "../typings/snippet"; import { Action, ActionPreferences, From 1810d6284c293ff40530a2304e42baa610373928 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 15:56:32 +0100 Subject: [PATCH 27/35] More cleanup --- src/actions/WrapWithSnippet.ts | 6 +++- src/{snippets.ts => core/Snippets.ts} | 30 +++++++++++++------ src/extension.ts | 4 +-- src/scripts/transformRecordedTests.ts | 2 +- src/typings/Types.ts | 2 +- src/{ => util}/canonicalizeActionName.ts | 2 +- .../canonicalizeAndValidateCommand.ts | 4 +-- src/{ => util}/canonicalizeTargets.ts | 6 ++-- src/util/graphFactories.ts | 2 +- 9 files changed, 37 insertions(+), 21 deletions(-) rename src/{snippets.ts => core/Snippets.ts} (87%) rename src/{ => util}/canonicalizeActionName.ts (95%) rename src/{ => util}/canonicalizeAndValidateCommand.ts (89%) rename src/{ => util}/canonicalizeTargets.ts (90%) diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 35fd13d5ac..a313a23ad3 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -63,7 +63,11 @@ export default class WrapWithSnippet implements Action { const editor = ensureSingleEditor(targets); - // Find snippet definition matching context, preferring user definitions + // Find snippet definition matching context. + // NB: We only look at the first target to create our context. This means + // that if there are two snippets that match two different contexts, and + // the two targets match those two different contexts, we will just use the + // snippet that matches the first context for both targets const definition = findMatchingSnippetDefinition( targets[0], snippet.definitions diff --git a/src/snippets.ts b/src/core/Snippets.ts similarity index 87% rename from src/snippets.ts rename to src/core/Snippets.ts index cd50ce0df0..1b035536a7 100644 --- a/src/snippets.ts +++ b/src/core/Snippets.ts @@ -2,10 +2,10 @@ import { readFile, stat } from "fs/promises"; import { cloneDeep, max } from "lodash"; import { join } from "path"; import { workspace } from "vscode"; -import { walkFiles } from "./testUtil/walkAsync"; -import { Snippet, SnippetMap } from "./typings/snippet"; -import { Graph } from "./typings/Types"; -import { mergeStrict } from "./util/object"; +import { walkFiles } from "../testUtil/walkAsync"; +import { Snippet, SnippetMap } from "../typings/snippet"; +import { Graph } from "../typings/Types"; +import { mergeStrict } from "../util/object"; const SNIPPET_DIR_REFRESH_INTERVAL_MS = 1000; @@ -16,11 +16,23 @@ const SNIPPET_DIR_REFRESH_INTERVAL_MS = 1000; */ export class Snippets { private coreSnippets!: SnippetMap; + private thirdPartySnippets: Record = {}; private userSnippets!: SnippetMap; + private mergedSnippets!: SnippetMap; - private thirdPartySnippets: Record = {}; + private userSnippetsDir?: string; - private maxSnippetMtime: number = -1; + + /** + * The maximum modification time of any snippet in user snippets dir. + * + * This variable will be set to -1 if no user snippets have yet been read or + * if the user snippets path has changed. + * + * This variable will be set to 0 if the user has no snippets dir configured and + * we've already set userSnippets to {}. + */ + private maxSnippetMtimeMs: number = -1; constructor(private graph: Graph) { this.updateUserSnippetsPath(); @@ -78,7 +90,7 @@ export class Snippets { } // Reset mtime to -1 so that next time we'll update the snippets - this.maxSnippetMtime = -1; + this.maxSnippetMtimeMs = -1; this.userSnippetsDir = newUserSnippetsDir; @@ -97,11 +109,11 @@ export class Snippets { ) ) ?? 0; - if (maxSnippetMtime <= this.maxSnippetMtime) { + if (maxSnippetMtime <= this.maxSnippetMtimeMs) { return; } - this.maxSnippetMtime = maxSnippetMtime; + this.maxSnippetMtimeMs = maxSnippetMtime; this.userSnippets = mergeStrict( ...(await Promise.all( diff --git a/src/extension.ts b/src/extension.ts index f3a2ccbffe..a7965b94d2 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -18,8 +18,8 @@ import { TestCase } from "./testUtil/TestCase"; import { ThatMark } from "./core/ThatMark"; import { TestCaseRecorder } from "./testUtil/TestCaseRecorder"; import { getParseTreeApi } from "./util/getExtensionApi"; -import { canonicalizeAndValidateCommand } from "./canonicalizeAndValidateCommand"; -import canonicalizeActionName from "./canonicalizeActionName"; +import { canonicalizeAndValidateCommand } from "./util/canonicalizeAndValidateCommand"; +import canonicalizeActionName from "./util/canonicalizeActionName"; export async function activate(context: vscode.ExtensionContext) { const fontMeasurements = new FontMeasurements(context); diff --git a/src/scripts/transformRecordedTests.ts b/src/scripts/transformRecordedTests.ts index 2f82f7ca8f..7c87f1cac8 100644 --- a/src/scripts/transformRecordedTests.ts +++ b/src/scripts/transformRecordedTests.ts @@ -7,7 +7,7 @@ import { TestCaseFixture } from "../testUtil/TestCase"; import { walkFilesSync } from "../testUtil/walkSync"; import serialize from "../testUtil/serialize"; -import canonicalizeActionName from "../canonicalizeActionName"; +import canonicalizeActionName from "../util/canonicalizeActionName"; /** * The transformation to run on all recorded test fixtures. Change this diff --git a/src/typings/Types.ts b/src/typings/Types.ts index 3acc454869..7715fb28ef 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -4,7 +4,7 @@ import { ExtensionContext, Location, Selection } from "vscode"; import { HatStyleName } from "../core/constants"; import { EditStyles } from "../core/editStyles"; import NavigationMap from "../core/NavigationMap"; -import { Snippets } from "../snippets"; +import { Snippets } from "../core/Snippets"; /** * A token within a text editor, including the current display line of the token diff --git a/src/canonicalizeActionName.ts b/src/util/canonicalizeActionName.ts similarity index 95% rename from src/canonicalizeActionName.ts rename to src/util/canonicalizeActionName.ts index eff7ba1935..983ce9c332 100755 --- a/src/canonicalizeActionName.ts +++ b/src/util/canonicalizeActionName.ts @@ -1,4 +1,4 @@ -import { ActionType } from "./typings/Types"; +import { ActionType } from "../typings/Types"; const actionAliasToCanonicalName: Record = { bring: "replaceWithTarget", diff --git a/src/canonicalizeAndValidateCommand.ts b/src/util/canonicalizeAndValidateCommand.ts similarity index 89% rename from src/canonicalizeAndValidateCommand.ts rename to src/util/canonicalizeAndValidateCommand.ts index dd3f754c03..3f2b90741d 100644 --- a/src/canonicalizeAndValidateCommand.ts +++ b/src/util/canonicalizeAndValidateCommand.ts @@ -1,7 +1,7 @@ import canonicalizeActionName from "./canonicalizeActionName"; import canonicalizeTargets from "./canonicalizeTargets"; -import { ActionType, PartialTarget, SelectionType } from "./typings/Types"; -import { getPrimitiveTargets } from "./util/targetUtils"; +import { ActionType, PartialTarget, SelectionType } from "../typings/Types"; +import { getPrimitiveTargets } from "./targetUtils"; export function canonicalizeAndValidateCommand( inputActionName: string, diff --git a/src/canonicalizeTargets.ts b/src/util/canonicalizeTargets.ts similarity index 90% rename from src/canonicalizeTargets.ts rename to src/util/canonicalizeTargets.ts index 10d8d554fd..d7183cbf21 100755 --- a/src/canonicalizeTargets.ts +++ b/src/util/canonicalizeTargets.ts @@ -2,10 +2,10 @@ import { PartialPrimitiveTarget, PartialTarget, ScopeType, -} from "./typings/Types"; +} from "../typings/Types"; import update from "immutability-helper"; -import { transformPrimitiveTargets } from "./util/targetUtils"; -import { HatStyleName } from "./core/constants"; +import { transformPrimitiveTargets } from "./targetUtils"; +import { HatStyleName } from "../core/constants"; import { flow } from "lodash"; const SCOPE_TYPE_CANONICALIZATION_MAPPING: Record = { diff --git a/src/util/graphFactories.ts b/src/util/graphFactories.ts index ef827a3e27..0781bb69f7 100644 --- a/src/util/graphFactories.ts +++ b/src/util/graphFactories.ts @@ -3,7 +3,7 @@ import { EditStyles } from "../core/editStyles"; import { Graph } from "../typings/Types"; import { FactoryMap } from "./makeGraph"; import NavigationMap from "../core/NavigationMap"; -import { Snippets } from "../snippets"; +import { Snippets } from "../core/Snippets"; const graphFactories: Partial> = { actions: (graph: Graph) => new Actions(graph), From 45e4f82e2df76f0139c7daf152e10ce6c7211a77 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 16:40:54 +0100 Subject: [PATCH 28/35] Change `/` to `.` for placeholder indication --- src/actions/WrapWithSnippet.ts | 2 +- .../recorded/inference/ifWrapTokenFine.yml | 32 +++++++++----- .../languages/cpp/elseStateWrapThis.yml | 29 +++++++++---- .../recorded/languages/cpp/ifElseWrapThis.yml | 29 +++++++++---- .../languages/cpp/ifStateWrapThis.yml | 29 +++++++++---- .../languages/cpp/tryCatchWrapThis.yml | 29 +++++++++---- .../languages/cpp/tryCatchWrapThis2.yml | 41 +++++++++++------- .../languages/csharp/elseStateWrapThis.yml | 29 +++++++++---- .../languages/csharp/ifElseWrapThis.yml | 29 +++++++++---- .../languages/csharp/ifStateWrapThis.yml | 29 +++++++++---- .../languages/csharp/tryCatchWrapThis.yml | 29 +++++++++---- .../languages/csharp/tryCatchWrapThis2.yml | 41 +++++++++++------- .../languages/java/elseStateWrapThis.yml | 29 +++++++++---- .../languages/java/ifElseWrapThis.yml | 29 +++++++++---- .../languages/java/ifStateWrapThis.yml | 29 +++++++++---- .../languages/java/tryCatchWrapThis.yml | 29 +++++++++---- .../languages/java/tryCatchWrapThis2.yml | 41 +++++++++++------- .../languages/python/elseStateWrapThis.yml | 29 +++++++++---- .../languages/python/ifElseWrapThis.yml | 31 ++++++++----- .../languages/python/ifStateWrapThis.yml | 29 +++++++++---- .../languages/python/tryCatchWrapThis.yml | 31 ++++++++----- .../languages/python/tryCatchWrapThis2.yml | 43 ++++++++++++------- .../typescript/elseStateWrapThis.yml | 29 +++++++++---- .../languages/typescript/ifElseWrapThis.yml | 29 +++++++++---- .../languages/typescript/ifStateWrapThis.yml | 29 +++++++++---- .../languages/typescript/tryCatchWrapThis.yml | 29 +++++++++---- .../typescript/tryCatchWrapThis2.yml | 41 +++++++++++------- 27 files changed, 555 insertions(+), 270 deletions(-) diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index a313a23ad3..3a04431961 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -155,7 +155,7 @@ function getMaxPlaceholderIndex(parsedSnippet: TextmateSnippet) { } function parseSnippetLocation(snippetLocation: string): [string, string] { - const [snippetName, placeholderName] = snippetLocation.split("/"); + const [snippetName, placeholderName] = snippetLocation.split("."); if (snippetName == null || placeholderName == null) { throw new Error("Snippet location missing slash"); } diff --git a/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml b/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml index 98db207251..e4e7844fd7 100644 --- a/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml +++ b/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml @@ -5,27 +5,37 @@ command: partialTargets: - type: primitive selectionType: token - mark: {type: decoratedSymbol, symbolColor: default, character: f} - extraArgs: [ifStatement/consequence] + mark: { type: decoratedSymbol, symbolColor: default, character: f } + extraArgs: [ifStatement.consequence] marks: default.f: - start: {line: 0, character: 6} - end: {line: 0, character: 9} + start: { line: 0, character: 6 } + end: { line: 0, character: 9 } initialState: documentContents: | const foo = "hello"; selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} + - anchor: { line: 1, character: 0 } + active: { line: 1, character: 0 } finalState: documentContents: | const if () { foo } = "hello"; selections: - - anchor: {line: 0, character: 10} - active: {line: 0, character: 10} + - anchor: { line: 0, character: 10 } + active: { line: 0, character: 10 } thatMark: - - anchor: {line: 0, character: 6} - active: {line: 2, character: 1} -fullTargets: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: f}, selectionType: token, position: contents, insideOutsideType: null, modifier: {type: identity}}] + - anchor: { line: 0, character: 6 } + active: { line: 2, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: decoratedSymbol, symbolColor: default, character: f }, + selectionType: token, + position: contents, + insideOutsideType: null, + modifier: { type: identity }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml index 014c8d544a..f6c8fb1b1a 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifElseStatement/alternative] + mark: { type: cursor } + extraArgs: [ifElseStatement.alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml index adc39fbe6e..536eddd9b2 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifElseStatement/consequence] + mark: { type: cursor } + extraArgs: [ifElseStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml index f421c6f60e..e91f9c2d13 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml @@ -4,23 +4,34 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifStatement/consequence] + mark: { type: cursor } + extraArgs: [ifStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 2, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 2, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml index a9d9ee9401..e468243db9 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [tryCatchStatement/body] + mark: { type: cursor } + extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- try { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 2, character: 9} - active: {line: 2, character: 9} + - anchor: { line: 2, character: 9 } + active: { line: 2, character: 9 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml index 80628fb2a3..7914768221 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml @@ -4,8 +4,8 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [tryCatchStatement/body] + mark: { type: cursor } + extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: |- @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 4, character: 0 } + active: { line: 4, character: 0 } + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try { @@ -35,13 +35,24 @@ finalState: } selections: - - anchor: {line: 10, character: 9} - active: {line: 10, character: 9} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} + - anchor: { line: 10, character: 9 } + active: { line: 10, character: 9 } + - anchor: { line: 4, character: 9 } + active: { line: 4, character: 9 } thatMark: - - anchor: {line: 8, character: 0} - active: {line: 12, character: 1} - - anchor: {line: 0, character: 0} - active: {line: 6, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 8, character: 0 } + active: { line: 12, character: 1 } + - anchor: { line: 0, character: 0 } + active: { line: 6, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml index 61ba8c0f5c..16fe865e2c 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifElseStatement/alternative] + mark: { type: cursor } + extraArgs: [ifElseStatement.alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml index 1a92630457..58970dbe6e 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifElseStatement/consequence] + mark: { type: cursor } + extraArgs: [ifElseStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml index bf8b2c012f..9b95e03b79 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml @@ -4,23 +4,34 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifStatement/consequence] + mark: { type: cursor } + extraArgs: [ifStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 2, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 2, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml index a9fb1a55ac..60250a5780 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [tryCatchStatement/body] + mark: { type: cursor } + extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- try { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 2, character: 9} - active: {line: 2, character: 9} + - anchor: { line: 2, character: 9 } + active: { line: 2, character: 9 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml index 20d6235484..f0ce706df1 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml @@ -4,8 +4,8 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [tryCatchStatement/body] + mark: { type: cursor } + extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: |- @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 4, character: 0 } + active: { line: 4, character: 0 } + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try { @@ -35,13 +35,24 @@ finalState: } selections: - - anchor: {line: 10, character: 9} - active: {line: 10, character: 9} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} + - anchor: { line: 10, character: 9 } + active: { line: 10, character: 9 } + - anchor: { line: 4, character: 9 } + active: { line: 4, character: 9 } thatMark: - - anchor: {line: 8, character: 0} - active: {line: 12, character: 1} - - anchor: {line: 0, character: 0} - active: {line: 6, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 8, character: 0 } + active: { line: 12, character: 1 } + - anchor: { line: 0, character: 0 } + active: { line: 6, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml index 0b4f405273..34e93c5cd4 100644 --- a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifElseStatement/alternative] + mark: { type: cursor } + extraArgs: [ifElseStatement.alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml index 30a22f7943..d39b6b87bd 100644 --- a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifElseStatement/consequence] + mark: { type: cursor } + extraArgs: [ifElseStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml index d68eb48db6..f397f322bb 100644 --- a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml @@ -4,23 +4,34 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifStatement/consequence] + mark: { type: cursor } + extraArgs: [ifStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 2, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 2, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml index bcff1caa85..a26ecb9e8b 100644 --- a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [tryCatchStatement/body] + mark: { type: cursor } + extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- try { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 2, character: 9} - active: {line: 2, character: 9} + - anchor: { line: 2, character: 9 } + active: { line: 2, character: 9 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml index 1b3bef41a8..f20d9fba3a 100644 --- a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml @@ -4,8 +4,8 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [tryCatchStatement/body] + mark: { type: cursor } + extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: |- @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 4, character: 0 } + active: { line: 4, character: 0 } + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try { @@ -35,13 +35,24 @@ finalState: } selections: - - anchor: {line: 10, character: 9} - active: {line: 10, character: 9} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} + - anchor: { line: 10, character: 9 } + active: { line: 10, character: 9 } + - anchor: { line: 4, character: 9 } + active: { line: 4, character: 9 } thatMark: - - anchor: {line: 8, character: 0} - active: {line: 12, character: 1} - - anchor: {line: 0, character: 0} - active: {line: 6, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 8, character: 0 } + active: { line: 12, character: 1 } + - anchor: { line: 0, character: 0 } + active: { line: 6, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml index a0f3549599..c29385d3d0 100644 --- a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifElseStatement/alternative] + mark: { type: cursor } + extraArgs: [ifElseStatement.alternative] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- if : @@ -19,9 +19,20 @@ finalState: else: foo = "hello" selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} + - anchor: { line: 0, character: 3 } + active: { line: 0, character: 3 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 3, character: 17} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 3, character: 17 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml index cf02818fbe..a2a476abc4 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml @@ -4,24 +4,35 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifElseStatement/consequence] + mark: { type: cursor } + extraArgs: [ifElseStatement.consequence] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- if : foo = "hello" else: - + selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} + - anchor: { line: 0, character: 3 } + active: { line: 0, character: 3 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 3, character: 4} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 3, character: 4 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml index 1051c31353..5c4f823369 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml @@ -4,22 +4,33 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifStatement/consequence] + mark: { type: cursor } + extraArgs: [ifStatement.consequence] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- if : foo = "hello" selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} + - anchor: { line: 0, character: 3 } + active: { line: 0, character: 3 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 1, character: 17} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 1, character: 17 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml index f352eac5d7..5ddf725d4f 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml @@ -4,24 +4,35 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [tryCatchStatement/body] + mark: { type: cursor } + extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try: foo = "hello" except : - + selections: - - anchor: {line: 2, character: 7} - active: {line: 2, character: 7} + - anchor: { line: 2, character: 7 } + active: { line: 2, character: 7 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 3, character: 4} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 3, character: 4 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml index 2a5460b027..c627a7a75f 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml @@ -4,8 +4,8 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [tryCatchStatement/body] + mark: { type: cursor } + extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: |- @@ -14,10 +14,10 @@ initialState: bar = "hello" selections: - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 3, character: 0 } + active: { line: 3, character: 0 } + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try: @@ -29,15 +29,26 @@ finalState: try: bar = "hello" except : - + selections: - - anchor: {line: 8, character: 7} - active: {line: 8, character: 7} - - anchor: {line: 3, character: 7} - active: {line: 3, character: 7} + - anchor: { line: 8, character: 7 } + active: { line: 8, character: 7 } + - anchor: { line: 3, character: 7 } + active: { line: 3, character: 7 } thatMark: - - anchor: {line: 6, character: 0} - active: {line: 9, character: 4} - - anchor: {line: 0, character: 0} - active: {line: 4, character: 4} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 6, character: 0 } + active: { line: 9, character: 4 } + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 4 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml index 1f194a3898..b0855f67d9 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifElseStatement/alternative] + mark: { type: cursor } + extraArgs: [ifElseStatement.alternative] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: const foo = "hello"; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml index c13631e87c..491cf9ff64 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifElseStatement/consequence] + mark: { type: cursor } + extraArgs: [ifElseStatement.consequence] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml index 6b466b0c8c..bb53b890d1 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml @@ -4,23 +4,34 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [ifStatement/consequence] + mark: { type: cursor } + extraArgs: [ifStatement.consequence] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- if () { const foo = "hello"; } selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} + - anchor: { line: 0, character: 4 } + active: { line: 0, character: 4 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 2, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 2, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml index 9a1d75cd63..135bce05cc 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [tryCatchStatement/body] + mark: { type: cursor } + extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: { line: 0, character: 6 } + active: { line: 0, character: 6 } finalState: documentContents: |- try { @@ -20,9 +20,20 @@ finalState: } selections: - - anchor: {line: 2, character: 9} - active: {line: 2, character: 9} + - anchor: { line: 2, character: 9 } + active: { line: 2, character: 9 } thatMark: - - anchor: {line: 0, character: 0} - active: {line: 4, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 0, character: 0 } + active: { line: 4, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml index c04bf2d2e2..6c66a275c4 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml @@ -4,8 +4,8 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: {type: cursor} - extraArgs: [tryCatchStatement/body] + mark: { type: cursor } + extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: |- @@ -15,10 +15,10 @@ initialState: const bar = "hello"; selections: - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: { line: 4, character: 0 } + active: { line: 4, character: 0 } + - anchor: { line: 0, character: 0 } + active: { line: 0, character: 0 } finalState: documentContents: |- try { @@ -35,13 +35,24 @@ finalState: } selections: - - anchor: {line: 10, character: 9} - active: {line: 10, character: 9} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} + - anchor: { line: 10, character: 9 } + active: { line: 10, character: 9 } + - anchor: { line: 4, character: 9 } + active: { line: 4, character: 9 } thatMark: - - anchor: {line: 8, character: 0} - active: {line: 12, character: 1} - - anchor: {line: 0, character: 0} - active: {line: 6, character: 1} -fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] + - anchor: { line: 8, character: 0 } + active: { line: 12, character: 1 } + - anchor: { line: 0, character: 0 } + active: { line: 6, character: 1 } +fullTargets: + [ + { + type: primitive, + mark: { type: cursor }, + selectionType: token, + position: contents, + insideOutsideType: inside, + modifier: + { type: containingScope, scopeType: statement, includeSiblings: false }, + }, + ] From a0a190daa19a22f8fd752d4658011d53f555dbea Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 16:46:08 +0100 Subject: [PATCH 29/35] Reformat --- .../recorded/inference/ifWrapTokenFine.yml | 30 +++++-------- .../languages/cpp/elseStateWrapThis.yml | 27 ++++-------- .../recorded/languages/cpp/ifElseWrapThis.yml | 27 ++++-------- .../languages/cpp/ifStateWrapThis.yml | 27 ++++-------- .../languages/cpp/tryCatchWrapThis.yml | 27 ++++-------- .../languages/cpp/tryCatchWrapThis2.yml | 39 ++++++----------- .../languages/csharp/elseStateWrapThis.yml | 27 ++++-------- .../languages/csharp/ifElseWrapThis.yml | 27 ++++-------- .../languages/csharp/ifStateWrapThis.yml | 27 ++++-------- .../languages/csharp/tryCatchWrapThis.yml | 27 ++++-------- .../languages/csharp/tryCatchWrapThis2.yml | 39 ++++++----------- .../languages/java/elseStateWrapThis.yml | 27 ++++-------- .../languages/java/ifElseWrapThis.yml | 27 ++++-------- .../languages/java/ifStateWrapThis.yml | 27 ++++-------- .../languages/java/tryCatchWrapThis.yml | 27 ++++-------- .../languages/java/tryCatchWrapThis2.yml | 39 ++++++----------- .../languages/python/elseStateWrapThis.yml | 27 ++++-------- .../languages/python/ifElseWrapThis.yml | 29 ++++--------- .../languages/python/ifStateWrapThis.yml | 27 ++++-------- .../languages/python/tryCatchWrapThis.yml | 29 ++++--------- .../languages/python/tryCatchWrapThis2.yml | 41 +++++++----------- .../typescript/elseStateWrapThis.yml | 27 ++++-------- .../languages/typescript/ifElseWrapThis.yml | 27 ++++-------- .../languages/typescript/ifStateWrapThis.yml | 27 ++++-------- .../languages/typescript/tryCatchWrapThis.yml | 29 ++++--------- .../typescript/tryCatchWrapThis2.yml | 43 +++++++------------ 26 files changed, 246 insertions(+), 531 deletions(-) diff --git a/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml b/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml index e4e7844fd7..59c491081b 100644 --- a/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml +++ b/src/test/suite/fixtures/recorded/inference/ifWrapTokenFine.yml @@ -5,37 +5,27 @@ command: partialTargets: - type: primitive selectionType: token - mark: { type: decoratedSymbol, symbolColor: default, character: f } + mark: {type: decoratedSymbol, symbolColor: default, character: f} extraArgs: [ifStatement.consequence] marks: default.f: - start: { line: 0, character: 6 } - end: { line: 0, character: 9 } + start: {line: 0, character: 6} + end: {line: 0, character: 9} initialState: documentContents: | const foo = "hello"; selections: - - anchor: { line: 1, character: 0 } - active: { line: 1, character: 0 } + - anchor: {line: 1, character: 0} + active: {line: 1, character: 0} finalState: documentContents: | const if () { foo } = "hello"; selections: - - anchor: { line: 0, character: 10 } - active: { line: 0, character: 10 } + - anchor: {line: 0, character: 10} + active: {line: 0, character: 10} thatMark: - - anchor: { line: 0, character: 6 } - active: { line: 2, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: decoratedSymbol, symbolColor: default, character: f }, - selectionType: token, - position: contents, - insideOutsideType: null, - modifier: { type: identity }, - }, - ] + - anchor: {line: 0, character: 6} + active: {line: 2, character: 1} +fullTargets: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: f}, selectionType: token, position: contents, insideOutsideType: null, modifier: {type: identity}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml index f6c8fb1b1a..67f03b5748 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement.alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml index 536eddd9b2..09f561f114 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml index e91f9c2d13..9ed0d478c3 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/ifStateWrapThis.yml @@ -4,34 +4,23 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml index e468243db9..9ca7b8195c 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- try { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 2, character: 9 } - active: { line: 2, character: 9 } + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml index 7914768221..1454f71b44 100644 --- a/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/cpp/tryCatchWrapThis2.yml @@ -4,7 +4,7 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement.body] marks: {} initialState: @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: { line: 4, character: 0 } - active: { line: 4, character: 0 } - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try { @@ -35,24 +35,13 @@ finalState: } selections: - - anchor: { line: 10, character: 9 } - active: { line: 10, character: 9 } - - anchor: { line: 4, character: 9 } - active: { line: 4, character: 9 } + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} thatMark: - - anchor: { line: 8, character: 0 } - active: { line: 12, character: 1 } - - anchor: { line: 0, character: 0 } - active: { line: 6, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml index 16fe865e2c..8c0f9779d1 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement.alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml index 58970dbe6e..99efae39cd 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml index 9b95e03b79..aa22745e98 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/ifStateWrapThis.yml @@ -4,34 +4,23 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml index 60250a5780..31f11c84c0 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- try { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 2, character: 9 } - active: { line: 2, character: 9 } + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml index f0ce706df1..cc88d423e5 100644 --- a/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/csharp/tryCatchWrapThis2.yml @@ -4,7 +4,7 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement.body] marks: {} initialState: @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: { line: 4, character: 0 } - active: { line: 4, character: 0 } - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try { @@ -35,24 +35,13 @@ finalState: } selections: - - anchor: { line: 10, character: 9 } - active: { line: 10, character: 9 } - - anchor: { line: 4, character: 9 } - active: { line: 4, character: 9 } + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} thatMark: - - anchor: { line: 8, character: 0 } - active: { line: 12, character: 1 } - - anchor: { line: 0, character: 0 } - active: { line: 6, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml index 34e93c5cd4..69843ecff1 100644 --- a/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement.alternative] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml index d39b6b87bd..d43167eeb7 100644 --- a/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml index f397f322bb..191f56cf68 100644 --- a/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/ifStateWrapThis.yml @@ -4,34 +4,23 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifStatement.consequence] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { int foo = 0; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml index a26ecb9e8b..9b95e3f83d 100644 --- a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: int foo = 0; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- try { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 2, character: 9 } - active: { line: 2, character: 9 } + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml index f20d9fba3a..832fba247d 100644 --- a/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/java/tryCatchWrapThis2.yml @@ -4,7 +4,7 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement.body] marks: {} initialState: @@ -15,10 +15,10 @@ initialState: int bar = 1; selections: - - anchor: { line: 4, character: 0 } - active: { line: 4, character: 0 } - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try { @@ -35,24 +35,13 @@ finalState: } selections: - - anchor: { line: 10, character: 9 } - active: { line: 10, character: 9 } - - anchor: { line: 4, character: 9 } - active: { line: 4, character: 9 } + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} thatMark: - - anchor: { line: 8, character: 0 } - active: { line: 12, character: 1 } - - anchor: { line: 0, character: 0 } - active: { line: 6, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml index c29385d3d0..14cdf0ec83 100644 --- a/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement.alternative] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- if : @@ -19,20 +19,9 @@ finalState: else: foo = "hello" selections: - - anchor: { line: 0, character: 3 } - active: { line: 0, character: 3 } + - anchor: {line: 0, character: 3} + active: {line: 0, character: 3} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 3, character: 17 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 3, character: 17} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml index a2a476abc4..8a63c3439d 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifElseWrapThis.yml @@ -4,35 +4,24 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement.consequence] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- if : foo = "hello" else: - + selections: - - anchor: { line: 0, character: 3 } - active: { line: 0, character: 3 } + - anchor: {line: 0, character: 3} + active: {line: 0, character: 3} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 3, character: 4 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 3, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml index 5c4f823369..a2b66e465c 100644 --- a/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/ifStateWrapThis.yml @@ -4,33 +4,22 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifStatement.consequence] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- if : foo = "hello" selections: - - anchor: { line: 0, character: 3 } - active: { line: 0, character: 3 } + - anchor: {line: 0, character: 3} + active: {line: 0, character: 3} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 1, character: 17 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 1, character: 17} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml index 5ddf725d4f..788878ea3d 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis.yml @@ -4,35 +4,24 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: foo = "hello" selections: - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try: foo = "hello" except : - + selections: - - anchor: { line: 2, character: 7 } - active: { line: 2, character: 7 } + - anchor: {line: 2, character: 7} + active: {line: 2, character: 7} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 3, character: 4 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 3, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml index c627a7a75f..6fd5886ec2 100644 --- a/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/python/tryCatchWrapThis2.yml @@ -4,7 +4,7 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement.body] marks: {} initialState: @@ -14,10 +14,10 @@ initialState: bar = "hello" selections: - - anchor: { line: 3, character: 0 } - active: { line: 3, character: 0 } - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 3, character: 0} + active: {line: 3, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try: @@ -29,26 +29,15 @@ finalState: try: bar = "hello" except : - + selections: - - anchor: { line: 8, character: 7 } - active: { line: 8, character: 7 } - - anchor: { line: 3, character: 7 } - active: { line: 3, character: 7 } + - anchor: {line: 8, character: 7} + active: {line: 8, character: 7} + - anchor: {line: 3, character: 7} + active: {line: 3, character: 7} thatMark: - - anchor: { line: 6, character: 0 } - active: { line: 9, character: 4 } - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 4 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 6, character: 0} + active: {line: 9, character: 4} + - anchor: {line: 0, character: 0} + active: {line: 4, character: 4} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml index b0855f67d9..75def3f5b0 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/elseStateWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement.alternative] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: const foo = "hello"; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml index 491cf9ff64..2b8fae5fe0 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifElseWrapThis.yml @@ -4,14 +4,14 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifElseStatement.consequence] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { @@ -20,20 +20,9 @@ finalState: } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml index bb53b890d1..8f84ac19a5 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/ifStateWrapThis.yml @@ -4,34 +4,23 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [ifStatement.consequence] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- if () { const foo = "hello"; } selections: - - anchor: { line: 0, character: 4 } - active: { line: 0, character: 4 } + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 2, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 2, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml index 135bce05cc..b3e9581e2d 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml @@ -4,36 +4,25 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement.body] marks: {} initialState: documentContents: const foo = "hello"; selections: - - anchor: { line: 0, character: 6 } - active: { line: 0, character: 6 } + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} finalState: documentContents: |- try { const foo = "hello"; - } catch () { + } catch (err) { } selections: - - anchor: { line: 2, character: 9 } - active: { line: 2, character: 9 } + - anchor: {line: 3, character: 4} + active: {line: 3, character: 4} thatMark: - - anchor: { line: 0, character: 0 } - active: { line: 4, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 0, character: 0} + active: {line: 4, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml index 6c66a275c4..84480a24f1 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml @@ -4,7 +4,7 @@ command: actionName: wrapWithSnippet partialTargets: - type: primitive - mark: { type: cursor } + mark: {type: cursor} extraArgs: [tryCatchStatement.body] marks: {} initialState: @@ -15,44 +15,33 @@ initialState: const bar = "hello"; selections: - - anchor: { line: 4, character: 0 } - active: { line: 4, character: 0 } - - anchor: { line: 0, character: 0 } - active: { line: 0, character: 0 } + - anchor: {line: 4, character: 0} + active: {line: 4, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} finalState: documentContents: |- try { if (true) { const foo = "hello"; } - } catch () { + } catch (err) { } try { const bar = "hello"; - } catch () { + } catch (err) { } selections: - - anchor: { line: 10, character: 9 } - active: { line: 10, character: 9 } - - anchor: { line: 4, character: 9 } - active: { line: 4, character: 9 } + - anchor: {line: 11, character: 4} + active: {line: 11, character: 4} + - anchor: {line: 5, character: 4} + active: {line: 5, character: 4} thatMark: - - anchor: { line: 8, character: 0 } - active: { line: 12, character: 1 } - - anchor: { line: 0, character: 0 } - active: { line: 6, character: 1 } -fullTargets: - [ - { - type: primitive, - mark: { type: cursor }, - selectionType: token, - position: contents, - insideOutsideType: inside, - modifier: - { type: containingScope, scopeType: statement, includeSiblings: false }, - }, - ] + - anchor: {line: 8, character: 0} + active: {line: 12, character: 1} + - anchor: {line: 0, character: 0} + active: {line: 6, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: containingScope, scopeType: statement, includeSiblings: false}}] From 20a271748f895642d8c867958a4da946463d3318 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 16:47:01 +0100 Subject: [PATCH 30/35] Fix comment --- src/actions/WrapWithSnippet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 3a04431961..03704734ec 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -157,7 +157,7 @@ function getMaxPlaceholderIndex(parsedSnippet: TextmateSnippet) { function parseSnippetLocation(snippetLocation: string): [string, string] { const [snippetName, placeholderName] = snippetLocation.split("."); if (snippetName == null || placeholderName == null) { - throw new Error("Snippet location missing slash"); + throw new Error("Snippet location missing '.'"); } return [snippetName, placeholderName]; } From f74bd5060a370c0f4b28606f460fbc505ba67005 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 16:58:38 +0100 Subject: [PATCH 31/35] Fix tests --- .../languages/typescript/tryCatchWrapThis.yml | 6 +++--- .../languages/typescript/tryCatchWrapThis2.yml | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml index b3e9581e2d..e74db810c6 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis.yml @@ -16,12 +16,12 @@ finalState: documentContents: |- try { const foo = "hello"; - } catch (err) { + } catch () { } selections: - - anchor: {line: 3, character: 4} - active: {line: 3, character: 4} + - anchor: {line: 2, character: 9} + active: {line: 2, character: 9} thatMark: - anchor: {line: 0, character: 0} active: {line: 4, character: 1} diff --git a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml index 84480a24f1..51b89b697d 100644 --- a/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml +++ b/src/test/suite/fixtures/recorded/languages/typescript/tryCatchWrapThis2.yml @@ -25,20 +25,20 @@ finalState: if (true) { const foo = "hello"; } - } catch (err) { + } catch () { } try { const bar = "hello"; - } catch (err) { + } catch () { } selections: - - anchor: {line: 11, character: 4} - active: {line: 11, character: 4} - - anchor: {line: 5, character: 4} - active: {line: 5, character: 4} + - anchor: {line: 10, character: 9} + active: {line: 10, character: 9} + - anchor: {line: 4, character: 9} + active: {line: 4, character: 9} thatMark: - anchor: {line: 8, character: 0} active: {line: 12, character: 1} From bac3d3871a3a3c2bc74b9a618542c8ecc4569e90 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 23 Oct 2021 17:04:29 +0100 Subject: [PATCH 32/35] Add basic docs --- docs/experimental/snippets.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/experimental/snippets.md diff --git a/docs/experimental/snippets.md b/docs/experimental/snippets.md new file mode 100644 index 0000000000..a5ab2fe372 --- /dev/null +++ b/docs/experimental/snippets.md @@ -0,0 +1,5 @@ +# Cursorless snippets + +Cursorless has experimental support for snippets. Currently these snippets are just used for wrapping targets. + +The best place to start is to look at the [core cursorless snippets](../../cursorless-snippets). Additionally, there is autocomplete with documentation as you're writing a snippet. From 7d716be1db5dda7c44df5667c80f77a5e1184b09 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Mon, 25 Oct 2021 10:30:31 +0100 Subject: [PATCH 33/35] Change snippet format --- .../ifElseStatement.cursorless-snippets | 88 ++++++++++--------- .../ifStatement.cursorless-snippets | 76 ++++++++-------- .../tryCatchStatement.cursorless-snippets | 88 ++++++++++--------- schemas/cursorless-snippets.json | 14 ++- src/actions/WrapWithSnippet.ts | 3 +- src/typings/snippet.ts | 25 +++++- 6 files changed, 167 insertions(+), 127 deletions(-) diff --git a/cursorless-snippets/ifElseStatement.cursorless-snippets b/cursorless-snippets/ifElseStatement.cursorless-snippets index c43dbf1c60..fa05102ce1 100644 --- a/cursorless-snippets/ifElseStatement.cursorless-snippets +++ b/cursorless-snippets/ifElseStatement.cursorless-snippets @@ -1,45 +1,49 @@ { - "ifElseStatement": { - "definitions": [ - { - "scope": { - "langIds": [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp" - ] - }, - "body": [ - "if ($condition) {", - "\t$consequence", - "} else {", - "\t$alternative", - "}" - ] - }, - { - "scope": { - "langIds": [ - "python" - ] - }, - "body": [ - "if $condition:", - "\t$consequence", - "else:", - "\t$alternative" - ] - } - ], - "defaultScopeTypes": { - "consequence": "statement", - "alternative": "statement" + "ifElseStatement": { + "definitions": [ + { + "scope": { + "langIds": [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp" + ] }, - "description": "If else statement" + "body": [ + "if ($condition) {", + "\t$consequence", + "} else {", + "\t$alternative", + "}" + ] + }, + { + "scope": { + "langIds": [ + "python" + ] + }, + "body": [ + "if $condition:", + "\t$consequence", + "else:", + "\t$alternative" + ] + } + ], + "description": "If else statement", + "variables": { + "consequence": { + "wrapperScopeType": "statement" + }, + "alternative": { + "wrapperScopeType": "statement" + } } -} \ No newline at end of file + } +} diff --git a/cursorless-snippets/ifStatement.cursorless-snippets b/cursorless-snippets/ifStatement.cursorless-snippets index 8899c7fb62..3eb229ea3e 100644 --- a/cursorless-snippets/ifStatement.cursorless-snippets +++ b/cursorless-snippets/ifStatement.cursorless-snippets @@ -1,40 +1,42 @@ { - "ifStatement": { - "definitions": [ - { - "scope": { - "langIds": [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp" - ] - }, - "body": [ - "if ($condition) {", - "\t$consequence", - "}" - ] - }, - { - "scope": { - "langIds": [ - "python" - ] - }, - "body": [ - "if $condition:", - "\t$consequence" - ] - } - ], - "defaultScopeTypes": { - "consequence": "statement" + "ifStatement": { + "definitions": [ + { + "scope": { + "langIds": [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp" + ] }, - "description": "If statement" + "body": [ + "if ($condition) {", + "\t$consequence", + "}" + ] + }, + { + "scope": { + "langIds": [ + "python" + ] + }, + "body": [ + "if $condition:", + "\t$consequence" + ] + } + ], + "description": "If statement", + "variables": { + "consequence": { + "wrapperScopeType": "statement" + } } -} \ No newline at end of file + } +} diff --git a/cursorless-snippets/tryCatchStatement.cursorless-snippets b/cursorless-snippets/tryCatchStatement.cursorless-snippets index ccf9f1ae99..4c0155f0a5 100644 --- a/cursorless-snippets/tryCatchStatement.cursorless-snippets +++ b/cursorless-snippets/tryCatchStatement.cursorless-snippets @@ -1,45 +1,49 @@ { - "tryCatchStatement": { - "definitions": [ - { - "scope": { - "langIds": [ - "typescript", - "typescriptreact", - "javascript", - "javascriptreact", - "cpp", - "c", - "java", - "csharp" - ] - }, - "body": [ - "try {", - "\t$body", - "} catch ($error) {", - "\t$exceptBody", - "}" - ] - }, - { - "scope": { - "langIds": [ - "python" - ] - }, - "body": [ - "try:", - "\t$body", - "except $error:", - "\t$exceptBody" - ] - } - ], - "defaultScopeTypes": { - "body": "statement", - "exceptBody": "statement" + "tryCatchStatement": { + "definitions": [ + { + "scope": { + "langIds": [ + "typescript", + "typescriptreact", + "javascript", + "javascriptreact", + "cpp", + "c", + "java", + "csharp" + ] }, - "description": "Try catch statement" + "body": [ + "try {", + "\t$body", + "} catch ($error) {", + "\t$exceptBody", + "}" + ] + }, + { + "scope": { + "langIds": [ + "python" + ] + }, + "body": [ + "try:", + "\t$body", + "except $error:", + "\t$exceptBody" + ] + } + ], + "description": "Try catch statement", + "variables": { + "body": { + "wrapperScopeType": "statement" + }, + "exceptBody": { + "wrapperScopeType": "statement" + } } -} \ No newline at end of file + } +} diff --git a/schemas/cursorless-snippets.json b/schemas/cursorless-snippets.json index 08a7558013..e8a615e6a6 100644 --- a/schemas/cursorless-snippets.json +++ b/schemas/cursorless-snippets.json @@ -32,7 +32,7 @@ "items": { "type": "string" }, - "description": "Inline snippet text; entries joined by newline" + "description": "Inline snippet text using VSCode snippet syntax; entries joined by newline. Named variables of the form $foo can be used as wrappers" } }, "required": [ @@ -40,11 +40,17 @@ ] } }, - "defaultScopeTypes": { + "variables": { "type": "object", - "description": "For each named variable in the snippet, uses the given scope type from this map when wrapping a target without scope type specified", + "description": "For each named variable in the snippet, provides extra information about the variable.", "additionalProperties": { - "$ref": "#/$defs/scopeType" + "type": "object", + "properties": { + "wrapperScopeType": { + "$ref": "#/$defs/scopeType", + "description": "Default to this scope type when wrapping a target without scope type specified" + } + }, } }, "description": { diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 03704734ec..91d366c12f 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -31,7 +31,8 @@ export default class WrapWithSnippet implements Action { throw new Error(`Couldn't find snippet ${snippetName}`); } - const defaultScopeType = snippet.defaultScopeTypes[placeholderName]; + const variables = snippet.variables ?? {}; + const defaultScopeType = variables[placeholderName]?.wrapperScopeType; return [ { diff --git a/src/typings/snippet.ts b/src/typings/snippet.ts index 2c33d550a0..f6e29de6fd 100644 --- a/src/typings/snippet.ts +++ b/src/typings/snippet.ts @@ -9,12 +9,35 @@ export type SnippetBody = string[]; export interface SnippetDefinition { body: SnippetBody; + + /** + * Scopes where this snippet is active + */ scope?: SnippetScope; } +export interface SnippetVariable { + /** + * Default to this scope type when wrapping a target without scope type + * specified. + */ + wrapperScopeType?: ScopeType; +} + export interface Snippet { + /** + * List of possible definitions for this snippet + */ definitions: SnippetDefinition[]; - defaultScopeTypes: Record; + + /** + * For each named variable in the snippet, provides extra information about the variable. + */ + variables?: Record; + + /** + * Description of the snippet + */ description?: string; } From a8926a54b5c0b4bd6bdd938452463085e7f36b44 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Mon, 25 Oct 2021 10:34:11 +0100 Subject: [PATCH 34/35] Fixes --- schemas/cursorless-snippets.json | 2 +- src/core/Snippets.ts | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/schemas/cursorless-snippets.json b/schemas/cursorless-snippets.json index e8a615e6a6..6a312bd144 100644 --- a/schemas/cursorless-snippets.json +++ b/schemas/cursorless-snippets.json @@ -50,7 +50,7 @@ "$ref": "#/$defs/scopeType", "description": "Default to this scope type when wrapping a target without scope type specified" } - }, + } } }, "description": { diff --git a/src/core/Snippets.ts b/src/core/Snippets.ts index 1b035536a7..12457bcad7 100644 --- a/src/core/Snippets.ts +++ b/src/core/Snippets.ts @@ -1,5 +1,5 @@ import { readFile, stat } from "fs/promises"; -import { cloneDeep, max } from "lodash"; +import { cloneDeep, max, merge } from "lodash"; import { join } from "path"; import { workspace } from "vscode"; import { walkFiles } from "../testUtil/walkAsync"; @@ -159,7 +159,7 @@ export class Snippets { entries.forEach(([key, value]) => { if (this.mergedSnippets.hasOwnProperty(key)) { - const { definitions, defaultScopeTypes, ...rest } = value; + const { definitions, ...rest } = value; const mergedSnippet = this.mergedSnippets[key]; // NB: We make sure that the new definitions appear before the previous @@ -168,8 +168,7 @@ export class Snippets { ...mergedSnippet.definitions ); - Object.assign(mergedSnippet.defaultScopeTypes, defaultScopeTypes); - Object.assign(mergedSnippet, rest); + merge(mergedSnippet, rest); } else { this.mergedSnippets[key] = value; } From 6adc0af05a295d83fdae6f99c024e2c393292441 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Mon, 25 Oct 2021 10:50:20 +0100 Subject: [PATCH 35/35] Add description field --- schemas/cursorless-snippets.json | 4 ++++ src/typings/snippet.ts | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/schemas/cursorless-snippets.json b/schemas/cursorless-snippets.json index 6a312bd144..0a1e648813 100644 --- a/schemas/cursorless-snippets.json +++ b/schemas/cursorless-snippets.json @@ -49,6 +49,10 @@ "wrapperScopeType": { "$ref": "#/$defs/scopeType", "description": "Default to this scope type when wrapping a target without scope type specified" + }, + "description": { + "type": "string", + "description": "Description of the snippet variable" } } } diff --git a/src/typings/snippet.ts b/src/typings/snippet.ts index f6e29de6fd..4eb7ef3c08 100644 --- a/src/typings/snippet.ts +++ b/src/typings/snippet.ts @@ -22,6 +22,11 @@ export interface SnippetVariable { * specified. */ wrapperScopeType?: ScopeType; + + /** + * Description of the snippet variable + */ + description?: string; } export interface Snippet {