UNPKG

3.02 kBJavaScriptView Raw
1/*
2Language: WebAssembly
3Website: https://webassembly.org
4Description: Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.
5Category: web
6Audit: 2020
7*/
8
9/** @type LanguageFn */
10function wasm(hljs) {
11 hljs.regex;
12 const BLOCK_COMMENT = hljs.COMMENT(/\(;/, /;\)/);
13 BLOCK_COMMENT.contains.push("self");
14 const LINE_COMMENT = hljs.COMMENT(/;;/, /$/);
15
16 const KWS = [
17 "anyfunc",
18 "block",
19 "br",
20 "br_if",
21 "br_table",
22 "call",
23 "call_indirect",
24 "data",
25 "drop",
26 "elem",
27 "else",
28 "end",
29 "export",
30 "func",
31 "global.get",
32 "global.set",
33 "local.get",
34 "local.set",
35 "local.tee",
36 "get_global",
37 "get_local",
38 "global",
39 "if",
40 "import",
41 "local",
42 "loop",
43 "memory",
44 "memory.grow",
45 "memory.size",
46 "module",
47 "mut",
48 "nop",
49 "offset",
50 "param",
51 "result",
52 "return",
53 "select",
54 "set_global",
55 "set_local",
56 "start",
57 "table",
58 "tee_local",
59 "then",
60 "type",
61 "unreachable"
62 ];
63
64 const FUNCTION_REFERENCE = {
65 begin: [
66 /(?:func|call|call_indirect)/,
67 /\s+/,
68 /\$[^\s)]+/
69 ],
70 className: {
71 1: "keyword",
72 3: "title.function"
73 }
74 };
75
76 const ARGUMENT = {
77 className: "variable",
78 begin: /\$[\w_]+/
79 };
80
81 const PARENS = {
82 match: /(\((?!;)|\))+/,
83 className: "punctuation",
84 relevance: 0
85 };
86
87 const NUMBER = {
88 className: "number",
89 relevance: 0,
90 // borrowed from Prism, TODO: split out into variants
91 match: /[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/
92 };
93
94 const TYPE = {
95 // look-ahead prevents us from gobbling up opcodes
96 match: /(i32|i64|f32|f64)(?!\.)/,
97 className: "type"
98 };
99
100 const MATH_OPERATIONS = {
101 className: "keyword",
102 // borrowed from Prism, TODO: split out into variants
103 match: /\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/
104 };
105
106 const OFFSET_ALIGN = {
107 match: [
108 /(?:offset|align)/,
109 /\s*/,
110 /=/
111 ],
112 className: {
113 1: "keyword",
114 3: "operator"
115 }
116 };
117
118 return {
119 name: 'WebAssembly',
120 keywords: {
121 $pattern: /[\w.]+/,
122 keyword: KWS
123 },
124 contains: [
125 LINE_COMMENT,
126 BLOCK_COMMENT,
127 OFFSET_ALIGN,
128 ARGUMENT,
129 PARENS,
130 FUNCTION_REFERENCE,
131 hljs.QUOTE_STRING_MODE,
132 TYPE,
133 MATH_OPERATIONS,
134 NUMBER
135 ]
136 };
137}
138
139module.exports = wasm;