From a47833dc7b3ee2f531ac17371f354798e43b9f88 Mon Sep 17 00:00:00 2001 From: PureFox48 <64583745+PureFox48@users.noreply.github.com> Date: Tue, 29 Nov 2022 01:13:37 +0000 Subject: [PATCH] Add support for Wren language (#2271) Co-authored-by: Jean Abou Samra --- pygments/lexers/_mapping.py | 1 + pygments/lexers/wren.py | 99 +++ tests/examplefiles/wren/example.wren | 122 +++ tests/examplefiles/wren/example.wren.output | 925 ++++++++++++++++++++ tests/snippets/wren/lonely-paren.txt | 10 + 5 files changed, 1157 insertions(+) create mode 100644 pygments/lexers/wren.py create mode 100644 tests/examplefiles/wren/example.wren create mode 100644 tests/examplefiles/wren/example.wren.output create mode 100644 tests/snippets/wren/lonely-paren.txt diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index 96db712fe9..85b2c5f09b 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -529,6 +529,7 @@ 'WebIDLLexer': ('pygments.lexers.webidl', 'Web IDL', ('webidl',), ('*.webidl',), ()), 'WhileyLexer': ('pygments.lexers.whiley', 'Whiley', ('whiley',), ('*.whiley',), ('text/x-whiley',)), 'WoWTocLexer': ('pygments.lexers.wowtoc', 'World of Warcraft TOC', ('wowtoc',), ('*.toc',), ()), + 'WrenLexer': ('pygments.lexers.wren', 'Wren', ('wren',), ('*.wren',), ()), 'X10Lexer': ('pygments.lexers.x10', 'X10', ('x10', 'xten'), ('*.x10',), ('text/x-x10',)), 'XMLUL4Lexer': ('pygments.lexers.ul4', 'XML+UL4', ('xml+ul4',), ('*.xmlul4',), ()), 'XQueryLexer': ('pygments.lexers.webmisc', 'XQuery', ('xquery', 'xqy', 'xq', 'xql', 'xqm'), ('*.xqy', '*.xquery', '*.xq', '*.xql', '*.xqm'), ('text/xquery', 'application/xquery')), diff --git a/pygments/lexers/wren.py b/pygments/lexers/wren.py new file mode 100644 index 0000000000..f0f3793f88 --- /dev/null +++ b/pygments/lexers/wren.py @@ -0,0 +1,99 @@ +""" + pygments.lexers.wren + ~~~~~~~~~~~~~~~~~~~~ + + Lexer for Wren. + + :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re + +from pygments.lexer import include, RegexLexer, words +from pygments.token import Whitespace, Punctuation, Keyword, Name, Comment, \ + Operator, Number, String, Error + +__all__ = ['WrenLexer'] + +class WrenLexer(RegexLexer): + """ + For Wren source code, version 0.4.0. + + .. versionadded:: 2.14.0 + """ + name = 'Wren' + url = 'https://wren.io' + aliases = ['wren'] + filenames = ['*.wren'] + + flags = re.MULTILINE | re.DOTALL + + tokens = { + 'root': [ + # Whitespace. + (r'\s+', Whitespace), + (r'[,\\\[\]{}]', Punctuation), + + # Really 'root', not '#push': in 'interpolation', + # parentheses inside the interpolation expression are + # Punctuation, not String.Interpol. + (r'\(', Punctuation, 'root'), + (r'\)', Punctuation, '#pop'), + + # Keywords. + (words(( + 'as', 'break', 'class', 'construct', 'continue', 'else', + 'for', 'foreign', 'if', 'import', 'return', 'static', 'super', + 'this', 'var', 'while'), prefix = r'(??\\^|~]+', Operator), + (r'[a-z][a-zA-Z_0-9]*', Name), + (r'[A-Z][a-zA-Z_0-9]*', Name.Class), + (r'__[a-zA-Z_0-9]*', Name.Variable.Class), + (r'_[a-zA-Z_0-9]*', Name.Variable.Instance), + + # Numbers. + (r'0x[0-9a-fA-F]+', Number.Hex), + (r'\d+(\.\d+)?([eE][-+]?\d+)?', Number.Float), + + # Strings. + (r'""".*?"""', String), # Raw string + (r'"', String, 'string'), # Other string + ], + 'comment': [ + (r'/\*', Comment.Multiline, '#push'), + (r'\*/', Comment.Multiline, '#pop'), + (r'([^*/]|\*(?!/)|/(?!\*))+', Comment.Multiline), + ], + 'string': [ + (r'"', String, '#pop'), + (r'\\[\\%"0abefnrtv]', String.Escape), # Escape. + (r'\\x[a-fA-F0-9]{2}', String.Escape), # Byte escape. + (r'\\u[a-fA-F0-9]{4}', String.Escape), # Unicode escape. + (r'\\U[a-fA-F0-9]{8}', String.Escape), # Long Unicode escape. + + (r'%\(', String.Interpol, 'interpolation'), + (r'[^\\"%]+', String), # All remaining characters. + ], + 'interpolation': [ + # redefine closing paren to be String.Interpol + (r'\)', String.Interpol, '#pop'), + include('root'), + ], + } diff --git a/tests/examplefiles/wren/example.wren b/tests/examplefiles/wren/example.wren new file mode 100644 index 0000000000..272d3cb94e --- /dev/null +++ b/tests/examplefiles/wren/example.wren @@ -0,0 +1,122 @@ +#!/bin/wren + +/* IMPORTS */ +import "random" for Random as Rand + +/* COMMENTS */ + +// single line comment + +/* + multiline comment + /* + nested multiline comment + */ +*/ + +/* CLASSES & ATTRIBUTES */ + +#!type = "parent" +class Parent { + #method + static setField (field) { + __field = field + } + + construct new(parent) { + _parent = parent + return + } + + parent { _parent } + + foreign method() +} + +#!type = "child" +#group( + multiple, + lines = true +) +class Child is Parent { + construct new(parent, child) { + super(parent) + _child = child + } + + child { _child } + + toString { this.parent } +} + +/* VARIABLES & STRINGS */ + +var rand = Rand.new() +var name = """David""" +var fullName = "%(name) Smith" +var firstChild = Child.new("Philip Smith", fullName) +var age = 21 +var weight = 70.25 +var male = true +var sex = male ? "M" : "F" +var address = """ + "House name" 12 Any Street + Some Town + \t %("Some Country") " +""" + +/* LOOPS & CONDITIONALS */ +for (i in 1..5) { + if (i == 2) { + continue + } else if (i == 4) { + break + } + System.print(i) +} +var j = 6 +while (j <= 1e+1) { + if (j == 8) break + System.print(j) + j = j + 1 +} + +/* ARITHMETIC OPERATORS */ +var a = 1 +var b = 2 +var c = [-a, a + b, a - b, a * b, a / b, a % b] +var add = c[1] + +/* BITWISE OPERATORS */ +var d = 3 +var e = 4 +var f = [~d, d & e, d | e, d ^ e, d << 2, e >> 1] + +/* COMPARISON OPERATORS */ +var g = 5 +var h = 6 +var i = [a == b, a != b, a < b, a <= b, a > b, a >= b] +var k = firstChild is Parent + +/* FUNCTIONS */ +var func = Fn.new { |param| + var z = "this" + System.print(z + " " + param) +} +func.call("function") + +/* MISCELLANEOUS */ + +var hex = 0x12ac +var nul = null +var l = false +var m = true +var n = l && m +var o = l || m +var esc = "\\ \% \" \0 \a \b \t \f \n \r \v \e \x01 \uabcd \Uabcdef01" +var uni = "£ é 😀 ‎🎷" +var map = {"a": 1, "b": 2} +var iex = "%(map["a"] + map[("b")])" +var odd = (1...h).where { |i| i % 2 == 1 } + .toList +var emp = "" diff --git a/tests/examplefiles/wren/example.wren.output b/tests/examplefiles/wren/example.wren.output new file mode 100644 index 0000000000..2b76dd6313 --- /dev/null +++ b/tests/examplefiles/wren/example.wren.output @@ -0,0 +1,925 @@ +'#!/bin/wren' Comment.Special +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +' IMPORTS ' Comment.Multiline +'*/' Comment.Multiline +'\n' Text.Whitespace + +'import' Keyword +' ' Text.Whitespace +'"' Literal.String +'random' Literal.String +'"' Literal.String +' ' Text.Whitespace +'for' Keyword +' ' Text.Whitespace +'Random' Name.Class +' ' Text.Whitespace +'as' Keyword +' ' Text.Whitespace +'Rand' Name.Class +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +' COMMENTS ' Comment.Multiline +'*/' Comment.Multiline +'\n\n' Text.Whitespace + +'// single line comment' Comment.Single +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +'\n multiline comment\n ' Comment.Multiline +'/*' Comment.Multiline +'\n nested multiline comment\n ' Comment.Multiline +'*/' Comment.Multiline +'\n' Comment.Multiline + +'*/' Comment.Multiline +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +' CLASSES & ATTRIBUTES ' Comment.Multiline +'*/' Comment.Multiline +'\n\n' Text.Whitespace + +'#!type = "parent"' Comment.Special +'\n' Text.Whitespace + +'class' Keyword +' ' Text.Whitespace +'Parent' Name.Class +' ' Text.Whitespace +'{' Punctuation +'\n ' Text.Whitespace +'#method' Comment.Special +'\n ' Text.Whitespace +'static' Keyword +' ' Text.Whitespace +'setField' Name +' ' Text.Whitespace +'(' Punctuation +'field' Name +')' Punctuation +' ' Text.Whitespace +'{' Punctuation +'\n ' Text.Whitespace +'__field' Name.Variable.Class +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'field' Name +'\n ' Text.Whitespace +'}' Punctuation +'\n\n ' Text.Whitespace +'construct' Keyword +' ' Text.Whitespace +'new' Name +'(' Punctuation +'parent' Name +')' Punctuation +' ' Text.Whitespace +'{' Punctuation +'\n ' Text.Whitespace +'_parent' Name.Variable.Instance +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'parent' Name +'\n ' Text.Whitespace +'return' Keyword +'\n ' Text.Whitespace +'}' Punctuation +'\n\n ' Text.Whitespace +'parent' Name +' ' Text.Whitespace +'{' Punctuation +' ' Text.Whitespace +'_parent' Name.Variable.Instance +' ' Text.Whitespace +'}' Punctuation +'\n\n ' Text.Whitespace +'foreign' Keyword +' ' Text.Whitespace +'method' Name +'(' Punctuation +')' Punctuation +'\n' Text.Whitespace + +'}' Punctuation +'\n\n' Text.Whitespace + +'#!type = "child"' Comment.Special +'\n' Text.Whitespace + +'#group(\n multiple,\n lines = true\n)' Comment.Special +'\n' Text.Whitespace + +'class' Keyword +' ' Text.Whitespace +'Child' Name.Class +' ' Text.Whitespace +'is' Operator.Word +' ' Text.Whitespace +'Parent' Name.Class +' ' Text.Whitespace +'{' Punctuation +'\n ' Text.Whitespace +'construct' Keyword +' ' Text.Whitespace +'new' Name +'(' Punctuation +'parent' Name +',' Punctuation +' ' Text.Whitespace +'child' Name +')' Punctuation +' ' Text.Whitespace +'{' Punctuation +'\n ' Text.Whitespace +'super' Keyword +'(' Punctuation +'parent' Name +')' Punctuation +'\n ' Text.Whitespace +'_child' Name.Variable.Instance +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'child' Name +'\n ' Text.Whitespace +'}' Punctuation +'\n\n ' Text.Whitespace +'child' Name +' ' Text.Whitespace +'{' Punctuation +' ' Text.Whitespace +'_child' Name.Variable.Instance +' ' Text.Whitespace +'}' Punctuation +'\n\n ' Text.Whitespace +'toString' Name +' ' Text.Whitespace +'{' Punctuation +' ' Text.Whitespace +'this' Keyword +'.' Operator +'parent' Name +' ' Text.Whitespace +'}' Punctuation +'\n' Text.Whitespace + +'}' Punctuation +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +' VARIABLES & STRINGS ' Comment.Multiline +'*/' Comment.Multiline +'\n\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'rand' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'Rand' Name.Class +'.' Operator +'new' Name +'(' Punctuation +')' Punctuation +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'name' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"""David"""' Literal.String +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'fullName' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"' Literal.String +'%(' Literal.String.Interpol +'name' Name +')' Literal.String.Interpol +' Smith' Literal.String +'"' Literal.String +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'firstChild' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'Child' Name.Class +'.' Operator +'new' Name +'(' Punctuation +'"' Literal.String +'Philip Smith' Literal.String +'"' Literal.String +',' Punctuation +' ' Text.Whitespace +'fullName' Name +')' Punctuation +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'age' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'21' Literal.Number.Float +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'weight' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'70.25' Literal.Number.Float +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'male' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'true' Keyword.Constant +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'sex' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'male' Name +' ' Text.Whitespace +'?' Operator +' ' Text.Whitespace +'"' Literal.String +'M' Literal.String +'"' Literal.String +' ' Text.Whitespace +':' Operator +' ' Text.Whitespace +'"' Literal.String +'F' Literal.String +'"' Literal.String +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'address' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"""\n "House name" 12 Any Street\n Some Town\n \\t %("Some Country") "\n"""' Literal.String +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +' LOOPS & CONDITIONALS ' Comment.Multiline +'*/' Comment.Multiline +'\n' Text.Whitespace + +'for' Keyword +' ' Text.Whitespace +'(' Punctuation +'i' Name +' ' Text.Whitespace +'in' Operator.Word +' ' Text.Whitespace +'1' Literal.Number.Float +'..' Operator +'5' Literal.Number.Float +')' Punctuation +' ' Text.Whitespace +'{' Punctuation +'\n ' Text.Whitespace +'if' Keyword +' ' Text.Whitespace +'(' Punctuation +'i' Name +' ' Text.Whitespace +'==' Operator +' ' Text.Whitespace +'2' Literal.Number.Float +')' Punctuation +' ' Text.Whitespace +'{' Punctuation +'\n ' Text.Whitespace +'continue' Keyword +'\n ' Text.Whitespace +'}' Punctuation +' ' Text.Whitespace +'else' Keyword +' ' Text.Whitespace +'if' Keyword +' ' Text.Whitespace +'(' Punctuation +'i' Name +' ' Text.Whitespace +'==' Operator +' ' Text.Whitespace +'4' Literal.Number.Float +')' Punctuation +' ' Text.Whitespace +'{' Punctuation +'\n ' Text.Whitespace +'break' Keyword +'\n ' Text.Whitespace +'}' Punctuation +'\n ' Text.Whitespace +'System' Name.Class +'.' Operator +'print' Name +'(' Punctuation +'i' Name +')' Punctuation +'\n' Text.Whitespace + +'}' Punctuation +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'j' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'6' Literal.Number.Float +'\n' Text.Whitespace + +'while' Keyword +' ' Text.Whitespace +'(' Punctuation +'j' Name +' ' Text.Whitespace +'<=' Operator +' ' Text.Whitespace +'1e+1' Literal.Number.Float +')' Punctuation +' ' Text.Whitespace +'{' Punctuation +'\n ' Text.Whitespace +'if' Keyword +' ' Text.Whitespace +'(' Punctuation +'j' Name +' ' Text.Whitespace +'==' Operator +' ' Text.Whitespace +'8' Literal.Number.Float +')' Punctuation +' ' Text.Whitespace +'break' Keyword +'\n ' Text.Whitespace +'System' Name.Class +'.' Operator +'print' Name +'(' Punctuation +'j' Name +')' Punctuation +'\n ' Text.Whitespace +'j' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'j' Name +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'1' Literal.Number.Float +'\n' Text.Whitespace + +'}' Punctuation +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +' ARITHMETIC OPERATORS ' Comment.Multiline +'*/' Comment.Multiline +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1' Literal.Number.Float +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'b' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'2' Literal.Number.Float +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'c' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'[' Punctuation +'-' Operator +'a' Name +',' Punctuation +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'b' Name +',' Punctuation +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'b' Name +',' Punctuation +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'*' Operator +' ' Text.Whitespace +'b' Name +',' Punctuation +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'/' Operator +' ' Text.Whitespace +'b' Name +',' Punctuation +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'%' Operator +' ' Text.Whitespace +'b' Name +']' Punctuation +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'add' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'c' Name +'[' Punctuation +'1' Literal.Number.Float +']' Punctuation +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +' BITWISE OPERATORS ' Comment.Multiline +'*/' Comment.Multiline +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'d' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'3' Literal.Number.Float +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'e' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'4' Literal.Number.Float +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'f' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'[' Punctuation +'~' Operator +'d' Name +',' Punctuation +' ' Text.Whitespace +'d' Name +' ' Text.Whitespace +'&' Operator +' ' Text.Whitespace +'e' Name +',' Punctuation +' ' Text.Whitespace +'d' Name +' ' Text.Whitespace +'|' Operator +' ' Text.Whitespace +'e' Name +',' Punctuation +' ' Text.Whitespace +'d' Name +' ' Text.Whitespace +'^' Operator +' ' Text.Whitespace +'e' Name +',' Punctuation +' ' Text.Whitespace +'d' Name +' ' Text.Whitespace +'<<' Operator +' ' Text.Whitespace +'2' Literal.Number.Float +',' Punctuation +' ' Text.Whitespace +'e' Name +' ' Text.Whitespace +'>>' Operator +' ' Text.Whitespace +'1' Literal.Number.Float +']' Punctuation +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +' COMPARISON OPERATORS ' Comment.Multiline +'*/' Comment.Multiline +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'g' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'5' Literal.Number.Float +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'h' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'6' Literal.Number.Float +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'i' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'[' Punctuation +'a' Name +' ' Text.Whitespace +'==' Operator +' ' Text.Whitespace +'b' Name +',' Punctuation +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'!=' Operator +' ' Text.Whitespace +'b' Name +',' Punctuation +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'b' Name +',' Punctuation +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'<=' Operator +' ' Text.Whitespace +'b' Name +',' Punctuation +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'>' Operator +' ' Text.Whitespace +'b' Name +',' Punctuation +' ' Text.Whitespace +'a' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'b' Name +']' Punctuation +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'k' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'firstChild' Name +' ' Text.Whitespace +'is' Operator.Word +' ' Text.Whitespace +'Parent' Name.Class +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +' FUNCTIONS ' Comment.Multiline +'*/' Comment.Multiline +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'func' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'Fn' Name.Class +'.' Operator +'new' Name +' ' Text.Whitespace +'{' Punctuation +' ' Text.Whitespace +'|' Operator +'param' Name +'|' Operator +'\n ' Text.Whitespace +'var' Keyword +' ' Text.Whitespace +'z' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"' Literal.String +'this' Literal.String +'"' Literal.String +'\n ' Text.Whitespace +'System' Name.Class +'.' Operator +'print' Name +'(' Punctuation +'z' Name +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'"' Literal.String +' ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'param' Name +')' Punctuation +'\n' Text.Whitespace + +'}' Punctuation +'\n' Text.Whitespace + +'func' Name +'.' Operator +'call' Name +'(' Punctuation +'"' Literal.String +'function' Literal.String +'"' Literal.String +')' Punctuation +'\n\n' Text.Whitespace + +'/*' Comment.Multiline +' MISCELLANEOUS ' Comment.Multiline +'*/' Comment.Multiline +'\n\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'hex' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0x12ac' Literal.Number.Hex +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'nul' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'null' Keyword.Constant +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'l' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'false' Keyword.Constant +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'m' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'true' Keyword.Constant +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'n' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'l' Name +' ' Text.Whitespace +'&&' Operator +' ' Text.Whitespace +'m' Name +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'o' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'l' Name +' ' Text.Whitespace +'||' Operator +' ' Text.Whitespace +'m' Name +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'esc' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"' Literal.String +'\\\\' Literal.String.Escape +' ' Literal.String +'\\%' Literal.String.Escape +' ' Literal.String +'\\"' Literal.String.Escape +' ' Literal.String +'\\0' Literal.String.Escape +' ' Literal.String +'\\a' Literal.String.Escape +' ' Literal.String +'\\b' Literal.String.Escape +' ' Literal.String +'\\t' Literal.String.Escape +' ' Literal.String +'\\f' Literal.String.Escape +' ' Literal.String +'\\n' Literal.String.Escape +' ' Literal.String +'\\r' Literal.String.Escape +' ' Literal.String +'\\v' Literal.String.Escape +' ' Literal.String +'\\e' Literal.String.Escape +' ' Literal.String +'\\x01' Literal.String.Escape +' ' Literal.String +'\\uabcd' Literal.String.Escape +' ' Literal.String +'\\Uabcdef01' Literal.String.Escape +'"' Literal.String +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'uni' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"' Literal.String +'£ é 😀 \u200e🎷' Literal.String +'"' Literal.String +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'map' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'{' Punctuation +'"' Literal.String +'a' Literal.String +'"' Literal.String +':' Operator +' ' Text.Whitespace +'1' Literal.Number.Float +',' Punctuation +' ' Text.Whitespace +'"' Literal.String +'b' Literal.String +'"' Literal.String +':' Operator +' ' Text.Whitespace +'2' Literal.Number.Float +'}' Punctuation +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'iex' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"' Literal.String +'%(' Literal.String.Interpol +'map' Name +'[' Punctuation +'"' Literal.String +'a' Literal.String +'"' Literal.String +']' Punctuation +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'map' Name +'[' Punctuation +'(' Punctuation +'"' Literal.String +'b' Literal.String +'"' Literal.String +')' Punctuation +']' Punctuation +')' Literal.String.Interpol +'"' Literal.String +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'odd' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'(' Punctuation +'1' Literal.Number.Float +'...' Operator +'h' Name +')' Punctuation +'.' Operator +'where' Name +' ' Text.Whitespace +'{' Punctuation +' ' Text.Whitespace +'|' Operator +'i' Name +'|' Operator +' ' Text.Whitespace +'i' Name +' ' Text.Whitespace +'%' Operator +' ' Text.Whitespace +'2' Literal.Number.Float +' ' Text.Whitespace +'==' Operator +' ' Text.Whitespace +'1' Literal.Number.Float +' ' Text.Whitespace +'}' Punctuation +'\n ' Text.Whitespace +'.' Operator +'toList' Name +'\n' Text.Whitespace + +'var' Keyword +' ' Text.Whitespace +'emp' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"' Literal.String +'"' Literal.String +'\n' Text.Whitespace diff --git a/tests/snippets/wren/lonely-paren.txt b/tests/snippets/wren/lonely-paren.txt new file mode 100644 index 0000000000..5236e601b7 --- /dev/null +++ b/tests/snippets/wren/lonely-paren.txt @@ -0,0 +1,10 @@ +---input--- +// This invalid input should terminate. +) + +---tokens--- +'// This invalid input should terminate.' Comment.Single +'\n' Text.Whitespace + +')' Punctuation +'\n' Text.Whitespace