| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 part of js; | 5 part of js; | 
| 6 | 6 | 
| 7 class Printer implements NodeVisitor { | 7 class Printer implements NodeVisitor { | 
| 8   final bool shouldCompressOutput; | 8   final bool shouldCompressOutput; | 
| 9   leg.Compiler compiler; | 9   leg.Compiler compiler; | 
| 10   leg.CodeBuffer outBuffer; | 10   leg.CodeBuffer outBuffer; | 
| 11   int indentLevel = 0; | 11   int indentLevel = 0; | 
| 12   bool inForInit = false; | 12   bool inForInit = false; | 
| 13   bool atStatementBegin = false; | 13   bool atStatementBegin = false; | 
| 14   final DanglingElseVisitor danglingElseVisitor; | 14   final DanglingElseVisitor danglingElseVisitor; | 
| 15   final Namer namer; | 15   final LocalNamer localNamer; | 
| 16   bool pendingSemicolon = false; | 16   bool pendingSemicolon = false; | 
| 17   bool pendingSpace = false; | 17   bool pendingSpace = false; | 
| 18   static final identifierCharacterRegExp = new RegExp(r'^[a-zA-Z_0-9$]'); | 18   static final identifierCharacterRegExp = new RegExp(r'^[a-zA-Z_0-9$]'); | 
| 19 | 19 | 
| 20   Printer(leg.Compiler compiler, { allowVariableMinification: true }) | 20   Printer(leg.Compiler compiler, { allowVariableMinification: true }) | 
| 21       : shouldCompressOutput = compiler.enableMinification, | 21       : shouldCompressOutput = compiler.enableMinification, | 
| 22         this.compiler = compiler, | 22         this.compiler = compiler, | 
| 23         outBuffer = new leg.CodeBuffer(), | 23         outBuffer = new leg.CodeBuffer(), | 
| 24         danglingElseVisitor = new DanglingElseVisitor(compiler), | 24         danglingElseVisitor = new DanglingElseVisitor(compiler), | 
| 25         namer = determineRenamer(compiler.enableMinification, | 25         localNamer = determineRenamer(compiler.enableMinification, | 
| 26                                  allowVariableMinification); | 26                                       allowVariableMinification); | 
| 27 | 27 | 
| 28   static Namer determineRenamer(bool shouldCompressOutput, | 28   static LocalNamer determineRenamer(bool shouldCompressOutput, | 
| 29                                 bool allowVariableMinification) { | 29                                      bool allowVariableMinification) { | 
| 30     return (shouldCompressOutput && allowVariableMinification) | 30     return (shouldCompressOutput && allowVariableMinification) | 
| 31         ? new MinifyRenamer() : new IdentityNamer(); | 31         ? new MinifyRenamer() : new IdentityNamer(); | 
| 32   } | 32   } | 
| 33 | 33 | 
| 34   void spaceOut() { | 34   void spaceOut() { | 
| 35     if (!shouldCompressOutput) out(" "); | 35     if (!shouldCompressOutput) out(" "); | 
| 36   } | 36   } | 
| 37   void lineOut() { | 37   void lineOut() { | 
| 38     if (!shouldCompressOutput) out("\n"); | 38     if (!shouldCompressOutput) out("\n"); | 
| 39   } | 39   } | 
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 384   } | 384   } | 
| 385 | 385 | 
| 386   void functionOut(Fun fun, Node name, VarCollector vars) { | 386   void functionOut(Fun fun, Node name, VarCollector vars) { | 
| 387     out("function"); | 387     out("function"); | 
| 388     if (name != null) { | 388     if (name != null) { | 
| 389       out(" "); | 389       out(" "); | 
| 390       // Name must be a [Decl]. Therefore only test for primary expressions. | 390       // Name must be a [Decl]. Therefore only test for primary expressions. | 
| 391       visitNestedExpression(name, PRIMARY, | 391       visitNestedExpression(name, PRIMARY, | 
| 392                             newInForInit: false, newAtStatementBegin: false); | 392                             newInForInit: false, newAtStatementBegin: false); | 
| 393     } | 393     } | 
| 394     namer.enterScope(vars); | 394     localNamer.enterScope(vars); | 
| 395     out("("); | 395     out("("); | 
| 396     if (fun.params != null) { | 396     if (fun.params != null) { | 
| 397       visitCommaSeparated(fun.params, PRIMARY, | 397       visitCommaSeparated(fun.params, PRIMARY, | 
| 398                           newInForInit: false, newAtStatementBegin: false); | 398                           newInForInit: false, newAtStatementBegin: false); | 
| 399     } | 399     } | 
| 400     out(")"); | 400     out(")"); | 
| 401     blockBody(fun.body, needsSeparation: false, needsNewline: false); | 401     blockBody(fun.body, needsSeparation: false, needsNewline: false); | 
| 402     namer.leaveScope(); | 402     localNamer.leaveScope(); | 
| 403   } | 403   } | 
| 404 | 404 | 
| 405   visitFunctionDeclaration(FunctionDeclaration declaration) { | 405   visitFunctionDeclaration(FunctionDeclaration declaration) { | 
| 406     VarCollector vars = new VarCollector(); | 406     VarCollector vars = new VarCollector(); | 
| 407     vars.visitFunctionDeclaration(declaration); | 407     vars.visitFunctionDeclaration(declaration); | 
| 408     indent(); | 408     indent(); | 
| 409     functionOut(declaration.function, declaration.name, vars); | 409     functionOut(declaration.function, declaration.name, vars); | 
| 410     lineOut(); | 410     lineOut(); | 
| 411   } | 411   } | 
| 412 | 412 | 
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 632   } | 632   } | 
| 633 | 633 | 
| 634   visitPostfix(Postfix postfix) { | 634   visitPostfix(Postfix postfix) { | 
| 635     visitNestedExpression(postfix.argument, LEFT_HAND_SIDE, | 635     visitNestedExpression(postfix.argument, LEFT_HAND_SIDE, | 
| 636                           newInForInit: inForInit, | 636                           newInForInit: inForInit, | 
| 637                           newAtStatementBegin: atStatementBegin); | 637                           newAtStatementBegin: atStatementBegin); | 
| 638     out(postfix.op); | 638     out(postfix.op); | 
| 639   } | 639   } | 
| 640 | 640 | 
| 641   visitVariableUse(VariableUse ref) { | 641   visitVariableUse(VariableUse ref) { | 
| 642     out(namer.getName(ref.name)); | 642     out(localNamer.getName(ref.name)); | 
| 643   } | 643   } | 
| 644 | 644 | 
| 645   visitThis(This node) { | 645   visitThis(This node) { | 
| 646     out("this"); | 646     out("this"); | 
| 647   } | 647   } | 
| 648 | 648 | 
| 649   visitVariableDeclaration(VariableDeclaration decl) { | 649   visitVariableDeclaration(VariableDeclaration decl) { | 
| 650     out(namer.getName(decl.name)); | 650     out(localNamer.getName(decl.name)); | 
| 651   } | 651   } | 
| 652 | 652 | 
| 653   visitParameter(Parameter param) { | 653   visitParameter(Parameter param) { | 
| 654     out(namer.getName(param.name)); | 654     out(localNamer.getName(param.name)); | 
| 655   } | 655   } | 
| 656 | 656 | 
| 657   bool isDigit(int charCode) { | 657   bool isDigit(int charCode) { | 
| 658     return charCodes.$0 <= charCode && charCode <= charCodes.$9; | 658     return charCodes.$0 <= charCode && charCode <= charCodes.$9; | 
| 659   } | 659   } | 
| 660 | 660 | 
| 661   bool isValidJavaScriptId(String field) { | 661   bool isValidJavaScriptId(String field) { | 
| 662     if (field.length < 3) return false; | 662     if (field.length < 3) return false; | 
| 663     // Ignore the leading and trailing string-delimiter. | 663     // Ignore the leading and trailing string-delimiter. | 
| 664     for (int i = 1; i < field.length - 1; i++) { | 664     for (int i = 1; i < field.length - 1; i++) { | 
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 937 leg.CodeBuffer prettyPrint(Node node, leg.Compiler compiler, | 937 leg.CodeBuffer prettyPrint(Node node, leg.Compiler compiler, | 
| 938                            { allowVariableMinification: true }) { | 938                            { allowVariableMinification: true }) { | 
| 939   Printer printer = | 939   Printer printer = | 
| 940       new Printer(compiler, | 940       new Printer(compiler, | 
| 941                   allowVariableMinification: allowVariableMinification); | 941                   allowVariableMinification: allowVariableMinification); | 
| 942   printer.visit(node); | 942   printer.visit(node); | 
| 943   return printer.outBuffer; | 943   return printer.outBuffer; | 
| 944 } | 944 } | 
| 945 | 945 | 
| 946 | 946 | 
| 947 abstract class Namer { | 947 abstract class LocalNamer { | 
| 948   String getName(String oldName); | 948   String getName(String oldName); | 
| 949   String declareVariable(String oldName); | 949   String declareVariable(String oldName); | 
| 950   String declareParameter(String oldName); | 950   String declareParameter(String oldName); | 
| 951   void enterScope(VarCollector vars); | 951   void enterScope(VarCollector vars); | 
| 952   void leaveScope(); | 952   void leaveScope(); | 
| 953 } | 953 } | 
| 954 | 954 | 
| 955 | 955 | 
| 956 class IdentityNamer implements Namer { | 956 class IdentityNamer implements LocalNamer { | 
| 957   String getName(String oldName) => oldName; | 957   String getName(String oldName) => oldName; | 
| 958   String declareVariable(String oldName) => oldName; | 958   String declareVariable(String oldName) => oldName; | 
| 959   String declareParameter(String oldName) => oldName; | 959   String declareParameter(String oldName) => oldName; | 
| 960   void enterScope(VarCollector vars) {} | 960   void enterScope(VarCollector vars) {} | 
| 961   void leaveScope() {} | 961   void leaveScope() {} | 
| 962 } | 962 } | 
| 963 | 963 | 
| 964 | 964 | 
| 965 class MinifyRenamer implements Namer { | 965 class MinifyRenamer implements LocalNamer { | 
| 966   final List<Map<String, String>> maps = []; | 966   final List<Map<String, String>> maps = []; | 
| 967   final List<int> parameterNumberStack = []; | 967   final List<int> parameterNumberStack = []; | 
| 968   final List<int> variableNumberStack = []; | 968   final List<int> variableNumberStack = []; | 
| 969   int parameterNumber = 0; | 969   int parameterNumber = 0; | 
| 970   int variableNumber = 0; | 970   int variableNumber = 0; | 
| 971 | 971 | 
| 972   MinifyRenamer(); | 972   MinifyRenamer(); | 
| 973 | 973 | 
| 974   void enterScope(VarCollector vars) { | 974   void enterScope(VarCollector vars) { | 
| 975     maps.add(new Map<String, String>()); | 975     maps.add(new Map<String, String>()); | 
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1065         codes.add(nthLetter((n ~/ nameSpaceSize) % LETTERS)); | 1065         codes.add(nthLetter((n ~/ nameSpaceSize) % LETTERS)); | 
| 1066       } | 1066       } | 
| 1067       codes.add(charCodes.$0 + digit); | 1067       codes.add(charCodes.$0 + digit); | 
| 1068       newName = new String.fromCharCodes(codes); | 1068       newName = new String.fromCharCodes(codes); | 
| 1069     } | 1069     } | 
| 1070     assert(new RegExp(r'[a-zA-Z][a-zA-Z0-9]*').hasMatch(newName)); | 1070     assert(new RegExp(r'[a-zA-Z][a-zA-Z0-9]*').hasMatch(newName)); | 
| 1071     maps.last[oldName] = newName; | 1071     maps.last[oldName] = newName; | 
| 1072     return newName; | 1072     return newName; | 
| 1073   } | 1073   } | 
| 1074 } | 1074 } | 
| OLD | NEW | 
|---|