test.js 9.0 KB

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