From cd15d1299812faee623cc0c6454c35e09dff8baa Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 2 Oct 2026 17:59:31 +0200 Subject: [PATCH 1/5] Added `trim-end-optional!` predicate --- .../TreeSitterQuery/QueryPredicateOperator.ts | 27 ++++----- .../queryPredicateOperators.test.ts | 11 ++-- .../queryPredicateOperators.ts | 55 ++++++++++++------- ...collectionItem.unenclosed.iteration2.scope | 12 ++++ .../collectionItem.unenclosed.multiLine.scope | 17 ++++-- ...collectionItem.unenclosed.multiLine2.scope | 54 ++++++++++++++++++ resources/queries/markdown.scm | 8 ++- 7 files changed, 134 insertions(+), 50 deletions(-) create mode 100644 resources/fixtures/scopes/markdown/collectionItem.unenclosed.iteration2.scope create mode 100644 resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine2.scope diff --git a/packages/lib-engine/src/languages/TreeSitterQuery/QueryPredicateOperator.ts b/packages/lib-engine/src/languages/TreeSitterQuery/QueryPredicateOperator.ts index fc52f500761..bc23df4fbeb 100644 --- a/packages/lib-engine/src/languages/TreeSitterQuery/QueryPredicateOperator.ts +++ b/packages/lib-engine/src/languages/TreeSitterQuery/QueryPredicateOperator.ts @@ -35,6 +35,16 @@ export abstract class QueryPredicateOperator { */ abstract readonly schema: InferSchemaType; + /** + * Whether it is ok for a node argument to be missing. If true, then the + * operator will just accept the pattern if the given node is missing. If + * false, then the operator will throw an error if the node is missing. + * + * This is useful if we want to set some flag on a node, but only if it's + * present. + */ + protected allowMissingNode: boolean = false; + /** * Given a list of operands, return whether the operator accepts the given * operands. This is where the actual logic of the operator is implemented. @@ -47,21 +57,6 @@ export abstract class QueryPredicateOperator { ...args: AcceptFunctionArgs>> ): boolean; - /** - * Whether it is ok for a node argument to be missing. If true, then the - * operator will just accept the pattern if the given node is missing. If - * false, then the operator will throw an error if the node is missing. - * - * This is useful if we want to set some flag on a node, but only if it's - * present. - * - * @returns A boolean indicating whether it is ok for a node argument to be - * missing. - */ - protected allowMissingNode(): boolean { - return false; - } - /** * Given a list of operands, return a predicate function that can be used to * test whether a given match satisfies the predicate. @@ -84,7 +79,7 @@ export abstract class QueryPredicateOperator { } catch (error) { if ( error instanceof CaptureNotFoundError && - this.allowMissingNode() + this.allowMissingNode ) { return true; } diff --git a/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.test.ts b/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.test.ts index 34eebea26e8..d2bed07bf2f 100644 --- a/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.test.ts +++ b/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.test.ts @@ -387,6 +387,7 @@ suite("queryPredicateOperators", () => { "shrink-to-match!": [captureOperand, "hello"], "grow-to-named-siblings!": [captureOperand], "trim-end!": [captureOperand, conditionOperand], + "trim-end-optional!": [captureOperand, conditionOperand], "document-range!": [captureOperand, conditionOperand], "allow-multiple!": [captureOperand, conditionOperand], "insertion-delimiter!": [captureOperand, ", "], @@ -448,17 +449,15 @@ suite("queryPredicateOperators", () => { } test("allow-multiple! accepts missing captures while range operators require them", () => { - for (const name of [ - "allow-multiple!", - "trim-end!", - "document-range!", - ] as const) { + const optionalNames = ["allow-multiple!", "trim-end-optional!"]; + const requiredNames = ["trim-end!", "document-range!"]; + for (const name of [...optionalNames, ...requiredNames] as const) { const operator = queryPredicateOperators.find((op) => op.name === name)!; const result = operator.createPredicate([ { type: "capture", name: "missing" }, ]); assert.ok(result.success); - if (name === "allow-multiple!") { + if (optionalNames.includes(name)) { assert.equal(result.predicate({ captures: [] }), true); } else { assert.throws( diff --git a/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts b/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts index 21d396057b5..801b22b4beb 100644 --- a/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts +++ b/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts @@ -317,26 +317,43 @@ class TrimEnd extends QueryPredicateOperator { schema = z.tuple([q.node]).rest(q.node); run(...captures: MutableQueryCapture[]) { - for (const capture of captures) { - const { document, range } = capture; - const text = getNode(capture).text; - const whitespaceLength = text.length - text.trimEnd().length; - - if (whitespaceLength > 0) { - setRange( - capture, - new Range( - range.start, - adjustPosition(document, range.end, -whitespaceLength), - ), - ); - } - } + return trimEnd(captures); + } +} - return true; +/** + * A predicate that behaves the same as {@link TrimEnd} but allows the node to be missing. + */ +class TrimEndOptional extends QueryPredicateOperator { + name = "trim-end-optional!" as const; + schema = z.tuple([q.node]).rest(q.node); + allowMissingNode = true; + + run(...captures: MutableQueryCapture[]) { + return trimEnd(captures); } } +function trimEnd(captures: MutableQueryCapture[]): boolean { + for (const capture of captures) { + const { document, range } = capture; + const text = getNode(capture).text; + const whitespaceLength = text.length - text.trimEnd().length; + + if (whitespaceLength > 0) { + setRange( + capture, + new Range( + range.start, + adjustPosition(document, range.end, -whitespaceLength), + ), + ); + } + } + + return true; +} + /** * A predicate operator that sets the range to the full document. */ @@ -367,10 +384,7 @@ class DocumentRange extends QueryPredicateOperator { class AllowMultiple extends QueryPredicateOperator { name = "allow-multiple!" as const; schema = z.tuple([q.node]).rest(q.node); - - protected allowMissingNode(): boolean { - return true; - } + allowMissingNode = true; run(...captures: MutableQueryCapture[]) { for (const capture of captures) { @@ -477,6 +491,7 @@ export const queryPredicateOperators = [ new Type(), new NotType(), new TrimEnd(), + new TrimEndOptional(), new DocumentRange(), new NotParentType(), new NotChildType(), diff --git a/resources/fixtures/scopes/markdown/collectionItem.unenclosed.iteration2.scope b/resources/fixtures/scopes/markdown/collectionItem.unenclosed.iteration2.scope new file mode 100644 index 00000000000..cadcb8f278c --- /dev/null +++ b/resources/fixtures/scopes/markdown/collectionItem.unenclosed.iteration2.scope @@ -0,0 +1,12 @@ +- First item + Paragraph +- Second item +--- + +[Content] = +[Domain] = 0:0-2:13 + >------------ +0| - First item +1| Paragraph +2| - Second item + -------------< diff --git a/resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine.scope b/resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine.scope index bdceb3f2abc..ae66dd3c888 100644 --- a/resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine.scope +++ b/resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine.scope @@ -56,13 +56,20 @@ >----------------------------------------< 2| - This is the first level of a list again. -[#3 Removal] = -[#3 Domain] = 2:0-2:42 - >------------------------------------------< +[#3 Removal] = 1:39-2:42 + > +1| - This is the second level of a list. 2| - This is the first level of a list again. + ------------------------------------------< -[#3 Leading delimiter] = 2:0-2:0 - >< +[#3 Leading delimiter] = 1:39-2:0 + > +1| - This is the second level of a list. +2| - This is the first level of a list again. + < + +[#3 Domain] = 2:0-2:42 + >------------------------------------------< 2| - This is the first level of a list again. [#3 Insertion delimiter] = "\n" diff --git a/resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine2.scope b/resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine2.scope new file mode 100644 index 00000000000..48f0c8e06ae --- /dev/null +++ b/resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine2.scope @@ -0,0 +1,54 @@ +- First item + Paragraph +- Second item +--- + +[#1 Content] = 0:2-1:11 + >---------- +0| - First item +1| Paragraph + -----------< + +[#1 Removal] = 0:0-2:0 + >------------ +0| - First item +1| Paragraph +2| - Second item + < + +[#1 Trailing delimiter] = 1:11-2:0 + > +1| Paragraph +2| - Second item + < + +[#1 Domain] = 0:0-1:11 + >------------ +0| - First item +1| Paragraph + -----------< + +[#1 Insertion delimiter] = "\n" + + +[#2 Content] = 2:2-2:13 + >-----------< +2| - Second item + +[#2 Removal] = 1:11-2:13 + > +1| Paragraph +2| - Second item + -------------< + +[#2 Leading delimiter] = 1:11-2:0 + > +1| Paragraph +2| - Second item + < + +[#2 Domain] = 2:0-2:13 + >-------------< +2| - Second item + +[#2 Insertion delimiter] = "\n" diff --git a/resources/queries/markdown.scm b/resources/queries/markdown.scm index daa5b46a842..3136ad89071 100644 --- a/resources/queries/markdown.scm +++ b/resources/queries/markdown.scm @@ -20,18 +20,20 @@ (#shrink-to-match! @name "^\\s*(?.*)$") ) @name.domain -;;!! - 0 -;;! ^ -;;! --- +;;!! - Hello world +;;! ^^^^^^^^^^^ + (list (list_item)? @collectionItem.leading.endOf . (list_item (_) @collectionItem.prefix + . (paragraph) @collectionItem.start.startOf ) @collectionItem.end.endOf @collectionItem.domain . (list_item)? @collectionItem.trailing.startOf + (#trim-end-optional! @collectionItem.leading.endOf) (#trim-end! @collectionItem.end.endOf) (#trim-end! @collectionItem.domain) (#insertion-delimiter! @collectionItem.start.startOf "\n") From ee198f82864a1a66cf95a7c22ca08a2c5758ab23 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 2 Oct 2026 18:01:38 +0200 Subject: [PATCH 2/5] Meta Updater --- .../user/languages/fixtures/markdown.json | 44 ++++++++++++++++++- .../src/docs/user/languages/markdown.mdx | 4 ++ .../src/docs/user/scopes/collectionItem.mdx | 4 ++ .../user/scopes/fixtures/collectionItem.json | 44 ++++++++++++++++++- 4 files changed, 94 insertions(+), 2 deletions(-) diff --git a/packages/app-web-docs/src/docs/user/languages/fixtures/markdown.json b/packages/app-web-docs/src/docs/user/languages/fixtures/markdown.json index 9a9b1117783..6758f2e5b5f 100644 --- a/packages/app-web-docs/src/docs/user/languages/fixtures/markdown.json +++ b/packages/app-web-docs/src/docs/user/languages/fixtures/markdown.json @@ -23,6 +23,22 @@ } ] }, + { + "name": "scopes/markdown/collectionItem.unenclosed.iteration2", + "languageId": "markdown", + "facet": "collectionItem.unenclosed.iteration", + "code": "- First item\n Paragraph\n- Second item", + "scopes": [ + { + "targets": [ + { + "content": "0:0-2:13" + } + ], + "domain": "0:0-2:13" + } + ] + }, { "name": "scopes/markdown/collectionItem.unenclosed.multiLine", "languageId": "markdown", @@ -51,13 +67,39 @@ "targets": [ { "content": "2:2-2:42", - "removal": "2:0-2:42" + "removal": "1:39-2:42" } ], "domain": "2:0-2:42" } ] }, + { + "name": "scopes/markdown/collectionItem.unenclosed.multiLine2", + "languageId": "markdown", + "facet": "collectionItem.unenclosed.multiLine", + "code": "- First item\n Paragraph\n- Second item", + "scopes": [ + { + "targets": [ + { + "content": "0:2-1:11", + "removal": "0:0-2:0" + } + ], + "domain": "0:0-1:11" + }, + { + "targets": [ + { + "content": "2:2-2:13", + "removal": "1:11-2:13" + } + ], + "domain": "2:0-2:13" + } + ] + }, { "name": "scopes/markdown/comment.block", "languageId": "markdown", diff --git a/packages/app-web-docs/src/docs/user/languages/markdown.mdx b/packages/app-web-docs/src/docs/user/languages/markdown.mdx index bc9ee9a081a..fe67cc8b093 100644 --- a/packages/app-web-docs/src/docs/user/languages/markdown.mdx +++ b/packages/app-web-docs/src/docs/user/languages/markdown.mdx @@ -19,12 +19,16 @@ Below are visualizations of all our scope tests for this language. These were cr + + #### 2. Collection item: Unenclosed (iteration) Iteration scope for items in a comma-separated list without enclosing delimiters + + ### Comment #### 1. Comment: Block diff --git a/packages/app-web-docs/src/docs/user/scopes/collectionItem.mdx b/packages/app-web-docs/src/docs/user/scopes/collectionItem.mdx index f1e44760ac6..e32575e2919 100644 --- a/packages/app-web-docs/src/docs/user/scopes/collectionItem.mdx +++ b/packages/app-web-docs/src/docs/user/scopes/collectionItem.mdx @@ -117,6 +117,8 @@ Default: `item` + + ##### Scala @@ -255,6 +257,8 @@ Default: `item` + + ##### Python diff --git a/packages/app-web-docs/src/docs/user/scopes/fixtures/collectionItem.json b/packages/app-web-docs/src/docs/user/scopes/fixtures/collectionItem.json index b052bfb74f3..2cc2bb29dcf 100644 --- a/packages/app-web-docs/src/docs/user/scopes/fixtures/collectionItem.json +++ b/packages/app-web-docs/src/docs/user/scopes/fixtures/collectionItem.json @@ -1499,6 +1499,22 @@ } ] }, + { + "name": "scopes/markdown/collectionItem.unenclosed.iteration2", + "languageId": "markdown", + "facet": "collectionItem.unenclosed.iteration", + "code": "- First item\n Paragraph\n- Second item", + "scopes": [ + { + "targets": [ + { + "content": "0:0-2:13" + } + ], + "domain": "0:0-2:13" + } + ] + }, { "name": "scopes/markdown/collectionItem.unenclosed.multiLine", "languageId": "markdown", @@ -1527,13 +1543,39 @@ "targets": [ { "content": "2:2-2:42", - "removal": "2:0-2:42" + "removal": "1:39-2:42" } ], "domain": "2:0-2:42" } ] }, + { + "name": "scopes/markdown/collectionItem.unenclosed.multiLine2", + "languageId": "markdown", + "facet": "collectionItem.unenclosed.multiLine", + "code": "- First item\n Paragraph\n- Second item", + "scopes": [ + { + "targets": [ + { + "content": "0:2-1:11", + "removal": "0:0-2:0" + } + ], + "domain": "0:0-1:11" + }, + { + "targets": [ + { + "content": "2:2-2:13", + "removal": "1:11-2:13" + } + ], + "domain": "2:0-2:13" + } + ] + }, { "name": "scopes/plaintext/collectionItem/collectionItem.textual.iteration", "languageId": "plaintext", From 4e37bc1e84781b9e3905e7ff282c39e65f786822 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 2 Oct 2026 18:24:07 +0200 Subject: [PATCH 3/5] Update tests --- .../queryPredicateOperators.test.ts | 2 +- .../queryPredicateOperators.ts | 40 +++++++++---------- .../languages/markdown/changeLeadingItem.yml | 7 ++-- .../languages/markdown/chuckItem4.yml | 5 +-- 4 files changed, 26 insertions(+), 28 deletions(-) diff --git a/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.test.ts b/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.test.ts index d2bed07bf2f..07104d0a2cd 100644 --- a/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.test.ts +++ b/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.test.ts @@ -387,7 +387,7 @@ suite("queryPredicateOperators", () => { "shrink-to-match!": [captureOperand, "hello"], "grow-to-named-siblings!": [captureOperand], "trim-end!": [captureOperand, conditionOperand], - "trim-end-optional!": [captureOperand, conditionOperand], + "trim-end-optional!": [captureOperand], "document-range!": [captureOperand, conditionOperand], "allow-multiple!": [captureOperand, conditionOperand], "insertion-delimiter!": [captureOperand, ", "], diff --git a/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts b/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts index 801b22b4beb..83a78276e21 100644 --- a/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts +++ b/packages/lib-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts @@ -317,7 +317,10 @@ class TrimEnd extends QueryPredicateOperator { schema = z.tuple([q.node]).rest(q.node); run(...captures: MutableQueryCapture[]) { - return trimEnd(captures); + for (const capture of captures) { + trimEnd(capture); + } + return true; } } @@ -326,32 +329,29 @@ class TrimEnd extends QueryPredicateOperator { */ class TrimEndOptional extends QueryPredicateOperator { name = "trim-end-optional!" as const; - schema = z.tuple([q.node]).rest(q.node); + schema = z.tuple([q.node]); allowMissingNode = true; - run(...captures: MutableQueryCapture[]) { - return trimEnd(captures); + run(capture: MutableQueryCapture) { + trimEnd(capture); + return true; } } -function trimEnd(captures: MutableQueryCapture[]): boolean { - for (const capture of captures) { - const { document, range } = capture; - const text = getNode(capture).text; - const whitespaceLength = text.length - text.trimEnd().length; +function trimEnd(capture: MutableQueryCapture): void { + const { document, range } = capture; + const text = getNode(capture).text; + const whitespaceLength = text.length - text.trimEnd().length; - if (whitespaceLength > 0) { - setRange( - capture, - new Range( - range.start, - adjustPosition(document, range.end, -whitespaceLength), - ), - ); - } + if (whitespaceLength > 0) { + setRange( + capture, + new Range( + range.start, + adjustPosition(document, range.end, -whitespaceLength), + ), + ); } - - return true; } /** diff --git a/resources/fixtures/recorded/languages/markdown/changeLeadingItem.yml b/resources/fixtures/recorded/languages/markdown/changeLeadingItem.yml index 382b2f9c2bb..8ccddbf0efc 100644 --- a/resources/fixtures/recorded/languages/markdown/changeLeadingItem.yml +++ b/resources/fixtures/recorded/languages/markdown/changeLeadingItem.yml @@ -24,9 +24,8 @@ initialState: finalState: documentContents: |- - values - - 0 - - 1 + - 0- 1 - 2 selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} + - anchor: {line: 1, character: 7} + active: {line: 1, character: 7} diff --git a/resources/fixtures/recorded/languages/markdown/chuckItem4.yml b/resources/fixtures/recorded/languages/markdown/chuckItem4.yml index 7d3fb55582b..eace857961b 100644 --- a/resources/fixtures/recorded/languages/markdown/chuckItem4.yml +++ b/resources/fixtures/recorded/languages/markdown/chuckItem4.yml @@ -23,7 +23,6 @@ finalState: documentContents: |- - values - 0 - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} + - anchor: {line: 1, character: 7} + active: {line: 1, character: 7} From a15a2d4cc8b1316ea55cbfca092e063d6c62f68b Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 2 Oct 2026 18:58:49 +0200 Subject: [PATCH 4/5] Fixed prefix for task list --- ...collectionItem.unenclosed.iteration3.scope | 22 +++++++ ...collectionItem.unenclosed.multiLine3.scope | 66 +++++++++++++++++++ resources/queries/markdown.scm | 3 +- 3 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 resources/fixtures/scopes/markdown/collectionItem.unenclosed.iteration3.scope create mode 100644 resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine3.scope diff --git a/resources/fixtures/scopes/markdown/collectionItem.unenclosed.iteration3.scope b/resources/fixtures/scopes/markdown/collectionItem.unenclosed.iteration3.scope new file mode 100644 index 00000000000..29b310d7904 --- /dev/null +++ b/resources/fixtures/scopes/markdown/collectionItem.unenclosed.iteration3.scope @@ -0,0 +1,22 @@ +- [ ] First item +- [ ] Second item +--- + +[#1 Content] = +[#1 Domain] = 0:0-1:17 + >---------------- +0| - [ ] First item +1| - [ ] Second item + -----------------< + + +[#2 Content] = +[#2 Domain] = 0:3-0:4 + >-< +0| - [ ] First item + + +[#3 Content] = +[#3 Domain] = 1:3-1:4 + >-< +1| - [ ] Second item diff --git a/resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine3.scope b/resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine3.scope new file mode 100644 index 00000000000..fb8a66d7726 --- /dev/null +++ b/resources/fixtures/scopes/markdown/collectionItem.unenclosed.multiLine3.scope @@ -0,0 +1,66 @@ +- [ ] First item +- [ ] Second item +--- + +[#1 Content] = 0:2-0:16 + >--------------< +0| - [ ] First item + +[#1 Removal] = 0:0-1:0 + >---------------- +0| - [ ] First item +1| - [ ] Second item + < + +[#1 Trailing delimiter] = 0:16-1:0 + > +0| - [ ] First item +1| - [ ] Second item + < + +[#1 Domain] = 0:0-0:16 + >----------------< +0| - [ ] First item + +[#1 Insertion delimiter] = "\n" + + +[#2 Content] = +[#2 Removal] = +[#2 Domain] = 0:3-0:4 + >-< +0| - [ ] First item + +[#2 Insertion delimiter] = ", " + + +[#3 Content] = 1:2-1:17 + >---------------< +1| - [ ] Second item + +[#3 Removal] = 0:16-1:17 + > +0| - [ ] First item +1| - [ ] Second item + -----------------< + +[#3 Leading delimiter] = 0:16-1:0 + > +0| - [ ] First item +1| - [ ] Second item + < + +[#3 Domain] = 1:0-1:17 + >-----------------< +1| - [ ] Second item + +[#3 Insertion delimiter] = "\n" + + +[#4 Content] = +[#4 Removal] = +[#4 Domain] = 1:3-1:4 + >-< +1| - [ ] Second item + +[#4 Insertion delimiter] = ", " diff --git a/resources/queries/markdown.scm b/resources/queries/markdown.scm index 3136ad89071..cb23ecb077d 100644 --- a/resources/queries/markdown.scm +++ b/resources/queries/markdown.scm @@ -27,9 +27,10 @@ (list_item)? @collectionItem.leading.endOf . (list_item + . (_) @collectionItem.prefix . - (paragraph) @collectionItem.start.startOf + (_) @collectionItem.start.startOf ) @collectionItem.end.endOf @collectionItem.domain . (list_item)? @collectionItem.trailing.startOf From 99eedc81f4e0241d9f82d94239fa6badfa1b0491 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 2 Oct 2026 18:59:28 +0200 Subject: [PATCH 5/5] Meta Updater --- .../user/languages/fixtures/markdown.json | 76 +++++++++++++++++++ .../src/docs/user/languages/markdown.mdx | 4 + .../src/docs/user/scopes/collectionItem.mdx | 4 + .../user/scopes/fixtures/collectionItem.json | 76 +++++++++++++++++++ 4 files changed, 160 insertions(+) diff --git a/packages/app-web-docs/src/docs/user/languages/fixtures/markdown.json b/packages/app-web-docs/src/docs/user/languages/fixtures/markdown.json index 6758f2e5b5f..ee696d36430 100644 --- a/packages/app-web-docs/src/docs/user/languages/fixtures/markdown.json +++ b/packages/app-web-docs/src/docs/user/languages/fixtures/markdown.json @@ -39,6 +39,38 @@ } ] }, + { + "name": "scopes/markdown/collectionItem.unenclosed.iteration3", + "languageId": "markdown", + "facet": "collectionItem.unenclosed.iteration", + "code": "- [ ] First item\n- [ ] Second item", + "scopes": [ + { + "targets": [ + { + "content": "0:0-1:17" + } + ], + "domain": "0:0-1:17" + }, + { + "targets": [ + { + "content": "0:3-0:4" + } + ], + "domain": "0:3-0:4" + }, + { + "targets": [ + { + "content": "1:3-1:4" + } + ], + "domain": "1:3-1:4" + } + ] + }, { "name": "scopes/markdown/collectionItem.unenclosed.multiLine", "languageId": "markdown", @@ -100,6 +132,50 @@ } ] }, + { + "name": "scopes/markdown/collectionItem.unenclosed.multiLine3", + "languageId": "markdown", + "facet": "collectionItem.unenclosed.multiLine", + "code": "- [ ] First item\n- [ ] Second item", + "scopes": [ + { + "targets": [ + { + "content": "0:2-0:16", + "removal": "0:0-1:0" + } + ], + "domain": "0:0-0:16" + }, + { + "targets": [ + { + "content": "0:3-0:4", + "removal": "0:3-0:4" + } + ], + "domain": "0:3-0:4" + }, + { + "targets": [ + { + "content": "1:2-1:17", + "removal": "0:16-1:17" + } + ], + "domain": "1:0-1:17" + }, + { + "targets": [ + { + "content": "1:3-1:4", + "removal": "1:3-1:4" + } + ], + "domain": "1:3-1:4" + } + ] + }, { "name": "scopes/markdown/comment.block", "languageId": "markdown", diff --git a/packages/app-web-docs/src/docs/user/languages/markdown.mdx b/packages/app-web-docs/src/docs/user/languages/markdown.mdx index fe67cc8b093..4f80a2d77f3 100644 --- a/packages/app-web-docs/src/docs/user/languages/markdown.mdx +++ b/packages/app-web-docs/src/docs/user/languages/markdown.mdx @@ -21,6 +21,8 @@ Below are visualizations of all our scope tests for this language. These were cr + + #### 2. Collection item: Unenclosed (iteration) Iteration scope for items in a comma-separated list without enclosing delimiters @@ -29,6 +31,8 @@ Below are visualizations of all our scope tests for this language. These were cr + + ### Comment #### 1. Comment: Block diff --git a/packages/app-web-docs/src/docs/user/scopes/collectionItem.mdx b/packages/app-web-docs/src/docs/user/scopes/collectionItem.mdx index e32575e2919..48de661dddf 100644 --- a/packages/app-web-docs/src/docs/user/scopes/collectionItem.mdx +++ b/packages/app-web-docs/src/docs/user/scopes/collectionItem.mdx @@ -119,6 +119,8 @@ Default: `item` + + ##### Scala @@ -259,6 +261,8 @@ Default: `item` + + ##### Python diff --git a/packages/app-web-docs/src/docs/user/scopes/fixtures/collectionItem.json b/packages/app-web-docs/src/docs/user/scopes/fixtures/collectionItem.json index 2cc2bb29dcf..e08e595c359 100644 --- a/packages/app-web-docs/src/docs/user/scopes/fixtures/collectionItem.json +++ b/packages/app-web-docs/src/docs/user/scopes/fixtures/collectionItem.json @@ -1515,6 +1515,38 @@ } ] }, + { + "name": "scopes/markdown/collectionItem.unenclosed.iteration3", + "languageId": "markdown", + "facet": "collectionItem.unenclosed.iteration", + "code": "- [ ] First item\n- [ ] Second item", + "scopes": [ + { + "targets": [ + { + "content": "0:0-1:17" + } + ], + "domain": "0:0-1:17" + }, + { + "targets": [ + { + "content": "0:3-0:4" + } + ], + "domain": "0:3-0:4" + }, + { + "targets": [ + { + "content": "1:3-1:4" + } + ], + "domain": "1:3-1:4" + } + ] + }, { "name": "scopes/markdown/collectionItem.unenclosed.multiLine", "languageId": "markdown", @@ -1576,6 +1608,50 @@ } ] }, + { + "name": "scopes/markdown/collectionItem.unenclosed.multiLine3", + "languageId": "markdown", + "facet": "collectionItem.unenclosed.multiLine", + "code": "- [ ] First item\n- [ ] Second item", + "scopes": [ + { + "targets": [ + { + "content": "0:2-0:16", + "removal": "0:0-1:0" + } + ], + "domain": "0:0-0:16" + }, + { + "targets": [ + { + "content": "0:3-0:4", + "removal": "0:3-0:4" + } + ], + "domain": "0:3-0:4" + }, + { + "targets": [ + { + "content": "1:2-1:17", + "removal": "0:16-1:17" + } + ], + "domain": "1:0-1:17" + }, + { + "targets": [ + { + "content": "1:3-1:4", + "removal": "1:3-1:4" + } + ], + "domain": "1:3-1:4" + } + ] + }, { "name": "scopes/plaintext/collectionItem/collectionItem.textual.iteration", "languageId": "plaintext",