diff --git a/data/fixtures/scopes/json/key.mapPair.iteration.scope b/data/fixtures/scopes/json/key.mapPair.iteration.scope new file mode 100644 index 0000000000..348e646e91 --- /dev/null +++ b/data/fixtures/scopes/json/key.mapPair.iteration.scope @@ -0,0 +1,7 @@ +{"aaa": 123, "bbb": 456} +--- + +[Range] = +[Domain] = 0:1-0:23 + >----------------------< +0| {"aaa": 123, "bbb": 456} diff --git a/data/fixtures/scopes/json/key.mapPair.scope b/data/fixtures/scopes/json/key.mapPair.scope new file mode 100644 index 0000000000..d77e7977cf --- /dev/null +++ b/data/fixtures/scopes/json/key.mapPair.scope @@ -0,0 +1,39 @@ +{"aaa": 123, "bbb": 456} +--- + +[#1 Content] = 0:1-0:6 + >-----< +0| {"aaa": 123, "bbb": 456} + +[#1 Removal] = 0:1-0:8 + >-------< +0| {"aaa": 123, "bbb": 456} + +[#1 Trailing delimiter] = 0:6-0:8 + >--< +0| {"aaa": 123, "bbb": 456} + +[#1 Domain] = 0:1-0:11 + >----------< +0| {"aaa": 123, "bbb": 456} + +[#1 Insertion delimiter] = " " + + +[#2 Content] = 0:13-0:18 + >-----< +0| {"aaa": 123, "bbb": 456} + +[#2 Removal] = 0:13-0:20 + >-------< +0| {"aaa": 123, "bbb": 456} + +[#2 Trailing delimiter] = 0:18-0:20 + >--< +0| {"aaa": 123, "bbb": 456} + +[#2 Domain] = 0:13-0:23 + >----------< +0| {"aaa": 123, "bbb": 456} + +[#2 Insertion delimiter] = " " diff --git a/data/fixtures/scopes/json/list.scope b/data/fixtures/scopes/json/list.scope new file mode 100644 index 0000000000..54a5d795c2 --- /dev/null +++ b/data/fixtures/scopes/json/list.scope @@ -0,0 +1,10 @@ +[1, 2, 3] +--- + +[Content] = +[Removal] = +[Domain] = 0:0-0:9 + >---------< +0| [1, 2, 3] + +[Insertion delimiter] = " " diff --git a/data/fixtures/scopes/json/map.scope b/data/fixtures/scopes/json/map.scope index 5adc61b4a8..213d54caa1 100644 --- a/data/fixtures/scopes/json/map.scope +++ b/data/fixtures/scopes/json/map.scope @@ -1,10 +1,10 @@ -{"aaa": 0} +{"aaa": 123, "bbb": 456} --- [Content] = [Removal] = -[Domain] = 0:0-0:10 - >----------< -0| {"aaa": 0} +[Domain] = 0:0-0:24 + >------------------------< +0| {"aaa": 123, "bbb": 456} [Insertion delimiter] = " " diff --git a/data/fixtures/scopes/json/string.singleLine.scope b/data/fixtures/scopes/json/string.singleLine.scope new file mode 100644 index 0000000000..9a81284fe2 --- /dev/null +++ b/data/fixtures/scopes/json/string.singleLine.scope @@ -0,0 +1,10 @@ +"value" +--- + +[Content] = +[Removal] = +[Domain] = 0:0-0:7 + >-------< +0| "value" + +[Insertion delimiter] = " " diff --git a/data/fixtures/scopes/json/string.singleLine2.scope b/data/fixtures/scopes/json/string.singleLine2.scope new file mode 100644 index 0000000000..ac6fe7e5ee --- /dev/null +++ b/data/fixtures/scopes/json/string.singleLine2.scope @@ -0,0 +1,26 @@ +{"key": "value"} +--- + +[#1 Content] = +[#1 Removal] = +[#1 Domain] = 0:1-0:6 + >-----< +0| {"key": "value"} + +[#1 Insertion delimiter] = " " + + +[#2 Content] = +[#2 Domain] = 0:8-0:15 + >-------< +0| {"key": "value"} + +[#2 Removal] = 0:7-0:15 + >--------< +0| {"key": "value"} + +[#2 Leading delimiter] = 0:7-0:8 + >-< +0| {"key": "value"} + +[#2 Insertion delimiter] = " " diff --git a/data/fixtures/scopes/json/textFragment.comment.block.scope b/data/fixtures/scopes/json/textFragment.comment.block.scope new file mode 100644 index 0000000000..e037658206 --- /dev/null +++ b/data/fixtures/scopes/json/textFragment.comment.block.scope @@ -0,0 +1,15 @@ +/* + Hello world +*/ +--- + +[Content] = +[Removal] = +[Domain] = 0:0-2:2 + >-- +0| /* +1| Hello world +2| */ + --< + +[Insertion delimiter] = " " diff --git a/data/fixtures/scopes/json/textFragment.comment.line.scope b/data/fixtures/scopes/json/textFragment.comment.line.scope new file mode 100644 index 0000000000..6758f81490 --- /dev/null +++ b/data/fixtures/scopes/json/textFragment.comment.line.scope @@ -0,0 +1,10 @@ +// Hello world +--- + +[Content] = +[Removal] = +[Domain] = 0:0-0:14 + >--------------< +0| // Hello world + +[Insertion delimiter] = " " diff --git a/data/fixtures/scopes/json/textFragment.string.singleLine.scope b/data/fixtures/scopes/json/textFragment.string.singleLine.scope new file mode 100644 index 0000000000..472aea176e --- /dev/null +++ b/data/fixtures/scopes/json/textFragment.string.singleLine.scope @@ -0,0 +1,10 @@ +"value" +--- + +[Content] = +[Removal] = +[Domain] = 0:1-0:6 + >-----< +0| "value" + +[Insertion delimiter] = " " diff --git a/data/fixtures/scopes/json/textFragment.string.singleLine2.scope b/data/fixtures/scopes/json/textFragment.string.singleLine2.scope new file mode 100644 index 0000000000..9c86ca8d55 --- /dev/null +++ b/data/fixtures/scopes/json/textFragment.string.singleLine2.scope @@ -0,0 +1,19 @@ +{"key": "value"} +--- + +[#1 Content] = +[#1 Removal] = +[#1 Domain] = 0:2-0:5 + >---< +0| {"key": "value"} + +[#1 Insertion delimiter] = " " + + +[#2 Content] = +[#2 Removal] = +[#2 Domain] = 0:9-0:14 + >-----< +0| {"key": "value"} + +[#2 Insertion delimiter] = " " diff --git a/data/fixtures/scopes/json/value.mapPair.iteration.scope b/data/fixtures/scopes/json/value.mapPair.iteration.scope new file mode 100644 index 0000000000..348e646e91 --- /dev/null +++ b/data/fixtures/scopes/json/value.mapPair.iteration.scope @@ -0,0 +1,7 @@ +{"aaa": 123, "bbb": 456} +--- + +[Range] = +[Domain] = 0:1-0:23 + >----------------------< +0| {"aaa": 123, "bbb": 456} diff --git a/data/fixtures/scopes/json/value.mapPair.scope b/data/fixtures/scopes/json/value.mapPair.scope new file mode 100644 index 0000000000..d4cf96e4d9 --- /dev/null +++ b/data/fixtures/scopes/json/value.mapPair.scope @@ -0,0 +1,39 @@ +{"aaa": 123, "bbb": 456} +--- + +[#1 Content] = 0:8-0:11 + >---< +0| {"aaa": 123, "bbb": 456} + +[#1 Removal] = 0:6-0:11 + >-----< +0| {"aaa": 123, "bbb": 456} + +[#1 Leading delimiter] = 0:6-0:8 + >--< +0| {"aaa": 123, "bbb": 456} + +[#1 Domain] = 0:1-0:11 + >----------< +0| {"aaa": 123, "bbb": 456} + +[#1 Insertion delimiter] = " " + + +[#2 Content] = 0:20-0:23 + >---< +0| {"aaa": 123, "bbb": 456} + +[#2 Removal] = 0:18-0:23 + >-----< +0| {"aaa": 123, "bbb": 456} + +[#2 Leading delimiter] = 0:18-0:20 + >--< +0| {"aaa": 123, "bbb": 456} + +[#2 Domain] = 0:13-0:23 + >----------< +0| {"aaa": 123, "bbb": 456} + +[#2 Insertion delimiter] = " " diff --git a/packages/common/src/scopeSupportFacets/json.ts b/packages/common/src/scopeSupportFacets/json.ts index 1e7efd0e50..8089ee0f2d 100644 --- a/packages/common/src/scopeSupportFacets/json.ts +++ b/packages/common/src/scopeSupportFacets/json.ts @@ -1,10 +1,175 @@ import type { LanguageScopeSupportFacetMap } from "./scopeSupportFacets.types"; import { ScopeSupportFacetLevel } from "./scopeSupportFacets.types"; -const { supported } = ScopeSupportFacetLevel; +const { supported, notApplicable } = ScopeSupportFacetLevel; export const jsonScopeSupport: LanguageScopeSupportFacetMap = { - "comment.line": supported, - "comment.block": supported, + list: supported, map: supported, + "string.singleLine": supported, + + "key.mapPair.iteration": supported, + "key.mapPair": supported, + + "value.mapPair.iteration": supported, + "value.mapPair": supported, + + "comment.block": supported, + "comment.line": supported, + + "textFragment.comment.block": supported, + "textFragment.comment.line": supported, + "textFragment.string.singleLine": supported, + + // Not applicable + + anonymousFunction: notApplicable, + "argument.actual": notApplicable, + "argument.actual.constructor": notApplicable, + "argument.actual.constructor.iteration": notApplicable, + "argument.actual.iteration": notApplicable, + "argument.actual.method": notApplicable, + "argument.actual.method.iteration": notApplicable, + "argument.formal": notApplicable, + "argument.formal.constructor": notApplicable, + "argument.formal.constructor.iteration": notApplicable, + "argument.formal.iteration": notApplicable, + "argument.formal.method": notApplicable, + "argument.formal.method.iteration": notApplicable, + attribute: notApplicable, + "branch.if": notApplicable, + "branch.if.iteration": notApplicable, + "branch.loop": notApplicable, + "branch.switchCase": notApplicable, + "branch.switchCase.iteration": notApplicable, + "branch.ternary": notApplicable, + "branch.try": notApplicable, + "branch.try.iteration": notApplicable, + class: notApplicable, + "class.iteration.block": notApplicable, + "class.iteration.document": notApplicable, + className: notApplicable, + "className.iteration.block": notApplicable, + "className.iteration.document": notApplicable, + "collectionItem.unenclosed": notApplicable, + "collectionItem.unenclosed.iteration": notApplicable, + command: notApplicable, + "condition.doWhile": notApplicable, + "condition.for": notApplicable, + "condition.if": notApplicable, + "condition.switchCase": notApplicable, + "condition.switchCase.iteration": notApplicable, + "condition.ternary": notApplicable, + "condition.while": notApplicable, + disqualifyDelimiter: notApplicable, + element: notApplicable, + endTag: notApplicable, + environment: notApplicable, + fieldAccess: notApplicable, + functionCall: notApplicable, + "functionCall.constructor": notApplicable, + functionCallee: notApplicable, + "functionCallee.constructor": notApplicable, + functionName: notApplicable, + "functionName.constructor": notApplicable, + "functionName.iteration.block": notApplicable, + "functionName.iteration.document": notApplicable, + "functionName.method": notApplicable, + "functionName.method.iteration.class": notApplicable, + ifStatement: notApplicable, + "interior.cell": notApplicable, + "interior.class": notApplicable, + "interior.command": notApplicable, + "interior.element": notApplicable, + "interior.function": notApplicable, + "interior.if": notApplicable, + "interior.lambda": notApplicable, + "interior.loop": notApplicable, + "interior.resource": notApplicable, + "interior.switchCase": notApplicable, + "interior.ternary": notApplicable, + "interior.try": notApplicable, + "key.attribute": notApplicable, + "name.argument.actual": notApplicable, + "name.argument.actual.iteration": notApplicable, + "name.argument.formal": notApplicable, + "name.argument.formal.constructor": notApplicable, + "name.argument.formal.constructor.iteration": notApplicable, + "name.argument.formal.iteration": notApplicable, + "name.argument.formal.method": notApplicable, + "name.argument.formal.method.iteration": notApplicable, + "name.assignment": notApplicable, + "name.assignment.pattern": notApplicable, + "name.class": notApplicable, + "name.constructor": notApplicable, + "name.field": notApplicable, + "name.foreach": notApplicable, + "name.function": notApplicable, + "name.iteration.block": notApplicable, + "name.iteration.document": notApplicable, + "name.method": notApplicable, + "name.resource": notApplicable, + "name.resource.iteration": notApplicable, + "name.variable": notApplicable, + "name.variable.pattern": notApplicable, + namedFunction: notApplicable, + "namedFunction.constructor": notApplicable, + "namedFunction.iteration.block": notApplicable, + "namedFunction.iteration.document": notApplicable, + "namedFunction.method": notApplicable, + "namedFunction.method.iteration.class": notApplicable, + notebookCell: notApplicable, + pairDelimiter: notApplicable, + regularExpression: notApplicable, + section: notApplicable, + "section.iteration.document": notApplicable, + "section.iteration.parent": notApplicable, + startTag: notApplicable, + statement: notApplicable, + "statement.class": notApplicable, + "statement.iteration.block": notApplicable, + "statement.iteration.document": notApplicable, + "string.multiLine": notApplicable, + switchStatementSubject: notApplicable, + tags: notApplicable, + "textFragment.element": notApplicable, + "textFragment.string.multiLine": notApplicable, + "type.alias": notApplicable, + "type.argument.formal": notApplicable, + "type.argument.formal.constructor": notApplicable, + "type.argument.formal.constructor.iteration": notApplicable, + "type.argument.formal.iteration": notApplicable, + "type.argument.formal.method": notApplicable, + "type.argument.formal.method.iteration": notApplicable, + "type.cast": notApplicable, + "type.class": notApplicable, + "type.enum": notApplicable, + "type.field": notApplicable, + "type.field.iteration": notApplicable, + "type.foreach": notApplicable, + "type.interface": notApplicable, + "type.return": notApplicable, + "type.typeArgument": notApplicable, + "type.typeArgument.iteration": notApplicable, + "type.variable": notApplicable, + "value.argument.actual": notApplicable, + "value.argument.actual.iteration": notApplicable, + "value.argument.formal": notApplicable, + "value.argument.formal.constructor": notApplicable, + "value.argument.formal.constructor.iteration": notApplicable, + "value.argument.formal.iteration": notApplicable, + "value.argument.formal.method": notApplicable, + "value.argument.formal.method.iteration": notApplicable, + "value.assignment": notApplicable, + "value.attribute": notApplicable, + "value.field": notApplicable, + "value.foreach": notApplicable, + "value.resource": notApplicable, + "value.resource.iteration": notApplicable, + "value.return": notApplicable, + "value.return.lambda": notApplicable, + "value.typeAlias": notApplicable, + "value.variable": notApplicable, + "value.variable.pattern": notApplicable, + "value.yield": notApplicable, }; diff --git a/queries/json.scm b/queries/json.scm index cdcd8e2d19..a63ed7a8dd 100644 --- a/queries/json.scm +++ b/queries/json.scm @@ -1,9 +1,5 @@ ;; https://github.com/tree-sitter/tree-sitter-json/blob/master/src/grammar.json -;;!! "string" -;;! ^^^^^^ -(string_content) @textFragment - ;;!! {"value": 0} ;;! ^^^^^^^^^^^^ (object) @map @@ -16,6 +12,10 @@ ;;! ^^^^^^^^ (string) @string +;;!! "string" +;;! ^^^^^^ +(string_content) @textFragment + ;;!! // aaa ;;! ^^^^^^ ;;!! /* aaa */