-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
-
125
-
126
-
127
-
128
-
129
-
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
-
138
-
139
-
140
-
141
-
142
-
143
-
144
-
145
-
146
-
147
-
148
-
149
-
150
-
151
-
152
-
153
-
154
-
155
-
156
-
157
-
158
-
159
-
160
-
161
-
162
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(function() {
var mode = CodeMirror.getMode({indentUnit: 2}, "swift");
function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
// Ensure all number types are properly represented.
MT("numbers",
"[keyword var] [def a] [operator =] [number 17]",
"[keyword var] [def b] [operator =] [number -0.5]",
"[keyword var] [def c] [operator =] [number 0.3456e-4]",
"[keyword var] [def d] [operator =] [number 345e2]",
"[keyword var] [def e] [operator =] [number 0o7324]",
"[keyword var] [def f] [operator =] [number 0b10010]",
"[keyword var] [def g] [operator =] [number -0x35ade]",
"[keyword var] [def h] [operator =] [number 0xaea.ep-13]",
"[keyword var] [def i] [operator =] [number 0x13ep6]");
// Variable/class/etc definition.
MT("definition",
"[keyword var] [def a] [operator =] [number 5]",
"[keyword let] [def b][punctuation :] [variable-2 Int] [operator =] [number 10]",
"[keyword class] [def C] [punctuation {] [punctuation }]",
"[keyword struct] [def D] [punctuation {] [punctuation }]",
"[keyword enum] [def E] [punctuation {] [punctuation }]",
"[keyword extension] [def F] [punctuation {] [punctuation }]",
"[keyword protocol] [def G] [punctuation {] [punctuation }]",
"[keyword func] [def h][punctuation ()] [punctuation {] [punctuation }]",
"[keyword import] [def Foundation]",
"[keyword typealias] [def NewString] [operator =] [variable-2 String]",
"[keyword associatedtype] [def I]",
"[keyword for] [def j] [keyword in] [number 0][punctuation ..][operator <][number 3] [punctuation {] [punctuation }]");
// Strings and string interpolation.
MT("strings",
"[keyword var] [def a][punctuation :] [variable-2 String] [operator =] [string \"test\"]",
"[keyword var] [def b][punctuation :] [variable-2 String] [operator =] [string \"\\(][variable a][string )\"]",
"[keyword var] [def c] [operator =] [string \"\"\"]",
"[string multi]",
"[string line]",
"[string \"test\"]",
"[string \"\"\"]",
"[variable print][punctuation (][string \"\"][punctuation )]");
// Comments.
MT("comments",
"[comment // This is a comment]",
"[comment /* This is another comment */]",
"[keyword var] [def a] [operator =] [number 5] [comment // Third comment]");
// Atoms.
MT("atoms",
"[keyword class] [def FooClass] [punctuation {]",
" [keyword let] [def fooBool][punctuation :] [variable-2 Bool][operator ?]",
" [keyword let] [def fooInt][punctuation :] [variable-2 Int][operator ?]",
" [keyword func] [keyword init][punctuation (][variable fooBool][punctuation :] [variable-2 Bool][punctuation ,] [variable barBool][punctuation :] [variable-2 Bool][punctuation )] [punctuation {]",
" [atom super][property .init][punctuation ()]",
" [atom self][property .fooBool] [operator =] [variable fooBool]",
" [variable fooInt] [operator =] [atom nil]",
" [keyword if] [variable barBool] [operator ==] [atom true] [punctuation {]",
" [variable print][punctuation (][string \"True!\"][punctuation )]",
" [punctuation }] [keyword else] [keyword if] [variable barBool] [operator ==] [atom false] [punctuation {]",
" [keyword for] [atom _] [keyword in] [number 0][punctuation ...][number 5] [punctuation {]",
" [variable print][punctuation (][string \"False!\"][punctuation )]",
" [punctuation }]",
" [punctuation }]",
" [punctuation }]",
"[punctuation }]");
// Types.
MT("types",
"[keyword var] [def a] [operator =] [variable-2 Array][operator <][variable-2 Int][operator >]",
"[keyword var] [def b] [operator =] [variable-2 Set][operator <][variable-2 Bool][operator >]",
"[keyword var] [def c] [operator =] [variable-2 Dictionary][operator <][variable-2 String][punctuation ,][variable-2 Character][operator >]",
"[keyword var] [def d][punctuation :] [variable-2 Int64][operator ?] [operator =] [variable-2 Optional][punctuation (][number 8][punctuation )]",
"[keyword func] [def e][punctuation ()] [operator ->] [variable-2 Void] [punctuation {]",
" [keyword var] [def e1][punctuation :] [variable-2 Float] [operator =] [number 1.2]",
"[punctuation }]",
"[keyword func] [def f][punctuation ()] [operator ->] [variable-2 Never] [punctuation {]",
" [keyword var] [def f1][punctuation :] [variable-2 Double] [operator =] [number 2.4]",
"[punctuation }]");
// Operators.
MT("operators",
"[keyword var] [def a] [operator =] [number 1] [operator +] [number 2]",
"[keyword var] [def b] [operator =] [number 1] [operator -] [number 2]",
"[keyword var] [def c] [operator =] [number 1] [operator *] [number 2]",
"[keyword var] [def d] [operator =] [number 1] [operator /] [number 2]",
"[keyword var] [def e] [operator =] [number 1] [operator %] [number 2]",
"[keyword var] [def f] [operator =] [number 1] [operator |] [number 2]",
"[keyword var] [def g] [operator =] [number 1] [operator &] [number 2]",
"[keyword var] [def h] [operator =] [number 1] [operator <<] [number 2]",
"[keyword var] [def i] [operator =] [number 1] [operator >>] [number 2]",
"[keyword var] [def j] [operator =] [number 1] [operator ^] [number 2]",
"[keyword var] [def k] [operator =] [operator ~][number 1]",
"[keyword var] [def l] [operator =] [variable foo] [operator ?] [number 1] [punctuation :] [number 2]",
"[keyword var] [def m][punctuation :] [variable-2 Int] [operator =] [variable-2 Optional][punctuation (][number 8][punctuation )][operator !]");
// Punctuation.
MT("punctuation",
"[keyword let] [def a] [operator =] [number 1][punctuation ;] [keyword let] [def b] [operator =] [number 2]",
"[keyword let] [def testArr][punctuation :] [punctuation [[][variable-2 Int][punctuation ]]] [operator =] [punctuation [[][variable a][punctuation ,] [variable b][punctuation ]]]",
"[keyword for] [def i] [keyword in] [number 0][punctuation ..][operator <][variable testArr][property .count] [punctuation {]",
" [variable print][punctuation (][variable testArr][punctuation [[][variable i][punctuation ]])]",
"[punctuation }]");
// Identifiers.
MT("identifiers",
"[keyword let] [def abc] [operator =] [number 1]",
"[keyword let] [def ABC] [operator =] [number 2]",
"[keyword let] [def _123] [operator =] [number 3]",
"[keyword let] [def _$1$2$3] [operator =] [number 4]",
"[keyword let] [def A1$_c32_$_] [operator =] [number 5]",
"[keyword let] [def `var`] [operator =] [punctuation [[][number 1][punctuation ,] [number 2][punctuation ,] [number 3][punctuation ]]]",
"[keyword let] [def square$] [operator =] [variable `var`][property .map] [punctuation {][variable $0] [operator *] [variable $0][punctuation }]",
"$$ [number 1][variable a] $[atom _] [variable _$] [variable __] `[variable a] [variable b]`");
// Properties.
MT("properties",
"[variable print][punctuation (][variable foo][property .abc][punctuation )]",
"[variable print][punctuation (][variable foo][property .ABC][punctuation )]",
"[variable print][punctuation (][variable foo][property ._123][punctuation )]",
"[variable print][punctuation (][variable foo][property ._$1$2$3][punctuation )]",
"[variable print][punctuation (][variable foo][property .A1$_c32_$_][punctuation )]",
"[variable print][punctuation (][variable foo][property .`var`][punctuation )]",
"[variable print][punctuation (][variable foo][property .__][punctuation )]");
// Instructions or other things that start with #.
MT("instructions",
"[keyword if] [builtin #available][punctuation (][variable iOS] [number 9][punctuation ,] [operator *][punctuation )] [punctuation {}]",
"[variable print][punctuation (][builtin #file][punctuation ,] [builtin #function][punctuation )]",
"[variable print][punctuation (][builtin #line][punctuation ,] [builtin #column][punctuation )]",
"[builtin #if] [atom true]",
"[keyword import] [def A]",
"[builtin #elseif] [atom false]",
"[keyword import] [def B]",
"[builtin #endif]",
"[builtin #sourceLocation][punctuation (][variable file][punctuation :] [string \"file.swift\"][punctuation ,] [variable line][punctuation :] [number 2][punctuation )]");
// Attributes; things that start with @.
MT("attributes",
"[attribute @objc][punctuation (][variable objcFoo][punctuation :)]",
"[attribute @available][punctuation (][variable iOS][punctuation )]");
// Property/number edge case.
MT("property_number",
"[variable print][punctuation (][variable foo][property ._123][punctuation )]",
"[variable print][punctuation (]")
MT("nested_comments",
"[comment /*]",
"[comment But wait /* this is a nested comment */ for real]",
"[comment /**** let * me * show * you ****/]",
"[comment ///// let / me / show / you /////]",
"[comment */]");
// TODO: correctly identify when multiple variables are being declared
// by use of a comma-separated list.
// TODO: correctly identify when variables are being declared in a tuple.
// TODO: identify protocols as types when used before an extension?
})();