{ "name": "WebAssembly", "scopeName": "source.webassembly", "patterns": [ { "name": "comment.line.hashbang.webassembly", "begin": "\\A(#!)", "end": "$", "beginCaptures": { "1": { "name": "punctuation.definition.comment.hashbang.webassembly" } } }, { "include": "#main" } ], "repository": { "comment-block": { "name": "comment.block.semicolon.webassembly", "begin": "\\(;", "end": ";\\)", "patterns": [ { "include": "#comment-block" } ], "beginCaptures": { "0": { "name": "punctuation.section.comment.begin.webassembly" } }, "endCaptures": { "0": { "name": "punctuation.section.comment.end.webassembly" } } }, "comment-line": { "name": "comment.line.semicolon.webassembly", "begin": ";;", "end": "$", "beginCaptures": { "0": { "name": "punctuation.definition.comment.webassembly" } } }, "expression": { "patterns": [ { "name": "meta.expression.module.root.webassembly", "begin": "(\\()\\s*(module)(?=[\\s()]|$|;;)", "end": "\\)", "patterns": [ { "include": "$self" } ], "beginCaptures": { "1": { "name": "punctuation.section.expression.begin.webassembly" }, "2": { "name": "keyword.control.module.webassembly" } }, "endCaptures": { "0": { "name": "punctuation.section.expression.end.webassembly" } } }, { "name": "meta.expression.$2.webassembly", "begin": "(\\()\\s*(\\w+)(?=[\\s()]|$|;;)", "end": "\\)", "patterns": [ { "include": "$self" } ], "beginCaptures": { "1": { "name": "punctuation.section.expression.begin.webassembly" }, "2": { "name": "entity.name.function.webassembly" } }, "endCaptures": { "0": { "name": "punctuation.section.expression.end.webassembly" } } }, { "name": "meta.expression.webassembly", "begin": "\\(", "end": "\\)", "patterns": [ { "include": "$self" } ], "beginCaptures": { "0": { "name": "punctuation.section.expression.begin.webassembly" } }, "endCaptures": { "0": { "name": "punctuation.section.expression.end.webassembly" } } } ] }, "instructions": { "patterns": [ { "name": "keyword.control.instruction.$1.webassembly", "match": "(?x) \\b\n( block\n| br\n| br_if\n| br_table\n| call\n| call_indirect\n| else\n| if\n| end\n| export\n| loop\n| return\n| then\n) (?=[\\s()]|$|;;)" }, { "name": "keyword.operator.declaration.instruction.$1.webassembly", "match": "(?x) \\b\n( data\n| elem\n| func\n| global\n| import\n| local\n| memory\n| module\n| offset\n| param\n| result\n| start\n| table\n| type\n) (?=[\\s()]|$|;;)" }, { "name": "entity.name.function.scripting.instruction.$1.webassembly", "match": "(?x) \\b\n( assert_exhaustion\n| assert_invalid\n| assert_malformed\n| assert_return (?:_(?:arithmetic|canonical)_nan)?\n| assert_trap\n| assert_unlinkable\n| binary\n| get\n| input\n| invoke\n| output\n| quote\n| register\n| script\n) (?=[\\s()]|$|;;)" }, { "name": "entity.name.function.misc.instruction.$1.webassembly", "match": "(?x) \\b\n( current_memory\n| drop\n| [gs]et_(?:global|local)\n| grow_memory\n| nop\n| select\n| tee_local\n| unreachable\n) (?=[\\s()]|$|;;)" } ] }, "main": { "patterns": [ { "include": "#comment-line" }, { "include": "#comment-block" }, { "include": "#expression" }, { "include": "#type" }, { "include": "#instructions" }, { "include": "#number" }, { "include": "#name" }, { "include": "#string" }, { "include": "#optional-immediate" } ] }, "name": { "name": "variable.other.name.webassembly", "match": "(\\$)[-A-Za-z0-9_.+*/\\\\^~=\u003c\u003e!?@#$%\u0026|:'`]+", "captures": { "1": { "name": "punctuation.definition.variable.webassembly" } } }, "number": { "patterns": [ { "name": "constant.language.nan.with-payload.webassembly", "match": "(?\u003c!\\w)[-+]?nan(:)(0x[A-Fa-f0-9]+)", "captures": { "1": { "name": "punctuation.separator.payload.colon.webassembly" }, "2": { "name": "constant.numeric.int.hex.payload.webassembly" } } }, { "name": "constant.language.$1.webassembly", "match": "(?\u003c!\\w)[-+]?(inf|nan)(?!\\w)" }, { "name": "constant.numeric.float.hex.webassembly", "match": "(?x) (?\u003c!\\w)\n[-+]?\n0x [A-Fa-f0-9]+\n(?: \\.[A-Fa-f0-9]* )?\n(?: [pP][-+]?[0-9]+ )?" }, { "name": "constant.numeric.float.decimal.webassembly", "match": "(?\u003c!\\w)[-+]?\\d+(?:\\.\\d*)?(?:[eE][-+]?[0-9]+)?" }, { "name": "constant.numeric.int.hex.webassembly", "match": "(?\u003c!\\w)[-+]?0x[A-Fa-f0-9]+" }, { "name": "constant.numeric.int.decimal.webassembly", "match": "(?\u003c!\\w)[-+]?\\d+" } ] }, "optional-immediate": { "match": "(?\u003c!\\w)(align|offset)(=)(?=[-+]?(?:\\d|0x[\\dA-Fa-f]))", "captures": { "1": { "name": "variable.parameter.$1.webassembly" }, "2": { "name": "keyword.operator.assignment.webassembly" } } }, "string": { "name": "string.quoted.double.webassembly", "begin": "\"", "end": "\"", "patterns": [ { "name": "constant.character.escape.newline.webassembly", "match": "\\\\n" }, { "name": "constant.character.escape.tab.webassembly", "match": "\\\\t" }, { "name": "constant.character.escape.backslash.webassembly", "match": "\\\\{2}" }, { "name": "constant.character.escape.quote.single.webassembly", "match": "\\\\'" }, { "name": "constant.character.escape.quote.double.webassembly", "match": "\\\\\"" }, { "name": "constant.character.escape.hex.unicode.webassembly", "match": "\\\\[0-9A-Fa-f]{2}|\\\\u({)[A-Fa-f0-9]+(})", "captures": { "1": { "name": "punctuation.definition.unicode-escape.begin.bracket.curly.webassembly" }, "2": { "name": "punctuation.definition.unicode-escape.end.bracket.curly.webassembly" } } } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.webassembly" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.webassembly" } } }, "type": { "patterns": [ { "match": "(?x)\n\\b (i32|i64) (\\.)\n(?:\n\t((?:div|rem|shr|[lg][et])_[su]|and|c[lt]z|x?or|shl|rot[lr]|eqz|popcnt)\n\t|\n\t(\n\t\t(?\u003c=i32 \\.) (?:reinterpret|trunc_[su]|wrap) |\n\t\t(?\u003c=i64 \\.) (?:reinterpret|(?:extend|trunc)_[su])\n\t)\n\t(/) (i32|i64|f32|f64)\n)", "captures": { "1": { "name": "storage.type.var.$1.webassembly" }, "2": { "name": "punctuation.separator.method.period.webassembly" }, "3": { "name": "entity.name.method-call.webassembly" }, "4": { "name": "entity.name.method-call.webassembly" }, "5": { "name": "keyword.operator.datatype.webassembly" }, "6": { "name": "storage.type.var.$6.webassembly" } } }, { "match": "(?x)\n\\b (f32|f64) (\\.)\n(?:\n\t(div|abs|neg|copysign|ceil|floor|trunc|nearest|le|lt|gt|ge|sqrt|min|max)\n\t|\n\t(\n\t\t(?\u003c=f32 \\.) (?:demote|convert_[su]|reinterpret) |\n\t\t(?\u003c=f64 \\.) (?:promote|convert_[su]|reinterpret)\n\t)\n\t(/) (i32|i64|f32|f64)\n)", "captures": { "1": { "name": "storage.type.var.$1.webassembly" }, "2": { "name": "punctuation.separator.method.period.webassembly" }, "3": { "name": "entity.name.method-call.webassembly" }, "4": { "name": "entity.name.method-call.webassembly" }, "5": { "name": "keyword.operator.datatype.webassembly" }, "6": { "name": "storage.type.var.$6.webassembly" } } }, { "match": "(?x) \\b\n(i32|i64|f32|f64)\n(?:\n\t(\\.)\n\t(const|add|sub|mul|(?:extend|trunc)_[su]|eq|ne\n\t|load((?:8|16|32)_[su])?\n\t|store(?:8|16|32)?)\n)?\n(?=[\\s()]|$|;;)", "captures": { "1": { "name": "storage.type.var.$1.webassembly" }, "2": { "name": "punctuation.separator.method.period.webassembly" }, "3": { "name": "entity.name.method-call.webassembly" } } }, { "match": "\\b(anyfunc)\\b", "captures": { "1": { "name": "storage.type.var.$1.webassembly" } } } ] } } }