From 0ac36e77408930154f1f4057aedf3da45b69f2b2 Mon Sep 17 00:00:00 2001 From: Myriad-Dreamin Date: Tue, 22 Oct 2024 20:23:16 +0800 Subject: [PATCH] dev: parse blocks in if/for/while more consistently --- syntaxes/textmate/main.mts | 64 +---- .../basic/control-flow-for-content.typ.snap | 4 +- .../unit/basic/control-flow-for.typ.snap | 4 +- .../tests/unit/basic/space-control-flow.typ | 16 ++ .../unit/basic/space-control-flow.typ.snap | 251 ++++++++++++++++++ 5 files changed, 282 insertions(+), 57 deletions(-) create mode 100644 syntaxes/textmate/tests/unit/basic/space-control-flow.typ create mode 100644 syntaxes/textmate/tests/unit/basic/space-control-flow.typ.snap diff --git a/syntaxes/textmate/main.mts b/syntaxes/textmate/main.mts index ae13e78a1..6c398e2c7 100644 --- a/syntaxes/textmate/main.mts +++ b/syntaxes/textmate/main.mts @@ -925,7 +925,7 @@ const ifStatement = (): textmate.Grammar => { const ifStatement: textmate.Pattern = { name: "meta.expr.if.typst", begin: lookAhead(/(else\s+)?(if\b(?!-))/), - end: /(?<=\}|\])(?!\s*(else)\b(?!-))|(?<=else)(?!\s*(?:if\b(?!-)|[\[\{]))|(?=[;\}\]\)\n]|$)/, + end: /(?<=\}|\])(?!\s*(else)\b(?!-)|[\[\{])|(?<=else)(?!\s*(?:if\b(?!-)|[\[\{]))|(?=[;\}\]\)\n]|$)/, patterns: [ { include: "#comments" }, { include: "#ifClause" }, @@ -966,24 +966,12 @@ const forStatement = (): textmate.Grammar => { const forStatement: textmate.Pattern = { name: "meta.expr.for.typst", begin: lookAhead(/(for\b(?!-))\s*/), - end: /(?<=[\}\]])(?=\s*[\n\S;\}\]\)])(?!\s*[\{\[])|(?=[;\}\]\)\n]|$)/, + end: /(?<=[\}\]])(?![\{\[])|(?=[;\}\]\)\n]|$)/, patterns: [ - /// Matches any comments - { - include: "#comments", - }, - /// Matches for clause - { - include: "#forClause", - }, - /// Matches a code block after the for clause - { - include: "#codeBlock", - }, - /// Matches a content block after the for clause - { - include: "#contentBlock", - }, + { include: "#comments" }, + { include: "#forClause" }, + { include: "#codeBlock" }, + { include: "#contentBlock" }, ], }; @@ -996,14 +984,7 @@ const forStatement = (): textmate.Grammar => { name: "keyword.control.loop.typst", }, }, - patterns: [ - { - include: "#comments", - }, - { - include: "#expression", - }, - ], + patterns: [{ include: "#expression" }], }; return { @@ -1019,24 +1000,12 @@ const whileStatement = (): textmate.Grammar => { const whileStatement: textmate.Pattern = { name: "meta.expr.while.typst", begin: lookAhead(/(while\b(?!-))/), - end: /(?<=\}|\])|(?=[;\}\]\)\n]|$)/, + end: /(?<=[\}\]])(?![\{\[])|(?=[;\}\]\)\n]|$)/, patterns: [ - /// Matches any comments - { - include: "#comments", - }, - /// Matches while clause - { - include: "#whileClause", - }, - /// Matches a code block after the while clause - { - include: "#codeBlock", - }, - /// Matches a content block after the while clause - { - include: "#contentBlock", - }, + { include: "#comments" }, + { include: "#whileClause" }, + { include: "#codeBlock" }, + { include: "#contentBlock" }, ], }; @@ -1049,14 +1018,7 @@ const whileStatement = (): textmate.Grammar => { name: "keyword.control.loop.typst", }, }, - patterns: [ - { - include: "#comments", - }, - { - include: "#expression", - }, - ], + patterns: [{ include: "#expression" }], }; return { diff --git a/syntaxes/textmate/tests/unit/basic/control-flow-for-content.typ.snap b/syntaxes/textmate/tests/unit/basic/control-flow-for-content.typ.snap index b232f6920..c09e525a6 100644 --- a/syntaxes/textmate/tests/unit/basic/control-flow-for-content.typ.snap +++ b/syntaxes/textmate/tests/unit/basic/control-flow-for-content.typ.snap @@ -187,8 +187,6 @@ # ^ source.typst meta.expr.for.typst # ^ source.typst meta.expr.for.typst meta.brace.square.typst # ^ source.typst meta.expr.for.typst meta.brace.square.typst -# ^ source.typst meta.expr.for.typst -# ^ source.typst meta.expr.for.typst meta.brace.square.typst -# ^ source.typst meta.expr.for.typst meta.brace.square.typst +# ^^^^ source.typst >1 #^^ source.typst \ No newline at end of file diff --git a/syntaxes/textmate/tests/unit/basic/control-flow-for.typ.snap b/syntaxes/textmate/tests/unit/basic/control-flow-for.typ.snap index cb33660e4..9a2247c7a 100644 --- a/syntaxes/textmate/tests/unit/basic/control-flow-for.typ.snap +++ b/syntaxes/textmate/tests/unit/basic/control-flow-for.typ.snap @@ -187,8 +187,6 @@ # ^ source.typst meta.expr.for.typst # ^ source.typst meta.expr.for.typst meta.brace.curly.typst # ^ source.typst meta.expr.for.typst meta.brace.curly.typst -# ^ source.typst meta.expr.for.typst -# ^ source.typst meta.expr.for.typst meta.brace.curly.typst -# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^^^^ source.typst >1 #^^ source.typst \ No newline at end of file diff --git a/syntaxes/textmate/tests/unit/basic/space-control-flow.typ b/syntaxes/textmate/tests/unit/basic/space-control-flow.typ new file mode 100644 index 000000000..499a49a1c --- /dev/null +++ b/syntaxes/textmate/tests/unit/basic/space-control-flow.typ @@ -0,0 +1,16 @@ +#let A = [] +#for i in range(0, 10) { A } { A } +#for i in { range(0, 10) } { A } { A } +#if { true } { A } { A } + +#for i in range(0, 10){A}{A} +#for i in { range(0, 10) }{A}{A} +#if{true}{A}{A} + +#for i in range(0, 10) { A }A +#for i in { range(0, 10) } { A }A +#if { true } { A }A + +#for i in range(0, 10){A}A +#for i in { range(0, 10) }{A}A +#if{true}{A}A diff --git a/syntaxes/textmate/tests/unit/basic/space-control-flow.typ.snap b/syntaxes/textmate/tests/unit/basic/space-control-flow.typ.snap new file mode 100644 index 000000000..8d801e16d --- /dev/null +++ b/syntaxes/textmate/tests/unit/basic/space-control-flow.typ.snap @@ -0,0 +1,251 @@ +>#let A = [] +#^ source.typst keyword.control.hash.typst +# ^^^ source.typst meta.expr.let.typst storage.type.typst +# ^ source.typst meta.expr.let.typst +# ^ source.typst meta.expr.let.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.let.typst +# ^^ source.typst meta.expr.let.typst keyword.operator.assignment.typst +# ^ source.typst meta.expr.let.typst meta.brace.square.typst +# ^ source.typst meta.expr.let.typst meta.brace.square.typst +>#for i in range(0, 10) { A } { A } +#^ source.typst keyword.control.hash.typst +# ^^^ source.typst meta.expr.for.typst keyword.control.loop.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^^ source.typst meta.expr.for.typst keyword.operator.range.typst +# ^ source.typst meta.expr.for.typst +# ^^^^^ source.typst meta.expr.for.typst meta.expr.call.typst entity.name.function.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst punctuation.separator.comma.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst +# ^^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^^^^^^^ source.typst +>#for i in { range(0, 10) } { A } { A } +#^ source.typst keyword.control.hash.typst +# ^^^ source.typst meta.expr.for.typst keyword.control.loop.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^^ source.typst meta.expr.for.typst keyword.operator.range.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst +# ^^^^^ source.typst meta.expr.for.typst meta.expr.call.typst entity.name.function.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst punctuation.separator.comma.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst +# ^^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^^^^^^^ source.typst +>#if { true } { A } { A } +#^ source.typst keyword.control.hash.typst +# ^^ source.typst meta.expr.if.typst keyword.control.conditional.typst +# ^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst +# ^^^^ source.typst meta.expr.if.typst entity.name.type.primitive.typst +# ^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^^^^^^^ source.typst +> +>#for i in range(0, 10){A}{A} +#^ source.typst keyword.control.hash.typst +# ^^^ source.typst meta.expr.for.typst keyword.control.loop.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^^ source.typst meta.expr.for.typst keyword.operator.range.typst +# ^ source.typst meta.expr.for.typst +# ^^^^^ source.typst meta.expr.for.typst meta.expr.call.typst entity.name.function.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst punctuation.separator.comma.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst +# ^^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +>#for i in { range(0, 10) }{A}{A} +#^ source.typst keyword.control.hash.typst +# ^^^ source.typst meta.expr.for.typst keyword.control.loop.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^^ source.typst meta.expr.for.typst keyword.operator.range.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst +# ^^^^^ source.typst meta.expr.for.typst meta.expr.call.typst entity.name.function.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst punctuation.separator.comma.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst +# ^^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +>#if{true}{A}{A} +#^ source.typst keyword.control.hash.typst +# ^^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^^^^ source.typst meta.expr.if.typst entity.name.type.primitive.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +> +>#for i in range(0, 10) { A }A +#^ source.typst keyword.control.hash.typst +# ^^^ source.typst meta.expr.for.typst keyword.control.loop.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^^ source.typst meta.expr.for.typst keyword.operator.range.typst +# ^ source.typst meta.expr.for.typst +# ^^^^^ source.typst meta.expr.for.typst meta.expr.call.typst entity.name.function.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst punctuation.separator.comma.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst +# ^^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^^ source.typst +>#for i in { range(0, 10) } { A }A +#^ source.typst keyword.control.hash.typst +# ^^^ source.typst meta.expr.for.typst keyword.control.loop.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^^ source.typst meta.expr.for.typst keyword.operator.range.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst +# ^^^^^ source.typst meta.expr.for.typst meta.expr.call.typst entity.name.function.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst punctuation.separator.comma.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst +# ^^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^^ source.typst +>#if { true } { A }A +#^ source.typst keyword.control.hash.typst +# ^^ source.typst meta.expr.if.typst keyword.control.conditional.typst +# ^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst +# ^^^^ source.typst meta.expr.if.typst entity.name.type.primitive.typst +# ^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^^ source.typst +> +>#for i in range(0, 10){A}A +#^ source.typst keyword.control.hash.typst +# ^^^ source.typst meta.expr.for.typst keyword.control.loop.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^^ source.typst meta.expr.for.typst keyword.operator.range.typst +# ^ source.typst meta.expr.for.typst +# ^^^^^ source.typst meta.expr.for.typst meta.expr.call.typst entity.name.function.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst punctuation.separator.comma.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst +# ^^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^^ source.typst +>#for i in { range(0, 10) }{A}A +#^ source.typst keyword.control.hash.typst +# ^^^ source.typst meta.expr.for.typst keyword.control.loop.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst +# ^^ source.typst meta.expr.for.typst keyword.operator.range.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst +# ^^^^^ source.typst meta.expr.for.typst meta.expr.call.typst entity.name.function.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst punctuation.separator.comma.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst +# ^^ source.typst meta.expr.for.typst meta.expr.call.typst constant.numeric.integer.typst +# ^ source.typst meta.expr.for.typst meta.expr.call.typst meta.brace.round.typst +# ^ source.typst meta.expr.for.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^ source.typst meta.expr.for.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.for.typst meta.brace.curly.typst +# ^^ source.typst +>#if{true}{A}A +#^ source.typst keyword.control.hash.typst +# ^^ source.typst meta.expr.if.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^^^^ source.typst meta.expr.if.typst entity.name.type.primitive.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^ source.typst meta.expr.if.typst variable.other.readwrite.typst +# ^ source.typst meta.expr.if.typst meta.brace.curly.typst +# ^^ source.typst +> \ No newline at end of file