Diffdown is a real-time collaborative Markdown editor/previewer built on the AT Protocol diffdown.com
at 4b2a77a711ce49c1b8bf63e8e6198fd8b6b53035 404 lines 12 kB view raw
1# Variable declaration 2 3var a = b 4 , c = d; 5const [x] = y = 3; 6 7==> 8 9Script( 10 VariableDeclaration(var,VariableDefinition,Equals,VariableName,VariableDefinition,Equals,VariableName), 11 VariableDeclaration(const,ArrayPattern(VariableDefinition),Equals,AssignmentExpression(VariableName,Equals,Number))) 12 13# Function declaration 14 15function a(a, b) { return 3; } 16function b({b}, c = d, e = f) {} 17 18==> 19 20Script( 21 FunctionDeclaration(function,VariableDefinition,ParamList(VariableDefinition,VariableDefinition),Block(ReturnStatement(return,Number))), 22 FunctionDeclaration(function,VariableDefinition,ParamList( 23 ObjectPattern(PatternProperty(PropertyName)),VariableDefinition,Equals,VariableName,VariableDefinition,Equals,VariableName),Block)) 24 25# Async functions 26 27async function foo() {} 28 29class Foo { async bar() {} } 30 31async (a) => { return foo; }; 32 33==> 34 35Script( 36 FunctionDeclaration(async,function,VariableDefinition,ParamList,Block), 37 ClassDeclaration(class,VariableDefinition,ClassBody(MethodDeclaration(async,PropertyDefinition,ParamList,Block))), 38 ExpressionStatement(ArrowFunction(async,ParamList(VariableDefinition),Arrow,Block(ReturnStatement(return,VariableName))))) 39 40# If statements 41 42if (x) log(y); 43 44if (a.b) { 45 d; 46} 47 48if (a) { 49 c; 50 d; 51} else { 52 e; 53} 54 55if (1) if (2) b; else c; 56 57==> 58 59Script( 60 IfStatement(if,ParenthesizedExpression(VariableName),ExpressionStatement(CallExpression(VariableName,ArgList(VariableName)))), 61 IfStatement(if,ParenthesizedExpression(MemberExpression(VariableName,PropertyName)),Block(ExpressionStatement(VariableName))), 62 IfStatement(if,ParenthesizedExpression(VariableName),Block(ExpressionStatement(VariableName),ExpressionStatement(VariableName)), 63 else,Block(ExpressionStatement(VariableName))), 64 IfStatement(if,ParenthesizedExpression(Number),IfStatement(if,ParenthesizedExpression(Number),ExpressionStatement(VariableName), 65 else,ExpressionStatement(VariableName)))) 66 67# While loop 68 69while (1) debugger; 70while (2) { 71 a; 72 b; 73} 74 75==> 76 77Script( 78 WhileStatement(while,ParenthesizedExpression(Number),DebuggerStatement(debugger)), 79 WhileStatement(while,ParenthesizedExpression(Number),Block(ExpressionStatement(VariableName),ExpressionStatement(VariableName)))) 80 81# Labels 82 83foo: 1; 84foo: while(2) break foo; 85 86==> 87 88Script( 89 LabeledStatement(Label,ExpressionStatement(Number)), 90 LabeledStatement(Label,WhileStatement(while,ParenthesizedExpression(Number),BreakStatement(break,Label)))) 91 92# Try 93 94try { throw new Error; } catch {} 95try { 1; } catch (x) { 2; } finally { 3; } 96 97==> 98 99Script( 100 TryStatement(try,Block(ThrowStatement(throw,NewExpression(new,VariableName))),CatchClause(catch,Block)), 101 TryStatement(try,Block(ExpressionStatement(Number)), 102 CatchClause(catch,VariableDefinition,Block(ExpressionStatement(Number))), 103 FinallyClause(finally,Block(ExpressionStatement(Number))))) 104 105# Switch 106 107switch (x) { 108 case 1: 109 return true; 110 case 2: 111 case 50 * 3: 112 console.log("ok"); 113 default: 114 return false; 115} 116 117==> 118 119Script(SwitchStatement(switch,ParenthesizedExpression(VariableName),SwitchBody( 120 CaseLabel(case,Number), 121 ReturnStatement(return,BooleanLiteral), 122 CaseLabel(case,Number), 123 CaseLabel(case,BinaryExpression(Number,ArithOp,Number)), 124 ExpressionStatement(CallExpression(MemberExpression(VariableName,PropertyName),ArgList(String))), 125 DefaultLabel(default), 126 ReturnStatement(return,BooleanLiteral)))) 127 128# For 129 130for (let x = 1; x < 10; x++) {} 131for (const y of z) {} 132for (var m in n) {} 133for (q in r) {} 134for (var a, b; c; d) continue; 135for (i = 0, init(); i < 10; i++) {} 136for (;;) {} 137for (const {thing} in things) thing; 138for await (let x of stream) {} 139 140==> 141 142Script( 143 ForStatement(for,ForSpec(VariableDeclaration(let,VariableDefinition,Equals,Number), 144 BinaryExpression(VariableName,CompareOp,Number),PostfixExpression(VariableName,ArithOp)),Block), 145 ForStatement(for,ForOfSpec(const,VariableDefinition,of,VariableName),Block), 146 ForStatement(for,ForInSpec(var,VariableDefinition,in,VariableName),Block), 147 ForStatement(for,ForInSpec(VariableName,in,VariableName),Block), 148 ForStatement(for,ForSpec(VariableDeclaration(var,VariableDefinition,VariableDefinition),VariableName,VariableName),ContinueStatement(continue)), 149 ForStatement(for,ForSpec(SequenceExpression(AssignmentExpression(VariableName,Equals,Number), 150 CallExpression(VariableName,ArgList)),BinaryExpression(VariableName,CompareOp,Number),PostfixExpression(VariableName,ArithOp)),Block), 151 ForStatement(for,ForSpec,Block), 152 ForStatement(for,ForInSpec(const,ObjectPattern(PatternProperty(PropertyName)),in,VariableName),ExpressionStatement(VariableName)), 153 ForStatement(for,await,ForOfSpec(let,VariableDefinition,of,VariableName),Block)) 154 155# Labeled statements 156 157theLoop: for (;;) { 158 if (a) { 159 break theLoop; 160 } 161} 162 163==> 164 165Script(LabeledStatement(Label,ForStatement(for,ForSpec,Block( 166 IfStatement(if,ParenthesizedExpression(VariableName),Block(BreakStatement(break,Label))))))) 167 168# Classes 169 170class Foo { 171 static one(a) { return a; }; 172 two(b) { return b; } 173 finally() {} 174} 175 176class Foo extends require('another-class') { 177 constructor() { super(); } 178 bar() { super.a(); } 179 prop; 180 etc = 20; 181 static { f() } 182} 183 184==> 185 186Script( 187 ClassDeclaration(class,VariableDefinition,ClassBody( 188 MethodDeclaration(static,PropertyDefinition,ParamList(VariableDefinition),Block(ReturnStatement(return,VariableName))), 189 MethodDeclaration(PropertyDefinition,ParamList(VariableDefinition),Block(ReturnStatement(return,VariableName))), 190 MethodDeclaration(PropertyDefinition,ParamList,Block))), 191 ClassDeclaration(class,VariableDefinition,extends,CallExpression(VariableName,ArgList(String)),ClassBody( 192 MethodDeclaration(PropertyDefinition,ParamList,Block(ExpressionStatement(CallExpression(super,ArgList)))), 193 MethodDeclaration(PropertyDefinition,ParamList,Block(ExpressionStatement(CallExpression(MemberExpression(super,PropertyName),ArgList)))), 194 PropertyDeclaration(PropertyDefinition), 195 PropertyDeclaration(PropertyDefinition,Equals,Number), 196 StaticBlock(static, Block(ExpressionStatement(CallExpression(VariableName,ArgList))))))) 197 198# Private properties 199 200class Foo { 201 #bar() { this.#a() + this?.#prop == #prop in this; } 202 #prop; 203 #etc = 20; 204} 205 206==> 207 208Script(ClassDeclaration(class,VariableDefinition,ClassBody( 209 MethodDeclaration(PrivatePropertyDefinition,ParamList,Block( 210 ExpressionStatement(BinaryExpression( 211 BinaryExpression( 212 CallExpression(MemberExpression(this,PrivatePropertyName),ArgList), 213 ArithOp, 214 MemberExpression(this,PrivatePropertyName)), 215 CompareOp, 216 BinaryExpression(PrivatePropertyName, in, this))))), 217 PropertyDeclaration(PrivatePropertyDefinition), 218 PropertyDeclaration(PrivatePropertyDefinition,Equals,Number)))) 219 220# Computed properties 221 222class Foo { 223 [x] = 44; 224 [Symbol.iterator]() {} 225} 226 227==> 228 229Script(ClassDeclaration(class,VariableDefinition,ClassBody( 230 PropertyDeclaration(VariableName,Equals,Number), 231 MethodDeclaration(MemberExpression(VariableName,PropertyName),ParamList,Block)))) 232 233# Imports 234 235import defaultMember from "module-name"; 236import * as name from "module-name"; 237import { member } from "module-name"; 238import { member1, member2 as alias2 } from "module-name"; 239import defaultMember, { member1, member2 as alias2, } from "module-name"; 240import "module-name"; 241import defer x from "y"; 242import defer from "y"; 243 244==> 245 246Script( 247 ImportDeclaration(import,VariableDefinition,from,String), 248 ImportDeclaration(import,Star,as,VariableDefinition,from,String), 249 ImportDeclaration(import,ImportGroup(VariableDefinition),from,String), 250 ImportDeclaration(import,ImportGroup(VariableDefinition,VariableName,as,VariableDefinition),from,String), 251 ImportDeclaration(import,VariableDefinition,ImportGroup(VariableDefinition,VariableName,as,VariableDefinition),from,String), 252 ImportDeclaration(import,String), 253 ImportDeclaration(import,defer,VariableDefinition,from,String), 254 ImportDeclaration(import,VariableDefinition,from,String)) 255 256# Exports 257 258export { name1, name2, name3 as x, nameN }; 259export let a, b = 2; 260export default 2 + 2; 261export default function() { } 262export default async function name1() { } 263export { name1 as default, } from "foo"; 264export * from 'foo'; 265 266==> 267 268Script( 269 ExportDeclaration(export,ExportGroup(VariableName,VariableName,VariableName,as,VariableName,VariableName)), 270 ExportDeclaration(export,VariableDeclaration(let,VariableDefinition,VariableDefinition,Equals,Number)), 271 ExportDeclaration(export,default,BinaryExpression(Number,ArithOp,Number)), 272 ExportDeclaration(export,default,FunctionDeclaration(function,ParamList,Block)), 273 ExportDeclaration(export,default,FunctionDeclaration(async,function,VariableDefinition,ParamList,Block)), 274 ExportDeclaration(export,ExportGroup(VariableName,as,VariableName),from,String), 275 ExportDeclaration(export,Star,from,String)) 276 277# Empty statements 278 279if (true) { ; };;; 280 281==> 282 283Script(IfStatement(if,ParenthesizedExpression(BooleanLiteral),Block)) 284 285# Comments 286 287/* a */ 288one; 289 290/* b **/ 291two; 292 293/* c ***/ 294three; 295 296/* d 297 298***/ 299four; 300 301y // comment 302 * z; 303 304==> 305 306Script( 307 BlockComment, 308 ExpressionStatement(VariableName), 309 BlockComment, 310 ExpressionStatement(VariableName), 311 BlockComment, 312 ExpressionStatement(VariableName), 313 BlockComment, 314 ExpressionStatement(VariableName), 315 ExpressionStatement(BinaryExpression(VariableName,LineComment,ArithOp,VariableName))) 316 317# Recover from invalid char 318 319const {foobar} = {}; 320 321==> 322 323Script(VariableDeclaration( 324 const, 325 ObjectPattern("{",PatternProperty(PropertyName,⚠),"}"), 326 Equals, 327 ObjectExpression)) 328 329# Sync back to statement 330 331function f() { 332 log(a b --c) 333} 334function g() {} 335 336==> 337 338Script( 339 FunctionDeclaration(function,VariableDefinition,ParamList,Block(ExpressionStatement(CallExpression(VariableName,ArgList(...))))), 340 FunctionDeclaration(function,VariableDefinition,ParamList,Block)) 341 342# Destructuring 343 344({x} = y); 345[u, v] = w; 346let [a,, b = 0] = c; 347let {x, y: z = 1} = d; 348let {[f]: m} = e; 349 350==> 351 352Script( 353 ExpressionStatement(ParenthesizedExpression(AssignmentExpression( 354 ObjectPattern(PatternProperty(PropertyName)),Equals,VariableName))), 355 ExpressionStatement(AssignmentExpression(ArrayPattern(VariableDefinition,VariableDefinition),Equals,VariableName)), 356 VariableDeclaration(let,ArrayPattern(VariableDefinition,VariableDefinition,Equals,Number),Equals,VariableName), 357 VariableDeclaration(let,ObjectPattern( 358 PatternProperty(PropertyName), 359 PatternProperty(PropertyName,VariableDefinition,Equals,Number) 360 ),Equals,VariableName), 361 VariableDeclaration(let,ObjectPattern(PatternProperty(VariableName,VariableDefinition)),Equals,VariableName)) 362 363# Generators 364 365function* foo() { yield 1 } 366 367class B { 368 *method() {} 369} 370 371({*x() {}}) 372 373==> 374 375Script( 376 FunctionDeclaration(function,Star,VariableDefinition,ParamList,Block( 377 ExpressionStatement(YieldExpression(yield,Number)))), 378 ClassDeclaration(class,VariableDefinition,ClassBody( 379 MethodDeclaration(Star,PropertyDefinition,ParamList,Block))), 380 ExpressionStatement(ParenthesizedExpression(ObjectExpression(Property(Star,PropertyDefinition,ParamList,Block))))) 381 382# Hashbang 383 384#!/bin/env node 385foo() 386 387==> 388 389Script(Hashbang,ExpressionStatement(CallExpression(VariableName,ArgList))) 390 391# new.target 392 393function MyObj() { 394 if (!new.target) { 395 throw new Error('Must construct MyObj with new'); 396 } 397} 398 399==> 400 401Script( 402 FunctionDeclaration(function,VariableDefinition,ParamList,Block( 403 IfStatement(if,ParenthesizedExpression(UnaryExpression(LogicOp,NewTarget(new,PropertyName))), Block( 404 ThrowStatement(throw,NewExpression(new,VariableName,ArgList(String))))))))