[READ-ONLY] Mirror of https://github.com/probablykasper/javascript-without-snippets. Atom package | language-javascript without snippets
atom atom-package package
0

Configure Feed

Select the types of activity you want to include in your feed.

Done stuff

SpectralKH (May 7, 2016, 8:06 PM +0200) 463e3533

+3884
+3
.gitignore
··· 1 + .DS_Store 2 + npm-debug.log 3 + node_modules
+1
CONTRIBUTING.md
··· 1 + See the [Atom contributing guide](https://atom.io/docs/latest/contributing)
+31
LICENSE.md
··· 1 + Copyright (c) 2015 GitHub Inc. 2 + 3 + Permission is hereby granted, free of charge, to any person obtaining 4 + a copy of this software and associated documentation files (the 5 + "Software"), to deal in the Software without restriction, including 6 + without limitation the rights to use, copy, modify, merge, publish, 7 + distribute, sublicense, and/or sell copies of the Software, and to 8 + permit persons to whom the Software is furnished to do so, subject to 9 + the following conditions: 10 + 11 + The above copyright notice and this permission notice shall be 12 + included in all copies or substantial portions of the Software. 13 + 14 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 + 22 + -------------------------------------------------------------------- 23 + 24 + This package was derived from a TextMate bundle located at 25 + https://github.com/textmate/javascript.tmbundle and distributed under the 26 + following license, located in `README.mdown`: 27 + 28 + Permission to copy, use, modify, sell and distribute this 29 + software is granted. This software is provided "as is" without 30 + express or implied warranty, and with no claim as to its 31 + suitability for any purpose.
+8
README.md
··· 1 + # JavaScript Without snippets 2 + Package for [Atom](https://atom.io) 3 + 4 + The core package "[language-javascript](https://github.com/atom/language-javascript)" without snippets, so you can easily 5 + add your own. Just disable the core package, and add your desired snippets 6 + through Atom's default snippets.cson file. 7 + 8 + Default snippets can be found commented out in [/snippets/language-javascript.cson]()
+37
coffeelint.json
··· 1 + { 2 + "max_line_length": { 3 + "level": "ignore" 4 + }, 5 + "no_empty_param_list": { 6 + "level": "error" 7 + }, 8 + "arrow_spacing": { 9 + "level": "error" 10 + }, 11 + "no_interpolation_in_single_quotes": { 12 + "level": "error" 13 + }, 14 + "no_debugger": { 15 + "level": "error" 16 + }, 17 + "prefer_english_operator": { 18 + "level": "error" 19 + }, 20 + "colon_assignment_spacing": { 21 + "spacing": { 22 + "left": 0, 23 + "right": 1 24 + }, 25 + "level": "error" 26 + }, 27 + "braces_spacing": { 28 + "spaces": 0, 29 + "level": "error" 30 + }, 31 + "spacing_after_comma": { 32 + "level": "error" 33 + }, 34 + "no_stand_alone_at": { 35 + "level": "error" 36 + } 37 + }
+1660
grammars/javascript.cson
··· 1 + 'scopeName': 'source.js' 2 + 'fileTypes': [ 3 + 'js' 4 + '_js' 5 + 'es' 6 + 'es6' 7 + 'gs' 8 + 'htc' 9 + 'jscad' 10 + 'jslib' 11 + 'jsm' 12 + 'json5' 13 + 'jspre' 14 + 'pac' 15 + 'pjs' 16 + 'xsjs' 17 + 'xsjslib' 18 + ] 19 + 'firstLineMatch': '^#!.*\\b(node|iojs|JavaScript)' 20 + 'name': 'JavaScript' 21 + 'patterns': [ 22 + { 23 + 'comment': 'ES6 import' 24 + 'begin': '(?<!\\.)\\b(import)(?!\\s*:)\\b' 25 + 'beginCaptures': 26 + '1': 27 + 'name': 'keyword.control.js' 28 + 'patterns': [ 29 + { 30 + 'comment': '{ member1 , member2 as alias2 , [...] }' 31 + 'begin': '\\{' 32 + 'beginCaptures': 33 + 0: 34 + 'name': 'punctuation.definition.modules.begin.js' 35 + 'end': '\\}' 36 + 'endCaptures': 37 + 0: 38 + 'name': 'punctuation.definition.modules.end.js' 39 + 'patterns': [ 40 + { 41 + 'comment': '(default|name) as alias' 42 + 'captures': 43 + '1': 44 + 'name': 'variable.language.default.js' 45 + '2': 46 + 'name': 'variable.other.module.js' 47 + '3': 48 + 'name': 'keyword.control.js' 49 + '4': 50 + 'name': 'invalid.illegal.js' 51 + '5': 52 + 'name': 'variable.other.module-alias.js' 53 + 'match': '(?x) 54 + (?: \\b(default)\\b | \\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b) 55 + \\s* 56 + (\\b as \\b) 57 + \\s* 58 + (?: (\\b default \\b | \\*) | \\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b) 59 + ' 60 + } 61 + { 62 + 'match': ',' 63 + 'name': 'meta.delimiter.object.comma.js' 64 + } 65 + { 66 + 'include': '#comments' 67 + } 68 + { 69 + 'match': '\\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b' 70 + 'name': 'variable.other.module.js' 71 + } 72 + ] 73 + } 74 + { 75 + 'comment': '(default|*|name) as alias' 76 + 'captures': 77 + '1': 78 + 'name': 'variable.language.default.js' 79 + '2': 80 + 'name': 'variable.language.import-all.js' 81 + '3': 82 + 'name': 'variable.other.module.js' 83 + '4': 84 + 'name': 'keyword.control.js' 85 + '5': 86 + 'name': 'invalid.illegal.js' 87 + '6': 88 + 'name': 'variable.other.module-alias.js' 89 + 'match': '(?x) 90 + (?: \\b(default)\\b | (\\*) | \\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b) 91 + \\s* 92 + (\\b as \\b) 93 + \\s* 94 + (?: (\\b default \\b | \\*) | \\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b) 95 + ' 96 + } 97 + { 98 + 'match': '\\*' 99 + 'name': 'variable.language.import-all.js' 100 + } 101 + { 102 + 'match': '\\b(default)\\b' 103 + 'name': 'variable.language.default.js' 104 + } 105 + { 106 + 'include': '#strings' 107 + } 108 + { 109 + 'include': '#comments' 110 + } 111 + { 112 + 'match': '\\b(from)\\b' 113 + 'name': 'keyword.control.js' 114 + } 115 + { 116 + 'match': '\\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b(?=.*\\bfrom\\b)' 117 + 'name': 'variable.other.module.js' 118 + } 119 + { 120 + 'match': ',' 121 + 'name': 'meta.delimiter.object.comma.js' 122 + } 123 + ] 124 + 'end': '(?=;|$)' 125 + 'name': 'meta.import.js' 126 + } 127 + { 128 + 'comment': 'ES6 export: `export default (variable|class|function, etc.)`' 129 + 'match': '(?x) \\b(export)\\b \\s* \\b(default)\\b (?:\\s*) \\b((?!\\bfunction\\b|\\bclass\\b|\\blet\\b|\\bvar\\b|\\bconst\\b)[a-zA-Z_$][a-zA-Z_$0-9]*)?\\b' 130 + 'captures': 131 + '0': 132 + 'name': 'meta.export.js' 133 + '1': 134 + 'name': 'keyword.control.js' 135 + '2': 136 + 'name': 'variable.language.default.js' 137 + '3': 138 + 'name': 'variable.other.module.js' 139 + } 140 + { 141 + 'comment': 'ES6 export, re-export: `export {member as alias, [...]} [from ...]`' 142 + 'begin': '(?<!\\.)\\b(export)(?!\\s*:)\\b' 143 + 'beginCaptures': 144 + '1': 145 + 'name': 'keyword.control.js' 146 + 'patterns': [ 147 + { 148 + 'include': '#numbers' 149 + } 150 + { 151 + 'comment': '`{ member1 , member2 as alias2 , [...] }` inside re-export' 152 + 'begin': '\\{(?=.*\\bfrom\\b)' 153 + 'beginCaptures': 154 + 0: 155 + 'name': 'punctuation.definition.modules.begin.js' 156 + 'end': '\\}' 157 + 'endCaptures': 158 + 0: 159 + 'name': 'punctuation.definition.modules.end.js' 160 + 'patterns': [ 161 + { 162 + 'comment': '(default|name) as alias' 163 + 'captures': 164 + '1': 165 + 'name': 'variable.language.default.js' 166 + '2': 167 + 'name': 'variable.other.module.js' 168 + '3': 169 + 'name': 'keyword.control.js' 170 + '4': 171 + 'name': 'variable.language.default.js' 172 + '5': 173 + 'name': 'invalid.illegal.js' 174 + '6': 175 + 'name': 'variable.other.module-alias.js' 176 + 'match': '(?x) 177 + (?: \\b(default)\\b | \\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b) 178 + \\s* 179 + (\\b as \\b) 180 + \\s* 181 + (?: \\b(default)\\b | (\\*) | \\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b) 182 + ' 183 + } 184 + { 185 + 'match': ',' 186 + 'name': 'meta.delimiter.object.comma.js' 187 + } 188 + { 189 + 'include': '#comments' 190 + } 191 + { 192 + 'match': '\\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b' 193 + 'name': 'variable.other.module.js' 194 + } 195 + ] 196 + } 197 + { 198 + 'comment': '{ member1 , member2 as alias2 , [...] }' 199 + 'begin': '(?![a-zA-Z_$0-9])\\{' 200 + 'beginCaptures': 201 + 0: 202 + 'name': 'punctuation.definition.modules.begin.js' 203 + 'end': '\\}' 204 + 'endCaptures': 205 + 0: 206 + 'name': 'punctuation.definition.modules.end.js' 207 + 'patterns': [ 208 + { 209 + 'comment': 'name as (default|alias)' 210 + 'captures': 211 + '1': 212 + 'name': 'invalid.illegal.js' 213 + '2': 214 + 'name': 'variable.other.module.js' 215 + '3': 216 + 'name': 'keyword.control.js' 217 + '4': 218 + 'name': 'variable.language.default.js' 219 + '5': 220 + 'name': 'invalid.illegal.js' 221 + '6': 222 + 'name': 'variable.other.module-alias.js' 223 + 'match': '(?x) 224 + (?: \\b(default)\\b | \\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b) 225 + \\s* 226 + (\\b as \\b) 227 + \\s* 228 + (?: \\b(default)\\b | (\\*) | \\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b) 229 + ' 230 + } 231 + { 232 + 'include': '#comments' 233 + } 234 + { 235 + 'match': ',' 236 + 'name': 'meta.delimiter.object.comma.js' 237 + } 238 + { 239 + 'match': '\\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b' 240 + 'name': 'variable.other.module.js' 241 + } 242 + ] 243 + } 244 + { 245 + 'match': '\\*(?=.*\\bfrom\\b)' 246 + 'name': 'variable.language.import-all.js' 247 + } 248 + { 249 + 'match': '\\b(default)\\b' 250 + 'name': 'variable.language.default.js' 251 + } 252 + { 253 + 'include': '#strings' 254 + } 255 + { 256 + 'include': '#comments' 257 + } 258 + { 259 + 'match': '\\b(from)\\b' 260 + 'name': 'keyword.control.js' 261 + } 262 + { 263 + 'match': '\\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b' 264 + 'name': 'variable.other.module.js' 265 + } 266 + { 267 + 'match': ',' 268 + 'name': 'meta.delimiter.object.comma.js' 269 + } 270 + { 271 + 'include': '#operators' 272 + } 273 + ] 274 + 'end': '(?=;|\\bfunction\\b|\\bclass\\b|\\blet\\b|\\bvar\\b|\\bconst\\b|$)' 275 + 'name': 'meta.export.js' 276 + } 277 + { 278 + 'match': '(?<!\\.)\\b(super|this|arguments)(?!\\s*:)\\b|(?<=\\?)(?:\\s*)(super|this|arguments)(?=\\s*:)' 279 + 'captures': 280 + '1': 281 + 'name': 'variable.language.js' 282 + '2': 283 + 'name': 'variable.language.js' 284 + } 285 + { 286 + # [async] function [name](params) 287 + # function* name(params) – generator function declaration 288 + 'begin': '(?=(\\basync\\b\\s*)?\\bfunction\\b)' 289 + 'end': '(?<=})' 290 + 'patterns': [ 291 + { 292 + 'include': '#comments' 293 + } 294 + { 295 + 'include': '#function_body' 296 + } 297 + { 298 + 'begin': '\\G' 299 + 'end': '(?<=\\))' 300 + 'name': 'meta.function.js' 301 + 'patterns': [ 302 + { 303 + 'include': '#function_innards' 304 + } 305 + ] 306 + } 307 + ] 308 + } 309 + { 310 + # [.]foo = function... 311 + 'begin': '(?=(\\.)?[a-zA-Z_$][\\w$]*\\s*=\\s*(\\basync\\b\\s*)?\\bfunction\\b)' 312 + 'end': '(?<=})' 313 + 'patterns': [ 314 + { 315 + 'include': '#comments' 316 + } 317 + { 318 + 'include': '#function_body' 319 + } 320 + { 321 + 'begin': '\\G' 322 + 'end': '(?!\\G)(?<=\\))' 323 + 'name': 'meta.function.js' 324 + 'patterns': [ 325 + { 326 + 'match': '(\\.)?([a-zA-Z_$][\\w$]*)\\s*(=)\\s*' 327 + 'captures': 328 + '1': 329 + 'name': 'meta.delimiter.method.period.js' 330 + '2': 331 + 'name': 'entity.name.function.js' 332 + '3': 333 + 'name': 'keyword.operator.assignment.js' 334 + } 335 + { 336 + 'include': '#function_innards' 337 + } 338 + ] 339 + } 340 + ] 341 + } 342 + { 343 + # foo: function... 344 + 'begin': '(?=\\b[a-zA-Z_$][\\w$]*\\s*:\\s*(\\basync\\b\\s*)?\\bfunction\\b)' 345 + 'end': '(?<=})' 346 + 'patterns': [ 347 + { 348 + 'include': '#comments' 349 + } 350 + { 351 + 'include': '#function_body' 352 + } 353 + { 354 + 'begin': '\\G' 355 + 'end': '(?<=\\))' 356 + 'name': 'meta.function.json.js' 357 + 'patterns': [ 358 + { 359 + 'match': '\\b([a-zA-Z_$][\\w$]*)\\s*(:)\\s*' 360 + 'captures': 361 + '1': 362 + 'name': 'entity.name.function.js' 363 + '2': 364 + 'name': 'keyword.operator.assignment.js' 365 + } 366 + { 367 + 'include': '#function_innards' 368 + } 369 + ] 370 + } 371 + ] 372 + } 373 + { 374 + # "foo": function... 375 + 'begin': '(?=((\'[^\']*?\')|("[^"]*?"))\\s*:\\s*(\\basync\\b\\s*)?\\bfunction\\b)' 376 + 'end': '(?<=})' 377 + 'patterns': [ 378 + { 379 + 'include': '#comments' 380 + } 381 + { 382 + 'include': '#function_body' 383 + } 384 + { 385 + 'begin': '\\G' 386 + 'end': '(?<=\\))' 387 + 'name': 'meta.function.json.js' 388 + 'patterns': [ 389 + { 390 + 'match': '(?:((\')([^\']*?)(\'))|((")([^"]*?)(")))\\s*(:)' 391 + 'captures': 392 + '1': 393 + 'name': 'string.quoted.single.js' 394 + '2': 395 + 'name': 'punctuation.definition.string.begin.js' 396 + '3': 397 + 'name': 'entity.name.function.js' 398 + '4': 399 + 'name': 'punctuation.definition.string.end.js' 400 + '5': 401 + 'name': 'string.quoted.double.js' 402 + '6': 403 + 'name': 'punctuation.definition.string.begin.js' 404 + '7': 405 + 'name': 'entity.name.function.js' 406 + '8': 407 + 'name': 'punctuation.definition.string.end.js' 408 + '9': 409 + 'name': 'keyword.operator.assignment.js' 410 + } 411 + { 412 + 'include': '#function_innards' 413 + } 414 + ] 415 + } 416 + ] 417 + } 418 + { 419 + 'begin': '(?=\\b(constructor)\\s*)' 420 + 'end': '(?<=})' 421 + 'patterns': [ 422 + { 423 + 'include': '#comments' 424 + } 425 + { 426 + 'include': '#function_body' 427 + } 428 + { 429 + 'begin': '\\G' 430 + 'end': '(?<=\\))' 431 + 'name': 'meta.function.js' 432 + 'patterns': [ 433 + { 434 + 'match': '\\b(constructor)\\s*' 435 + 'name': 'entity.name.function.constructor.js' 436 + } 437 + { 438 + 'include': '#function_innards' 439 + } 440 + ] 441 + } 442 + ] 443 + } 444 + { 445 + # ES6 method definitions: foo() {} 446 + 'begin': '''(?x) 447 + (?= 448 + (?! 449 + (break|case|catch|continue|do|else|finally|for|function|if|export| 450 + import|package|return|switch|throw|try|while|with) 451 + [\\s\\(] 452 + ) 453 + \\b[a-zA-Z_$][\\w$]* 454 + \\s*\\(\\s* 455 + (("[^"]*")|(\\'[^\\']*\\')|((?!"|\\'|\\(|\\)).))* 456 + \\)\\s*\\{ 457 + ) 458 + ''' 459 + 'end': '(?<=})' 460 + 'patterns': [ 461 + { 462 + 'include': '#comments' 463 + } 464 + { 465 + 'include': '#function_body' 466 + } 467 + { 468 + 'begin': '\\G' 469 + 'end': '(?<=\\))' 470 + 'name': 'meta.function.method.definition.js' 471 + 'patterns': [ 472 + { 473 + 'match': '\\b([a-zA-Z_$][\\w$]*)' 474 + 'name': 'entity.name.function.js' 475 + } 476 + { 477 + 'include': '#function_params' 478 + } 479 + ] 480 + } 481 + ] 482 + } 483 + { 484 + # [param|(params)] => [expression|{statements}] 485 + 'begin': '''(?x) 486 + (?= 487 + (?<![A-Za-z0-9]) 488 + ((\\(([^\\(\\)]*)?\\))|[\\w$]+) 489 + \\s*=> 490 + ) 491 + ''' 492 + 'end': '''(?x) 493 + (?<=})| 494 + ((?! 495 + \\s*{| 496 + \\G\\(| 497 + \\G[\\w$]+| 498 + \\s*/\\*|\\s*// 499 + )(?=\\s*\\S)) 500 + ''' 501 + 'patterns': [ 502 + { 503 + 'include': '#comments' 504 + } 505 + { 506 + 'include': '#function_body' 507 + } 508 + { 509 + 'begin': '\\G' 510 + 'end': '(?<=(=>))' 511 + 'name': 'meta.function.arrow.js' 512 + 'patterns': [ 513 + { 514 + 'include': '#arrow_function_innards' 515 + } 516 + ] 517 + } 518 + ] 519 + } 520 + { 521 + # [.]foo = ... => ... 522 + 'begin': '''(?x) 523 + (?= 524 + (\\.)?[a-zA-Z_$][\\w$]* 525 + \\s*(=)\\s* 526 + ((\\(([^\\(\\)]*)?\\))|[\\w$]+) 527 + \\s*=> 528 + ) 529 + ''' 530 + 'end': '''(?x) 531 + (?<=})| 532 + ((?! 533 + \\s*{| 534 + \\G(\\.)?[a-zA-Z_$][\\w$]*\\s*(=)\\s*\\(| 535 + \\G(\\.)?[a-zA-Z_$][\\w$]*\\s*(=)\\s*[\\w$]+| 536 + \\s*/\\*|\\s*// 537 + )(?=\\s*\\S)) 538 + ''' 539 + 'patterns': [ 540 + { 541 + 'include': '#comments' 542 + } 543 + { 544 + 'include': '#function_body' 545 + } 546 + { 547 + 'begin': '\\G' 548 + 'end': '(?<=(=>))' 549 + 'name': 'meta.function.arrow.js' 550 + 'patterns': [ 551 + { 552 + 'match': '\\G(\\.)?([a-zA-Z_$][\\w$]*)\\s*(=)' 553 + 'captures': 554 + '1': 555 + 'name': 'meta.delimiter.method.period.js' 556 + '2': 557 + 'name': 'entity.name.function.js' 558 + '3': 559 + 'name': 'keyword.operator.assignment.js' 560 + } 561 + { 562 + 'include': '#arrow_function_innards' 563 + } 564 + ] 565 + } 566 + ] 567 + } 568 + { 569 + # foo: ... => ... 570 + 'begin': '''(?x) 571 + (?= 572 + \\b[a-zA-Z_$][\\w$]* 573 + \\s*:\\s* 574 + ((\\(([^\\(\\)]*)?\\))|[\\w$]+) 575 + \\s*=> 576 + ) 577 + ''' 578 + 'end': '''(?x) 579 + (?<=})| 580 + ((?! 581 + \\s*{| 582 + \\G[\\w$]+:| 583 + \\s*/\\*|\\s*// 584 + )(?=\\s*\\S)) 585 + ''' 586 + 'patterns': [ 587 + { 588 + 'include': '#comments' 589 + } 590 + { 591 + 'include': '#function_body' 592 + } 593 + { 594 + 'begin': '\\G' 595 + 'end': '(?<=(=>))' 596 + 'name': 'meta.function.arrow.json.js' 597 + 'patterns': [ 598 + { 599 + 'match': '\\b([a-zA-Z_$][\\w$]*)\\s*(:)\\s*' 600 + 'captures': 601 + '1': 602 + 'name': 'entity.name.function.js' 603 + '2': 604 + 'name': 'keyword.operator.assignment.js' 605 + } 606 + { 607 + 'include': '#arrow_function_innards' 608 + } 609 + ] 610 + } 611 + ] 612 + } 613 + { 614 + # "foo": ... => ... 615 + 'begin': '''(?x) 616 + (?= 617 + ((\'[^\']*?\')|("[^"]*?")) 618 + \\s*:\\s* 619 + ((\\(([^\\(\\)]*)?\\))|[\\w$]+) 620 + \\s*=> 621 + ) 622 + ''' 623 + 'end': '''(?x) 624 + (?<=})| 625 + ((?! 626 + \\G((\'[^\']*?\')|("[^"]*?"))| 627 + \\s*{| 628 + \\s*/\\*|\\s*// 629 + )(?=\\s*\\S)) 630 + ''' 631 + 'patterns': [ 632 + { 633 + 'include': '#comments' 634 + } 635 + { 636 + 'include': '#function_body' 637 + } 638 + { 639 + 'begin': '\\G' 640 + 'end': '(?<=(=>))' 641 + 'name': 'meta.function.arrow.json.js' 642 + 'patterns': [ 643 + { 644 + 'match': '(?:((\')([^\']*?)(\'))|((")([^"]*?)(")))\\s*(:)' 645 + 'captures': 646 + '1': 647 + 'name': 'string.quoted.single.js' 648 + '2': 649 + 'name': 'punctuation.definition.string.begin.js' 650 + '3': 651 + 'name': 'entity.name.function.js' 652 + '4': 653 + 'name': 'punctuation.definition.string.end.js' 654 + '5': 655 + 'name': 'string.quoted.double.js' 656 + '6': 657 + 'name': 'punctuation.definition.string.begin.js' 658 + '7': 659 + 'name': 'entity.name.function.js' 660 + '8': 661 + 'name': 'punctuation.definition.string.end.js' 662 + '9': 663 + 'name': 'keyword.operator.assignment.js' 664 + } 665 + { 666 + 'include': '#arrow_function_innards' 667 + } 668 + ] 669 + } 670 + ] 671 + } 672 + { 673 + 'match': '(=>)' 674 + 'captures': 675 + '0': 676 + 'name': 'meta.function.arrow.js' 677 + '1': 678 + 'name': 'storage.type.function.arrow.js' 679 + } 680 + { 681 + 'match': '''(?x) 682 + \\b(class) 683 + (?: 684 + (?:\\s+(extends)\\s+([a-zA-Z_$][\\w$]*)) 685 + | 686 + (?: 687 + (?:\\s+([a-zA-Z_$][\\w$]*)) 688 + (?:\\s+(extends)\\s+([a-zA-Z_$][\\w$]*))? 689 + ) 690 + ) 691 + ''' 692 + 'captures': 693 + '1': 694 + 'name': 'storage.type.class.js' 695 + '2': 696 + 'name': 'storage.modifier.js' 697 + '3': 698 + 'name': 'entity.other.inherited-class.js' 699 + '4': 700 + 'name': 'entity.name.type.class.js' 701 + '5': 702 + 'name': 'storage.modifier.js' 703 + '6': 704 + 'name': 'entity.other.inherited-class.js' 705 + 'name': 'meta.class.js' 706 + } 707 + { 708 + 'captures': 709 + '1': 710 + 'name': 'keyword.operator.new.js' 711 + '2': 712 + 'name': 'entity.name.type.instance.js' 713 + 'match': '(new)\\s+(\\$?\\w+(?:\\.\\w*)?)' 714 + 'name': 'meta.class.instance.constructor' 715 + } 716 + { 717 + # console 718 + # console.log(arg1, "arg2", [...]) 719 + 'begin': '(?<![\\w$])console(?![\\w$]|\\s*:)' 720 + 'beginCaptures': 721 + '0': 722 + 'name': 'entity.name.type.object.console.js' 723 + 'end': '''(?x) 724 + (?<=\\)) | (?= 725 + (?! (\\s*//)|(\\s*/\\*)|(\\s*(\\.)\\s* 726 + (assert|clear|debug|error|info|log|profile|profileEnd|time|timeEnd|warn) 727 + \\s*\\( 728 + )) \\s*\\S 729 + ) 730 + ''' 731 + 'patterns': [ 732 + { 733 + 'include': '#comments' 734 + } 735 + { 736 + 'begin': '\\s*(\\.)\\s*(\\w+)\\s*(?=\\()' 737 + 'beginCaptures': 738 + '1': 739 + 'name': 'meta.delimiter.method.period.js' 740 + '2': 741 + 'name': 'support.function.console.js' 742 + 'end': '(?<=\\))' 743 + 'name': 'meta.method-call.js' 744 + 'patterns': [ 745 + { 746 + 'include': '#arguments' 747 + } 748 + ] 749 + } 750 + ] 751 + } 752 + { 753 + # Math 754 + 'begin': '(?<![\\w$])Math(?![\\w$]|\\s*:)' 755 + 'beginCaptures': 756 + '0': 757 + 'name': 'support.class.math.js' 758 + 'end': '''(?x) 759 + (?<=E|LN10|LN2|LOG10E|LOG2E|PI|SQRT1_2|SQRT2|\\) 760 + ) | (?= 761 + (?! (\\s*//)|(\\s*/\\*)|(\\s*\\.\\s* ( 762 + ((abs|acos|acosh|asin|asinh|atan|atan2|atanh|cbrt|ceil|clz32|cos|cosh|exp| 763 + expm1|floor|fround|hypot|imul|log|log10|log1p|log2|max|min|pow|random| 764 + round|sign|sin|sinh|sqrt|tan|tanh|trunc)\\s*\\( 765 + ) | (E|LN10|LN2|LOG10E|LOG2E|PI|SQRT1_2|SQRT2)(?!\\s*[\\w$(])) 766 + )) \\s*\\S 767 + ) 768 + ''' 769 + 'patterns': [ 770 + { 771 + 'include': '#comments' 772 + } 773 + { 774 + # Math.random() 775 + 'begin': '\\s*(\\.)\\s*(\\w+)\\s*(?=\\()' 776 + 'beginCaptures': 777 + '1': 778 + 'name': 'meta.delimiter.method.period.js' 779 + '2': 780 + 'name': 'support.function.math.js' 781 + 'end': '(?<=\\))' 782 + 'name': 'meta.method-call.js' 783 + 'patterns': [ 784 + { 785 + 'include': '#arguments' 786 + } 787 + ] 788 + } 789 + { 790 + # Math.PI 791 + 'match': '\\s*(\\.)\\s*(\\w+)\\b' 792 + 'captures': 793 + '1': 794 + 'name': 'meta.delimiter.property.period.js' 795 + '2': 796 + 'name': 'support.constant.property.math.js' 797 + } 798 + ] 799 + } 800 + { 801 + 'include': '#strings' 802 + } 803 + { 804 + 'include': '#comments' 805 + } 806 + { 807 + 'captures': 808 + '0': 809 + 'name': 'punctuation.definition.comment.html.js' 810 + '2': 811 + 'name': 'punctuation.definition.comment.html.js' 812 + 'match': '(<!--|-->)' 813 + 'name': 'comment.block.html.js' 814 + } 815 + { 816 + 'match': '(?<!\\.)\\b(class|enum|function|interface)(?!\\s*:)\\b' 817 + 'name': 'storage.type.js' 818 + } 819 + { 820 + 'match': '(?<!\\.)\\b(async|export|extends|implements|private|protected|public|static)(?!\\s*:)\\b' 821 + 'name': 'storage.modifier.js' 822 + } 823 + { 824 + 'match': '(?<!\\.)\\b(let|var)(?!\\s*:)\\b' 825 + 'name': 'storage.type.var.js' 826 + } 827 + { 828 + 'begin': '(?<!\\.)\\b(const)(?!\\s*:)\\b' 829 + 'beginCaptures': 830 + '1': 831 + 'name': 'storage.modifier.js' 832 + 'end': '(\\bof\\b|\\bin\\b)|(;)|(=)|(?<![,{])\\n' 833 + 'endCaptures': 834 + '1': 835 + 'name': 'keyword.operator.$1.js' 836 + '2': 837 + 'name': 'punctuation.terminator.statement.js' 838 + '3': 839 + 'name': 'keyword.operator.assignment.js' 840 + 'patterns': [ 841 + { 842 + 'match': '([$_a-zA-Z][$_a-zA-Z0-9]*)\\s*(:)\\s*([$_a-zA-Z][$_a-zA-Z0-9]*)?' 843 + 'captures': 844 + '2': 845 + 'name': 'keyword.operator.assignment.js' 846 + '3': 847 + 'name': 'constant.other.js' 848 + } 849 + { 850 + 'match': '([$_a-zA-Z][$_a-zA-Z0-9]*)' 851 + 'captures': 852 + '1': 853 + 'name': 'constant.other.js' 854 + } 855 + { 856 + 'match': '\\.\\.\\.' 857 + 'name': 'keyword.operator.spread.js' 858 + } 859 + { 860 + 'match': ',' 861 + 'name': 'meta.delimiter.object.comma.js' 862 + } 863 + { 864 + 'match': '\\(|\\)' 865 + 'name': 'meta.brace.round.js' 866 + } 867 + { 868 + 'match': '{|}' 869 + 'name': 'meta.brace.curly.js' 870 + } 871 + { 872 + 'match': '\\[|\\]' 873 + 'name': 'meta.brace.square.js' 874 + } 875 + { 876 + 'include': '#comments' 877 + } 878 + ] 879 + } 880 + { 881 + 'match': '(?<!\\.)\\b(yield)(?!\\s*:)\\b(?:\\s*(\\*))?|(?<=\\?)(?:\\s*)(yield)(?=\\s*:)', 882 + 'captures': 883 + '1': 884 + 'name': 'keyword.control.js' 885 + '2': 886 + 'name': 'storage.modifier.js' 887 + '3': 888 + 'name': 'keyword.control.js' 889 + '4': 890 + 'name': 'storage.modifier.js' 891 + 'name': 'meta.control.yield.js' 892 + } 893 + { 894 + 'match': '(?<!\\.)\\b(await|break|case|catch|continue|do|else|finally|for|if|import|from|package|return|switch|throw|try|while|with)(?!\\s*:)\\b' 895 + 'name': 'keyword.control.js' 896 + } 897 + { 898 + 'match': '(?<!\\.)\\b(default)\\b' 899 + 'name': 'keyword.control.js' 900 + } 901 + { 902 + 'match': '(?<!\\.)\\b(delete|in|of|instanceof|new|typeof|void)(?!\\s*:)\\b' 903 + 'name': 'keyword.operator.$1.js' 904 + } 905 + { 906 + 'match': '\\.\\.\\.' 907 + 'name': 'keyword.operator.spread.js' 908 + } 909 + { 910 + 'match': '(?<!\\.)\\b(true|false)(?!\\s*:)\\b|(?<=\\?)(?:\\s*)(true|false)(?=\\s*:)' 911 + 'captures': 912 + '1': 913 + 'name': 'constant.language.boolean.$1.js' 914 + '2': 915 + 'name': 'constant.language.boolean.$2.js' 916 + } 917 + { 918 + 'match': '(?<!\\.)\\b(null)(?!\\s*:)\\b|(?<=\\?)(?:\\s*)(null)(?=\\s*:)' 919 + 'captures': 920 + '1': 921 + 'name': 'constant.language.null.js' 922 + '2': 923 + 'name': 'constant.language.null.js' 924 + } 925 + { 926 + 'match': '(?<!\\.)\\b(debugger)(?!\\s*:)\\b|(?<=\\?)(?:\\s*)(debugger)(?=\\s*:)' 927 + 'captures': 928 + '1': 929 + 'name': 'keyword.other.js' 930 + '2': 931 + 'name': 'keyword.other.js' 932 + } 933 + { 934 + 'match': '(?<!\\$)\\b(Anchor|Applet|Area|Array|Boolean|Button|Checkbox|Date|document|event|FileUpload|Form|Frame|Function|Hidden|History|Image|JavaArray|JavaClass|JavaObject|JavaPackage|java|Layer|Link|Location|Map|MimeType|Number|navigator|netscape|Object|Option|Packages|Password|Plugin|performance|Radio|RegExp|Reset|Select|Set|String|Style|Submit|Symbol|screen|sun|Text|Textarea|WeakMap|WeakSet|window|XMLHttpRequest)\\b' 935 + 'name': 'support.class.js' 936 + } 937 + { 938 + 'match': '(\\.)(systemLanguage|scripts|scrollbars|screenX|screenY|screenTop|screenLeft|style|styleSheets|status|statusText|statusbar|siblingBelow|siblingAbove|source|suffixes|security|securityPolicy|selection|self|history|host|hostname|hash|hasFocus|XMLDocument|XSLDocument|next|namespaces|namespaceURI|nameProp|MIN_VALUE|MAX_VALUE|characterSet|constructor|controllers|cookieEnabled|colorDepth|components|complete|current|cpuClass|clip|clipBoardData|clientInformation|closed|classes|callee|caller|crypto|toolbar|top|textTransform|textIndent|textDecoration|textAlign|tags|innerHeight|innerWidth|input|ids|ignoreCase|zIndex|oscpu|onreadystatechange|onLine|outerHeight|outerWidth|opsProfile|opener|offscreenBuffering|NEGATIVE_INFINITY|display|dialogHeight|dialogTop|dialogWidth|dialogLeft|dialogArguments|directories|description|defaultStatus|defaultChecked|defaultCharset|defaultView|userProfile|userLanguage|userAgent|uniqueID|undefined|updateInterval|_content|pixelDepth|port|personalbar|pkcs11|plugins|platform|pathname|paddingRight|paddingBottom|paddingTop|paddingLeft|parent|parentWindow|parentLayer|pageX|pageXOffset|pageY|pageYOffset|protocol|prototype|product|productSub|prompter|previous|prefix|encoding|enabledPlugin|external|expando|embeds|visiblity|vendor|vendorSub|vLinkcolor|URLUnencoded|POSITIVE_INFINITY|filename|fontSize|fontFamily|fontWeight|formName|frames|frameElement|fgColor|whiteSpace|listStyleType|lineHeight|linkColor|location|locationbar|localName|lowsrc|length|left|leftContext|lastModified|lastMatch|lastIndex|lastParen|layers|layerX|language|appMinorVersion|appName|appCodeName|appCore|appVersion|availHeight|availTop|availWidth|availLeft|all|arity|arguments|aLinkcolor|above|right|rightContext|responseXML|responeText|readyState|global|x|y|z|mimeTypes|multiline|menubar|marginRight|marginBottom|marginTop|marginLeft|bottom|border(Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth)|bufferDepth|below|backgroundColor|backgroundImage)\\b' 939 + 'captures': 940 + '1': 941 + 'name': 'meta.delimiter.property.period.js' 942 + '2': 943 + 'name': 'support.constant.js' 944 + } 945 + { 946 + 'match': '(\\.)(shape|systemId|scheme|scope|scrolling|standby|start|size|summary|specified|sectionRowIndex|selected|selectedIndex|hspace|httpEquiv|htmlFor|height|headers|href|hreflang|noResize|notations|notationName|noShade|noHref|nodeName|nodeType|nodeValue|noWrap|nextSibling|name|ch|childNodes|chOff|checked|charset|cite|content|cookie|cords|code|codeBase|codeType|cols|colSpan|color|compact|cells|cellSpacing|cellPadding|clear|className|caption|type|tBodies|title|tHead|text|target|tagName|tFoot|isMap|index|id|implementation|images|options|ownerDocument|object|disabled|dir|doctype|documentElement|docmain|declare|defer|defaultSelected|defaultChecked|defaultValue|dateTime|data|useMap|publicId|parentNode|profile|profileend|prompt|previousDibling|enctype|entities|event|elements|vspace|version|value|valueType|vLink|vAlign|URL|firstChild|form|forms|face|frame|frameBorder|width|link|links|longDesc|lowSrc|lastChild|lang|label|anchors|accessKey|accept|acceptCharset|action|attributes|applets|alt|align|archive|areas|axis|aLink|abbr|rows|rowSpan|rowIndex|rules|rev|referrer|rel|readOnly|multiple|method|media|marginHeight|marginWidth|maxLength|body|border|background|bgColor)\\b' 947 + 'captures': 948 + '1': 949 + 'name': 'meta.delimiter.property.period.js' 950 + '2': 951 + 'name': 'support.constant.dom.js' 952 + } 953 + { 954 + 'match': '\\b(ELEMENT_NODE|ATTRIBUTE_NODE|TEXT_NODE|CDATA_SECTION_NODE|ENTITY_REFERENCE_NODE|ENTITY_NODE|PROCESSING_INSTRUCTION_NODE|COMMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE|DOCUMENT_FRAGMENT_NODE|NOTATION_NODE|INDEX_SIZE_ERR|DOMSTRING_SIZE_ERR|HIERARCHY_REQUEST_ERR|WRONG_DOCUMENT_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR|NOT_SUPPORTED_ERR|INUSE_ATTRIBUTE_ERR)\\b' 955 + 'name': 'support.constant.dom.js' 956 + } 957 + { 958 + 'match': '(?<!\\.)\\b(module|exports|__filename|__dirname|global|process)(?!\\s*:)\\b|(?<=\\?)(?:\\s*)(module|exports|__filename|__dirname|global|process)(?=\\s*:)' 959 + 'captures': 960 + '1': 961 + 'name': 'support.variable.js' 962 + '2': 963 + 'name': 'support.variable.js' 964 + } 965 + { 966 + 'match': '\\b(Infinity|NaN|undefined)\\b' 967 + 'name': 'constant.language.js' 968 + } 969 + { 970 + 'begin': '(?<=[\\[=(?:+,!]|^|return|=>|&&|\\|\\|)\\s*(/)(?![/*+{}?])(?=.*/)' 971 + 'beginCaptures': 972 + '1': 973 + 'name': 'punctuation.definition.string.begin.js' 974 + 'end': '(/)[gimuy]*' 975 + 'endCaptures': 976 + '1': 977 + 'name': 'punctuation.definition.string.end.js' 978 + 'name': 'string.regexp.js' 979 + 'patterns': [ 980 + { 981 + 'include': 'source.js.regexp' 982 + } 983 + ] 984 + } 985 + { 986 + 'include': '#operators' 987 + } 988 + { 989 + 'include': '#method_calls' 990 + } 991 + { 992 + 'include': '#function_calls' 993 + } 994 + { 995 + 'include': '#numbers' 996 + } 997 + { 998 + 'include': '#objects' 999 + } 1000 + { 1001 + 'include': '#properties' 1002 + } 1003 + { 1004 + 'match': '(?<!\\.)\\b([A-Z][A-Z0-9_]+)(?!\\s*:)\\b|(?<=\\?)(?:\\s*)([A-Z][A-Z0-9_]+)(?=\\s*:)' 1005 + 'captures': 1006 + '1': 1007 + 'name': 'constant.other.js' 1008 + '2': 1009 + 'name': 'constant.other.js' 1010 + } 1011 + { 1012 + 'match': '(?<!\\$)\\b[0-9]+[\\w$]*' 1013 + 'name': 'invalid.illegal.identifier.js' 1014 + } 1015 + { 1016 + 'match': '\\;' 1017 + 'name': 'punctuation.terminator.statement.js' 1018 + } 1019 + { 1020 + 'match': ',' 1021 + 'name': 'meta.delimiter.object.comma.js' 1022 + } 1023 + { 1024 + 'match': '\\.' 1025 + 'name': 'meta.delimiter.method.period.js' 1026 + } 1027 + { 1028 + 'captures': 1029 + '1': 1030 + 'name': 'punctuation.section.scope.begin.js' 1031 + '2': 1032 + 'name': 'punctuation.section.scope.end.js' 1033 + 'comment': 'Allows the special return snippet to fire.' 1034 + 'match': '({)(})' 1035 + } 1036 + { 1037 + 'begin': '{' 1038 + 'beginCaptures': 1039 + '0': 1040 + 'name': 'meta.brace.curly.js' 1041 + 'end': '}' 1042 + 'endCaptures': 1043 + '0': 1044 + 'name': 'meta.brace.curly.js' 1045 + 'patterns': [ 1046 + { 1047 + 'include': '$self' 1048 + } 1049 + ] 1050 + } 1051 + { 1052 + 'begin': '\\(' 1053 + 'beginCaptures': 1054 + '0': 1055 + 'name': 'meta.brace.round.js' 1056 + 'end': '\\)' 1057 + 'endCaptures': 1058 + '0': 1059 + 'name': 'meta.brace.round.js' 1060 + 'patterns': [ 1061 + { 1062 + 'include': '$self' 1063 + } 1064 + ] 1065 + } 1066 + { 1067 + 'match': '\\[|\\]' 1068 + 'name': 'meta.brace.square.js' 1069 + } 1070 + { 1071 + 'match': '\\A#!.*$' 1072 + 'name': 'comment.line.shebang.js' 1073 + } 1074 + ] 1075 + 'repository': 1076 + 'numbers': 1077 + 'patterns': [ 1078 + { 1079 + 'match': '\\b(?<!\\$)0(x|X)[0-9a-fA-F]+\\b(?!\\$)' 1080 + 'name': 'constant.numeric.hex.js' 1081 + } 1082 + { 1083 + 'match': '\\b(?<!\\$)0(b|B)[01]+\\b(?!\\$)' 1084 + 'name': 'constant.numeric.binary.js' 1085 + } 1086 + { 1087 + 'match': '\\b(?<!\\$)0(o|O)?[0-7]+\\b(?!\\$)' 1088 + 'name': 'constant.numeric.octal.js' 1089 + } 1090 + { 1091 + 'match': '''(?x) 1092 + (?<!\\$)(?: 1093 + (?:\\b[0-9]+(\\.)[0-9]+[eE][+-]?[0-9]+\\b)| # 1.1E+3 1094 + (?:\\b[0-9]+(\\.)[eE][+-]?[0-9]+\\b)| # 1.E+3 1095 + (?:\\B(\\.)[0-9]+[eE][+-]?[0-9]+\\b)| # .1E+3 1096 + (?:\\b[0-9]+[eE][+-]?[0-9]+\\b)| # 1E+3 1097 + (?:\\b[0-9]+(\\.)[0-9]+\\b)| # 1.1 1098 + (?:\\b[0-9]+(\\.)\\B)| # 1. 1099 + (?:\\B(\\.)[0-9]+\\b)| # .1 1100 + (?:\\b[0-9]+\\b(?!\\.)) # 1 1101 + )(?!\\$) 1102 + ''' 1103 + 'captures': 1104 + '0': 1105 + 'name': 'constant.numeric.decimal.js' 1106 + '1': 1107 + 'name': 'meta.delimiter.decimal.period.js' 1108 + '2': 1109 + 'name': 'meta.delimiter.decimal.period.js' 1110 + '3': 1111 + 'name': 'meta.delimiter.decimal.period.js' 1112 + '4': 1113 + 'name': 'meta.delimiter.decimal.period.js' 1114 + '5': 1115 + 'name': 'meta.delimiter.decimal.period.js' 1116 + '6': 1117 + 'name': 'meta.delimiter.decimal.period.js' 1118 + } 1119 + ] 1120 + 'operators': 1121 + 'patterns': [ 1122 + { 1123 + 'match': '%=|\\+=|-=|\\*=|(?<!\\()/=' 1124 + 'name': 'keyword.operator.assignment.compound.js' 1125 + } 1126 + { 1127 + 'match': '&=|\\^=|<<=|>>=|>>>=|\\|=' 1128 + 'name': 'keyword.operator.assignment.compound.bitwise.js' 1129 + } 1130 + { 1131 + 'match': '!==|!=|<=|>=|===|==|<|>' 1132 + 'name': 'keyword.operator.comparison.js' 1133 + } 1134 + { 1135 + 'match': '&&|!|\\|\\|' 1136 + 'name': 'keyword.operator.logical.js' 1137 + } 1138 + { 1139 + 'match': '&|\\||\\^|~' 1140 + 'name': 'keyword.operator.bitwise.js' 1141 + } 1142 + { 1143 + 'match': '\\?|:' 1144 + 'name': 'keyword.operator.js' 1145 + } 1146 + { 1147 + 'match': '=' 1148 + 'name': 'keyword.operator.assignment.js' 1149 + } 1150 + { 1151 + 'match': '--' 1152 + 'name': 'keyword.operator.decrement.js' 1153 + } 1154 + { 1155 + 'match': '\\+\\+' 1156 + 'name': 'keyword.operator.increment.js' 1157 + } 1158 + { 1159 + 'match': '%|\\*|/|-|\\+' 1160 + 'name': 'keyword.operator.js' 1161 + } 1162 + ] 1163 + 'strings': 1164 + 'patterns': [ 1165 + { 1166 + 'begin': '\'' 1167 + 'beginCaptures': 1168 + '0': 1169 + 'name': 'punctuation.definition.string.begin.js' 1170 + 'end': '\'' 1171 + 'endCaptures': 1172 + '0': 1173 + 'name': 'punctuation.definition.string.end.js' 1174 + 'name': 'string.quoted.single.js' 1175 + 'patterns': [ 1176 + { 1177 + 'match': '\\\\(x\\h{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)' 1178 + 'name': 'constant.character.escape.js' 1179 + } 1180 + { 1181 + 'match': "[^']*[^\\n\\r'\\\\]$" 1182 + 'name': 'invalid.illegal.string.js' 1183 + } 1184 + ] 1185 + } 1186 + { 1187 + 'begin': '"' 1188 + 'beginCaptures': 1189 + '0': 1190 + 'name': 'punctuation.definition.string.begin.js' 1191 + 'end': '"' 1192 + 'endCaptures': 1193 + '0': 1194 + 'name': 'punctuation.definition.string.end.js' 1195 + 'name': 'string.quoted.double.js' 1196 + 'patterns': [ 1197 + { 1198 + 'match': '\\\\(x\\h{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)' 1199 + 'name': 'constant.character.escape.js' 1200 + } 1201 + { 1202 + 'match': '[^"]*[^\\n\\r"\\\\]$' 1203 + 'name': 'invalid.illegal.string.js' 1204 + } 1205 + ] 1206 + } 1207 + { 1208 + 'begin': '((\\w+)?(html|HTML|Html))\\s*(`)' 1209 + 'beginCaptures': 1210 + '1': 1211 + 'name': 'entity.name.function.js' 1212 + '4': 1213 + 'name': 'punctuation.definition.string.begin.js' 1214 + 'end': '`' 1215 + 'endCaptures': 1216 + '0': 1217 + 'name': 'punctuation.definition.string.end.js' 1218 + 'name': 'string.quoted.template.html.js' 1219 + 'patterns': [ 1220 + { 1221 + 'match': '\\\\(x\\h{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)' 1222 + 'name': 'constant.character.escape.js' 1223 + } 1224 + { 1225 + 'include': '#interpolated_js' 1226 + } 1227 + { 1228 + 'include': 'text.html.basic' 1229 + } 1230 + ] 1231 + } 1232 + { 1233 + 'begin': '(Relay\\.QL)\\s*(`)' 1234 + 'beginCaptures': 1235 + '1': 1236 + 'name': 'entity.name.function.js' 1237 + '2': 1238 + 'name': 'punctuation.definition.string.begin.js' 1239 + 'end': '`' 1240 + 'endCaptures': 1241 + '0': 1242 + 'name': 'punctuation.definition.string.end.js' 1243 + 'name': 'string.quoted.template.graphql.js' 1244 + 'patterns': [ 1245 + { 1246 + 'match': '\\\\(x\\h{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)' 1247 + 'name': 'constant.character.escape.js' 1248 + } 1249 + { 1250 + 'include': '#interpolated_js' 1251 + } 1252 + { 1253 + 'include': 'source.graphql' 1254 + } 1255 + ] 1256 + } 1257 + { 1258 + 'begin': '`' 1259 + 'beginCaptures': 1260 + '0': 1261 + 'name': 'punctuation.definition.string.begin.js' 1262 + 'end': '`' 1263 + 'endCaptures': 1264 + '0': 1265 + 'name': 'punctuation.definition.string.end.js' 1266 + 'name': 'string.quoted.template.js' 1267 + 'patterns': [ 1268 + { 1269 + 'match': '\\\\(x\\h{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)' 1270 + 'name': 'constant.character.escape.js' 1271 + } 1272 + { 1273 + 'include': '#interpolated_js' 1274 + } 1275 + ] 1276 + } 1277 + ] 1278 + 'function_params': 1279 + 'patterns': [ 1280 + { 1281 + 'begin': '\\(' 1282 + 'beginCaptures': 1283 + '0': 1284 + 'name': 'punctuation.definition.parameters.begin.bracket.round.js' 1285 + 'end': '\\)' 1286 + 'endCaptures': 1287 + '0': 1288 + 'name': 'punctuation.definition.parameters.end.bracket.round.js' 1289 + 'name': 'meta.parameters.js' 1290 + 'patterns': [ 1291 + { 1292 + 'match': '(\\.\\.\\.)([a-zA-Z_$][\\w$]*)' 1293 + 'captures': 1294 + '1': 1295 + 'name': 'keyword.operator.spread.js' 1296 + '2': 1297 + 'name': 'variable.parameter.rest.function.js' 1298 + } 1299 + { 1300 + 'include': '$self' 1301 + } 1302 + { 1303 + 'match': '[a-zA-Z_$][\\w$]*' 1304 + 'name': 'variable.parameter.function.js' 1305 + } 1306 + ] 1307 + } 1308 + ] 1309 + 'function_body': 1310 + 'patterns': [ 1311 + { 1312 + 'begin': '{' 1313 + 'beginCaptures': 1314 + '0': 1315 + 'name': 'punctuation.definition.function.body.begin.bracket.curly.js' 1316 + 'end': '}' 1317 + 'endCaptures': 1318 + '0': 1319 + 'name': 'punctuation.definition.function.body.end.bracket.curly.js' 1320 + 'patterns': [ 1321 + { 1322 + 'include': '$self' 1323 + } 1324 + ] 1325 + } 1326 + ] 1327 + 'function_innards': 1328 + 'patterns': [ 1329 + { 1330 + 'match': '(?:\\b(async)\\b\\s*)?\\b(function)\\b(?:\\s*(\\*))?' 1331 + 'captures': 1332 + '1': 1333 + 'name': 'storage.modifier.async.js' 1334 + '2': 1335 + 'name': 'storage.type.function.js' 1336 + '3': 1337 + 'name': 'storage.modifier.generator.js' 1338 + } 1339 + { 1340 + 'match': '[a-zA-Z_$][\\w$]*(?=\\s*\\()' 1341 + 'name': 'entity.name.function.js' 1342 + } 1343 + { 1344 + 'include': '#function_params' 1345 + } 1346 + { 1347 + 'include': '#comments' 1348 + } 1349 + ] 1350 + 'arrow_function_innards': 1351 + 'patterns': [ 1352 + { 1353 + 'match': '=>' 1354 + 'name': 'storage.type.function.arrow.js' 1355 + } 1356 + { 1357 + 'include': '#function_params' 1358 + } 1359 + { 1360 + 'match': '([a-zA-Z_$][\\w$]*)(?=\\s*=>)' 1361 + 'captures': 1362 + '0': 1363 + 'name': 'meta.parameters.js' 1364 + '1': 1365 + 'name': 'variable.parameter.function.js' 1366 + } 1367 + { 1368 + 'match': '(\\d[\\w$]*)' 1369 + 'captures': 1370 + '0': 1371 + 'name': 'meta.parameters.js' 1372 + '1': 1373 + 'name': 'invalid.illegal.identifier.js' 1374 + } 1375 + ] 1376 + 'arguments': 1377 + 'patterns': [ 1378 + { 1379 + 'begin': '\\(' 1380 + 'beginCaptures': 1381 + '0': 1382 + 'name': 'punctuation.definition.arguments.begin.bracket.round.js' 1383 + 'end': '\\)' 1384 + 'endCaptures': 1385 + '0': 1386 + 'name': 'punctuation.definition.arguments.end.bracket.round.js' 1387 + 'name': 'meta.arguments.js' 1388 + 'patterns': [ 1389 + { 1390 + 'include': '$self' 1391 + } 1392 + ] 1393 + } 1394 + ] 1395 + 'method_calls': 1396 + 'patterns': [ 1397 + { 1398 + # .methodCall(arg1, "arg2", [...]) 1399 + 'begin': '(\\.)\\s*([\\w$]+)\\s*(?=\\()' 1400 + 'beginCaptures': 1401 + '1': 1402 + 'name': 'meta.delimiter.method.period.js' 1403 + '2': 1404 + 'patterns': [ 1405 + { 1406 + 'match': '''(?x) 1407 + \\bon(Rowsinserted|Rowsdelete|Rowenter|Rowexit|Resize|Resizestart|Resizeend|Reset| 1408 + Readystatechange|Mouseout|Mouseover|Mousedown|Mouseup|Mousemove| 1409 + Before(cut|deactivate|unload|update|paste|print|editfocus|activate)| 1410 + Blur|Scrolltop|Submit|Select|Selectstart|Selectionchange|Hover|Help| 1411 + Change|Contextmenu|Controlselect|Cut|Cellchange|Clock|Close|Deactivate| 1412 + Datasetchanged|Datasetcomplete|Dataavailable|Drop|Drag|Dragstart|Dragover| 1413 + Dragdrop|Dragenter|Dragend|Dragleave|Dblclick|Unload|Paste|Propertychange|Error| 1414 + Errorupdate|Keydown|Keyup|Keypress|Focus|Load|Activate|Afterupdate|Afterprint|Abort)\\b 1415 + ''' 1416 + 'name': 'support.function.event-handler.js' 1417 + } 1418 + { 1419 + 'match': '''(?x) 1420 + \\b(shift|showModelessDialog|showModalDialog|showHelp|scroll|scrollX|scrollByPages| 1421 + scrollByLines|scrollY|scrollTo|stop|strike|sizeToContent|sidebar|signText|sort| 1422 + sup|sub|substr|substring|splice|split|send|set(Milliseconds|Seconds|Minutes|Hours| 1423 + Month|Year|FullYear|Date|UTC(Milliseconds|Seconds|Minutes|Hours|Month|FullYear|Date)| 1424 + Time|Hotkeys|Cursor|ZOptions|Active|Resizable|RequestHeader)|search|slice| 1425 + savePreferences|small|home|handleEvent|navigate|char|charCodeAt|charAt|concat| 1426 + contextual|confirm|compile|clear|captureEvents|call|createStyleSheet|createPopup| 1427 + createEventObject|to(GMTString|UTCString|String|Source|UpperCase|LowerCase|LocaleString)| 1428 + test|taint|taintEnabled|indexOf|italics|disableExternalCapture|dump|detachEvent|unshift| 1429 + untaint|unwatch|updateCommands|join|javaEnabled|pop|push|plugins.refresh|paddings|parse| 1430 + print|prompt|preference|enableExternalCapture|elementFromPoint|exec|execScript| 1431 + execCommand|valueOf|UTC|queryCommandState|queryCommandIndeterm|queryCommandEnabled| 1432 + queryCommandValue|find|file|fileModifiedDate|fileSize|fileCreatedDate|fileUpdatedDate| 1433 + fixed|fontsize|fontcolor|forward|fromCharCode|watch|link|load|lastIndexOf| 1434 + anchor|attachEvent|atob|apply|alert|abort|routeEvents| 1435 + resize|resizeBy|resizeTo|recalc|returnValue|replace|reverse|reload|releaseCapture| 1436 + releaseEvents|go|get(Milliseconds|Seconds|Minutes|Hours|Month|Day|Year|FullYear| 1437 + Time|Date|TimezoneOffset|UTC(Milliseconds|Seconds|Minutes|Hours|Day|Month|FullYear|Date)| 1438 + Attention|Selection|ResponseHeader|AllResponseHeaders)|moveBy|moveBelow|moveTo| 1439 + moveToAbsolute|moveAbove|mergeAttributes|match|margins|btoa|big|bold|borderWidths|blink|back)\\b 1440 + ''' 1441 + 'name': 'support.function.js' 1442 + } 1443 + { 1444 + 'match': '''(?x) 1445 + \\b(substringData|submit|splitText|setNamedItem|setAttribute|setAttributeNode|select| 1446 + hasChildNodes|hasFeature|namedItem|click|close|cloneNode|createComment|createCDATASection| 1447 + createCaption|createTHead|createTextNode|createTFoot|createDocumentFragment| 1448 + createProcessingInstruction|createEntityReference|createElement|createAttribute| 1449 + tabIndex|insertRow|insertBefore|insertCell|insertData|item|open|deleteRow|deleteCell| 1450 + deleteCaption|deleteTHead|deleteTFoot|deleteData|focus|write|writeln|add|appendChild| 1451 + appendData|reset|replaceChild|replaceData|move|moveNamedItem|moveChild|moveAttribute| 1452 + moveAttributeNode|getNamedItem|getElementsByName|getElementsByTagName|getElementById| 1453 + getAttribute|getAttributeNode|blur)\\b 1454 + ''' 1455 + 'name': 'support.function.dom.js' 1456 + } 1457 + { 1458 + 'match': "[a-zA-Z_$][\\w$]*" 1459 + 'name': 'entity.name.function.js' 1460 + } 1461 + { 1462 + 'match': '\\d[\\w$]*' 1463 + 'name': 'invalid.illegal.identifier.js' 1464 + } 1465 + ] 1466 + 'end': '(?<=\\))' 1467 + 'name': 'meta.method-call.js' 1468 + 'patterns': [ 1469 + { 1470 + 'include': '#arguments' 1471 + } 1472 + ] 1473 + } 1474 + ] 1475 + 'function_calls': 1476 + 'patterns': [ 1477 + { 1478 + # functionCall(arg1, "arg2", [...]) 1479 + 'begin': '([\\w$]+)\\s*(?=\\()' 1480 + 'beginCaptures': 1481 + '1': 1482 + 'patterns': [ 1483 + { 1484 + 'match': '''(?x) 1485 + \\b(isNaN|isFinite|eval|uneval|parseInt|parseFloat|decodeURI| 1486 + decodeURIComponent|encodeURI|encodeURIComponent|escape|unescape| 1487 + require|set(Interval|Timeout)|clear(Interval|Timeout))\\b 1488 + ''' 1489 + 'name': 'support.function.js' 1490 + } 1491 + { 1492 + 'match': "[a-zA-Z_$][\\w$]*" 1493 + 'name': 'entity.name.function.js' 1494 + } 1495 + { 1496 + 'match': '\\d[\\w$]*' 1497 + 'name': 'invalid.illegal.identifier.js' 1498 + } 1499 + ] 1500 + 'end': '(?<=\\))' 1501 + 'name': 'meta.function-call.js' 1502 + 'patterns': [ 1503 + { 1504 + 'include': '#arguments' 1505 + } 1506 + ] 1507 + } 1508 + ] 1509 + 'objects': 1510 + 'patterns': [ 1511 + { 1512 + # OBJ in OBJ.prop, OBJ.methodCall() 1513 + 'match': '[A-Z][A-Z0-9_$]*(?=\\s*\\.\\s*[a-zA-Z_$]\\w*)' 1514 + 'name': 'constant.other.object.js' 1515 + } 1516 + { 1517 + # obj in obj.prop, obj.methodCall() 1518 + 'match': '[a-zA-Z_$][\\w$]*(?=\\s*\\.\\s*[a-zA-Z_$]\\w*)' 1519 + 'name': 'variable.other.object.js' 1520 + } 1521 + ] 1522 + 'properties': 1523 + 'patterns': [ 1524 + { 1525 + # PROP1 in obj.PROP1.prop2, func().PROP1.prop2 1526 + 'match': '(\\.)\\s*([A-Z][A-Z0-9_$]*\\b\\$*)(?=\\s*\\.\\s*[a-zA-Z_$]\\w*)' 1527 + 'captures': 1528 + '1': 1529 + 'name': 'meta.delimiter.property.period.js' 1530 + '2': 1531 + 'name': 'constant.other.object.property.js' 1532 + } 1533 + { 1534 + # prop1 in obj.prop1.prop2, func().prop1.prop2 1535 + 'match': '(\\.)\\s*(\\$*[a-zA-Z_$][\\w$]*)(?=\\s*\\.\\s*[a-zA-Z_$]\\w*)' 1536 + 'captures': 1537 + '1': 1538 + 'name': 'meta.delimiter.property.period.js' 1539 + '2': 1540 + 'name': 'variable.other.object.property.js' 1541 + } 1542 + { 1543 + # PROP in obj.PROP, func().PROP 1544 + 'match': '(\\.)\\s*([A-Z][A-Z0-9_$]*\\b\\$*)' 1545 + 'captures': 1546 + '1': 1547 + 'name': 'meta.delimiter.property.period.js' 1548 + '2': 1549 + 'name': 'constant.other.property.js' 1550 + } 1551 + { 1552 + # prop in obj.prop, func().prop 1553 + 'match': '(\\.)\\s*(\\$*[a-zA-Z_$][\\w$]*)' 1554 + 'captures': 1555 + '1': 1556 + 'name': 'meta.delimiter.property.period.js' 1557 + '2': 1558 + 'name': 'variable.other.property.js' 1559 + } 1560 + { 1561 + # 123illegal in obj.123illegal, func().123illegal 1562 + 'match': '(\\.)\\s*([0-9][\\w$]*)' 1563 + 'captures': 1564 + '1': 1565 + 'name': 'meta.delimiter.property.period.js' 1566 + '2': 1567 + 'name': 'invalid.illegal.identifier.js' 1568 + } 1569 + ] 1570 + 'interpolated_js': 1571 + 'patterns': [ 1572 + { 1573 + 'begin': '\\$\\{' 1574 + 'captures': 1575 + '0': 1576 + 'name': 'punctuation.section.embedded.js' 1577 + 'end': '\\}' 1578 + 'name': 'source.js.embedded.source' 1579 + 'patterns': [ 1580 + { 1581 + 'begin': '{' 1582 + 'beginCaptures': 1583 + '0': 1584 + 'name': 'meta.brace.curly.js' 1585 + 'end': '}' 1586 + 'endCaptures': 1587 + '0': 1588 + 'name': 'meta.brace.curly.js' 1589 + 'patterns': [ 1590 + { 1591 + 'include': '$self' 1592 + } 1593 + ] 1594 + } 1595 + { 1596 + 'include': '$self' 1597 + } 1598 + ] 1599 + } 1600 + ] 1601 + 'docblock': 1602 + 'patterns': [ 1603 + { 1604 + 'match': '(?<!\\w)@(abstract|access|alias|augments|author|async|attribute|arg|argument|beta|borrows|bubbes|callback|class|classdesc|config|const|constant|constructs|constructor|copyright|chainable|default|defaultvalue|deprecated|desc|description|enum|emits|event|example|exports|external|extends|extension|extensionfor|extension_for|for|file|fileoverview|fires|final|function|global|host|ignore|implements|inheritdoc|inner|instance|interface|kind|lends|license|listens|main|member|memberof|method|mixex|mixin(?:s|)|module|name|namespace|override|overview|param|private|prop|property|protected|readonly|readOnly|requires|required|return|returns|see|since|static|summary|submodule|this|throws|todo|tutorial|type|typedef|var|variation|version|virtual|uses|writeOnce)\\b' 1605 + 'name': 'storage.type.class.jsdoc' 1606 + } 1607 + { 1608 + 'match': '({\\b(?:[a-zA-Z_$][a-zA-Z_$0-9]*)\\b})\\s\\b([a-zA-Z_$][a-zA-Z_$0-9]*)\\b\\s*((?:(?!\\*\\/).)*)' 1609 + 'captures': 1610 + 0: 1611 + 'name': 'other.meta.jsdoc' 1612 + 1: 1613 + 'name': 'entity.name.type.instance.jsdoc' 1614 + 2: 1615 + 'name': 'variable.other.jsdoc' 1616 + 3: 1617 + 'name': 'other.description.jsdoc' 1618 + } 1619 + ] 1620 + 'comments': 1621 + 'patterns': [ 1622 + { 1623 + 'begin': '/\\*\\*(?!/)' 1624 + 'captures': 1625 + '0': 1626 + 'name': 'punctuation.definition.comment.js' 1627 + 'patterns': [ 1628 + { 1629 + 'include': '#docblock' 1630 + } 1631 + ] 1632 + 'end': '\\*/' 1633 + 'name': 'comment.block.documentation.js' 1634 + } 1635 + { 1636 + 'begin': '/\\*' 1637 + 'captures': 1638 + '0': 1639 + 'name': 'punctuation.definition.comment.js' 1640 + 'end': '\\*/' 1641 + 'name': 'comment.block.js' 1642 + } 1643 + { 1644 + 'begin': '(^[ \\t]+)?(?=//)' 1645 + 'beginCaptures': 1646 + '1': 1647 + 'name': 'punctuation.whitespace.comment.leading.js' 1648 + 'end': '(?!\\G)' 1649 + 'patterns': [ 1650 + { 1651 + 'begin': '//' 1652 + 'beginCaptures': 1653 + '0': 1654 + 'name': 'punctuation.definition.comment.js' 1655 + 'end': '\\n' 1656 + 'name': 'comment.line.double-slash.js' 1657 + } 1658 + ] 1659 + } 1660 + ]
+24
grammars/regular expression replacement (javascript).cson
··· 1 + 'scopeName': 'source.js.regexp.replacement' 2 + 'name': 'Regular Expression Replacement (JavaScript)' 3 + 'fileTypes': [] 4 + 'patterns': [ 5 + { 6 + 'include': '#regexp-replacement' 7 + } 8 + ] 9 + 'repository': 10 + 'regexp-replacement': 11 + 'patterns': [ 12 + { 13 + 'match': '\\$([1-9][0-9]|[1-9]|0[1-9]|[&`\'])' 14 + 'name': 'variable.regexp.replacement' 15 + } 16 + { 17 + 'match': '\\$\\$' 18 + 'name': 'constant.character.escape.dollar.regexp.replacement' 19 + } 20 + { 21 + 'match': '\\\\[^$]' 22 + 'name': 'constant.character.escape.backslash.regexp.replacement' 23 + } 24 + ]
+121
grammars/regular expressions (javascript).cson
··· 1 + 'scopeName': 'source.js.regexp' 2 + 'name': 'Regular Expressions (JavaScript)' 3 + 'fileTypes': [] 4 + 'patterns': [ 5 + { 6 + 'include': '#regexp' 7 + } 8 + ] 9 + 'repository': 10 + 'regex-character-class': 11 + 'patterns': [ 12 + { 13 + 'match': '\\\\[wWsSdD]|\\.' 14 + 'name': 'constant.character.character-class.regexp' 15 + } 16 + { 17 + 'match': '\\\\([0-7]{3}|x\\h\\h|u\\h\\h\\h\\h)' 18 + 'name': 'constant.character.numeric.regexp' 19 + } 20 + { 21 + 'match': '\\\\c[A-Z]' 22 + 'name': 'constant.character.control.regexp' 23 + } 24 + { 25 + 'match': '\\\\.' 26 + 'name': 'constant.character.escape.backslash.regexp' 27 + } 28 + ] 29 + 'regexp': 30 + 'patterns': [ 31 + { 32 + 'match': '\\\\[bB]|\\^|\\$' 33 + 'name': 'keyword.control.anchor.regexp' 34 + } 35 + { 36 + 'match': '\\\\[1-9]\\d*' 37 + 'name': 'keyword.other.back-reference.regexp' 38 + } 39 + { 40 + 'match': '[?+*]|\\{(\\d+,\\d+|\\d+,|,\\d+|\\d+)\\}\\??' 41 + 'name': 'keyword.operator.quantifier.regexp' 42 + } 43 + { 44 + 'match': '\\|' 45 + 'name': 'keyword.operator.or.regexp' 46 + } 47 + { 48 + 'begin': '(\\()((\\?=)|(\\?!))' 49 + 'beginCaptures': 50 + '1': 51 + 'name': 'punctuation.definition.group.regexp' 52 + '3': 53 + 'name': 'meta.assertion.look-ahead.regexp' 54 + '4': 55 + 'name': 'meta.assertion.negative-look-ahead.regexp' 56 + 'end': '(\\))' 57 + 'endCaptures': 58 + '1': 59 + 'name': 'punctuation.definition.group.regexp' 60 + 'name': 'meta.group.assertion.regexp' 61 + 'patterns': [ 62 + { 63 + 'include': '#regexp' 64 + } 65 + ] 66 + } 67 + { 68 + 'begin': '\\((\\?:)?' 69 + 'beginCaptures': 70 + '0': 71 + 'name': 'punctuation.definition.group.regexp' 72 + 'end': '\\)' 73 + 'endCaptures': 74 + '0': 75 + 'name': 'punctuation.definition.group.regexp' 76 + 'name': 'meta.group.regexp' 77 + 'patterns': [ 78 + { 79 + 'include': '#regexp' 80 + } 81 + ] 82 + } 83 + { 84 + 'begin': '(\\[)(\\^)?' 85 + 'beginCaptures': 86 + '1': 87 + 'name': 'punctuation.definition.character-class.regexp' 88 + '2': 89 + 'name': 'keyword.operator.negation.regexp' 90 + 'end': '(\\])' 91 + 'endCaptures': 92 + '1': 93 + 'name': 'punctuation.definition.character-class.regexp' 94 + 'name': 'constant.other.character-class.set.regexp' 95 + 'patterns': [ 96 + { 97 + 'captures': 98 + '1': 99 + 'name': 'constant.character.numeric.regexp' 100 + '2': 101 + 'name': 'constant.character.control.regexp' 102 + '3': 103 + 'name': 'constant.character.escape.backslash.regexp' 104 + '4': 105 + 'name': 'constant.character.numeric.regexp' 106 + '5': 107 + 'name': 'constant.character.control.regexp' 108 + '6': 109 + 'name': 'constant.character.escape.backslash.regexp' 110 + 'match': '(?:.|(\\\\(?:[0-7]{3}|x\\h\\h|u\\h\\h\\h\\h))|(\\\\c[A-Z])|(\\\\.))\\-(?:[^\\]\\\\]|(\\\\(?:[0-7]{3}|x\\h\\h|u\\h\\h\\h\\h))|(\\\\c[A-Z])|(\\\\.))' 111 + 'name': 'constant.other.character-class.range.regexp' 112 + } 113 + { 114 + 'include': '#regex-character-class' 115 + } 116 + ] 117 + } 118 + { 119 + 'include': '#regex-character-class' 120 + } 121 + ]
+20
package.json
··· 1 + { 2 + "name": "javascript-without-snippets", 3 + "version": "0.119.0", 4 + "description": "language-javascript without snippets, letting you easily add your own", 5 + "engines": { 6 + "atom": "*", 7 + "node": "*" 8 + }, 9 + "repository": { 10 + "type": "git", 11 + "url": "https://github.com/spectralkh/javascript-without-snippets" 12 + }, 13 + "license": "MIT", 14 + "bugs": { 15 + "url": "https://github.com/spectralkh/javascript-without-snippets/issues" 16 + }, 17 + "devDependencies": { 18 + "coffeelint": "^1.10.1" 19 + } 20 + }
+12
settings/language-javascript.cson
··· 1 + '.source.js': 2 + 'editor': 3 + 'commentStart': '// ' 4 + 'foldEndPattern': '^\\s*\\}|^\\s*\\]|^\\s*\\)' 5 + 'increaseIndentPattern': '(?x) 6 + \\{ [^}"\']* $ 7 + | \\[ [^\\]"\']* $ 8 + | \\( [^)"\']* $ 9 + ' 10 + 'decreaseIndentPattern': '(?x) 11 + ^ \\s* (\\s* /[*] .* [*]/ \\s*)* [}\\])] 12 + '
+115
snippets/language-javascript.cson
··· 1 + # '.source.js': 2 + # 'Object Method': 3 + # 'prefix': 'kf' 4 + # 'body': '${1:methodName}: function (${2:attribute}) {\n\t$3\n}${4:,}' 5 + # 'Object key — key: "value"': 6 + # 'prefix': 'kv' 7 + # 'body': '${1:key}: ${2:\'${3:value}\'}${4:, }' 8 + # 'Prototype': 9 + # 'prefix': 'proto' 10 + # 'body': '${1:ClassName}.prototype.${2:methodName} = function ($3) {\n\t$0\n};' 11 + # 'do': 12 + # 'prefix': 'do' 13 + # 'body': 'do {\n\t$2\n} while (${1:true});' 14 + # 'if': 15 + # 'prefix': 'if' 16 + # 'body': 'if (${1:true}) {\n\t$2\n}' 17 + # 'if … else': 18 + # 'prefix': 'ife' 19 + # 'body': 'if (${1:true}) {\n\t$2\n} else {\n\t$3\n}' 20 + # 'else': 21 + # 'prefix': 'else' 22 + # 'body': 'else {\n\t$1\n}' 23 + # 'else if': 24 + # 'prefix': 'elseif' 25 + # 'body': 'else if (${1:true}) {\n\t$2\n}' 26 + # 'for': 27 + # 'prefix' : 'for' 28 + # 'body' : 'for (var ${2:i} = 0; ${2:i} < ${1:array}.length; ${2:i}++) {\n\t${1:array}[${2:i}]$3\n}' 29 + # 'for in': 30 + # 'prefix': 'forin' 31 + # 'body': 'for (var ${1:variable} in ${2:object}) {\n\t${3:if (${2:object}.hasOwnProperty(${1:variable})) {\n\t\t$4\n\t\\}}\n}' 32 + # 'for of': 33 + # 'prefix': 'forof' 34 + # 'body': 'for (${1:variable} of ${2:iterable}) {\n\t$3\n}' 35 + # 'Function': 36 + # 'prefix': 'fun' 37 + # 'body': 'function ${1:functionName}($2) {\n\t$0\n}' 38 + # 'Anonymous Function': 39 + # 'prefix': 'f' 40 + # 'body': 'function ($1) {\n\t$2\n}' 41 + # 'Generator': 42 + # 'prefix': 'gen', 43 + # 'body': 'function* ${1:functionName}($2) {\n\t$0\n}' 44 + # 'Anonymous Generator': 45 + # 'prefix': 'g' 46 + # 'body': 'function* ($1) {\n\t$2\n}' 47 + # 'getElementsByClassName': 48 + # 'prefix': 'get' 49 + # 'body': 'getElementsByClassName(${1:\'${2:className}\'})$3' 50 + # 'getElementsByName': 51 + # 'prefix': 'getn' 52 + # 'body': 'getElementsByName(${1:\'${2:name}\'})$3' 53 + # 'getElementsByTagName': 54 + # 'prefix': 'gett' 55 + # 'body': 'getElementsByTagName(${1:\'${2:tagName}\'})$3' 56 + # 'getElementById': 57 + # 'prefix': 'geti' 58 + # 'body': 'getElementById(${1:\'${2:id}\'})$3' 59 + # 'querySelector': 60 + # 'prefix': 'qs' 61 + # 'body': 'querySelector(${1:\'${2:query}\'})$3' 62 + # 'querySelectorAll': 63 + # 'prefix': 'qsa' 64 + # 'body': 'querySelectorAll(${1:\'${2:query}\'})$3' 65 + # 'Immediately-Invoked Function Expression': 66 + # 'prefix': 'iife' 67 + # 'body': '(function() {\n\t${1:\'use strict\';\n}\t$2\n}());' 68 + # 'log': 69 + # 'prefix': 'log' 70 + # 'body': 'console.log($1);$0' 71 + # 'warn': 72 + # 'prefix': 'warn' 73 + # 'body': 'console.warn($1);$0' 74 + # 'error': 75 + # 'prefix': 'error' 76 + # 'body': 'console.error($1);$0' 77 + # 'inspect': 78 + # 'prefix': 'inspect' 79 + # 'body': 'console.log(require(\'util\').inspect($0, { depth: null }));' 80 + # 'new Promise': 81 + # 'prefix': 'prom' 82 + # 'body': 'new Promise(function(resolve, reject) {\n\t$1\n});$0' 83 + # 'setInterval function': 84 + # 'prefix': 'interval' 85 + # 'body': 'setInterval(${2:function () {\n\t$3\n\\}}, ${1:10});' 86 + # 'setTimeout function': 87 + # 'prefix': 'timeout' 88 + # 'body': 'setTimeout(${2:function () {\n\t$3\n\\}}, ${1:10});' 89 + # 'switch': 90 + # 'prefix': 'switch' 91 + # 'body': 'switch (${1:expression}) {\n\tcase ${2:expression}:\n\t\t$4\n\t\tbreak;$5\n\tdefault:\n\t\t$3\n}' 92 + # 'case': 93 + # 'prefix': 'case' 94 + # 'body': 'case ${1:expression}:\n\t$2\n\tbreak;' 95 + # 'try': 96 + # 'prefix': 'try' 97 + # 'body': 'try {\n\t$1\n} catch (${2:e}) {\n\t$3\n}${4: finally {\n\t$5\n\\}}' 98 + # 'while': 99 + # 'prefix': 'while' 100 + # 'body': 'while (${1:true}) {\n\t$2\n}' 101 + # 'Start Docblock': 102 + # 'prefix': '/**' 103 + # 'body': '/**\n * $1\n */$0' 104 + # 'CommonJS require': 105 + # 'prefix': 'req' 106 + # 'body': 'const ${1:module} = require(\'${1:module}\');' 107 + # 'Class': 108 + # 'prefix': 'class' 109 + # 'body': 'class ${1:ClassName} {\n\tconstructor($2) {\n\t\t$3\n\t}\n}' 110 + # 'export function': 111 + # 'prefix': 'expfun' 112 + # 'body': 'exports.${1:functionName} = function ($2) {\n\t${3:// body...}\n};' 113 + # 'export module': 114 + # 'prefix': 'expmod' 115 + # 'body': 'module.exports = ${1:name};'
+1767
spec/javascript-spec.coffee
··· 1 + fs = require 'fs' 2 + path = require 'path' 3 + TextEditor = null 4 + buildTextEditor = (params) -> 5 + if atom.workspace.buildTextEditor? 6 + atom.workspace.buildTextEditor(params) 7 + else 8 + TextEditor ?= require('atom').TextEditor 9 + new TextEditor(params) 10 + 11 + describe "Javascript grammar", -> 12 + grammar = null 13 + 14 + beforeEach -> 15 + waitsForPromise -> 16 + atom.packages.activatePackage("language-javascript") 17 + 18 + runs -> 19 + grammar = atom.grammars.grammarForScopeName("source.js") 20 + 21 + it "parses the grammar", -> 22 + expect(grammar).toBeTruthy() 23 + expect(grammar.scopeName).toBe "source.js" 24 + 25 + describe "strings", -> 26 + it "tokenizes single-line strings", -> 27 + delimsByScope = 28 + "string.quoted.double.js": '"' 29 + "string.quoted.single.js": "'" 30 + 31 + for scope, delim of delimsByScope 32 + {tokens} = grammar.tokenizeLine(delim + "x" + delim) 33 + expect(tokens[0].value).toEqual delim 34 + expect(tokens[0].scopes).toEqual ["source.js", scope, "punctuation.definition.string.begin.js"] 35 + expect(tokens[1].value).toEqual "x" 36 + expect(tokens[1].scopes).toEqual ["source.js", scope] 37 + expect(tokens[2].value).toEqual delim 38 + expect(tokens[2].scopes).toEqual ["source.js", scope, "punctuation.definition.string.end.js"] 39 + 40 + it "tokenizes invalid multiline strings", -> 41 + delimsByScope = 42 + "string.quoted.double.js": '"' 43 + "string.quoted.single.js": "'" 44 + 45 + for scope, delim of delimsByScope 46 + lines = grammar.tokenizeLines delim + """ 47 + line1 48 + line2\\ 49 + line3 50 + """ + delim 51 + expect(lines[0][0]).toEqual value: delim, scopes: ['source.js', scope, 'punctuation.definition.string.begin.js'] 52 + expect(lines[0][1]).toEqual value: 'line1', scopes: ['source.js', scope, 'invalid.illegal.string.js'] 53 + expect(lines[1][0]).toEqual value: 'line2\\', scopes: ['source.js', scope] 54 + expect(lines[2][0]).toEqual value: 'line3', scopes: ['source.js', scope] 55 + expect(lines[2][1]).toEqual value: delim, scopes: ['source.js', scope, 'punctuation.definition.string.end.js'] 56 + 57 + describe "keywords", -> 58 + it "tokenizes with as a keyword", -> 59 + {tokens} = grammar.tokenizeLine('with') 60 + expect(tokens[0]).toEqual value: 'with', scopes: ['source.js', 'keyword.control.js'] 61 + 62 + map = 63 + super: 'variable.language.js' 64 + this: 'variable.language.js' 65 + null: 'constant.language.null.js' 66 + true: 'constant.language.boolean.true.js' 67 + false: 'constant.language.boolean.false.js' 68 + debugger: 'keyword.other.js' 69 + exports: 'support.variable.js' 70 + __filename: 'support.variable.js' 71 + 72 + for keyword, scope of map 73 + do (keyword, scope) -> 74 + it "does not tokenize `#{keyword}` when it is an object key", -> 75 + {tokens} = grammar.tokenizeLine("#{keyword}: 1") 76 + expect(tokens[0]).toEqual value: keyword, scopes: ['source.js'] 77 + expect(tokens[1]).toEqual value: ':', scopes: ['source.js', 'keyword.operator.js'] 78 + 79 + it "tokenizes `#{keyword}` in the middle of ternary expressions", -> 80 + {tokens} = grammar.tokenizeLine("a ? #{keyword} : b") 81 + expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] 82 + expect(tokens[3]).toEqual value: keyword, scopes: ['source.js', scope] 83 + 84 + it "tokenizes `#{keyword}` at the end of ternary expressions", -> 85 + {tokens} = grammar.tokenizeLine("a ? b : #{keyword}") 86 + expect(tokens[4]).toEqual value: ' ', scopes: ['source.js'] 87 + expect(tokens[5]).toEqual value: keyword, scopes: ['source.js', scope] 88 + 89 + describe "built-in globals", -> 90 + it "tokenizes built-in classes", -> 91 + {tokens} = grammar.tokenizeLine('window') 92 + expect(tokens[0]).toEqual value: 'window', scopes: ['source.js', 'support.class.js'] 93 + 94 + {tokens} = grammar.tokenizeLine('window.name') 95 + expect(tokens[0]).toEqual value: 'window', scopes: ['source.js', 'support.class.js'] 96 + 97 + {tokens} = grammar.tokenizeLine('$window') 98 + expect(tokens[0]).toEqual value: '$window', scopes: ['source.js'] 99 + 100 + it "tokenizes built-in variables", -> 101 + {tokens} = grammar.tokenizeLine('module') 102 + expect(tokens[0]).toEqual value: 'module', scopes: ['source.js', 'support.variable.js'] 103 + 104 + {tokens} = grammar.tokenizeLine('module.prop') 105 + expect(tokens[0]).toEqual value: 'module', scopes: ['source.js', 'support.variable.js'] 106 + 107 + describe "instantiation", -> 108 + it "tokenizes the new keyword and instance entities", -> 109 + {tokens} = grammar.tokenizeLine('new something') 110 + expect(tokens[0]).toEqual value: 'new', scopes: ['source.js', 'meta.class.instance.constructor', 'keyword.operator.new.js'] 111 + expect(tokens[1]).toEqual value: ' ', scopes: ['source.js', 'meta.class.instance.constructor'] 112 + expect(tokens[2]).toEqual value: 'something', scopes: ['source.js', 'meta.class.instance.constructor', 'entity.name.type.instance.js'] 113 + 114 + {tokens} = grammar.tokenizeLine('new Something') 115 + expect(tokens[0]).toEqual value: 'new', scopes: ['source.js', 'meta.class.instance.constructor', 'keyword.operator.new.js'] 116 + expect(tokens[1]).toEqual value: ' ', scopes: ['source.js', 'meta.class.instance.constructor'] 117 + expect(tokens[2]).toEqual value: 'Something', scopes: ['source.js', 'meta.class.instance.constructor', 'entity.name.type.instance.js'] 118 + 119 + {tokens} = grammar.tokenizeLine('new $something') 120 + expect(tokens[0]).toEqual value: 'new', scopes: ['source.js', 'meta.class.instance.constructor', 'keyword.operator.new.js'] 121 + expect(tokens[1]).toEqual value: ' ', scopes: ['source.js', 'meta.class.instance.constructor'] 122 + expect(tokens[2]).toEqual value: '$something', scopes: ['source.js', 'meta.class.instance.constructor', 'entity.name.type.instance.js'] 123 + 124 + describe "regular expressions", -> 125 + it "tokenizes regular expressions", -> 126 + {tokens} = grammar.tokenizeLine('/test/') 127 + expect(tokens[0]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.begin.js'] 128 + expect(tokens[1]).toEqual value: 'test', scopes: ['source.js', 'string.regexp.js'] 129 + expect(tokens[2]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js'] 130 + 131 + {tokens} = grammar.tokenizeLine('foo + /test/') 132 + expect(tokens[0]).toEqual value: 'foo ', scopes: ['source.js'] 133 + expect(tokens[1]).toEqual value: '+', scopes: ['source.js', 'keyword.operator.js'] 134 + expect(tokens[2]).toEqual value: ' ', scopes: ['source.js', 'string.regexp.js'] 135 + expect(tokens[3]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.begin.js'] 136 + expect(tokens[4]).toEqual value: 'test', scopes: ['source.js', 'string.regexp.js'] 137 + expect(tokens[5]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js'] 138 + 139 + it "tokenizes regular expressions inside arrays", -> 140 + {tokens} = grammar.tokenizeLine('[/test/]') 141 + expect(tokens[0]).toEqual value: '[', scopes: ['source.js', 'meta.brace.square.js'] 142 + expect(tokens[1]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.begin.js'] 143 + expect(tokens[2]).toEqual value: 'test', scopes: ['source.js', 'string.regexp.js'] 144 + expect(tokens[3]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js'] 145 + expect(tokens[4]).toEqual value: ']', scopes: ['source.js', 'meta.brace.square.js'] 146 + 147 + {tokens} = grammar.tokenizeLine('[1, /test/]') 148 + expect(tokens[0]).toEqual value: '[', scopes: ['source.js', 'meta.brace.square.js'] 149 + expect(tokens[1]).toEqual value: '1', scopes: ['source.js', 'constant.numeric.decimal.js'] 150 + expect(tokens[2]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] 151 + expect(tokens[3]).toEqual value: ' ', scopes: ['source.js', 'string.regexp.js'] 152 + expect(tokens[4]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.begin.js'] 153 + expect(tokens[5]).toEqual value: 'test', scopes: ['source.js', 'string.regexp.js'] 154 + expect(tokens[6]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js'] 155 + expect(tokens[7]).toEqual value: ']', scopes: ['source.js', 'meta.brace.square.js'] 156 + 157 + it "tokenizes regular expressions inside ternary expressions", -> 158 + {tokens} = grammar.tokenizeLine('a ? /b/ : /c/') 159 + expect(tokens[ 0]).toEqual value: 'a ', scopes: ['source.js'] 160 + expect(tokens[ 1]).toEqual value: '?', scopes: ['source.js', 'keyword.operator.js'] 161 + expect(tokens[ 2]).toEqual value: ' ', scopes: ['source.js', 'string.regexp.js'] 162 + expect(tokens[ 3]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.begin.js'] 163 + expect(tokens[ 4]).toEqual value: 'b', scopes: ['source.js', 'string.regexp.js'] 164 + expect(tokens[ 5]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js'] 165 + expect(tokens[ 6]).toEqual value: ' ', scopes: ['source.js'] 166 + expect(tokens[ 7]).toEqual value: ':', scopes: ['source.js', 'keyword.operator.js'] 167 + expect(tokens[ 8]).toEqual value: ' ', scopes: ['source.js', 'string.regexp.js'] 168 + expect(tokens[ 9]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.begin.js'] 169 + expect(tokens[10]).toEqual value: 'c', scopes: ['source.js', 'string.regexp.js'] 170 + expect(tokens[11]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js'] 171 + 172 + it "tokenizes regular expressions inside arrow function expressions", -> 173 + {tokens} = grammar.tokenizeLine('getRegex = () => /^helloworld$/;') 174 + expect(tokens[9]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.begin.js'] 175 + expect(tokens[10]).toEqual value: '^', scopes: ['source.js', 'string.regexp.js', 'keyword.control.anchor.regexp'] 176 + expect(tokens[11]).toEqual value: 'helloworld', scopes: ['source.js', 'string.regexp.js'] 177 + expect(tokens[12]).toEqual value: '$', scopes: ['source.js', 'string.regexp.js', 'keyword.control.anchor.regexp'] 178 + expect(tokens[13]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js'] 179 + expect(tokens[14]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 180 + 181 + it "verifies that regular expressions have explicit count modifiers", -> 182 + source = fs.readFileSync(path.resolve(__dirname, '..', 'grammars', 'javascript.cson'), 'utf8') 183 + expect(source.search /{,/).toEqual -1 184 + 185 + source = fs.readFileSync(path.resolve(__dirname, '..', 'grammars', 'regular expressions (javascript).cson'), 'utf8') 186 + expect(source.search /{,/).toEqual -1 187 + 188 + describe "numbers", -> 189 + it "tokenizes hexadecimals", -> 190 + {tokens} = grammar.tokenizeLine('0x1D306') 191 + expect(tokens[0]).toEqual value: '0x1D306', scopes: ['source.js', 'constant.numeric.hex.js'] 192 + 193 + {tokens} = grammar.tokenizeLine('0X1D306') 194 + expect(tokens[0]).toEqual value: '0X1D306', scopes: ['source.js', 'constant.numeric.hex.js'] 195 + 196 + it "tokenizes binary literals", -> 197 + {tokens} = grammar.tokenizeLine('0b011101110111010001100110') 198 + expect(tokens[0]).toEqual value: '0b011101110111010001100110', scopes: ['source.js', 'constant.numeric.binary.js'] 199 + 200 + {tokens} = grammar.tokenizeLine('0B011101110111010001100110') 201 + expect(tokens[0]).toEqual value: '0B011101110111010001100110', scopes: ['source.js', 'constant.numeric.binary.js'] 202 + 203 + it "tokenizes octal literals", -> 204 + {tokens} = grammar.tokenizeLine('0o1411') 205 + expect(tokens[0]).toEqual value: '0o1411', scopes: ['source.js', 'constant.numeric.octal.js'] 206 + 207 + {tokens} = grammar.tokenizeLine('0O1411') 208 + expect(tokens[0]).toEqual value: '0O1411', scopes: ['source.js', 'constant.numeric.octal.js'] 209 + 210 + {tokens} = grammar.tokenizeLine('0010') 211 + expect(tokens[0]).toEqual value: '0010', scopes: ['source.js', 'constant.numeric.octal.js'] 212 + 213 + it "tokenizes decimals", -> 214 + {tokens} = grammar.tokenizeLine('1234') 215 + expect(tokens[0]).toEqual value: '1234', scopes: ['source.js', 'constant.numeric.decimal.js'] 216 + 217 + {tokens} = grammar.tokenizeLine('5e-10') 218 + expect(tokens[0]).toEqual value: '5e-10', scopes: ['source.js', 'constant.numeric.decimal.js'] 219 + 220 + {tokens} = grammar.tokenizeLine('5E+5') 221 + expect(tokens[0]).toEqual value: '5E+5', scopes: ['source.js', 'constant.numeric.decimal.js'] 222 + 223 + {tokens} = grammar.tokenizeLine('9.') 224 + expect(tokens[0]).toEqual value: '9', scopes: ['source.js', 'constant.numeric.decimal.js'] 225 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'constant.numeric.decimal.js', 'meta.delimiter.decimal.period.js'] 226 + 227 + {tokens} = grammar.tokenizeLine('.9') 228 + expect(tokens[0]).toEqual value: '.', scopes: ['source.js', 'constant.numeric.decimal.js', 'meta.delimiter.decimal.period.js'] 229 + expect(tokens[1]).toEqual value: '9', scopes: ['source.js', 'constant.numeric.decimal.js'] 230 + 231 + {tokens} = grammar.tokenizeLine('9.9') 232 + expect(tokens[0]).toEqual value: '9', scopes: ['source.js', 'constant.numeric.decimal.js'] 233 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'constant.numeric.decimal.js', 'meta.delimiter.decimal.period.js'] 234 + expect(tokens[2]).toEqual value: '9', scopes: ['source.js', 'constant.numeric.decimal.js'] 235 + 236 + {tokens} = grammar.tokenizeLine('.1e-23') 237 + expect(tokens[0]).toEqual value: '.', scopes: ['source.js', 'constant.numeric.decimal.js', 'meta.delimiter.decimal.period.js'] 238 + expect(tokens[1]).toEqual value: '1e-23', scopes: ['source.js', 'constant.numeric.decimal.js'] 239 + 240 + {tokens} = grammar.tokenizeLine('1.E3') 241 + expect(tokens[0]).toEqual value: '1', scopes: ['source.js', 'constant.numeric.decimal.js'] 242 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'constant.numeric.decimal.js', 'meta.delimiter.decimal.period.js'] 243 + expect(tokens[2]).toEqual value: 'E3', scopes: ['source.js', 'constant.numeric.decimal.js'] 244 + 245 + it "does not tokenize numbers that are part of a variable", -> 246 + {tokens} = grammar.tokenizeLine('hi$1') 247 + expect(tokens[0]).toEqual value: 'hi$1', scopes: ['source.js'] 248 + 249 + {tokens} = grammar.tokenizeLine('hi_1') 250 + expect(tokens[0]).toEqual value: 'hi_1', scopes: ['source.js'] 251 + 252 + describe "operators", -> 253 + it "tokenizes them", -> 254 + operators = ["delete", "in", "of", "instanceof", "new", "typeof", "void"] 255 + 256 + for operator in operators 257 + {tokens} = grammar.tokenizeLine(operator) 258 + expect(tokens[0]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.' + operator + '.js'] 259 + 260 + it "tokenizes spread operator", -> 261 + {tokens} = grammar.tokenizeLine('myFunction(...args);') 262 + expect(tokens[2]).toEqual value: '...', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'keyword.operator.spread.js'] 263 + expect(tokens[3]).toEqual value: 'args', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js'] 264 + 265 + {tokens} = grammar.tokenizeLine('[...iterableObj]') 266 + expect(tokens[1]).toEqual value: '...', scopes: ['source.js', 'keyword.operator.spread.js'] 267 + expect(tokens[2]).toEqual value: 'iterableObj', scopes: ['source.js'] 268 + 269 + describe "increment, decrement", -> 270 + it "tokenizes increment", -> 271 + {tokens} = grammar.tokenizeLine('i++') 272 + expect(tokens[0]).toEqual value: 'i', scopes: ['source.js'] 273 + expect(tokens[1]).toEqual value: '++', scopes: ['source.js', 'keyword.operator.increment.js'] 274 + 275 + it "tokenizes decrement", -> 276 + {tokens} = grammar.tokenizeLine('i--') 277 + expect(tokens[0]).toEqual value: 'i', scopes: ['source.js'] 278 + expect(tokens[1]).toEqual value: '--', scopes: ['source.js', 'keyword.operator.decrement.js'] 279 + 280 + describe "conditional ternary", -> 281 + it "tokenizes them", -> 282 + {tokens} = grammar.tokenizeLine('test ? expr1 : expr2') 283 + expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] 284 + expect(tokens[1]).toEqual value: '?', scopes: ['source.js', 'keyword.operator.js'] 285 + expect(tokens[2]).toEqual value: ' expr1 ', scopes: ['source.js'] 286 + expect(tokens[3]).toEqual value: ':', scopes: ['source.js', 'keyword.operator.js'] 287 + expect(tokens[4]).toEqual value: ' expr2', scopes: ['source.js'] 288 + 289 + describe "logical", -> 290 + operators = ["&&", "||", "!"] 291 + 292 + it "tokenizes them", -> 293 + for operator in operators 294 + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') 295 + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] 296 + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.logical.js'] 297 + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] 298 + 299 + describe "comparison", -> 300 + operators = ["<=", ">=", "!=", "!==", "===", "==", "<", ">" ] 301 + 302 + it "tokenizes them", -> 303 + for operator in operators 304 + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') 305 + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] 306 + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.comparison.js'] 307 + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] 308 + 309 + describe "bitwise", -> 310 + it "tokenizes bitwise 'not'", -> 311 + {tokens} = grammar.tokenizeLine('~a') 312 + expect(tokens[0]).toEqual value: '~', scopes: ['source.js', 'keyword.operator.bitwise.js'] 313 + expect(tokens[1]).toEqual value: 'a', scopes: ['source.js'] 314 + 315 + it "tokenizes them", -> 316 + operators = ["|", "^", "&"] 317 + 318 + for operator in operators 319 + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') 320 + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] 321 + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.bitwise.js'] 322 + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] 323 + 324 + describe "arithmetic", -> 325 + operators = ["*", "/", "-", "%", "+"] 326 + 327 + it "tokenizes them", -> 328 + for operator in operators 329 + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') 330 + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] 331 + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.js'] 332 + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] 333 + 334 + it "tokenizes the arithmetic operators when separated by newlines", -> 335 + for operator in operators 336 + lines = grammar.tokenizeLines '1\n' + operator + ' 2' 337 + expect(lines[0][0]).toEqual value: '1', scopes: ['source.js', 'constant.numeric.decimal.js'] 338 + expect(lines[1][0]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.js'] 339 + expect(lines[1][2]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.decimal.js'] 340 + 341 + describe "assignment", -> 342 + it "tokenizes '=' operator", -> 343 + {tokens} = grammar.tokenizeLine('a = b') 344 + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] 345 + expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 346 + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] 347 + 348 + describe "compound", -> 349 + it "tokenizes them", -> 350 + operators = ["+=", "-=", "*=", "/=", "%="] 351 + for operator in operators 352 + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') 353 + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] 354 + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.assignment.compound.js'] 355 + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] 356 + 357 + describe "bitwise", -> 358 + it "tokenizes them", -> 359 + operators = ["<<=", ">>=", ">>>=", "&=", "^=", "|="] 360 + for operator in operators 361 + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') 362 + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] 363 + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.assignment.compound.bitwise.js'] 364 + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] 365 + 366 + describe "constants", -> 367 + it "tokenizes ALL_CAPS variables as constants", -> 368 + {tokens} = grammar.tokenizeLine('var MY_COOL_VAR = 42;') 369 + expect(tokens[0]).toEqual value: 'var', scopes: ['source.js', 'storage.type.var.js'] 370 + expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] 371 + expect(tokens[2]).toEqual value: 'MY_COOL_VAR', scopes: ['source.js', 'constant.other.js'] 372 + expect(tokens[3]).toEqual value: ' ', scopes: ['source.js'] 373 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 374 + expect(tokens[5]).toEqual value: ' ', scopes: ['source.js'] 375 + expect(tokens[6]).toEqual value: '42', scopes: ['source.js', 'constant.numeric.decimal.js'] 376 + expect(tokens[7]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 377 + 378 + {tokens} = grammar.tokenizeLine('something = MY_COOL_VAR * 1;') 379 + expect(tokens[0]).toEqual value: 'something ', scopes: ['source.js'] 380 + expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 381 + expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] 382 + expect(tokens[3]).toEqual value: 'MY_COOL_VAR', scopes: ['source.js', 'constant.other.js'] 383 + expect(tokens[4]).toEqual value: ' ', scopes: ['source.js'] 384 + expect(tokens[5]).toEqual value: '*', scopes: ['source.js', 'keyword.operator.js'] 385 + expect(tokens[6]).toEqual value: ' ', scopes: ['source.js'] 386 + expect(tokens[7]).toEqual value: '1', scopes: ['source.js', 'constant.numeric.decimal.js'] 387 + expect(tokens[8]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 388 + 389 + {tokens} = grammar.tokenizeLine('OBJ.prop') 390 + expect(tokens[0]).toEqual value: 'OBJ', scopes: ['source.js', 'constant.other.object.js'] 391 + 392 + it "tokenizes variables declared using `const` as constants", -> 393 + {tokens} = grammar.tokenizeLine('const myCoolVar = 42;') 394 + expect(tokens[0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 395 + expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] 396 + expect(tokens[2]).toEqual value: 'myCoolVar', scopes: ['source.js', 'constant.other.js'] 397 + expect(tokens[3]).toEqual value: ' ', scopes: ['source.js'] 398 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 399 + expect(tokens[5]).toEqual value: ' ', scopes: ['source.js'] 400 + expect(tokens[6]).toEqual value: '42', scopes: ['source.js', 'constant.numeric.decimal.js'] 401 + expect(tokens[7]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 402 + 403 + lines = grammar.tokenizeLines """ 404 + const a, 405 + b, 406 + c 407 + if(a) 408 + """ 409 + expect(lines[0][0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 410 + expect(lines[0][1]).toEqual value: ' ', scopes: ['source.js'] 411 + expect(lines[0][2]).toEqual value: 'a', scopes: ['source.js', 'constant.other.js'] 412 + expect(lines[0][3]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] 413 + expect(lines[1][0]).toEqual value: 'b', scopes: ['source.js', 'constant.other.js'] 414 + expect(lines[1][1]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] 415 + expect(lines[2][0]).toEqual value: 'c', scopes: ['source.js', 'constant.other.js'] 416 + expect(lines[3][0]).toEqual value: 'if', scopes: ['source.js', 'keyword.control.js'] 417 + expect(lines[3][1]).toEqual value: '(', scopes: ['source.js', 'meta.brace.round.js'] 418 + expect(lines[3][2]).toEqual value: 'a', scopes: ['source.js'] 419 + expect(lines[3][3]).toEqual value: ')', scopes: ['source.js', 'meta.brace.round.js'] 420 + 421 + lines = grammar.tokenizeLines """ 422 + const { 423 + a, 424 + b, 425 + c, 426 + } = foo 427 + """ 428 + expect(lines[0][0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 429 + expect(lines[0][1]).toEqual value: ' ', scopes: ['source.js'] 430 + expect(lines[0][2]).toEqual value: '{', scopes: ['source.js', 'meta.brace.curly.js'] 431 + expect(lines[1][0]).toEqual value: ' ', scopes: ['source.js'] 432 + expect(lines[1][1]).toEqual value: 'a', scopes: ['source.js', 'constant.other.js'] 433 + expect(lines[1][2]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] 434 + expect(lines[2][0]).toEqual value: ' ', scopes: ['source.js'] 435 + expect(lines[2][1]).toEqual value: 'b', scopes: ['source.js', 'constant.other.js'] 436 + expect(lines[2][2]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] 437 + expect(lines[3][0]).toEqual value: ' ', scopes: ['source.js'] 438 + expect(lines[3][1]).toEqual value: 'c', scopes: ['source.js', 'constant.other.js'] 439 + expect(lines[4][0]).toEqual value: '}', scopes: ['source.js', 'meta.brace.curly.js'] 440 + expect(lines[4][1]).toEqual value: ' ', scopes: ['source.js'] 441 + expect(lines[4][2]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 442 + expect(lines[4][3]).toEqual value: ' foo', scopes: ['source.js'] 443 + 444 + {tokens} = grammar.tokenizeLine('(const hi);') 445 + expect(tokens[0]).toEqual value: '(', scopes: ['source.js', 'meta.brace.round.js'] 446 + expect(tokens[1]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 447 + expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] 448 + expect(tokens[3]).toEqual value: 'hi', scopes: ['source.js', 'constant.other.js'] 449 + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.brace.round.js'] 450 + expect(tokens[5]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 451 + 452 + {tokens} = grammar.tokenizeLine('const {first:f,second,...rest} = obj;') 453 + expect(tokens[0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 454 + expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] 455 + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.brace.curly.js'] 456 + expect(tokens[3]).toEqual value: 'first', scopes: ['source.js'] 457 + expect(tokens[4]).toEqual value: ':', scopes: ['source.js', 'keyword.operator.assignment.js'] 458 + expect(tokens[5]).toEqual value: 'f', scopes: ['source.js', 'constant.other.js'] 459 + expect(tokens[6]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] 460 + expect(tokens[7]).toEqual value: 'second', scopes: ['source.js', 'constant.other.js'] 461 + expect(tokens[8]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] 462 + expect(tokens[9]).toEqual value: '...', scopes: ['source.js', 'keyword.operator.spread.js'] 463 + expect(tokens[10]).toEqual value: 'rest', scopes: ['source.js', 'constant.other.js'] 464 + expect(tokens[11]).toEqual value: '}', scopes: ['source.js', 'meta.brace.curly.js'] 465 + expect(tokens[12]).toEqual value: ' ', scopes: ['source.js'] 466 + expect(tokens[13]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 467 + expect(tokens[14]).toEqual value: ' obj', scopes: ['source.js'] 468 + expect(tokens[15]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 469 + 470 + {tokens} = grammar.tokenizeLine('const c = /regex/;') 471 + expect(tokens[0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 472 + expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] 473 + expect(tokens[2]).toEqual value: 'c', scopes: ['source.js', 'constant.other.js'] 474 + expect(tokens[3]).toEqual value: ' ', scopes: ['source.js'] 475 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 476 + expect(tokens[5]).toEqual value: ' ', scopes: ['source.js', 'string.regexp.js'] 477 + expect(tokens[6]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.begin.js'] 478 + expect(tokens[7]).toEqual value: 'regex', scopes: ['source.js', 'string.regexp.js'] 479 + expect(tokens[8]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js'] 480 + expect(tokens[9]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 481 + 482 + it "tokenizes variables declared with `const` in for-in and for-of loops", -> 483 + {tokens} = grammar.tokenizeLine 'for (const elem of array) {' 484 + expect(tokens[0]).toEqual value: 'for', scopes: ['source.js', 'keyword.control.js'] 485 + expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] 486 + expect(tokens[2]).toEqual value: '(', scopes: ['source.js', 'meta.brace.round.js'] 487 + expect(tokens[3]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 488 + expect(tokens[4]).toEqual value: ' ', scopes: ['source.js'] 489 + expect(tokens[5]).toEqual value: 'elem', scopes: ['source.js', 'constant.other.js'] 490 + expect(tokens[6]).toEqual value: ' ', scopes: ['source.js'] 491 + expect(tokens[7]).toEqual value: 'of', scopes: ['source.js', 'keyword.operator.of.js'] 492 + expect(tokens[8]).toEqual value: ' array', scopes: ['source.js'] 493 + expect(tokens[9]).toEqual value: ')', scopes: ['source.js', 'meta.brace.round.js'] 494 + 495 + {tokens} = grammar.tokenizeLine 'for (const name in object) {' 496 + expect(tokens[5]).toEqual value: 'name', scopes: ['source.js', 'constant.other.js'] 497 + expect(tokens[6]).toEqual value: ' ', scopes: ['source.js'] 498 + expect(tokens[7]).toEqual value: 'in', scopes: ['source.js', 'keyword.operator.in.js'] 499 + expect(tokens[8]).toEqual value: ' object', scopes: ['source.js'] 500 + 501 + {tokens} = grammar.tokenizeLine 'const index = 0;' 502 + expect(tokens[0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 503 + expect(tokens[2]).toEqual value: 'index', scopes: ['source.js', 'constant.other.js'] 504 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 505 + 506 + {tokens} = grammar.tokenizeLine 'const offset = 0;' 507 + expect(tokens[0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 508 + expect(tokens[2]).toEqual value: 'offset', scopes: ['source.js', 'constant.other.js'] 509 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 510 + 511 + it "tokenizes support constants", -> 512 + {tokens} = grammar.tokenizeLine('awesome = cool.systemLanguage;') 513 + expect(tokens[0]).toEqual value: 'awesome ', scopes: ['source.js'] 514 + expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 515 + expect(tokens[3]).toEqual value: 'cool', scopes: ['source.js', 'variable.other.object.js'] 516 + expect(tokens[4]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js'] 517 + expect(tokens[5]).toEqual value: 'systemLanguage', scopes: ['source.js', 'support.constant.js'] 518 + expect(tokens[6]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 519 + 520 + it "does not tokenize constants when they are object keys", -> 521 + {tokens} = grammar.tokenizeLine('FOO: 1') 522 + expect(tokens[0]).toEqual value: 'FOO', scopes: ['source.js'] 523 + expect(tokens[1]).toEqual value: ':', scopes: ['source.js', 'keyword.operator.js'] 524 + 525 + it "tokenizes constants in the middle of ternary expressions", -> 526 + {tokens} = grammar.tokenizeLine('a ? FOO : b') 527 + expect(tokens[3]).toEqual value: 'FOO', scopes: ['source.js', 'constant.other.js'] 528 + 529 + it "tokenizes constants at the end of ternary expressions", -> 530 + {tokens} = grammar.tokenizeLine('a ? b : FOO') 531 + expect(tokens[5]).toEqual value: 'FOO', scopes: ['source.js', 'constant.other.js'] 532 + 533 + describe "ES6 string templates", -> 534 + it "tokenizes them as strings", -> 535 + {tokens} = grammar.tokenizeLine('`hey ${name}`') 536 + expect(tokens[0]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.js', 'punctuation.definition.string.begin.js'] 537 + expect(tokens[1]).toEqual value: 'hey ', scopes: ['source.js', 'string.quoted.template.js'] 538 + expect(tokens[2]).toEqual value: '${', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 539 + expect(tokens[3]).toEqual value: 'name', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source'] 540 + expect(tokens[4]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 541 + expect(tokens[5]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.js', 'punctuation.definition.string.end.js'] 542 + 543 + {tokens} = grammar.tokenizeLine('`hey ${() => {return hi;}}`') 544 + expect(tokens[0]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.js', 'punctuation.definition.string.begin.js'] 545 + expect(tokens[1]).toEqual value: 'hey ', scopes: ['source.js', 'string.quoted.template.js'] 546 + expect(tokens[2]).toEqual value: '${', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 547 + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 548 + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 549 + expect(tokens[6]).toEqual value: '=>', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 550 + expect(tokens[8]).toEqual value: '{', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.definition.function.body.begin.bracket.curly.js'] 551 + expect(tokens[9]).toEqual value: 'return', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'keyword.control.js'] 552 + expect(tokens[10]).toEqual value: ' hi', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source'] 553 + expect(tokens[11]).toEqual value: ';', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.terminator.statement.js'] 554 + expect(tokens[12]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.definition.function.body.end.bracket.curly.js'] 555 + expect(tokens[13]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 556 + expect(tokens[14]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.js', 'punctuation.definition.string.end.js'] 557 + 558 + describe "ES6 tagged HTML string templates", -> 559 + it "tokenizes them as strings", -> 560 + {tokens} = grammar.tokenizeLine('html`hey <b>${name}</b>`') 561 + expect(tokens[0]).toEqual value: 'html', scopes: [ 'source.js', 'string.quoted.template.html.js', 'entity.name.function.js' ] 562 + expect(tokens[1]).toEqual value: '`', scopes: [ 'source.js', 'string.quoted.template.html.js', 'punctuation.definition.string.begin.js' ] 563 + expect(tokens[2]).toEqual value: 'hey <b>', scopes: ['source.js', 'string.quoted.template.html.js'] 564 + expect(tokens[3]).toEqual value: '${', scopes: ['source.js', 'string.quoted.template.html.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 565 + expect(tokens[4]).toEqual value: 'name', scopes: ['source.js', 'string.quoted.template.html.js', 'source.js.embedded.source'] 566 + expect(tokens[5]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.html.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 567 + expect(tokens[6]).toEqual value: '</b>', scopes: ['source.js', 'string.quoted.template.html.js'] 568 + expect(tokens[7]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.html.js', 'punctuation.definition.string.end.js'] 569 + 570 + describe "ES6 tagged HTML string templates with expanded function name", -> 571 + it "tokenizes them as strings", -> 572 + {tokens} = grammar.tokenizeLine('escapeHTML`hey <b>${name}</b>`') 573 + expect(tokens[0]).toEqual value: 'escapeHTML', scopes: [ 'source.js', 'string.quoted.template.html.js', 'entity.name.function.js' ] 574 + expect(tokens[1]).toEqual value: '`', scopes: [ 'source.js', 'string.quoted.template.html.js', 'punctuation.definition.string.begin.js' ] 575 + expect(tokens[2]).toEqual value: 'hey <b>', scopes: ['source.js', 'string.quoted.template.html.js'] 576 + expect(tokens[3]).toEqual value: '${', scopes: ['source.js', 'string.quoted.template.html.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 577 + expect(tokens[4]).toEqual value: 'name', scopes: ['source.js', 'string.quoted.template.html.js', 'source.js.embedded.source'] 578 + expect(tokens[5]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.html.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 579 + expect(tokens[6]).toEqual value: '</b>', scopes: ['source.js', 'string.quoted.template.html.js'] 580 + expect(tokens[7]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.html.js', 'punctuation.definition.string.end.js'] 581 + 582 + describe "ES6 tagged HTML string templates with expanded function name and white space", -> 583 + it "tokenizes them as strings", -> 584 + {tokens} = grammar.tokenizeLine('escapeHTML `hey <b>${name}</b>`') 585 + expect(tokens[0]).toEqual value: 'escapeHTML', scopes: [ 'source.js', 'string.quoted.template.html.js', 'entity.name.function.js' ] 586 + expect(tokens[1]).toEqual value: ' ', scopes: [ 'source.js', 'string.quoted.template.html.js' ] 587 + expect(tokens[2]).toEqual value: '`', scopes: [ 'source.js', 'string.quoted.template.html.js', 'punctuation.definition.string.begin.js' ] 588 + expect(tokens[3]).toEqual value: 'hey <b>', scopes: ['source.js', 'string.quoted.template.html.js'] 589 + expect(tokens[4]).toEqual value: '${', scopes: ['source.js', 'string.quoted.template.html.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 590 + expect(tokens[5]).toEqual value: 'name', scopes: ['source.js', 'string.quoted.template.html.js', 'source.js.embedded.source'] 591 + expect(tokens[6]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.html.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 592 + expect(tokens[7]).toEqual value: '</b>', scopes: ['source.js', 'string.quoted.template.html.js'] 593 + expect(tokens[8]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.html.js', 'punctuation.definition.string.end.js'] 594 + 595 + describe "ES6 tagged Relay.QL string templates", -> 596 + it "tokenizes them as strings", -> 597 + {tokens} = grammar.tokenizeLine('Relay.QL`fragment on Foo { id }`') 598 + expect(tokens[0]).toEqual value: 'Relay.QL', scopes: [ 'source.js', 'string.quoted.template.graphql.js', 'entity.name.function.js' ] 599 + expect(tokens[1]).toEqual value: '`', scopes: [ 'source.js', 'string.quoted.template.graphql.js', 'punctuation.definition.string.begin.js' ] 600 + expect(tokens[2]).toEqual value: 'fragment on Foo { id }', scopes: ['source.js', 'string.quoted.template.graphql.js'] 601 + expect(tokens[3]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.graphql.js', 'punctuation.definition.string.end.js'] 602 + 603 + describe "ES6 tagged Relay.QL string templates with interpolation", -> 604 + it "tokenizes them as strings", -> 605 + {tokens} = grammar.tokenizeLine('Relay.QL`fragment on Foo { ${myFragment} }`') 606 + expect(tokens[0]).toEqual value: 'Relay.QL', scopes: [ 'source.js', 'string.quoted.template.graphql.js', 'entity.name.function.js' ] 607 + expect(tokens[1]).toEqual value: '`', scopes: [ 'source.js', 'string.quoted.template.graphql.js', 'punctuation.definition.string.begin.js' ] 608 + expect(tokens[2]).toEqual value: 'fragment on Foo { ', scopes: ['source.js', 'string.quoted.template.graphql.js'] 609 + expect(tokens[3]).toEqual value: '${', scopes: ['source.js', 'string.quoted.template.graphql.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 610 + expect(tokens[4]).toEqual value: 'myFragment', scopes: ['source.js', 'string.quoted.template.graphql.js', 'source.js.embedded.source'] 611 + expect(tokens[5]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.graphql.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] 612 + expect(tokens[6]).toEqual value: ' }', scopes: ['source.js', 'string.quoted.template.graphql.js'] 613 + expect(tokens[7]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.graphql.js', 'punctuation.definition.string.end.js'] 614 + 615 + describe "ES6 class", -> 616 + it "tokenizes class", -> 617 + {tokens} = grammar.tokenizeLine('class MyClass') 618 + expect(tokens[0]).toEqual value: 'class', scopes: ['source.js', 'meta.class.js', 'storage.type.class.js'] 619 + expect(tokens[2]).toEqual value: 'MyClass', scopes: ['source.js', 'meta.class.js', 'entity.name.type.class.js'] 620 + 621 + {tokens} = grammar.tokenizeLine('class $abc$') 622 + expect(tokens[2]).toEqual value: '$abc$', scopes: ['source.js', 'meta.class.js', 'entity.name.type.class.js'] 623 + 624 + {tokens} = grammar.tokenizeLine('class $$') 625 + expect(tokens[2]).toEqual value: '$$', scopes: ['source.js', 'meta.class.js', 'entity.name.type.class.js'] 626 + 627 + it "tokenizes class...extends", -> 628 + {tokens} = grammar.tokenizeLine('class MyClass extends SomeClass') 629 + expect(tokens[0]).toEqual value: 'class', scopes: ['source.js', 'meta.class.js', 'storage.type.class.js'] 630 + expect(tokens[2]).toEqual value: 'MyClass', scopes: ['source.js', 'meta.class.js', 'entity.name.type.class.js'] 631 + expect(tokens[4]).toEqual value: 'extends', scopes: ['source.js', 'meta.class.js', 'storage.modifier.js'] 632 + expect(tokens[6]).toEqual value: 'SomeClass', scopes: ['source.js', 'meta.class.js', 'entity.other.inherited-class.js'] 633 + 634 + {tokens} = grammar.tokenizeLine('class MyClass extends $abc$') 635 + expect(tokens[6]).toEqual value: '$abc$', scopes: ['source.js', 'meta.class.js', 'entity.other.inherited-class.js'] 636 + 637 + {tokens} = grammar.tokenizeLine('class MyClass extends $$') 638 + expect(tokens[6]).toEqual value: '$$', scopes: ['source.js', 'meta.class.js', 'entity.other.inherited-class.js'] 639 + 640 + it "tokenizes anonymous class", -> 641 + {tokens} = grammar.tokenizeLine('class extends SomeClass') 642 + expect(tokens[0]).toEqual value: 'class', scopes: ['source.js', 'meta.class.js', 'storage.type.class.js'] 643 + expect(tokens[2]).toEqual value: 'extends', scopes: ['source.js', 'meta.class.js', 'storage.modifier.js'] 644 + expect(tokens[4]).toEqual value: 'SomeClass', scopes: ['source.js', 'meta.class.js', 'entity.other.inherited-class.js'] 645 + 646 + {tokens} = grammar.tokenizeLine('class extends $abc$') 647 + expect(tokens[4]).toEqual value: '$abc$', scopes: ['source.js', 'meta.class.js', 'entity.other.inherited-class.js'] 648 + 649 + {tokens} = grammar.tokenizeLine('class extends $$') 650 + expect(tokens[4]).toEqual value: '$$', scopes: ['source.js', 'meta.class.js', 'entity.other.inherited-class.js'] 651 + 652 + describe "ES6 import", -> 653 + it "tokenizes import", -> 654 + {tokens} = grammar.tokenizeLine('import "module-name";') 655 + expect(tokens[0]).toEqual value: 'import', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 656 + expect(tokens[2]).toEqual value: '"', scopes: ['source.js', 'meta.import.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] 657 + expect(tokens[3]).toEqual value: 'module-name', scopes: ['source.js', 'meta.import.js', 'string.quoted.double.js'] 658 + expect(tokens[4]).toEqual value: '"', scopes: ['source.js', 'meta.import.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] 659 + expect(tokens[5]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 660 + 661 + it "tokenizes default import", -> 662 + {tokens} = grammar.tokenizeLine('import defaultMember from "module-name";') 663 + expect(tokens[0]).toEqual value: 'import', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 664 + expect(tokens[2]).toEqual value: 'defaultMember', scopes: ['source.js', 'meta.import.js', 'variable.other.module.js'] 665 + expect(tokens[4]).toEqual value: 'from', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 666 + 667 + it "tokenizes default named import", -> 668 + {tokens} = grammar.tokenizeLine('import { default as defaultMember } from "module-name";') 669 + expect(tokens[0]).toEqual value: 'import', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 670 + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.import.js', 'punctuation.definition.modules.begin.js'] 671 + expect(tokens[4]).toEqual value: 'default', scopes: ['source.js', 'meta.import.js', 'variable.language.default.js'] 672 + expect(tokens[6]).toEqual value: 'as', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 673 + expect(tokens[8]).toEqual value: 'defaultMember', scopes: ['source.js', 'meta.import.js', 'variable.other.module-alias.js'] 674 + expect(tokens[10]).toEqual value: '}', scopes: ['source.js', 'meta.import.js', 'punctuation.definition.modules.end.js'] 675 + expect(tokens[12]).toEqual value: 'from', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 676 + 677 + it "tokenizes named import", -> 678 + {tokens} = grammar.tokenizeLine('import { member } from "module-name";') 679 + expect(tokens[0]).toEqual value: 'import', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 680 + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.import.js', 'punctuation.definition.modules.begin.js'] 681 + expect(tokens[4]).toEqual value: 'member', scopes: ['source.js', 'meta.import.js', 'variable.other.module.js'] 682 + expect(tokens[6]).toEqual value: '}', scopes: ['source.js', 'meta.import.js', 'punctuation.definition.modules.end.js'] 683 + expect(tokens[8]).toEqual value: 'from', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 684 + 685 + {tokens} = grammar.tokenizeLine('import { member1 , member2 as alias2 } from "module-name";') 686 + expect(tokens[0]).toEqual value: 'import', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 687 + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.import.js', 'punctuation.definition.modules.begin.js'] 688 + expect(tokens[4]).toEqual value: 'member1', scopes: ['source.js', 'meta.import.js', 'variable.other.module.js'] 689 + expect(tokens[6]).toEqual value: ',', scopes: ['source.js', 'meta.import.js', 'meta.delimiter.object.comma.js'] 690 + expect(tokens[8]).toEqual value: 'member2', scopes: ['source.js', 'meta.import.js', 'variable.other.module.js'] 691 + expect(tokens[10]).toEqual value: 'as', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 692 + expect(tokens[12]).toEqual value: 'alias2', scopes: ['source.js', 'meta.import.js', 'variable.other.module-alias.js'] 693 + expect(tokens[14]).toEqual value: '}', scopes: ['source.js', 'meta.import.js', 'punctuation.definition.modules.end.js'] 694 + expect(tokens[16]).toEqual value: 'from', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 695 + 696 + it "tokenizes entire module import", -> 697 + {tokens} = grammar.tokenizeLine('import * as name from "module-name";') 698 + expect(tokens[0]).toEqual value: 'import', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 699 + expect(tokens[2]).toEqual value: '*', scopes: ['source.js', 'meta.import.js', 'variable.language.import-all.js'] 700 + expect(tokens[4]).toEqual value: 'as', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 701 + expect(tokens[6]).toEqual value: 'name', scopes: ['source.js', 'meta.import.js', 'variable.other.module-alias.js'] 702 + expect(tokens[8]).toEqual value: 'from', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 703 + 704 + it "tokenizes `import defaultMember, { member } from 'module-name';`", -> 705 + {tokens} = grammar.tokenizeLine('import defaultMember, { member } from "module-name";') 706 + expect(tokens[0]).toEqual value: 'import', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 707 + expect(tokens[2]).toEqual value: 'defaultMember', scopes: ['source.js', 'meta.import.js', 'variable.other.module.js'] 708 + expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.import.js', 'meta.delimiter.object.comma.js'] 709 + expect(tokens[5]).toEqual value: '{', scopes: ['source.js', 'meta.import.js', 'punctuation.definition.modules.begin.js'] 710 + expect(tokens[7]).toEqual value: 'member', scopes: ['source.js', 'meta.import.js', 'variable.other.module.js'] 711 + expect(tokens[9]).toEqual value: '}', scopes: ['source.js', 'meta.import.js', 'punctuation.definition.modules.end.js'] 712 + expect(tokens[11]).toEqual value: 'from', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 713 + 714 + it "tokenizes `import defaultMember, * as alias from 'module-name';", -> 715 + {tokens} = grammar.tokenizeLine('import defaultMember, * as alias from "module-name";') 716 + expect(tokens[0]).toEqual value: 'import', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 717 + expect(tokens[2]).toEqual value: 'defaultMember', scopes: ['source.js', 'meta.import.js', 'variable.other.module.js'] 718 + expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.import.js', 'meta.delimiter.object.comma.js'] 719 + expect(tokens[5]).toEqual value: '*', scopes: ['source.js', 'meta.import.js', 'variable.language.import-all.js'] 720 + expect(tokens[7]).toEqual value: 'as', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 721 + expect(tokens[9]).toEqual value: 'alias', scopes: ['source.js', 'meta.import.js', 'variable.other.module-alias.js'] 722 + expect(tokens[11]).toEqual value: 'from', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] 723 + 724 + it "tokenizes comments in statement", -> 725 + lines = grammar.tokenizeLines ''' 726 + import /* comment */ { 727 + member1, // comment 728 + /* comment */ 729 + member2 730 + } from "module-name"; 731 + ''' 732 + expect(lines[0][2]).toEqual value: '/*', scopes: ['source.js', 'meta.import.js', 'comment.block.js', 'punctuation.definition.comment.js'] 733 + expect(lines[0][3]).toEqual value: ' comment ', scopes: ['source.js', 'meta.import.js', 'comment.block.js'] 734 + expect(lines[0][4]).toEqual value: '*/', scopes: ['source.js', 'meta.import.js', 'comment.block.js', 'punctuation.definition.comment.js'] 735 + expect(lines[1][4]).toEqual value: '//', scopes: ['source.js', 'meta.import.js', 'comment.line.double-slash.js', 'punctuation.definition.comment.js'] 736 + expect(lines[1][5]).toEqual value: ' comment', scopes: ['source.js', 'meta.import.js', 'comment.line.double-slash.js'] 737 + expect(lines[2][1]).toEqual value: '/*', scopes: ['source.js', 'meta.import.js', 'comment.block.js', 'punctuation.definition.comment.js'] 738 + expect(lines[2][2]).toEqual value: ' comment ', scopes: ['source.js', 'meta.import.js', 'comment.block.js'] 739 + expect(lines[2][3]).toEqual value: '*/', scopes: ['source.js', 'meta.import.js', 'comment.block.js', 'punctuation.definition.comment.js'] 740 + 741 + describe "ES6 export", -> 742 + it "tokenizes named export", -> 743 + {tokens} = grammar.tokenizeLine('export var x = 0;') 744 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 745 + expect(tokens[2]).toEqual value: 'var', scopes: ['source.js', 'storage.type.var.js'] 746 + expect(tokens[3]).toEqual value: ' x ', scopes: ['source.js'] 747 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 748 + 749 + {tokens} = grammar.tokenizeLine('export let scopedVariable = 0;') 750 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 751 + expect(tokens[2]).toEqual value: 'let', scopes: ['source.js', 'storage.type.var.js'] 752 + expect(tokens[3]).toEqual value: ' scopedVariable ', scopes: ['source.js'] 753 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 754 + 755 + {tokens} = grammar.tokenizeLine('export const CONSTANT = 0;') 756 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 757 + expect(tokens[2]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 758 + expect(tokens[4]).toEqual value: 'CONSTANT', scopes: ['source.js', 'constant.other.js'] 759 + expect(tokens[6]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] 760 + 761 + it "tokenizes named function export", -> 762 + {tokens} = grammar.tokenizeLine('export function func(p1, p2){}') 763 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 764 + expect(tokens[2]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 765 + expect(tokens[4]).toEqual value: 'func', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 766 + 767 + it "tokenizes named class export", -> 768 + {tokens} = grammar.tokenizeLine('export class Foo {}') 769 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 770 + expect(tokens[2]).toEqual value: 'class', scopes: ['source.js', 'meta.class.js', 'storage.type.class.js'] 771 + expect(tokens[4]).toEqual value: 'Foo', scopes: ['source.js', 'meta.class.js', 'entity.name.type.class.js'] 772 + 773 + it "tokenizes existing variable export", -> 774 + {tokens} = grammar.tokenizeLine('export { bar };') 775 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 776 + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.export.js', 'punctuation.definition.modules.begin.js'] 777 + expect(tokens[4]).toEqual value: 'bar', scopes: ['source.js', 'meta.export.js', 'variable.other.module.js'] 778 + expect(tokens[6]).toEqual value: '}', scopes: ['source.js', 'meta.export.js', 'punctuation.definition.modules.end.js'] 779 + 780 + {tokens} = grammar.tokenizeLine('export { bar, foo as alias };') 781 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 782 + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.export.js', 'punctuation.definition.modules.begin.js'] 783 + expect(tokens[4]).toEqual value: 'bar', scopes: ['source.js', 'meta.export.js', 'variable.other.module.js'] 784 + expect(tokens[5]).toEqual value: ',', scopes: ['source.js', 'meta.export.js', 'meta.delimiter.object.comma.js'] 785 + expect(tokens[7]).toEqual value: 'foo', scopes: ['source.js', 'meta.export.js', 'variable.other.module.js'] 786 + expect(tokens[9]).toEqual value: 'as', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 787 + expect(tokens[11]).toEqual value: 'alias', scopes: ['source.js', 'meta.export.js', 'variable.other.module-alias.js'] 788 + expect(tokens[13]).toEqual value: '}', scopes: ['source.js', 'meta.export.js', 'punctuation.definition.modules.end.js'] 789 + 790 + it "tokenizes default export", -> 791 + {tokens} = grammar.tokenizeLine('export default 123;') 792 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 793 + expect(tokens[2]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] 794 + expect(tokens[4]).toEqual value: '123', scopes: ['source.js', 'constant.numeric.decimal.js'] 795 + 796 + {tokens} = grammar.tokenizeLine('export default name;') 797 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 798 + expect(tokens[2]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] 799 + expect(tokens[4]).toEqual value: 'name', scopes: ['source.js', 'meta.export.js', 'variable.other.module.js'] 800 + 801 + {tokens} = grammar.tokenizeLine('export { foo as default };') 802 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 803 + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.export.js', 'punctuation.definition.modules.begin.js'] 804 + expect(tokens[4]).toEqual value: 'foo', scopes: ['source.js', 'meta.export.js', 'variable.other.module.js'] 805 + expect(tokens[6]).toEqual value: 'as', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 806 + expect(tokens[8]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] 807 + expect(tokens[10]).toEqual value: '}', scopes: ['source.js', 'meta.export.js', 'punctuation.definition.modules.end.js'] 808 + 809 + {tokens} = grammar.tokenizeLine(''' 810 + export default { 811 + 'prop': 'value' 812 + }; 813 + ''') 814 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 815 + expect(tokens[2]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] 816 + expect(tokens[4]).toEqual value: '{', scopes: ['source.js', 'meta.brace.curly.js'] 817 + expect(tokens[6]).toEqual value: "'", scopes: ['source.js', 'string.quoted.single.js', 'punctuation.definition.string.begin.js'] 818 + expect(tokens[7]).toEqual value: "prop", scopes: ['source.js', 'string.quoted.single.js'] 819 + expect(tokens[8]).toEqual value: "'", scopes: ['source.js', 'string.quoted.single.js', 'punctuation.definition.string.end.js'] 820 + expect(tokens[9]).toEqual value: ":", scopes: ['source.js', 'keyword.operator.js'] 821 + expect(tokens[11]).toEqual value: "'", scopes: ['source.js', 'string.quoted.single.js', 'punctuation.definition.string.begin.js'] 822 + expect(tokens[12]).toEqual value: "value", scopes: ['source.js', 'string.quoted.single.js'] 823 + expect(tokens[13]).toEqual value: "'", scopes: ['source.js', 'string.quoted.single.js', 'punctuation.definition.string.end.js'] 824 + expect(tokens[15]).toEqual value: '}', scopes: ['source.js', 'meta.brace.curly.js'] 825 + 826 + it "tokenizes default function export", -> 827 + {tokens} = grammar.tokenizeLine('export default function () {}') 828 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 829 + expect(tokens[2]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] 830 + expect(tokens[4]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 831 + 832 + {tokens} = grammar.tokenizeLine('export default function func() {}') 833 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 834 + expect(tokens[2]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] 835 + expect(tokens[4]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 836 + 837 + it "tokenizes comments in statement", -> 838 + lines = grammar.tokenizeLines ''' 839 + export { 840 + member1, // comment 841 + /* comment */ 842 + member2 843 + }; 844 + ''' 845 + expect(lines[1][4]).toEqual value: '//', scopes: ['source.js', 'meta.export.js', 'comment.line.double-slash.js', 'punctuation.definition.comment.js'] 846 + expect(lines[1][5]).toEqual value: ' comment', scopes: ['source.js', 'meta.export.js', 'comment.line.double-slash.js'] 847 + expect(lines[2][1]).toEqual value: '/*', scopes: ['source.js', 'meta.export.js', 'comment.block.js', 'punctuation.definition.comment.js'] 848 + expect(lines[2][2]).toEqual value: ' comment ', scopes: ['source.js', 'meta.export.js', 'comment.block.js'] 849 + expect(lines[2][3]).toEqual value: '*/', scopes: ['source.js', 'meta.export.js', 'comment.block.js', 'punctuation.definition.comment.js'] 850 + 851 + {tokens} = grammar.tokenizeLine('export {member1, /* comment */ member2} /* comment */ from "module";') 852 + expect(tokens[6]).toEqual value: '/*', scopes: ['source.js', 'meta.export.js', 'comment.block.js', 'punctuation.definition.comment.js'] 853 + expect(tokens[7]).toEqual value: ' comment ', scopes: ['source.js', 'meta.export.js', 'comment.block.js'] 854 + expect(tokens[8]).toEqual value: '*/', scopes: ['source.js', 'meta.export.js', 'comment.block.js', 'punctuation.definition.comment.js'] 855 + expect(tokens[13]).toEqual value: '/*', scopes: ['source.js', 'meta.export.js', 'comment.block.js', 'punctuation.definition.comment.js'] 856 + expect(tokens[14]).toEqual value: ' comment ', scopes: ['source.js', 'meta.export.js', 'comment.block.js'] 857 + expect(tokens[15]).toEqual value: '*/', scopes: ['source.js', 'meta.export.js', 'comment.block.js', 'punctuation.definition.comment.js'] 858 + 859 + it "tokenizes default class export", -> 860 + {tokens} = grammar.tokenizeLine('export default class {}') 861 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 862 + expect(tokens[2]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] 863 + expect(tokens[4]).toEqual value: 'class', scopes: ['source.js', 'storage.type.js'] 864 + expect(tokens[6]).toEqual value: '{', scopes: ['source.js', 'punctuation.section.scope.begin.js'] 865 + expect(tokens[7]).toEqual value: '}', scopes: ['source.js', 'punctuation.section.scope.end.js'] 866 + 867 + {tokens} = grammar.tokenizeLine('export default class Foo {}') 868 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 869 + expect(tokens[2]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] 870 + expect(tokens[4]).toEqual value: 'class', scopes: ['source.js', 'meta.class.js', 'storage.type.class.js'] 871 + expect(tokens[6]).toEqual value: 'Foo', scopes: ['source.js', 'meta.class.js', 'entity.name.type.class.js'] 872 + 873 + it "tokenizes re-export", -> 874 + {tokens} = grammar.tokenizeLine('export { name } from "module-name";') 875 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 876 + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.export.js', 'punctuation.definition.modules.begin.js'] 877 + expect(tokens[4]).toEqual value: 'name', scopes: ['source.js', 'meta.export.js', 'variable.other.module.js'] 878 + expect(tokens[6]).toEqual value: '}', scopes: ['source.js', 'meta.export.js', 'punctuation.definition.modules.end.js'] 879 + expect(tokens[8]).toEqual value: 'from', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 880 + 881 + {tokens} = grammar.tokenizeLine('export * from "module-name";') 882 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 883 + expect(tokens[2]).toEqual value: '*', scopes: ['source.js', 'meta.export.js', 'variable.language.import-all.js'] 884 + expect(tokens[4]).toEqual value: 'from', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 885 + 886 + {tokens} = grammar.tokenizeLine('export { default as alias } from "module-name";') 887 + expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 888 + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.export.js', 'punctuation.definition.modules.begin.js'] 889 + expect(tokens[4]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] 890 + expect(tokens[6]).toEqual value: 'as', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 891 + expect(tokens[8]).toEqual value: 'alias', scopes: ['source.js', 'meta.export.js', 'variable.other.module-alias.js'] 892 + expect(tokens[10]).toEqual value: '}', scopes: ['source.js', 'meta.export.js', 'punctuation.definition.modules.end.js'] 893 + expect(tokens[12]).toEqual value: 'from', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] 894 + 895 + describe "ES6 yield", -> 896 + it "tokenizes yield", -> 897 + {tokens} = grammar.tokenizeLine('yield next') 898 + expect(tokens[0]).toEqual value: 'yield', scopes: ['source.js', 'meta.control.yield.js', 'keyword.control.js'] 899 + 900 + it "tokenizes yield*", -> 901 + {tokens} = grammar.tokenizeLine('yield * next') 902 + expect(tokens[0]).toEqual value: 'yield', scopes: ['source.js', 'meta.control.yield.js', 'keyword.control.js'] 903 + expect(tokens[2]).toEqual value: '*', scopes: ['source.js', 'meta.control.yield.js', 'storage.modifier.js'] 904 + 905 + it "does not tokenize yield when it is an object key", -> 906 + {tokens} = grammar.tokenizeLine('yield: 1') 907 + expect(tokens[0]).toEqual value: 'yield', scopes: ['source.js'] 908 + expect(tokens[1]).toEqual value: ':', scopes: ['source.js', 'keyword.operator.js'] 909 + 910 + it "tokenizes yield in the middle of ternary expressions", -> 911 + {tokens} = grammar.tokenizeLine('a ? yield : b') 912 + expect(tokens[3]).toEqual value: 'yield', scopes: ['source.js', 'meta.control.yield.js', 'keyword.control.js'] 913 + 914 + it "tokenizes yield at the end of ternary expressions", -> 915 + {tokens} = grammar.tokenizeLine('a ? b : yield') 916 + expect(tokens[5]).toEqual value: 'yield', scopes: ['source.js', 'meta.control.yield.js', 'keyword.control.js'] 917 + 918 + describe "default: in a switch statement", -> 919 + it "tokenizes it as a keyword", -> 920 + {tokens} = grammar.tokenizeLine('default: ') 921 + expect(tokens[0]).toEqual value: 'default', scopes: ['source.js', 'keyword.control.js'] 922 + 923 + describe "functions", -> 924 + it "tokenizes regular function declarations", -> 925 + {tokens} = grammar.tokenizeLine('function foo(){}') 926 + expect(tokens[0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 927 + expect(tokens[2]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 928 + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 929 + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 930 + expect(tokens[5]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] 931 + expect(tokens[6]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] 932 + 933 + lines = grammar.tokenizeLines ''' 934 + function foo() { 935 + if(something){ } 936 + } 937 + ''' 938 + expect(lines[0][0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 939 + expect(lines[0][2]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 940 + expect(lines[0][3]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 941 + expect(lines[0][4]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 942 + expect(lines[0][6]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] 943 + expect(lines[1][1]).toEqual value: 'if', scopes: ['source.js', 'keyword.control.js'] 944 + expect(lines[1][5]).toEqual value: '{', scopes: ['source.js', 'meta.brace.curly.js'] 945 + expect(lines[1][7]).toEqual value: '}', scopes: ['source.js', 'meta.brace.curly.js'] 946 + expect(lines[2][0]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] 947 + 948 + {tokens} = grammar.tokenizeLine('function $abc$(){}') 949 + expect(tokens[2]).toEqual value: '$abc$', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 950 + 951 + {tokens} = grammar.tokenizeLine('function $$(){}') 952 + expect(tokens[2]).toEqual value: '$$', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 953 + 954 + it "tokenizes anonymous functions", -> 955 + {tokens} = grammar.tokenizeLine('function (){}') 956 + expect(tokens[0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 957 + expect(tokens[2]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 958 + expect(tokens[3]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 959 + expect(tokens[4]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] 960 + expect(tokens[5]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] 961 + 962 + it "tokenizes async functions", -> 963 + {tokens} = grammar.tokenizeLine('async function foo(){}') 964 + expect(tokens[0]).toEqual value: 'async', scopes: ['source.js', 'meta.function.js', 'storage.modifier.async.js'] 965 + expect(tokens[2]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 966 + expect(tokens[4]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 967 + 968 + it "tokenizes functions as object properties", -> 969 + {tokens} = grammar.tokenizeLine('obj.method = function foo(') 970 + expect(tokens[0]).toEqual value: 'obj', scopes: ['source.js', 'variable.other.object.js'] 971 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.function.js', 'meta.delimiter.method.period.js'] 972 + expect(tokens[2]).toEqual value: 'method', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 973 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'meta.function.js', 'keyword.operator.assignment.js'] 974 + expect(tokens[6]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 975 + expect(tokens[8]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 976 + expect(tokens[9]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 977 + 978 + {tokens} = grammar.tokenizeLine('this.register = function(') 979 + expect(tokens[0]).toEqual value: 'this', scopes: ['source.js', 'variable.language.js'] 980 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.function.js', 'meta.delimiter.method.period.js'] 981 + expect(tokens[2]).toEqual value: 'register', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 982 + expect(tokens[6]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 983 + 984 + {tokens} = grammar.tokenizeLine('document.getElementById("foo").onclick = function(') 985 + expect(tokens[8]).toEqual value: '.', scopes: ['source.js', 'meta.function.js', 'meta.delimiter.method.period.js'] 986 + expect(tokens[9]).toEqual value: 'onclick', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 987 + expect(tokens[13]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 988 + 989 + it "tokenizes ES6 method definitions", -> 990 + {tokens} = grammar.tokenizeLine('f(a, b) {}') 991 + expect(tokens[0]).toEqual value: 'f', scopes: ['source.js', 'meta.function.method.definition.js', 'entity.name.function.js'] 992 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 993 + expect(tokens[2]).toEqual value: 'a', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'variable.parameter.function.js'] 994 + expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] 995 + expect(tokens[5]).toEqual value: 'b', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'variable.parameter.function.js'] 996 + expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 997 + 998 + {tokens} = grammar.tokenizeLine('async foo(){}') 999 + expect(tokens[0]).toEqual value: 'async', scopes: ['source.js', 'storage.modifier.js'] 1000 + expect(tokens[2]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.method.definition.js', 'entity.name.function.js'] 1001 + 1002 + {tokens} = grammar.tokenizeLine('hi({host, root = "./", plugins = [a, "b", "c", d]}) {}') 1003 + expect(tokens[0]).toEqual value: 'hi', scopes: ['source.js', 'meta.function.method.definition.js', 'entity.name.function.js'] 1004 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 1005 + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.brace.curly.js'] 1006 + expect(tokens[3]).toEqual value: 'host', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js'] 1007 + expect(tokens[4]).toEqual value: ',', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] 1008 + expect(tokens[5]).toEqual value: ' root ', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js'] 1009 + expect(tokens[6]).toEqual value: '=', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'keyword.operator.assignment.js'] 1010 + expect(tokens[8]).toEqual value: '"', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] 1011 + expect(tokens[9]).toEqual value: './', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'string.quoted.double.js'] 1012 + expect(tokens[10]).toEqual value: '"', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] 1013 + expect(tokens[11]).toEqual value: ',', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] 1014 + expect(tokens[12]).toEqual value: ' plugins ', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js'] 1015 + expect(tokens[13]).toEqual value: '=', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'keyword.operator.assignment.js'] 1016 + expect(tokens[15]).toEqual value: '[', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.brace.square.js'] 1017 + expect(tokens[16]).toEqual value: 'a', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js'] 1018 + expect(tokens[17]).toEqual value: ',', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] 1019 + expect(tokens[19]).toEqual value: '"', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] 1020 + expect(tokens[22]).toEqual value: ',', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] 1021 + expect(tokens[24]).toEqual value: '"', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] 1022 + expect(tokens[28]).toEqual value: ' d', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js'] 1023 + expect(tokens[29]).toEqual value: ']', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.brace.square.js'] 1024 + expect(tokens[30]).toEqual value: '}', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.brace.curly.js'] 1025 + expect(tokens[31]).toEqual value: ')', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 1026 + 1027 + {tokens} = grammar.tokenizeLine('write("){");') 1028 + expect(tokens[0]).toEqual value: 'write', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] 1029 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1030 + expect(tokens[2]).toEqual value: '"', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] 1031 + expect(tokens[3]).toEqual value: '){', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'string.quoted.double.js'] 1032 + expect(tokens[4]).toEqual value: '"', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] 1033 + expect(tokens[5]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1034 + expect(tokens[6]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 1035 + 1036 + it "tokenizes constructors", -> 1037 + {tokens} = grammar.tokenizeLine('constructor(p1, p2) { this.p1 = p1; }') 1038 + expect(tokens[0]).toEqual value: 'constructor', scopes: ['source.js', 'meta.function.js', 'entity.name.function.constructor.js'] 1039 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 1040 + expect(tokens[2]).toEqual value: 'p1', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1041 + expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] 1042 + expect(tokens[5]).toEqual value: 'p2', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1043 + expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 1044 + expect(tokens[10]).toEqual value: 'this', scopes: ['source.js', 'variable.language.js'] 1045 + 1046 + it "tokenizes named function expressions", -> 1047 + {tokens} = grammar.tokenizeLine('var func = function foo(){}') 1048 + expect(tokens[0]).toEqual value: 'var', scopes: ['source.js', 'storage.type.var.js'] 1049 + expect(tokens[2]).toEqual value: 'func', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 1050 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'meta.function.js', 'keyword.operator.assignment.js'] 1051 + expect(tokens[6]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 1052 + expect(tokens[8]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 1053 + expect(tokens[9]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 1054 + 1055 + it "tokenizes anonymous function expressions", -> 1056 + {tokens} = grammar.tokenizeLine('var func = function(){}') 1057 + expect(tokens[0]).toEqual value: 'var', scopes: ['source.js', 'storage.type.var.js'] 1058 + expect(tokens[2]).toEqual value: 'func', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 1059 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'meta.function.js', 'keyword.operator.assignment.js'] 1060 + expect(tokens[6]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 1061 + expect(tokens[7]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 1062 + 1063 + it "tokenizes functions in object literals", -> 1064 + {tokens} = grammar.tokenizeLine('func: function foo(') 1065 + expect(tokens[0]).toEqual value: 'func', scopes: ['source.js', 'meta.function.json.js', 'entity.name.function.js'] 1066 + expect(tokens[1]).toEqual value: ':', scopes: ['source.js', 'meta.function.json.js', 'keyword.operator.assignment.js'] 1067 + expect(tokens[3]).toEqual value: 'function', scopes: ['source.js', 'meta.function.json.js', 'storage.type.function.js'] 1068 + expect(tokens[5]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.json.js', 'entity.name.function.js'] 1069 + expect(tokens[6]).toEqual value: '(', scopes: ['source.js', 'meta.function.json.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 1070 + 1071 + {tokens} = grammar.tokenizeLine('"func": function foo(') 1072 + expect(tokens[1]).toEqual value: 'func', scopes: ['source.js', 'meta.function.json.js', 'string.quoted.double.js', 'entity.name.function.js'] 1073 + expect(tokens[3]).toEqual value: ':', scopes: ['source.js', 'meta.function.json.js', 'keyword.operator.assignment.js'] 1074 + expect(tokens[5]).toEqual value: 'function', scopes: ['source.js', 'meta.function.json.js', 'storage.type.function.js'] 1075 + expect(tokens[7]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.json.js', 'entity.name.function.js'] 1076 + expect(tokens[8]).toEqual value: '(', scopes: ['source.js', 'meta.function.json.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 1077 + 1078 + it "tokenizes generator functions", -> 1079 + {tokens} = grammar.tokenizeLine('function* foo(){}') 1080 + expect(tokens[0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 1081 + expect(tokens[1]).toEqual value: '*', scopes: ['source.js', 'meta.function.js', 'storage.modifier.generator.js'] 1082 + expect(tokens[3]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 1083 + expect(tokens[4]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 1084 + expect(tokens[5]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 1085 + expect(tokens[6]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] 1086 + expect(tokens[7]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] 1087 + 1088 + {tokens} = grammar.tokenizeLine('function *foo(){}') 1089 + expect(tokens[2]).toEqual value: '*', scopes: ['source.js', 'meta.function.js', 'storage.modifier.generator.js'] 1090 + 1091 + {tokens} = grammar.tokenizeLine('function *(){}') 1092 + expect(tokens[2]).toEqual value: '*', scopes: ['source.js', 'meta.function.js', 'storage.modifier.generator.js'] 1093 + 1094 + it "tokenizes arrow functions", -> 1095 + {tokens} = grammar.tokenizeLine('x => x * x') 1096 + expect(tokens[0]).toEqual value: 'x', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1097 + expect(tokens[2]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1098 + expect(tokens[3]).toEqual value: ' x ', scopes: ['source.js'] 1099 + 1100 + {tokens} = grammar.tokenizeLine('() => {}') 1101 + expect(tokens[0]).toEqual value: '(', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 1102 + expect(tokens[1]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 1103 + expect(tokens[3]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1104 + expect(tokens[5]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] 1105 + expect(tokens[6]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] 1106 + 1107 + {tokens} = grammar.tokenizeLine('(p1, p2) => {}') 1108 + expect(tokens[0]).toEqual value: '(', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 1109 + expect(tokens[1]).toEqual value: 'p1', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1110 + expect(tokens[2]).toEqual value: ',', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] 1111 + expect(tokens[4]).toEqual value: 'p2', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1112 + expect(tokens[5]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 1113 + expect(tokens[7]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1114 + expect(tokens[9]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] 1115 + expect(tokens[10]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] 1116 + 1117 + lines = grammar.tokenizeLines """ 1118 + a = (x, 1119 + y) => {} 1120 + """ 1121 + expect(lines[1][3]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1122 + 1123 + it "tokenizes stored arrow functions", -> 1124 + {tokens} = grammar.tokenizeLine('var func = (p1, p2) => {}') 1125 + expect(tokens[0]).toEqual value: 'var', scopes: ['source.js', 'storage.type.var.js'] 1126 + expect(tokens[2]).toEqual value: 'func', scopes: ['source.js', 'meta.function.arrow.js', 'entity.name.function.js'] 1127 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'meta.function.arrow.js', 'keyword.operator.assignment.js'] 1128 + expect(tokens[11]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 1129 + expect(tokens[13]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1130 + 1131 + it "tokenizes arrow functions as object properties", -> 1132 + {tokens} = grammar.tokenizeLine('Utils.isEmpty = (p1, p2) => {}') 1133 + expect(tokens[0]).toEqual value: 'Utils', scopes: ['source.js', 'variable.other.object.js'] 1134 + expect(tokens[2]).toEqual value: 'isEmpty', scopes: ['source.js', 'meta.function.arrow.js', 'entity.name.function.js'] 1135 + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'meta.function.arrow.js', 'keyword.operator.assignment.js'] 1136 + expect(tokens[11]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 1137 + expect(tokens[13]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1138 + 1139 + it "tokenizes arrow functions in object literals", -> 1140 + {tokens} = grammar.tokenizeLine('foo: param => {}') 1141 + expect(tokens[0]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.arrow.json.js', 'entity.name.function.js'] 1142 + expect(tokens[1]).toEqual value: ':', scopes: ['source.js', 'meta.function.arrow.json.js', 'keyword.operator.assignment.js'] 1143 + expect(tokens[3]).toEqual value: 'param', scopes: ['source.js', 'meta.function.arrow.json.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1144 + expect(tokens[5]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.json.js', 'storage.type.function.arrow.js'] 1145 + 1146 + {tokens} = grammar.tokenizeLine('"foo": param => {}') 1147 + expect(tokens[1]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.arrow.json.js', 'string.quoted.double.js', 'entity.name.function.js'] 1148 + expect(tokens[3]).toEqual value: ':', scopes: ['source.js', 'meta.function.arrow.json.js', 'keyword.operator.assignment.js'] 1149 + expect(tokens[5]).toEqual value: 'param', scopes: ['source.js', 'meta.function.arrow.json.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1150 + expect(tokens[7]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.json.js', 'storage.type.function.arrow.js'] 1151 + 1152 + it "tokenizes default parameters", -> 1153 + {tokens} = grammar.tokenizeLine('function multiply(a, b = 1){}') 1154 + expect(tokens[7]).toEqual value: 'b', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1155 + expect(tokens[9]).toEqual value: '=', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'keyword.operator.assignment.js'] 1156 + expect(tokens[11]).toEqual value: '1', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'constant.numeric.decimal.js'] 1157 + 1158 + {tokens} = grammar.tokenizeLine('function callSomething(thing = this.something()) {}') 1159 + expect(tokens[4]).toEqual value: 'thing', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1160 + expect(tokens[6]).toEqual value: '=', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'keyword.operator.assignment.js'] 1161 + expect(tokens[8]).toEqual value: 'this', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'variable.language.js'] 1162 + expect(tokens[9]).toEqual value: '.', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1163 + expect(tokens[10]).toEqual value: 'something', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'meta.method-call.js', 'entity.name.function.js'] 1164 + 1165 + it "tokenizes the rest parameter", -> 1166 + {tokens} = grammar.tokenizeLine('(...args) => args[0]') 1167 + expect(tokens[1]).toEqual value: '...', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'keyword.operator.spread.js'] 1168 + expect(tokens[2]).toEqual value: 'args', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.rest.function.js'] 1169 + 1170 + it "tokenizes illegal parameters", -> 1171 + {tokens} = grammar.tokenizeLine('0abc => {}') 1172 + expect(tokens[0]).toEqual value: '0abc', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'invalid.illegal.identifier.js'] 1173 + expect(tokens[2]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1174 + 1175 + {tokens} = grammar.tokenizeLine('(0abc) => {}') 1176 + expect(tokens[1]).toEqual value: '0abc', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'invalid.illegal.identifier.js'] 1177 + expect(tokens[4]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1178 + 1179 + describe "variables", -> 1180 + it "tokenizes 'this'", -> 1181 + {tokens} = grammar.tokenizeLine('this') 1182 + expect(tokens[0]).toEqual value: 'this', scopes: ['source.js', 'variable.language.js'] 1183 + 1184 + {tokens} = grammar.tokenizeLine('this.obj.prototype = new El()') 1185 + expect(tokens[0]).toEqual value: 'this', scopes: ['source.js', 'variable.language.js'] 1186 + 1187 + it "tokenizes 'super'", -> 1188 + {tokens} = grammar.tokenizeLine('super') 1189 + expect(tokens[0]).toEqual value: 'super', scopes: ['source.js', 'variable.language.js'] 1190 + 1191 + it "tokenizes 'arguments'", -> 1192 + {tokens} = grammar.tokenizeLine('arguments') 1193 + expect(tokens[0]).toEqual value: 'arguments', scopes: ['source.js', 'variable.language.js'] 1194 + 1195 + {tokens} = grammar.tokenizeLine('arguments[0]') 1196 + expect(tokens[0]).toEqual value: 'arguments', scopes: ['source.js', 'variable.language.js'] 1197 + 1198 + {tokens} = grammar.tokenizeLine('arguments.length') 1199 + expect(tokens[0]).toEqual value: 'arguments', scopes: ['source.js', 'variable.language.js'] 1200 + 1201 + it "tokenizes illegal identifiers", -> 1202 + {tokens} = grammar.tokenizeLine('0illegal') 1203 + expect(tokens[0]).toEqual value: '0illegal', scopes: ['source.js', 'invalid.illegal.identifier.js'] 1204 + 1205 + {tokens} = grammar.tokenizeLine('123illegal') 1206 + expect(tokens[0]).toEqual value: '123illegal', scopes: ['source.js', 'invalid.illegal.identifier.js'] 1207 + 1208 + {tokens} = grammar.tokenizeLine('123$illegal') 1209 + expect(tokens[0]).toEqual value: '123$illegal', scopes: ['source.js', 'invalid.illegal.identifier.js'] 1210 + 1211 + describe "objects", -> 1212 + it "tokenizes them", -> 1213 + {tokens} = grammar.tokenizeLine('obj.prop') 1214 + expect(tokens[0]).toEqual value: 'obj', scopes: ['source.js', 'variable.other.object.js'] 1215 + 1216 + {tokens} = grammar.tokenizeLine('$abc$.prop') 1217 + expect(tokens[0]).toEqual value: '$abc$', scopes: ['source.js', 'variable.other.object.js'] 1218 + 1219 + {tokens} = grammar.tokenizeLine('$$.prop') 1220 + expect(tokens[0]).toEqual value: '$$', scopes: ['source.js', 'variable.other.object.js'] 1221 + 1222 + it "tokenizes illegal objects", -> 1223 + {tokens} = grammar.tokenizeLine('1.prop') 1224 + expect(tokens[0]).toEqual value: '1', scopes: ['source.js', 'invalid.illegal.identifier.js'] 1225 + 1226 + {tokens} = grammar.tokenizeLine('123.prop') 1227 + expect(tokens[0]).toEqual value: '123', scopes: ['source.js', 'invalid.illegal.identifier.js'] 1228 + 1229 + {tokens} = grammar.tokenizeLine('123a.prop') 1230 + expect(tokens[0]).toEqual value: '123a', scopes: ['source.js', 'invalid.illegal.identifier.js'] 1231 + 1232 + describe "function calls", -> 1233 + it "tokenizes function calls", -> 1234 + {tokens} = grammar.tokenizeLine('functionCall()') 1235 + expect(tokens[0]).toEqual value: 'functionCall', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] 1236 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1237 + expect(tokens[2]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1238 + 1239 + {tokens} = grammar.tokenizeLine('functionCall(arg1, "test", {a: 123})') 1240 + expect(tokens[0]).toEqual value: 'functionCall', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] 1241 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1242 + expect(tokens[2]).toEqual value: 'arg1', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js'] 1243 + expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.delimiter.object.comma.js'] 1244 + expect(tokens[5]).toEqual value: '"', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] 1245 + expect(tokens[6]).toEqual value: 'test', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'string.quoted.double.js'] 1246 + expect(tokens[7]).toEqual value: '"', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] 1247 + expect(tokens[8]).toEqual value: ',', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.delimiter.object.comma.js'] 1248 + expect(tokens[10]).toEqual value: '{', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.brace.curly.js'] 1249 + expect(tokens[11]).toEqual value: 'a', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js'] 1250 + expect(tokens[12]).toEqual value: ':', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'keyword.operator.js'] 1251 + expect(tokens[14]).toEqual value: '123', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'constant.numeric.decimal.js'] 1252 + expect(tokens[15]).toEqual value: '}', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.brace.curly.js'] 1253 + expect(tokens[16]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1254 + 1255 + {tokens} = grammar.tokenizeLine('functionCall((123).toString())') 1256 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1257 + expect(tokens[2]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.brace.round.js'] 1258 + expect(tokens[3]).toEqual value: '123', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'constant.numeric.decimal.js'] 1259 + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.brace.round.js'] 1260 + expect(tokens[9]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1261 + 1262 + {tokens} = grammar.tokenizeLine('$abc$()') 1263 + expect(tokens[0]).toEqual value: '$abc$', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] 1264 + 1265 + {tokens} = grammar.tokenizeLine('$$()') 1266 + expect(tokens[0]).toEqual value: '$$', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] 1267 + 1268 + {tokens} = grammar.tokenizeLine('ABC()') 1269 + expect(tokens[0]).toEqual value: 'ABC', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] 1270 + 1271 + {tokens} = grammar.tokenizeLine('$ABC$()') 1272 + expect(tokens[0]).toEqual value: '$ABC$', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] 1273 + 1274 + it "tokenizes function calls when they are arguments", -> 1275 + {tokens} = grammar.tokenizeLine('a(b(c))') 1276 + expect(tokens[0]).toEqual value: 'a', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] 1277 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1278 + expect(tokens[2]).toEqual value: 'b', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function-call.js', 'entity.name.function.js'] 1279 + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1280 + expect(tokens[4]).toEqual value: 'c', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function-call.js', 'meta.arguments.js'] 1281 + expect(tokens[5]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1282 + expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1283 + 1284 + it "tokenizes illegal function calls", -> 1285 + {tokens} = grammar.tokenizeLine('0illegal()') 1286 + expect(tokens[0]).toEqual value: '0illegal', scopes: ['source.js', 'meta.function-call.js', 'invalid.illegal.identifier.js'] 1287 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1288 + expect(tokens[2]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1289 + 1290 + it "tokenizes illegal arguments", -> 1291 + {tokens} = grammar.tokenizeLine('a(1a)') 1292 + expect(tokens[0]).toEqual value: 'a', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] 1293 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1294 + expect(tokens[2]).toEqual value: '1a', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'invalid.illegal.identifier.js'] 1295 + expect(tokens[3]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1296 + 1297 + {tokens} = grammar.tokenizeLine('a(123a)') 1298 + expect(tokens[2]).toEqual value: '123a', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'invalid.illegal.identifier.js'] 1299 + 1300 + {tokens} = grammar.tokenizeLine('a(1.prop)') 1301 + expect(tokens[2]).toEqual value: '1', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'invalid.illegal.identifier.js'] 1302 + expect(tokens[3]).toEqual value: '.', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.delimiter.property.period.js'] 1303 + expect(tokens[4]).toEqual value: 'prop', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'variable.other.property.js'] 1304 + 1305 + it "tokenizes function declaration as an argument", -> 1306 + {tokens} = grammar.tokenizeLine('a(function b(p) { return p; })') 1307 + expect(tokens[0]).toEqual value: 'a', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] 1308 + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1309 + expect(tokens[2]).toEqual value: 'function', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'storage.type.function.js'] 1310 + expect(tokens[4]).toEqual value: 'b', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'entity.name.function.js'] 1311 + expect(tokens[5]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] 1312 + expect(tokens[6]).toEqual value: 'p', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1313 + expect(tokens[7]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] 1314 + expect(tokens[9]).toEqual value: '{', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] 1315 + expect(tokens[11]).toEqual value: 'return', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'keyword.control.js'] 1316 + expect(tokens[12]).toEqual value: ' p', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js'] 1317 + expect(tokens[13]).toEqual value: ';', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.terminator.statement.js'] 1318 + expect(tokens[15]).toEqual value: '}', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.function.body.end.bracket.curly.js'] 1319 + expect(tokens[16]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1320 + 1321 + describe "method calls", -> 1322 + it "tokenizes method calls", -> 1323 + {tokens} = grammar.tokenizeLine('a.b(1+1)') 1324 + expect(tokens[0]).toEqual value: 'a', scopes: ['source.js', 'variable.other.object.js'] 1325 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1326 + expect(tokens[2]).toEqual value: 'b', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1327 + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1328 + expect(tokens[4]).toEqual value: '1', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'constant.numeric.decimal.js'] 1329 + expect(tokens[5]).toEqual value: '+', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'keyword.operator.js'] 1330 + expect(tokens[6]).toEqual value: '1', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'constant.numeric.decimal.js'] 1331 + expect(tokens[7]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1332 + 1333 + {tokens} = grammar.tokenizeLine('a . b(1+1)') 1334 + expect(tokens[2]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1335 + expect(tokens[4]).toEqual value: 'b', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1336 + expect(tokens[5]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1337 + 1338 + {tokens} = grammar.tokenizeLine('a.$abc$()') 1339 + expect(tokens[2]).toEqual value: '$abc$', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1340 + 1341 + {tokens} = grammar.tokenizeLine('a.$$()') 1342 + expect(tokens[2]).toEqual value: '$$', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1343 + 1344 + lines = grammar.tokenizeLines """ 1345 + gulp.src("./*.js") 1346 + .pipe(minify()) 1347 + .pipe(gulp.dest("build")) 1348 + """ 1349 + expect(lines[0][0]).toEqual value: 'gulp', scopes: ['source.js', 'variable.other.object.js'] 1350 + expect(lines[0][1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1351 + expect(lines[0][2]).toEqual value: 'src', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1352 + expect(lines[0][3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1353 + expect(lines[0][4]).toEqual value: '"', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] 1354 + expect(lines[0][5]).toEqual value: './*.js', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'string.quoted.double.js'] 1355 + expect(lines[0][6]).toEqual value: '"', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] 1356 + expect(lines[0][7]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1357 + expect(lines[1][1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1358 + expect(lines[1][2]).toEqual value: 'pipe', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1359 + expect(lines[1][3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1360 + expect(lines[1][4]).toEqual value: 'minify', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'meta.function-call.js', 'entity.name.function.js'] 1361 + expect(lines[1][5]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1362 + expect(lines[1][6]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1363 + expect(lines[1][7]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1364 + expect(lines[2][1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1365 + expect(lines[2][2]).toEqual value: 'pipe', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1366 + expect(lines[2][3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1367 + expect(lines[2][4]).toEqual value: 'gulp', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'variable.other.object.js'] 1368 + expect(lines[2][5]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1369 + expect(lines[2][6]).toEqual value: 'dest', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'meta.method-call.js', 'entity.name.function.js'] 1370 + expect(lines[2][7]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1371 + expect(lines[2][8]).toEqual value: '"', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'meta.method-call.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] 1372 + expect(lines[2][9]).toEqual value: 'build', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'meta.method-call.js', 'meta.arguments.js', 'string.quoted.double.js'] 1373 + expect(lines[2][10]).toEqual value: '"', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'meta.method-call.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] 1374 + expect(lines[2][11]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1375 + expect(lines[2][12]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1376 + 1377 + describe "built-in methods", -> 1378 + methods = ["require", "parseInt", "parseFloat", "print"] 1379 + domMethods = ["substringData", "submit", "splitText", "setNamedItem", "setAttribute"] 1380 + 1381 + for method in methods 1382 + it "tokenizes '#{method}'", -> 1383 + {tokens} = grammar.tokenizeLine('.' + method + '()') 1384 + expect(tokens[0]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1385 + expect(tokens[1]).toEqual value: method, scopes: ['source.js', 'meta.method-call.js', 'support.function.js'] 1386 + expect(tokens[2]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1387 + expect(tokens[3]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1388 + 1389 + for domMethod in domMethods 1390 + it "tokenizes '#{domMethod}'", -> 1391 + {tokens} = grammar.tokenizeLine('.' + domMethod + '()') 1392 + expect(tokens[0]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1393 + expect(tokens[1]).toEqual value: domMethod, scopes: ['source.js', 'meta.method-call.js', 'support.function.dom.js'] 1394 + expect(tokens[2]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1395 + expect(tokens[3]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1396 + 1397 + describe "properties", -> 1398 + it "tokenizes properties", -> 1399 + {tokens} = grammar.tokenizeLine('obj.property') 1400 + expect(tokens[0]).toEqual value: 'obj', scopes: ['source.js', 'variable.other.object.js'] 1401 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js'] 1402 + expect(tokens[2]).toEqual value: 'property', scopes: ['source.js', 'variable.other.property.js'] 1403 + 1404 + {tokens} = grammar.tokenizeLine('obj.property.property') 1405 + expect(tokens[0]).toEqual value: 'obj', scopes: ['source.js', 'variable.other.object.js'] 1406 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js'] 1407 + expect(tokens[2]).toEqual value: 'property', scopes: ['source.js', 'variable.other.object.property.js'] 1408 + 1409 + {tokens} = grammar.tokenizeLine('obj.Property') 1410 + expect(tokens[0]).toEqual value: 'obj', scopes: ['source.js', 'variable.other.object.js'] 1411 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js'] 1412 + expect(tokens[2]).toEqual value: 'Property', scopes: ['source.js', 'variable.other.property.js'] 1413 + 1414 + {tokens} = grammar.tokenizeLine('obj.$abc$') 1415 + expect(tokens[2]).toEqual value: '$abc$', scopes: ['source.js', 'variable.other.property.js'] 1416 + 1417 + {tokens} = grammar.tokenizeLine('obj.$$') 1418 + expect(tokens[2]).toEqual value: '$$', scopes: ['source.js', 'variable.other.property.js'] 1419 + 1420 + {tokens} = grammar.tokenizeLine('a().b') 1421 + expect(tokens[2]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1422 + expect(tokens[3]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js'] 1423 + expect(tokens[4]).toEqual value: 'b', scopes: ['source.js', 'variable.other.property.js'] 1424 + 1425 + {tokens} = grammar.tokenizeLine('a.123illegal') 1426 + expect(tokens[0]).toEqual value: 'a', scopes: ['source.js'] 1427 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js'] 1428 + expect(tokens[2]).toEqual value: '123illegal', scopes: ['source.js', 'invalid.illegal.identifier.js'] 1429 + 1430 + it "tokenizes constant properties", -> 1431 + {tokens} = grammar.tokenizeLine('obj.MY_CONSTANT') 1432 + expect(tokens[0]).toEqual value: 'obj', scopes: ['source.js', 'variable.other.object.js'] 1433 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js'] 1434 + expect(tokens[2]).toEqual value: 'MY_CONSTANT', scopes: ['source.js', 'constant.other.property.js'] 1435 + 1436 + {tokens} = grammar.tokenizeLine('obj.MY_CONSTANT.prop') 1437 + expect(tokens[0]).toEqual value: 'obj', scopes: ['source.js', 'variable.other.object.js'] 1438 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js'] 1439 + expect(tokens[2]).toEqual value: 'MY_CONSTANT', scopes: ['source.js', 'constant.other.object.property.js'] 1440 + 1441 + {tokens} = grammar.tokenizeLine('a.C') 1442 + expect(tokens[0]).toEqual value: 'a', scopes: ['source.js', 'variable.other.object.js'] 1443 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js'] 1444 + expect(tokens[2]).toEqual value: 'C', scopes: ['source.js', 'constant.other.property.js'] 1445 + 1446 + describe "strings and functions", -> 1447 + it "doesn't confuse them", -> 1448 + {tokens} = grammar.tokenizeLine("'a'.b(':c(d)')") 1449 + expect(tokens[0]).toEqual value: "'", scopes: ['source.js', 'string.quoted.single.js', 'punctuation.definition.string.begin.js'] 1450 + expect(tokens[1]).toEqual value: "a", scopes: ['source.js', 'string.quoted.single.js'] 1451 + expect(tokens[2]).toEqual value: "'", scopes: ['source.js', 'string.quoted.single.js', 'punctuation.definition.string.end.js'] 1452 + expect(tokens[3]).toEqual value: ".", scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1453 + expect(tokens[4]).toEqual value: "b", scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1454 + expect(tokens[5]).toEqual value: "(", scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1455 + expect(tokens[6]).toEqual value: "'", scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'string.quoted.single.js', 'punctuation.definition.string.begin.js'] 1456 + expect(tokens[7]).toEqual value: ":c(d)", scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'string.quoted.single.js'] 1457 + expect(tokens[8]).toEqual value: "'", scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'string.quoted.single.js', 'punctuation.definition.string.end.js'] 1458 + expect(tokens[9]).toEqual value: ")", scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1459 + 1460 + delimsByScope = 1461 + "string.quoted.double.js": '"' 1462 + "string.quoted.single.js": "'" 1463 + 1464 + for scope, delim of delimsByScope 1465 + {tokens} = grammar.tokenizeLine('a.push(' + delim + 'x' + delim + ' + y + ' + delim + ':function()' + delim + ');') 1466 + expect(tokens[2]).toEqual value: 'push', scopes: ['source.js', 'meta.method-call.js', 'support.function.js'] 1467 + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1468 + expect(tokens[4]).toEqual value: delim, scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', scope, 'punctuation.definition.string.begin.js'] 1469 + expect(tokens[5]).toEqual value: 'x', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', scope] 1470 + expect(tokens[6]).toEqual value: delim, scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', scope, 'punctuation.definition.string.end.js'] 1471 + expect(tokens[8]).toEqual value: '+', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'keyword.operator.js'] 1472 + expect(tokens[9]).toEqual value: ' y ', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js' ] 1473 + expect(tokens[10]).toEqual value: '+', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'keyword.operator.js'] 1474 + expect(tokens[12]).toEqual value: delim, scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', scope, 'punctuation.definition.string.begin.js'] 1475 + expect(tokens[13]).toEqual value: ':function()', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', scope] 1476 + expect(tokens[14]).toEqual value: delim, scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', scope, 'punctuation.definition.string.end.js'] 1477 + expect(tokens[15]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1478 + 1479 + describe "comments", -> 1480 + it "tokenizes /* */ comments", -> 1481 + {tokens} = grammar.tokenizeLine('/**/') 1482 + expect(tokens[0]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1483 + expect(tokens[1]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1484 + 1485 + {tokens} = grammar.tokenizeLine('/* foo */') 1486 + expect(tokens[0]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1487 + expect(tokens[1]).toEqual value: ' foo ', scopes: ['source.js', 'comment.block.js'] 1488 + expect(tokens[2]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1489 + 1490 + it "tokenizes /** */ comments", -> 1491 + {tokens} = grammar.tokenizeLine('/***/') 1492 + expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] 1493 + expect(tokens[1]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] 1494 + 1495 + {tokens} = grammar.tokenizeLine('/** foo */') 1496 + expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] 1497 + expect(tokens[1]).toEqual value: ' foo ', scopes: ['source.js', 'comment.block.documentation.js'] 1498 + expect(tokens[2]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] 1499 + 1500 + {tokens} = grammar.tokenizeLine('/** @mixins */') 1501 + expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] 1502 + expect(tokens[2]).toEqual value: '@mixins', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc'] 1503 + expect(tokens[3]).toEqual value: ' ', scopes: ['source.js', 'comment.block.documentation.js'] 1504 + expect(tokens[4]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] 1505 + 1506 + it "tokenizes JSDoc comment documentation", -> 1507 + {tokens} = grammar.tokenizeLine('/** @param {object} variable this is the description */') 1508 + expect(tokens[4]).toEqual value: '{object}', scopes: ['source.js', 'comment.block.documentation.js', 'other.meta.jsdoc', 'entity.name.type.instance.jsdoc'] 1509 + expect(tokens[6]).toEqual value: 'variable', scopes: ['source.js', 'comment.block.documentation.js', 'other.meta.jsdoc', 'variable.other.jsdoc'] 1510 + expect(tokens[8]).toEqual value: 'this is the description ', scopes: ['source.js', 'comment.block.documentation.js', 'other.meta.jsdoc', 'other.description.jsdoc'] 1511 + 1512 + it "tokenizes // comments", -> 1513 + {tokens} = grammar.tokenizeLine('// comment') 1514 + expect(tokens[0]).toEqual value: '//', scopes: ['source.js', 'comment.line.double-slash.js', 'punctuation.definition.comment.js'] 1515 + expect(tokens[1]).toEqual value: ' comment', scopes: ['source.js', 'comment.line.double-slash.js'] 1516 + 1517 + it "tokenizes comments inside constant definitions", -> 1518 + {tokens} = grammar.tokenizeLine('const a, // comment') 1519 + expect(tokens[0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] 1520 + expect(tokens[2]).toEqual value: 'a', scopes: ['source.js', 'constant.other.js'] 1521 + expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] 1522 + expect(tokens[5]).toEqual value: '//', scopes: ['source.js', 'comment.line.double-slash.js', 'punctuation.definition.comment.js'] 1523 + expect(tokens[6]).toEqual value: ' comment', scopes: ['source.js', 'comment.line.double-slash.js'] 1524 + 1525 + it "tokenizes comments inside function declarations", -> 1526 + {tokens} = grammar.tokenizeLine('function /* */ foo() /* */ {}') 1527 + expect(tokens[0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 1528 + expect(tokens[2]).toEqual value: '/*', scopes: ['source.js', 'meta.function.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1529 + expect(tokens[4]).toEqual value: '*/', scopes: ['source.js', 'meta.function.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1530 + expect(tokens[6]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 1531 + expect(tokens[10]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1532 + expect(tokens[12]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1533 + 1534 + {tokens} = grammar.tokenizeLine('x => /* */ {}') 1535 + expect(tokens[0]).toEqual value: 'x', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1536 + expect(tokens[2]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1537 + expect(tokens[4]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1538 + expect(tokens[6]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1539 + expect(tokens[8]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] 1540 + 1541 + {tokens} = grammar.tokenizeLine('.foo = x => /* */ {}') 1542 + expect(tokens[1]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.arrow.js', 'entity.name.function.js'] 1543 + expect(tokens[5]).toEqual value: 'x', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1544 + expect(tokens[7]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1545 + expect(tokens[9]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1546 + expect(tokens[11]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1547 + expect(tokens[13]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] 1548 + 1549 + lines = grammar.tokenizeLines ''' 1550 + function 1551 + // comment 1552 + foo() {} 1553 + ''' 1554 + expect(lines[0][0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] 1555 + expect(lines[1][0]).toEqual value: '//', scopes: ['source.js', 'meta.function.js', 'comment.line.double-slash.js', 'punctuation.definition.comment.js'] 1556 + expect(lines[1][1]).toEqual value: ' comment', scopes: ['source.js', 'meta.function.js', 'comment.line.double-slash.js'] 1557 + expect(lines[2][0]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] 1558 + 1559 + lines = grammar.tokenizeLines ''' 1560 + x => 1561 + // comment 1562 + {} 1563 + ''' 1564 + expect(lines[0][0]).toEqual value: 'x', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] 1565 + expect(lines[0][2]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] 1566 + expect(lines[1][1]).toEqual value: '//', scopes: ['source.js', 'comment.line.double-slash.js', 'punctuation.definition.comment.js'] 1567 + expect(lines[1][2]).toEqual value: ' comment', scopes: ['source.js', 'comment.line.double-slash.js'] 1568 + expect(lines[2][0]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] 1569 + 1570 + it "tokenizes comments inside function parameters correctly", -> 1571 + {tokens} = grammar.tokenizeLine('function test(p1 /*, p2 */) {}') 1572 + expect(tokens[6]).toEqual value: '/*', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1573 + expect(tokens[7]).toEqual value: ', p2 ', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'comment.block.js'] 1574 + expect(tokens[8]).toEqual value: '*/', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1575 + 1576 + describe "console", -> 1577 + it "tokenizes the console keyword", -> 1578 + {tokens} = grammar.tokenizeLine('console;') 1579 + expect(tokens[0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js'] 1580 + expect(tokens[1]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 1581 + 1582 + {tokens} = grammar.tokenizeLine('console$') 1583 + expect(tokens[0]).not.toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js'] 1584 + 1585 + {tokens} = grammar.tokenizeLine('$console') 1586 + expect(tokens[1]).not.toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js'] 1587 + 1588 + it "tokenizes console support functions", -> 1589 + {tokens} = grammar.tokenizeLine('console.log().log()') 1590 + expect(tokens[0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js'] 1591 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1592 + expect(tokens[2]).toEqual value: 'log', scopes: ['source.js', 'meta.method-call.js', 'support.function.console.js'] 1593 + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1594 + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1595 + expect(tokens[6]).not.toEqual value: 'log', scopes: ['source.js', 'meta.method-call.js', 'support.function.console.js'] 1596 + 1597 + {tokens} = grammar.tokenizeLine('console/**/.log()') 1598 + expect(tokens[0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js'] 1599 + expect(tokens[1]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1600 + expect(tokens[2]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] 1601 + expect(tokens[3]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1602 + expect(tokens[4]).toEqual value: 'log', scopes: ['source.js', 'meta.method-call.js', 'support.function.console.js'] 1603 + expect(tokens[5]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1604 + expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1605 + 1606 + lines = grammar.tokenizeLines ''' 1607 + console 1608 + .log(); 1609 + ''' 1610 + expect(lines[0][0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js'] 1611 + expect(lines[1][0]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1612 + expect(lines[1][1]).toEqual value: 'log', scopes: ['source.js', 'meta.method-call.js', 'support.function.console.js'] 1613 + expect(lines[1][2]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1614 + expect(lines[1][3]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1615 + expect(lines[1][4]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 1616 + 1617 + {tokens} = grammar.tokenizeLine('console . log();') 1618 + expect(tokens[0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js'] 1619 + expect(tokens[2]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1620 + expect(tokens[4]).toEqual value: 'log', scopes: ['source.js', 'meta.method-call.js', 'support.function.console.js'] 1621 + expect(tokens[5]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1622 + expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1623 + expect(tokens[7]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 1624 + 1625 + it "tokenizes console custom functions", -> 1626 + {tokens} = grammar.tokenizeLine('console.foo();') 1627 + expect(tokens[0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js'] 1628 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1629 + expect(tokens[2]).toEqual value: 'foo', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1630 + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1631 + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1632 + expect(tokens[5]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 1633 + 1634 + {tokens} = grammar.tokenizeLine('console .foo();') 1635 + expect(tokens[3]).toEqual value: 'foo', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1636 + 1637 + describe "math", -> 1638 + it "tokenizes the math object", -> 1639 + {tokens} = grammar.tokenizeLine('Math;') 1640 + expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.math.js'] 1641 + expect(tokens[1]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 1642 + 1643 + it "tokenizes math support functions/properties", -> 1644 + {tokens} = grammar.tokenizeLine('Math.random();') 1645 + expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.math.js'] 1646 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1647 + expect(tokens[2]).toEqual value: 'random', scopes: ['source.js', 'meta.method-call.js', 'support.function.math.js'] 1648 + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1649 + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1650 + expect(tokens[5]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 1651 + 1652 + lines = grammar.tokenizeLines ''' 1653 + Math 1654 + .random(); 1655 + ''' 1656 + expect(lines[0][0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.math.js'] 1657 + expect(lines[1][0]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1658 + expect(lines[1][1]).toEqual value: 'random', scopes: ['source.js', 'meta.method-call.js', 'support.function.math.js'] 1659 + expect(lines[1][2]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1660 + expect(lines[1][3]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1661 + expect(lines[1][4]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 1662 + 1663 + {tokens} = grammar.tokenizeLine('Math.PI;') 1664 + expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.math.js'] 1665 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js'] 1666 + expect(tokens[2]).toEqual value: 'PI', scopes: ['source.js', 'support.constant.property.math.js'] 1667 + expect(tokens[3]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 1668 + 1669 + it "tokenizes math custom functions", -> 1670 + {tokens} = grammar.tokenizeLine('Math.PI();') 1671 + expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.math.js'] 1672 + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] 1673 + expect(tokens[2]).toEqual value: 'PI', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js'] 1674 + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] 1675 + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] 1676 + expect(tokens[5]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] 1677 + 1678 + describe "indentation", -> 1679 + editor = null 1680 + 1681 + beforeEach -> 1682 + editor = buildTextEditor() 1683 + editor.setGrammar(grammar) 1684 + 1685 + expectPreservedIndentation = (text) -> 1686 + editor.setText(text) 1687 + editor.autoIndentBufferRows(0, editor.getLineCount() - 1) 1688 + 1689 + expectedLines = text.split("\n") 1690 + actualLines = editor.getText().split("\n") 1691 + for actualLine, i in actualLines 1692 + expect([ 1693 + actualLine, 1694 + editor.indentLevelForLine(actualLine) 1695 + ]).toEqual([ 1696 + expectedLines[i], 1697 + editor.indentLevelForLine(expectedLines[i]) 1698 + ]) 1699 + 1700 + it "indents allman-style curly braces", -> 1701 + expectPreservedIndentation """ 1702 + if (true) 1703 + { 1704 + for (;;) 1705 + { 1706 + while (true) 1707 + { 1708 + x(); 1709 + } 1710 + } 1711 + } 1712 + else 1713 + { 1714 + do 1715 + { 1716 + y(); 1717 + } while (true); 1718 + } 1719 + """ 1720 + 1721 + it "indents non-allman-style curly braces", -> 1722 + expectPreservedIndentation """ 1723 + if (true) { 1724 + for (;;) { 1725 + while (true) { 1726 + x(); 1727 + } 1728 + } 1729 + } else { 1730 + do { 1731 + y(); 1732 + } while (true); 1733 + } 1734 + """ 1735 + 1736 + it "doesn't indent case statements, because it wouldn't know when to outdent", -> 1737 + expectPreservedIndentation """ 1738 + switch (e) { 1739 + case 5: 1740 + something(); 1741 + case 6: 1742 + somethingElse(); 1743 + } 1744 + """ 1745 + 1746 + it "indents collection literals", -> 1747 + expectPreservedIndentation """ 1748 + [ 1749 + { 1750 + a: b, 1751 + c: d 1752 + }, 1753 + e, 1754 + f 1755 + ] 1756 + """ 1757 + 1758 + it "indents function arguments", -> 1759 + expectPreservedIndentation """ 1760 + f( 1761 + g( 1762 + h, 1763 + i 1764 + ), 1765 + j 1766 + ); 1767 + """
+85
spec/regular-expression-replacement-spec.coffee
··· 1 + describe "Regular Expression Replacement grammar", -> 2 + grammar = null 3 + 4 + beforeEach -> 5 + waitsForPromise -> 6 + atom.packages.activatePackage("language-javascript") 7 + 8 + runs -> 9 + grammar = atom.grammars.grammarForScopeName("source.js.regexp.replacement") 10 + 11 + it "parses the grammar", -> 12 + expect(grammar).toBeTruthy() 13 + expect(grammar.scopeName).toBe "source.js.regexp.replacement" 14 + 15 + describe "basic strings", -> 16 + it "tokenizes with no extra scopes", -> 17 + {tokens} = grammar.tokenizeLine('Hello [world]. (hi to you)') 18 + expect(tokens[0]).toEqual value: 'Hello [world]. (hi to you)', scopes: ['source.js.regexp.replacement'] 19 + 20 + describe "escaped characters", -> 21 + it "tokenizes with as an escape character", -> 22 + {tokens} = grammar.tokenizeLine('\\n') 23 + expect(tokens[0]).toEqual value: '\\n', scopes: ['source.js.regexp.replacement', 'constant.character.escape.backslash.regexp.replacement'] 24 + 25 + it "tokenizes '$$' as an escaped '$' character", -> 26 + {tokens} = grammar.tokenizeLine('$$') 27 + expect(tokens[0]).toEqual value: '$$', scopes: ['source.js.regexp.replacement', 'constant.character.escape.dollar.regexp.replacement'] 28 + 29 + it "doesn't treat '\\$' as an escaped '$' character", -> 30 + {tokens} = grammar.tokenizeLine('\\$') 31 + expect(tokens[0]).toEqual value: '\\$', scopes: ['source.js.regexp.replacement'] 32 + 33 + it "tokenizes '$$1' as an escaped '$' character followed by a '1' character", -> 34 + {tokens} = grammar.tokenizeLine('$$1') 35 + expect(tokens[0]).toEqual value: '$$', scopes: ['source.js.regexp.replacement', 'constant.character.escape.dollar.regexp.replacement'] 36 + expect(tokens[1]).toEqual value: '1', scopes: ['source.js.regexp.replacement'] 37 + 38 + describe "Numeric placeholders", -> 39 + it "doesn't tokenize $0 as a variable", -> 40 + {tokens} = grammar.tokenizeLine('$0') 41 + expect(tokens[0]).toEqual value: '$0', scopes: ['source.js.regexp.replacement'] 42 + 43 + it "doesn't tokenize $00 as a variable", -> 44 + {tokens} = grammar.tokenizeLine('$00') 45 + expect(tokens[0]).toEqual value: '$00', scopes: ['source.js.regexp.replacement'] 46 + 47 + it "tokenizes $1 as a variable", -> 48 + {tokens} = grammar.tokenizeLine('$1') 49 + expect(tokens[0]).toEqual value: '$1', scopes: ['source.js.regexp.replacement', 'variable.regexp.replacement'] 50 + 51 + it "tokenizes $01 as a variable", -> 52 + {tokens} = grammar.tokenizeLine('$01') 53 + expect(tokens[0]).toEqual value: '$01', scopes: ['source.js.regexp.replacement', 'variable.regexp.replacement'] 54 + 55 + it "tokenizes $3 as a variable", -> 56 + {tokens} = grammar.tokenizeLine('$3') 57 + expect(tokens[0]).toEqual value: '$3', scopes: ['source.js.regexp.replacement', 'variable.regexp.replacement'] 58 + 59 + it "tokenizes $10 as a variable", -> 60 + {tokens} = grammar.tokenizeLine('$10') 61 + expect(tokens[0]).toEqual value: '$10', scopes: ['source.js.regexp.replacement', 'variable.regexp.replacement'] 62 + 63 + it "tokenizes $99 as a variable", -> 64 + {tokens} = grammar.tokenizeLine('$99') 65 + expect(tokens[0]).toEqual value: '$99', scopes: ['source.js.regexp.replacement', 'variable.regexp.replacement'] 66 + 67 + it "doesn't tokenize the third numberic character in '$100' as a variable", -> 68 + {tokens} = grammar.tokenizeLine('$100') 69 + expect(tokens[0]).toEqual value: '$10', scopes: ['source.js.regexp.replacement', 'variable.regexp.replacement'] 70 + expect(tokens[1]).toEqual value: '0', scopes: ['source.js.regexp.replacement'] 71 + 72 + describe "Matched sub-string placeholder", -> 73 + it "tokenizes $& as a variable", -> 74 + {tokens} = grammar.tokenizeLine('$&') 75 + expect(tokens[0]).toEqual value: '$&', scopes: ['source.js.regexp.replacement', 'variable.regexp.replacement'] 76 + 77 + describe "Preceeding portion placeholder", -> 78 + it "tokenizes $` as a variable", -> 79 + {tokens} = grammar.tokenizeLine('$`') 80 + expect(tokens[0]).toEqual value: '$`', scopes: ['source.js.regexp.replacement', 'variable.regexp.replacement'] 81 + 82 + describe "Following portion placeholder", -> 83 + it "tokenizes $' as a variable", -> 84 + {tokens} = grammar.tokenizeLine('$\'') 85 + expect(tokens[0]).toEqual value: '$\'', scopes: ['source.js.regexp.replacement', 'variable.regexp.replacement']