aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Kennedy <colinvfx@gmail.com>2023-05-06 16:00:17 -0700
committerChristian Clason <c.clason@uni-graz.at>2023-05-15 09:28:11 +0200
commit4c35c0b75d678d3f901d8dd37428ae834c4bd689 (patch)
tree2234ece53a504cb4026252e59077f1e93c16a695
parentUpdate parsers: dart, query (diff)
downloadnvim-treesitter-4c35c0b75d678d3f901d8dd37428ae834c4bd689.tar
nvim-treesitter-4c35c0b75d678d3f901d8dd37428ae834c4bd689.tar.gz
nvim-treesitter-4c35c0b75d678d3f901d8dd37428ae834c4bd689.tar.bz2
nvim-treesitter-4c35c0b75d678d3f901d8dd37428ae834c4bd689.tar.lz
nvim-treesitter-4c35c0b75d678d3f901d8dd37428ae834c4bd689.tar.xz
nvim-treesitter-4c35c0b75d678d3f901d8dd37428ae834c4bd689.tar.zst
nvim-treesitter-4c35c0b75d678d3f901d8dd37428ae834c4bd689.zip
Added USD as a language + some queries
Added USD highlight unittests Added USD indentation Added USD indents.scm file Added USD indent rules Simplified USD highlight groups Added explicit highlight groups Added newline Removed after/ftdetect/usda.lua usd/indents.scm - Added inline comments explaining the nodes Fixed USD highlight group unittests Added indentation unittests Simplified USD `@identifier` highlighting Added USD documentation highlight group tests Simplified USD highlight groups Moved USD `@identifier` and `@namespace` highlights into one place Removed and simplified tests/query/highlights/usd Simplified tests/query/highlights/usd more Removed trailing newline Combined USD test files Added `set filetype=usd` to minimal_init.lua
-rw-r--r--README.md1
-rw-r--r--lua/nvim-treesitter/parsers.lua8
-rw-r--r--queries/usd/folds.scm3
-rw-r--r--queries/usd/highlights.scm181
-rw-r--r--queries/usd/indents.scm26
-rw-r--r--queries/usd/locals.scm4
-rw-r--r--scripts/minimal_init.lua1
-rw-r--r--tests/indent/usd/prim.usd6
-rw-r--r--tests/indent/usd_spec.lua21
-rw-r--r--tests/query/highlights/usd/prims.usda118
-rw-r--r--tests/query/highlights/usd/properties.usda21
-rw-r--r--tests/query/highlights/usd/subLayers.usda9
12 files changed, 399 insertions, 0 deletions
diff --git a/README.md b/README.md
index 9938df2c4..3b9f577cc 100644
--- a/README.md
+++ b/README.md
@@ -345,6 +345,7 @@ We are looking for maintainers to add more parsers and to write query files for
- [x] [twig](https://github.com/gbprod/tree-sitter-twig) (maintained by @gbprod)
- [x] [typescript](https://github.com/tree-sitter/tree-sitter-typescript) (maintained by @steelsojka)
- [x] [ungrammar](https://github.com/Philipp-M/tree-sitter-ungrammar) (maintained by @Philipp-M, @amaanq)
+- [x] [usd](https://github.com/ColinKennedy/tree-sitter-usd) (maintained by @ColinKennedy)
- [x] [uxn tal](https://github.com/amaanq/tree-sitter-uxntal) (maintained by @amaanq)
- [x] [v](https://github.com/vlang/vls) (maintained by @kkharji)
- [x] [vala](https://github.com/vala-lang/tree-sitter-vala) (maintained by @Prince781)
diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua
index c4ed3d720..8cd86213a 100644
--- a/lua/nvim-treesitter/parsers.lua
+++ b/lua/nvim-treesitter/parsers.lua
@@ -1522,6 +1522,14 @@ list.ungrammar = {
maintainers = { "@Philipp-M", "@amaanq" },
}
+list.usd = {
+ install_info = {
+ url = "https://github.com/ColinKennedy/tree-sitter-usd",
+ files = { "src/parser.c" },
+ },
+ maintainers = { "@ColinKennedy" },
+}
+
list.uxntal = {
install_info = {
url = "https://github.com/amaanq/tree-sitter-uxntal",
diff --git a/queries/usd/folds.scm b/queries/usd/folds.scm
new file mode 100644
index 000000000..c4815bd07
--- /dev/null
+++ b/queries/usd/folds.scm
@@ -0,0 +1,3 @@
+[
+ (block)
+] @fold
diff --git a/queries/usd/highlights.scm b/queries/usd/highlights.scm
new file mode 100644
index 000000000..73968a647
--- /dev/null
+++ b/queries/usd/highlights.scm
@@ -0,0 +1,181 @@
+(None) @constant.builtin
+(asset_path) @text.uri
+(attribute_property) @property
+(bool) @boolean
+(comment) @comment @spell
+(custom) @function.builtin
+(float) @float
+(integer) @number
+(orderer) @function.call
+(prim_path) @string.special
+(relationship_type) @type
+(string) @string
+(uniform) @function.builtin
+(variant_set_definition) @keyword
+
+;; Prefer namespace highlighting, if any.
+;;
+;; e.g. `rel fizz` - `fizz` uses `@identifier`
+;; e.g. `rel foo:bar:fizz` - `foo` and `bar` use `@namespace` and `fizz` uses `@identifier`
+;;
+(identifier) @variable
+(namespace_identifier) @namespace
+(namespace_identifier
+ (identifier) @namespace
+)
+
+[
+ "class"
+ "def"
+ "over"
+] @keyword.function
+
+["(" ")" "[" "]" "{" "}"] @punctuation.bracket
+[":" ";" "."] @punctuation.delimiter
+
+[
+ "="
+] @operator
+
+(attribute_type) @type
+(
+ ;; Reference: https://openusd.org/release/api/sdf_page_front.html
+ (attribute_type) @type.builtin
+ (#any-of? @type.builtin
+ ;; Scalar types
+ "asset" "asset[]"
+ "bool" "bool[]"
+ "double" "double[]"
+ "float" "float[]"
+ "half" "half[]"
+ "int" "int[]"
+ "int64" "int64[]"
+ "string" "string[]"
+ "timecode" "timecode[]"
+ "token" "token[]"
+ "uchar" "uchar[]"
+ "uint" "uint[]"
+ "uint64" "uint64[]"
+
+ ;; Dimensioned Types
+ "double2" "double2[]"
+ "double3" "double3[]"
+ "double4" "double4[]"
+ "float2" "float2[]"
+ "float3" "float3[]"
+ "float4" "float4[]"
+ "half2" "half2[]"
+ "half3" "half3[]"
+ "half4" "half4[]"
+ "int2" "int2[]"
+ "int3" "int3[]"
+ "int4" "int4[]"
+ "matrix2d" "matrix2d[]"
+ "matrix3d" "matrix3d[]"
+ "matrix4d" "matrix4d[]"
+ "quatd" "quatd[]"
+ "quatf" "quatf[]"
+ "quath" "quath[]"
+
+ ;; Extra Types
+ "color3f" "color3f[]"
+ "normal3f" "normal3f[]"
+ "point3f" "point3f[]"
+ "texCoord2f" "texCoord2f[]"
+ "vector3d" "vector3d[]"
+ "vector3f" "vector3f[]"
+ "vector3h" "vector3h[]"
+
+ "dictionary"
+
+ ;; Deprecated Types
+ "EdgeIndex" "EdgeIndex[]"
+ "FaceIndex" "FaceIndex[]"
+ "Matrix4d" "Matrix4d[]"
+ "PointIndex" "PointIndex[]"
+ "PointFloat" "PointFloat[]"
+ "Transform" "Transform[]"
+ "Vec3f" "Vec3f[]"
+ )
+)
+
+(
+ (identifier) @keyword
+ (#any-of? @keyword
+
+ ;; Reference: https://openusd.org/release/api/sdf_page_front.html
+ ;; LIVRPS names
+ "inherits"
+ "payload"
+ "references"
+ "specializes"
+ "variantSets"
+ "variants"
+
+ ; assetInfo names
+ "assetInfo"
+ "identifier"
+ "name"
+ "payloadAssetDependencies"
+ "version"
+
+ ;; clips names
+ "clips"
+
+ "active"
+ "assetPaths"
+ "manifestAssetPath"
+ "primPath"
+ "templateAssetPath"
+ "templateEndTime"
+ "templateStartTime"
+ "templateStride"
+ "times"
+
+ ;; customData names
+ "customData"
+
+ "apiSchemaAutoApplyTo"
+ "apiSchemaOverridePropertyNames"
+ "className"
+ "extraPlugInfo"
+ "isUsdShadeContainer"
+ "libraryName"
+ "providesUsdShadeConnectableAPIBehavior"
+ "requiresUsdShadeEncapsulation"
+ "skipCodeGeneration"
+
+ ;; Layer metadata names
+ "colorConfiguration"
+ "colorManagementSystem"
+ "customLayerData"
+ "defaultPrim"
+ "doc"
+ "endTimeCode"
+ "framesPerSecond"
+ "owner"
+ "startTimeCode"
+ "subLayers"
+
+ ;; Prim metadata
+ "instanceable"
+ )
+)
+
+;; Common attribute metadata
+(
+ (layer_offset
+ (identifier) @keyword
+ (#any-of? @keyword
+
+ "offset"
+ "scale"
+ )
+ )
+)
+
+;; Docstrings in USD
+(metadata
+ (comment)*
+ (string) @comment.documentation
+)
diff --git a/queries/usd/indents.scm b/queries/usd/indents.scm
new file mode 100644
index 000000000..4af153034
--- /dev/null
+++ b/queries/usd/indents.scm
@@ -0,0 +1,26 @@
+[
+ (block) ; The {}s in `def "foo" { ... Attributes / Prims here ... }`
+ (dictionary) ; The {}s in `dictionary foo = { string "foo" = "bar" }`
+ (list)
+ (list_proxy) ; [@foo.usda@, @bar.usda@]
+ (metadata) ; ( anything = "goes-here" )
+ (prim_paths) ; [</foo>, <../bar>]
+ (timeSamples) ; The {}s in `int value.timeSamples = { 0: 1, -10: 10, ... }`
+ (tuple)
+ (variant_set_definition) ; The {}s in `variantSet "foo" = { "vr1" { ... } "vr2" { ... } }`
+] @indent.begin
+
+(block "}" @indent.end)
+(dictionary "}" @indent.end)
+(list "]" @indent.end)
+(list_proxy "]" @indent.end)
+(metadata ")" @indent.end)
+(timeSamples "}" @indent.end)
+(tuple ")" @indent.end)
+(variant_set_definition "}" @indent.end)
+
+[
+ ")"
+ "]"
+ "}"
+] @indent.branch
diff --git a/queries/usd/locals.scm b/queries/usd/locals.scm
new file mode 100644
index 000000000..4e7e97b5f
--- /dev/null
+++ b/queries/usd/locals.scm
@@ -0,0 +1,4 @@
+[
+ (block)
+ (metadata)
+] @scope
diff --git a/scripts/minimal_init.lua b/scripts/minimal_init.lua
index e47b6701a..356745b61 100644
--- a/scripts/minimal_init.lua
+++ b/scripts/minimal_init.lua
@@ -5,6 +5,7 @@ vim.cmd [[runtime! plugin/nvim-treesitter.lua]]
vim.cmd [[au BufRead,BufNewFile *.conf set filetype=hocon]]
vim.cmd [[au BufRead,BufNewFile *.gleam set filetype=gleam]]
vim.cmd [[au BufRead,BufNewFile *.ncl set filetype=nickel]]
+vim.cmd [[au BufRead,BufNewFile *.usd,*.usda set filetype=usd]]
vim.o.swapfile = false
vim.bo.swapfile = false
diff --git a/tests/indent/usd/prim.usd b/tests/indent/usd/prim.usd
new file mode 100644
index 000000000..4bfbff955
--- /dev/null
+++ b/tests/indent/usd/prim.usd
@@ -0,0 +1,6 @@
+#usda 1.0
+
+def "foo" (
+)
+{
+}
diff --git a/tests/indent/usd_spec.lua b/tests/indent/usd_spec.lua
new file mode 100644
index 000000000..c4e8198aa
--- /dev/null
+++ b/tests/indent/usd_spec.lua
@@ -0,0 +1,21 @@
+local Runner = require("tests.indent.common").Runner
+
+local run = Runner:new(it, "tests/indent/usd", {
+ tabstop = 4,
+ shiftwidth = 4,
+ softtabstop = 4,
+ expandtab = true,
+})
+
+describe("indent USD:", function()
+ describe("whole file:", function()
+ run:whole_file(".", {
+ expected_failures = {},
+ })
+ end)
+
+ describe("new line:", function()
+ run:new_line("prim.usd", { on_line = 3, text = "active = false", indent = 4 })
+ run:new_line("prim.usd", { on_line = 5, text = "custom int foo = 10", indent = 4 })
+ end)
+end)
diff --git a/tests/query/highlights/usd/prims.usda b/tests/query/highlights/usd/prims.usda
new file mode 100644
index 000000000..eeac67d74
--- /dev/null
+++ b/tests/query/highlights/usd/prims.usda
@@ -0,0 +1,118 @@
+def Xform "cube" (
+ assetInfo = {
+ # <- keyword
+ asset[] payloadAssetDependencies = [@fizz.usd@, @buzz.usd@]
+ # <- type
+ # ^ keyword
+ # ^ text.uri
+ # ^ text.uri
+ }
+)
+{
+}
+
+def "root" (
+ add references = @foo.usda@</Model> (offset = 1; scale = 2.0)
+ # <- text.uri
+ # ^ string.special
+ # ^ keyword
+ # ^ number
+ # ^ punctuation.delimiter
+ # ^ keyword
+ # ^ float
+)
+{
+}
+
+def "World"
+{
+ over "points" (
+ clips = {
+ # <- keyword
+ dictionary default = {
+ # <- type
+ # ^ variable
+ double2[] times = [(101, 101), (102, 102)]
+ # <- type
+ # ^ keyword
+ # ^ number
+ }
+ }
+ )
+ {
+ }
+}
+
+def Xform "torch_2" (
+ payload = @./torch.usda@
+ kind = "model"
+)
+{
+ // Pre-published light list
+ # <- comment
+ rel lightList = [ <light> ] # inline comment
+ # ^ comment
+ token lightList:cacheBehavior = "consumeAndContinue"
+
+ double3 xformOp:translate = (1, 0, 0.5)
+ uniform token[] xformOpOrder = ["xformOp:translate"]
+}
+
+def "foo" (
+ "some comment"
+ # <- comment.documentation
+)
+{
+}
+
+def "foo" (
+ # inline comment
+ "actual in-description comment"
+ # <- comment.documentation
+)
+{
+}
+
+def "foo" (
+ add references = @foo.usda@
+ # <- function.call
+ append references = @foo.usda@
+ # <- function.call
+ delete references = @foo.usda@
+ # <- function.call
+ reorder references = [@foo.usda@]
+ # <- function.call
+
+ references = [@foo.usda@] # explicit
+)
+{
+}
+
+over "Parent" (
+ prepend references = [</InternalRef>, @./ref.usda@</RefParent>]
+ # <- function.call
+ # ^ keyword
+ # ^ string.special
+ # ^ text.uri
+ # ^ string.special
+)
+{
+}
+
+def "foo"
+{
+ float value.timeSamples = {
+ # <- type
+ # ^ variable
+ # ^ property
+ -414: 14.4
+ # <- number
+ # ^ float
+ 10: 201.0,
+ # <- number
+ # ^ float
+ 10.123: 201.0123,
+ # <- float
+ # ^ float
+ }
+}
diff --git a/tests/query/highlights/usd/properties.usda b/tests/query/highlights/usd/properties.usda
new file mode 100644
index 000000000..67df8a623
--- /dev/null
+++ b/tests/query/highlights/usd/properties.usda
@@ -0,0 +1,21 @@
+dictionary foo = {}
+# <- type
+half[] foo = [2, 1, 2]
+# <- type
+string foo = "something"
+# <- type
+timecode time = 1.0
+# <- type
+token[] purpose = ["default", "render"]
+# <- type
+
+rel material:binding:collection:Erasers = None
+# <- type
+# ^ namespace
+# ^ punctuation.delimiter
+# ^ namespace
+# ^ punctuation.delimiter
+# ^ namespace
+# ^ punctuation.delimiter
+# ^ variable
+# ^ constant.builtin
diff --git a/tests/query/highlights/usd/subLayers.usda b/tests/query/highlights/usd/subLayers.usda
new file mode 100644
index 000000000..b4dfa6298
--- /dev/null
+++ b/tests/query/highlights/usd/subLayers.usda
@@ -0,0 +1,9 @@
+#usda 1.0
+(
+ subLayers = [
+ # <- keyword
+ @./model_sub.usda@ (offset = 1)
+ # <- text.uri
+ # ^ keyword
+ ]
+)