From 06463e08203044afb4ee83df6df584f74c872e4a Mon Sep 17 00:00:00 2001 From: joerdav Date: Thu, 30 May 2024 11:02:47 +0100 Subject: [PATCH] feat: capture generic function declarations --- syntaxes/templ.tmLanguage.json | 19 +++- tests/snap/complex_syntax.templ | 22 ++-- tests/snap/complex_syntax.templ.snap | 144 ++++++++++++++------------- 3 files changed, 102 insertions(+), 83 deletions(-) diff --git a/syntaxes/templ.tmLanguage.json b/syntaxes/templ.tmLanguage.json index bc2a71a..cb0a2c2 100644 --- a/syntaxes/templ.tmLanguage.json +++ b/syntaxes/templ.tmLanguage.json @@ -170,7 +170,7 @@ ] }, "html-template": { - "begin": "^(templ) ((?:\\([A-z_][A-z_0-9]* \\*?[A-z_][A-z_0-9]*\\) )?[A-z_][A-z_0-9]*\\()", + "begin": "^(templ) ((?:\\([A-z_][A-z_0-9]* \\*?[A-z_][A-z_0-9]*\\) )?[A-z_][A-z_0-9]*(\\(|\\[))", "beginCaptures": { "1": { "name": "keyword.control.go" @@ -200,6 +200,21 @@ } ] }, + { + "name": "type-params.html-template.templ", + "begin": "(?<=\\[)", + "end": "(\\])", + "endCaptures": { + "1": { + "name": "punctuation.definition.end.bracket.square.go" + } + }, + "patterns": [ + { + "include": "source.go" + } + ] + }, { "name": "block.html-template.templ", "begin": "(?<=\\)) ({)$", @@ -1093,4 +1108,4 @@ ] } } -} \ No newline at end of file +} diff --git a/tests/snap/complex_syntax.templ b/tests/snap/complex_syntax.templ index e6eea56..a924e24 100644 --- a/tests/snap/complex_syntax.templ +++ b/tests/snap/complex_syntax.templ @@ -10,20 +10,20 @@ templ (d Data) Method(greeting string) { } templ test(comp templ.Component) { -
- @comp { -
Children
- } -
+
+ @comp { +
Children
+ } +
} -templ Hello() { +templ Hello[~string T]() { @Data{ - message: "You can implement methods on a type.", + message: "You can implement methods on a type.", }.Method("hello") { - @test(Data{ message: "You can implement methods on a type." }.Method("hello")) -
- { children... } -
+ @test(Data{message: "You can implement methods on a type."}.Method("hello")) +
+ { children... } +
} } diff --git a/tests/snap/complex_syntax.templ.snap b/tests/snap/complex_syntax.templ.snap index 7133d22..4d1356e 100644 --- a/tests/snap/complex_syntax.templ.snap +++ b/tests/snap/complex_syntax.templ.snap @@ -66,92 +66,96 @@ # ^ source.templ html-template.templ params.html-template.templ punctuation.definition.end.bracket.round.go # ^ source.templ html-template.templ block.html-template.templ # ^ source.templ html-template.templ block.html-template.templ punctuation.definition.begin.bracket.curly.go ->
-#^^^^ source.templ html-template.templ block.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html punctuation.definition.tag.begin.html -# ^^^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html entity.name.tag.block.any.html -# ^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html punctuation.definition.tag.end.html -> @comp { -#^^^^^^^^^^^^^^ source.templ html-template.templ block.html-template.templ -# ^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ start.string-expression.templ ->
Children
-#^^^^^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go -# ^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +>
+#^ source.templ html-template.templ block.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html punctuation.definition.tag.begin.html +# ^^^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html entity.name.tag.block.any.html +# ^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html punctuation.definition.tag.end.html +> @comp { +#^^^^^^^^ source.templ html-template.templ block.html-template.templ +# ^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ start.string-expression.templ +>
Children
+#^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go +# ^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go +# ^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ # ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go -# ^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.arithmetic.go -# ^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go -> } -#^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ end.string-expression.templ ->
-#^^^^ source.templ html-template.templ block.html-template.templ -# ^^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html punctuation.definition.tag.begin.html -# ^^^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html entity.name.tag.block.any.html -# ^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html punctuation.definition.tag.end.html +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.arithmetic.go +# ^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go +> } +#^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ end.string-expression.templ +>
+#^ source.templ html-template.templ block.html-template.templ +# ^^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html punctuation.definition.tag.begin.html +# ^^^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html entity.name.tag.block.any.html +# ^ source.templ html-template.templ block.html-template.templ meta.tag.block.any.html punctuation.definition.tag.end.html >} #^ source.templ html-template.templ block.html-template.templ punctuation.definition.end.bracket.curly.go > ->templ Hello() { +>templ Hello[~string T]() { #^^^^^ source.templ html-template.templ keyword.control.go # ^ source.templ html-template.templ # ^^^^^ source.templ html-template.templ -# ^ source.templ html-template.templ punctuation.definition.begin.bracket.round.go -# ^ source.templ html-template.templ params.html-template.templ punctuation.definition.end.bracket.round.go -# ^ source.templ html-template.templ block.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ punctuation.definition.begin.bracket.curly.go +# ^ source.templ html-template.templ punctuation.definition.bracket.square.go +# ^ source.templ html-template.templ type-params.html-template.templ +# ^^^^^^ source.templ html-template.templ type-params.html-template.templ storage.type.string.go +# ^^ source.templ html-template.templ type-params.html-template.templ +# ^ source.templ html-template.templ type-params.html-template.templ punctuation.definition.end.bracket.square.go +# ^ source.templ html-template.templ +# ^ source.templ html-template.templ params.html-template.templ punctuation.definition.end.bracket.round.go +# ^ source.templ html-template.templ block.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ punctuation.definition.begin.bracket.curly.go > @Data{ #^ source.templ html-template.templ block.html-template.templ # ^ source.templ html-template.templ block.html-template.templ import-expression.templ keyword.control.go # ^^^^ source.templ html-template.templ block.html-template.templ import-expression.templ # ^ source.templ html-template.templ block.html-template.templ import-expression.templ punctuation.definition.begin.bracket.curly.go -> message: "You can implement methods on a type.", -#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.templ html-template.templ block.html-template.templ +> message: "You can implement methods on a type.", +#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.templ html-template.templ block.html-template.templ > }.Method("hello") { #^^^^^^^^^^^^^^^^^^^ source.templ html-template.templ block.html-template.templ # ^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ start.string-expression.templ -> @test(Data{ message: "You can implement methods on a type." }.Method("hello")) -#^^^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.begin.bracket.round.go -# ^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.begin.bracket.curly.go -# ^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.other.colon.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go punctuation.definition.string.begin.go -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go punctuation.definition.string.end.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.end.bracket.curly.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.other.period.go -# ^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.begin.bracket.round.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go punctuation.definition.string.begin.go -# ^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go punctuation.definition.string.end.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.end.bracket.round.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.end.bracket.round.go ->
-#^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go -# ^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go -> { children... } -#^^^^^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +> @test(Data{message: "You can implement methods on a type."}.Method("hello")) +#^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.begin.bracket.round.go +# ^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ # ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.begin.bracket.curly.go -# ^^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.ellipsis.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.end.bracket.curly.go ->
-#^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.arithmetic.go -# ^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ -# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go +# ^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.other.colon.go +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go punctuation.definition.string.begin.go +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go punctuation.definition.string.end.go +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.end.bracket.curly.go +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.other.period.go +# ^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.begin.bracket.round.go +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go punctuation.definition.string.begin.go +# ^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ string.quoted.double.go punctuation.definition.string.end.go +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.end.bracket.round.go +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.end.bracket.round.go +>
+#^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go +# ^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go +> { children... } +#^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.begin.bracket.curly.go +# ^^^^^^^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.ellipsis.go +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ punctuation.definition.end.bracket.curly.go +>
+#^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.arithmetic.go +# ^^^ source.templ html-template.templ block.html-template.templ expression.html-template.templ +# ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ keyword.operator.comparison.go > } #^ source.templ html-template.templ block.html-template.templ expression.html-template.templ # ^ source.templ html-template.templ block.html-template.templ expression.html-template.templ end.string-expression.templ