Diffdown is a real-time collaborative Markdown editor/previewer built on the AT Protocol diffdown.com
at 22eecfdeb2ca15a85c4586429eff2d6c5e377e12 686 lines 19 kB view raw
1# Minimal 2 30 4 5==> 6 7Script(ExpressionStatement(Number)) 8 9# Strings 10 11"A string with \"double\" and 'single' quotes"; 12'A string with "double" and \'single\' quotes'; 13'\\'; 14"\\"; 15 16'A string with new \ 17line'; 18 19==> 20 21Script(ExpressionStatement(String(Escape,Escape)), 22 ExpressionStatement(String(Escape,Escape)), 23 ExpressionStatement(String(Escape)), 24 ExpressionStatement(String(Escape)), 25 ExpressionStatement(String(Escape))) 26 27# Numbers 28 29101; 303.14; 313.14e+1; 320x1ABCDEFabcdef; 330o7632157312; 340b1010101001; 351e+3; 36 37==> 38 39Script( 40 ExpressionStatement(Number), 41 ExpressionStatement(Number), 42 ExpressionStatement(Number), 43 ExpressionStatement(Number), 44 ExpressionStatement(Number), 45 ExpressionStatement(Number), 46 ExpressionStatement(Number)) 47 48# Identifiers 49 50theVar; 51theVar2; 52$_; 53é象𫝄; 54últimaVez; 55県; 56 57==> 58 59Script( 60 ExpressionStatement(VariableName), 61 ExpressionStatement(VariableName), 62 ExpressionStatement(VariableName), 63 ExpressionStatement(VariableName), 64 ExpressionStatement(VariableName), 65 ExpressionStatement(VariableName)) 66 67# RegExps 68 69/one\\/; 70/one/g; 71/one/i; 72/one/gim; 73/on\/e/gim; 74/on[^/]afe/gim; 75/[\]/]/; 76 77==> 78 79Script( 80 ExpressionStatement(RegExp), 81 ExpressionStatement(RegExp), 82 ExpressionStatement(RegExp), 83 ExpressionStatement(RegExp), 84 ExpressionStatement(RegExp), 85 ExpressionStatement(RegExp), 86 ExpressionStatement(RegExp)) 87 88# Arrays 89 90[]; 91[ "item1" ]; 92[ "item1", ]; 93[ "item1", item2 ]; 94[ , item2 ]; 95[ item2 = 5 ]; 96[ a, ...b, c ]; 97 98==> 99 100Script( 101 ExpressionStatement(ArrayExpression), 102 ExpressionStatement(ArrayExpression(String)), 103 ExpressionStatement(ArrayExpression(String)), 104 ExpressionStatement(ArrayExpression(String,VariableName)), 105 ExpressionStatement(ArrayExpression(VariableName)), 106 ExpressionStatement(ArrayExpression(AssignmentExpression(VariableName,Equals,Number))), 107 ExpressionStatement(ArrayExpression(VariableName, Spread, VariableName, VariableName))) 108 109# Functions 110 111[ 112 function() {}, 113 function(arg1, ...arg2) { 114 arg2; 115 }, 116 function stuff() {}, 117 function trailing(a,) {}, 118 function trailing(a,b,) {} 119] 120 121==> 122 123Script(ExpressionStatement(ArrayExpression( 124 FunctionExpression(function,ParamList,Block), 125 FunctionExpression(function,ParamList(VariableDefinition,Spread,VariableDefinition), Block(ExpressionStatement(VariableName))), 126 FunctionExpression(function,VariableDefinition,ParamList,Block), 127 FunctionExpression(function,VariableDefinition,ParamList(VariableDefinition), Block), 128 FunctionExpression(function,VariableDefinition,ParamList(VariableDefinition,VariableDefinition),Block)))) 129 130# Arrow functions 131 132a => 1; 133() => 2; 134(d, e) => 3; 135(f, g,) => { 136 return h; 137}; 138async () => 4; 139 140==> 141 142Script( 143 ExpressionStatement(ArrowFunction(ParamList(VariableDefinition),Arrow,Number)), 144 ExpressionStatement(ArrowFunction(ParamList,Arrow,Number)), 145 ExpressionStatement(ArrowFunction(ParamList(VariableDefinition,VariableDefinition),Arrow,Number)), 146 ExpressionStatement(ArrowFunction(ParamList(VariableDefinition,VariableDefinition),Arrow,Block(ReturnStatement(return,VariableName)))), 147 ExpressionStatement(ArrowFunction(async,ParamList,Arrow,Number))) 148 149# Arrow function followed by comma 150 151({ 152 a: () => 1, 153 b: "x" 154}) 155 156==> 157 158Script(ExpressionStatement(ParenthesizedExpression(ObjectExpression( 159 Property(PropertyDefinition,ArrowFunction(ParamList,Arrow,Number)), 160 Property(PropertyDefinition,String))))) 161 162# Long potential arrow function 163 164(assign = [to, from], from = assign[0], to = assign[1]); 165 166==> 167 168Script(ExpressionStatement(ParenthesizedExpression(SequenceExpression( 169 AssignmentExpression(VariableName,Equals,ArrayExpression(VariableName,VariableName)), 170 AssignmentExpression(VariableName,Equals,MemberExpression(VariableName,Number)), 171 AssignmentExpression(VariableName,Equals,MemberExpression(VariableName,Number)))))) 172 173# Ternary operator 174 175condition ? case1 : case2; 176 177x.y = some.condition ? 2**x : 1 - 2; 178 179==> 180 181Script( 182 ExpressionStatement(ConditionalExpression(VariableName,LogicOp,VariableName,LogicOp,VariableName)), 183 ExpressionStatement(AssignmentExpression( 184 MemberExpression(VariableName,PropertyName),Equals, 185 ConditionalExpression( 186 MemberExpression(VariableName,PropertyName),LogicOp, 187 BinaryExpression(Number,ArithOp,VariableName),LogicOp, 188 BinaryExpression(Number,ArithOp,Number))))) 189 190# Type operators 191 192typeof x; 193x instanceof String; 194 195==> 196 197Script(ExpressionStatement(UnaryExpression(typeof,VariableName)), 198 ExpressionStatement(BinaryExpression(VariableName,instanceof,VariableName))) 199 200# Delete 201 202delete thing['prop']; 203true ? delete thing.prop : null; 204 205==> 206 207Script( 208 ExpressionStatement(UnaryExpression(delete,MemberExpression(VariableName,String))), 209 ExpressionStatement(ConditionalExpression(BooleanLiteral,LogicOp, 210 UnaryExpression(delete,MemberExpression(VariableName,PropertyName)),LogicOp,null))) 211 212# Void 213 214a = void b(); 215 216==> 217 218Script(ExpressionStatement(AssignmentExpression(VariableName,Equals,UnaryExpression(void,CallExpression(VariableName,ArgList))))) 219 220# Augmented assignment 221 222s |= 1; 223t %= 2; 224w ^= 3; 225x += 4; 226y.z *= 5; 227z += 1; 228a >>= 1; 229b >>>= 1; 230c <<= 1; 231 232==> 233 234Script( 235 ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), 236 ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), 237 ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), 238 ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), 239 ExpressionStatement(AssignmentExpression(MemberExpression(VariableName,PropertyName),UpdateOp,Number)), 240 ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), 241 ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), 242 ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), 243 ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number))) 244 245# Operator precedence 246 247a <= b && c >= d; 248a.b = c ? d : e; 249a && b(c) && d; 250a && new b(c) && d; 251typeof a == b && c instanceof d; 252 253==> 254 255Script( 256 ExpressionStatement(BinaryExpression(BinaryExpression(VariableName,CompareOp,VariableName),LogicOp, 257 BinaryExpression(VariableName,CompareOp,VariableName))), 258 ExpressionStatement(AssignmentExpression(MemberExpression(VariableName,PropertyName),Equals, 259 ConditionalExpression(VariableName,LogicOp,VariableName,LogicOp,VariableName))), 260 ExpressionStatement(BinaryExpression(BinaryExpression(VariableName,LogicOp,CallExpression(VariableName,ArgList(VariableName))),LogicOp, 261 VariableName)), 262 ExpressionStatement(BinaryExpression(BinaryExpression(VariableName,LogicOp,NewExpression(new,VariableName,ArgList(VariableName))),LogicOp, 263 VariableName)), 264 ExpressionStatement(BinaryExpression(BinaryExpression(UnaryExpression(typeof,VariableName),CompareOp,VariableName),LogicOp, 265 BinaryExpression(VariableName,instanceof,VariableName)))) 266 267# Rest args 268 269foo(...rest); 270 271==> 272 273Script(ExpressionStatement(CallExpression(VariableName,ArgList(Spread,VariableName)))) 274 275# Forward slashes after parenthesized expressions 276 277(foo - bar) / baz; 278if (foo - bar) /baz/; 279(this.a() / this.b() - 1) / 2; 280 281==> 282 283Script( 284 ExpressionStatement(BinaryExpression(ParenthesizedExpression(BinaryExpression(VariableName,ArithOp,VariableName)),ArithOp,VariableName)), 285 IfStatement(if,ParenthesizedExpression(BinaryExpression(VariableName,ArithOp,VariableName)), 286 ExpressionStatement(RegExp)), 287 ExpressionStatement(BinaryExpression(ParenthesizedExpression( 288 BinaryExpression( 289 BinaryExpression( 290 CallExpression(MemberExpression(this,PropertyName),ArgList),ArithOp, 291 CallExpression(MemberExpression(this,PropertyName),ArgList)),ArithOp,Number)),ArithOp,Number))) 292 293# Yield expressions 294 295yield db.users.where('[endpoint+email]'); 296yield* a; 297yield [22]; 298 299==> 300 301Script( 302 ExpressionStatement(YieldExpression(yield, 303 CallExpression(MemberExpression(MemberExpression(VariableName,PropertyName),PropertyName),ArgList(String)))), 304 ExpressionStatement(YieldExpression(yield,Star,VariableName)), 305 ExpressionStatement(YieldExpression(yield,ArrayExpression(Number)))) 306 307# Template strings 308 309`one line`; 310`multi 311 line`; 312 313`multi 314 ${2 + 2} 315 hello 316 ${1, 2} 317 line`; 318 319`$$$$`; 320`$`; 321`$$$$${ async }`; 322 323`\\\``; 324 325`one${`two${`three`}`}`; 326 327f`hi${there}`; 328 329==> 330 331Script( 332 ExpressionStatement(TemplateString), 333 ExpressionStatement(TemplateString), 334 ExpressionStatement(TemplateString( 335 Interpolation(InterpolationStart,BinaryExpression(Number,ArithOp,Number),InterpolationEnd), 336 Interpolation(InterpolationStart,SequenceExpression(Number,Number),InterpolationEnd))), 337 ExpressionStatement(TemplateString), 338 ExpressionStatement(TemplateString), 339 ExpressionStatement(TemplateString(Interpolation(InterpolationStart,VariableName,InterpolationEnd))), 340 ExpressionStatement(TemplateString(Escape,Escape)), 341 ExpressionStatement(TemplateString(Interpolation(InterpolationStart,TemplateString( 342 Interpolation(InterpolationStart,TemplateString,InterpolationEnd)),InterpolationEnd))), 343 ExpressionStatement(TaggedTemplateExpression(VariableName,TemplateString( 344 Interpolation(InterpolationStart,VariableName,InterpolationEnd))))) 345 346# Atoms 347 348this; 349null; 350undefined; 351true; 352false; 353 354==> 355 356Script( 357 ExpressionStatement(this), 358 ExpressionStatement(null), 359 ExpressionStatement(VariableName), 360 ExpressionStatement(BooleanLiteral), 361 ExpressionStatement(BooleanLiteral)) 362 363# Objects 364 365foo({}, 366 { a: "b" }, 367 { c: "d", "e": f, 1: 2 }, 368 { 369 g, 370 [methodName]() {} 371 }, 372 {b, get}, 373 {a,}); 374 375==> 376 377Script(ExpressionStatement(CallExpression(VariableName,ArgList( 378 ObjectExpression, 379 ObjectExpression(Property(PropertyDefinition,String)), 380 ObjectExpression(Property(PropertyDefinition,String),Property(String,VariableName),Property(Number,Number)), 381 ObjectExpression(Property(PropertyDefinition),Property(VariableName,ParamList,Block)), 382 ObjectExpression(Property(PropertyDefinition),Property(PropertyDefinition)), 383 ObjectExpression(Property(PropertyDefinition)))))) 384 385# Method definitions 386 387({ 388 foo: true, 389 390 add(a, b) { 391 return a + b; 392 }, 393 394 get bar() { return c; }, 395 396 set bar(a) { c = a; }, 397 398 *barGenerator() { yield c; }, 399 400 get() { return 1; } 401}); 402 403==> 404 405Script(ExpressionStatement(ParenthesizedExpression(ObjectExpression( 406 Property(PropertyDefinition,BooleanLiteral), 407 Property(PropertyDefinition,ParamList(VariableDefinition,VariableDefinition), 408 Block(ReturnStatement(return,BinaryExpression(VariableName,ArithOp,VariableName)))), 409 Property(get,PropertyDefinition,ParamList,Block(ReturnStatement(return,VariableName))), 410 Property(set,PropertyDefinition,ParamList(VariableDefinition), 411 Block(ExpressionStatement(AssignmentExpression(VariableName,Equals,VariableName)))), 412 Property(Star,PropertyDefinition,ParamList,Block(ExpressionStatement(YieldExpression(yield,VariableName)))), 413 Property(PropertyDefinition,ParamList,Block(ReturnStatement(return,Number))))))) 414 415# Keyword property names 416 417({ 418 finally() {}, 419 catch() {}, 420 get: function () {}, 421 set() {}, 422 static: true, 423 async: true, 424}); 425 426==> 427 428Script(ExpressionStatement(ParenthesizedExpression(ObjectExpression( 429 Property(PropertyDefinition,ParamList,Block), 430 Property(PropertyDefinition,ParamList,Block), 431 Property(PropertyDefinition,FunctionExpression(function,ParamList,Block)), 432 Property(PropertyDefinition,ParamList,Block), 433 Property(PropertyDefinition,BooleanLiteral), 434 Property(PropertyDefinition,BooleanLiteral))))) 435 436# Generator functions 437 438[ 439 function *() {}, 440 function *generateStuff(arg1, arg2) { 441 yield; 442 yield arg2; 443 } 444]; 445 446==> 447 448Script(ExpressionStatement(ArrayExpression( 449 FunctionExpression(function,Star,ParamList,Block), 450 FunctionExpression(function,Star,VariableDefinition,ParamList(VariableDefinition,VariableDefinition),Block( 451 ExpressionStatement(VariableName), 452 ExpressionStatement(YieldExpression(yield,VariableName))))))) 453 454# Member expressions 455 456x.someProperty; 457x?.other; 458x[someVariable]; 459f()["some-string"]; 460return returned.promise().done(a).fail(b); 461 462==> 463 464Script( 465 ExpressionStatement(MemberExpression(VariableName,PropertyName)), 466 ExpressionStatement(MemberExpression(VariableName,PropertyName)), 467 ExpressionStatement(MemberExpression(VariableName,VariableName)), 468 ExpressionStatement(MemberExpression(CallExpression(VariableName,ArgList),String)), 469 ReturnStatement(return,CallExpression(MemberExpression(CallExpression(MemberExpression(CallExpression( 470 MemberExpression(VariableName,PropertyName),ArgList),PropertyName),ArgList(VariableName)),PropertyName),ArgList(VariableName)))) 471 472# Callback chain 473 474return this.map(function (a) { 475 return a.b; 476}) 477 478// a comment 479 480.filter(function (c) { 481 return 2; 482}); 483 484==> 485 486Script(ReturnStatement(return,CallExpression(MemberExpression(CallExpression(MemberExpression(this,PropertyName), 487 ArgList(FunctionExpression(function,ParamList(VariableDefinition),Block(ReturnStatement(return,MemberExpression(VariableName,PropertyName)))))), 488 LineComment,PropertyName),ArgList(FunctionExpression(function,ParamList(VariableDefinition),Block(ReturnStatement(return,Number))))))) 489 490# Function calls 491 492x.someMethod(arg1, "arg2"); 493(function(x, y) { 494 495}(a, b)); 496f(new foo.bar(1), 2); 497 498==> 499 500Script( 501 ExpressionStatement(CallExpression(MemberExpression(VariableName,PropertyName),ArgList(VariableName,String))), 502 ExpressionStatement(ParenthesizedExpression(CallExpression(FunctionExpression(function,ParamList(VariableDefinition,VariableDefinition),Block), 503 ArgList(VariableName,VariableName)))), 504 ExpressionStatement(CallExpression(VariableName,ArgList(NewExpression(new,MemberExpression(VariableName,PropertyName),ArgList(Number)),Number)))) 505 506# Constructor calls 507 508new foo(1); 509new module.Klass(1, "two"); 510new Thing; 511 512==> 513 514Script( 515 ExpressionStatement(NewExpression(new,VariableName,ArgList(Number))), 516 ExpressionStatement(NewExpression(new,MemberExpression(VariableName,PropertyName),ArgList(Number,String))), 517 ExpressionStatement(NewExpression(new,VariableName))) 518 519# Await Expressions 520 521await asyncFunction(); 522await asyncPromise; 523 524==> 525 526Script( 527 ExpressionStatement(AwaitExpression(await,CallExpression(VariableName,ArgList))), 528 ExpressionStatement(AwaitExpression(await,VariableName))) 529 530# Numeric operators 531 532i++; 533i--; 534i + j * 3 - j % 5; 5352 ** i * 3; 5362 * i ** 3; 537+x; 538-x; 539 540==> 541 542Script( 543 ExpressionStatement(PostfixExpression(VariableName,ArithOp)), 544 ExpressionStatement(PostfixExpression(VariableName,ArithOp)), 545 ExpressionStatement(BinaryExpression(BinaryExpression(VariableName,ArithOp,BinaryExpression(VariableName,ArithOp,Number)),ArithOp,BinaryExpression(VariableName,ArithOp,Number))), 546 ExpressionStatement(BinaryExpression(BinaryExpression(Number,ArithOp,VariableName),ArithOp,Number)), 547 ExpressionStatement(BinaryExpression(Number,ArithOp,BinaryExpression(VariableName,ArithOp,Number))), 548 ExpressionStatement(UnaryExpression(ArithOp,VariableName)), 549 ExpressionStatement(UnaryExpression(ArithOp,VariableName))) 550 551# Boolean operators 552 553i || j; 554i && j; 555i ?? j; 556!a && !b || !c && !d; 557 558==> 559 560Script( 561 ExpressionStatement(BinaryExpression(VariableName,LogicOp,VariableName)), 562 ExpressionStatement(BinaryExpression(VariableName,LogicOp,VariableName)), 563 ExpressionStatement(BinaryExpression(VariableName,LogicOp,VariableName)), 564 ExpressionStatement(BinaryExpression(BinaryExpression(UnaryExpression(LogicOp,VariableName),LogicOp, 565 UnaryExpression(LogicOp,VariableName)),LogicOp,BinaryExpression(UnaryExpression(LogicOp,VariableName),LogicOp, 566 UnaryExpression(LogicOp,VariableName))))) 567 568# Bitwise operators 569 570i >> j; 571i >>> j; 572i << j; 573i & j; 574i | j; 575~i ^ ~j; 576 577==> 578 579Script( 580 ExpressionStatement(BinaryExpression(VariableName,BitOp,VariableName)), 581 ExpressionStatement(BinaryExpression(VariableName,BitOp,VariableName)), 582 ExpressionStatement(BinaryExpression(VariableName,BitOp,VariableName)), 583 ExpressionStatement(BinaryExpression(VariableName,BitOp,VariableName)), 584 ExpressionStatement(BinaryExpression(VariableName,BitOp,VariableName)), 585 ExpressionStatement(BinaryExpression(UnaryExpression(BitOp,VariableName),BitOp,UnaryExpression(BitOp,VariableName)))) 586 587# Relational operators 588 589x < y; 590x <= y; 591x == y; 592x === y; 593x != y; 594x !== y; 595x > y; 596x >= y; 597 598==> 599 600Script( 601 ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), 602 ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), 603 ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), 604 ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), 605 ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), 606 ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), 607 ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), 608 ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName))) 609 610# Word operators 611 612x in y; 613x instanceof y; 614!x instanceof y; 615 616==> 617 618Script( 619 ExpressionStatement(BinaryExpression(VariableName,in,VariableName)), 620 ExpressionStatement(BinaryExpression(VariableName,instanceof,VariableName)), 621 ExpressionStatement(BinaryExpression(UnaryExpression(LogicOp,VariableName),instanceof,VariableName))) 622 623# Assignments 624 625x = 0; 626x.y = 0; 627x["y"] = 0; 628async = 0; 629[a, b = 2] = foo; 630({a, b, ...d} = c); 631 632==> 633 634Script( 635 ExpressionStatement(AssignmentExpression(VariableName,Equals,Number)), 636 ExpressionStatement(AssignmentExpression(MemberExpression(VariableName,PropertyName),Equals,Number)), 637 ExpressionStatement(AssignmentExpression(MemberExpression(VariableName,String),Equals,Number)), 638 ExpressionStatement(AssignmentExpression(VariableName,Equals,Number)), 639 ExpressionStatement(AssignmentExpression(ArrayPattern(VariableDefinition,VariableDefinition,Equals,Number),Equals,VariableName)), 640 ExpressionStatement(ParenthesizedExpression(AssignmentExpression(ObjectPattern( 641 PatternProperty(PropertyName),PatternProperty(PropertyName),PatternProperty(Spread,VariableDefinition)),Equals,VariableName)))) 642 643# Comma operator 644 645a = 1, b = 2; 646c = {d: (3, 4 + 5)}; 647 648==> 649 650Script( 651 ExpressionStatement(SequenceExpression(AssignmentExpression(VariableName,Equals,Number),AssignmentExpression(VariableName,Equals,Number))), 652 ExpressionStatement(AssignmentExpression(VariableName,Equals,ObjectExpression( 653 Property(PropertyDefinition,ParenthesizedExpression(SequenceExpression(Number,BinaryExpression(Number,ArithOp,Number)))))))) 654 655# Punctuation 656 657(foo(1, 2), bar); 658 659==> 660 661Script(ExpressionStatement(ParenthesizedExpression( 662 "(",SequenceExpression(CallExpression(VariableName,ArgList("(",Number,Number,")")),",",VariableName),")"))) 663 664# Doesn't choke on unfinished ternary operator 665 6661?1 667 668==> 669 670Script(ExpressionStatement(ConditionalExpression(Number,LogicOp,Number,⚠))) 671 672# Can handle unterminated template literals 673 674`f 675 676==> 677 678Script(ExpressionStatement(TemplateString(⚠))) 679 680# Ternary with leading-dot number 681 682a?.2:.3 683 684==> 685 686Script(ExpressionStatement(ConditionalExpression(VariableName,LogicOp,Number,LogicOp,Number)))