| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 library dart2js_incremental.library_updater; | 5 library dart2js_incremental.library_updater; |
| 6 | 6 |
| 7 import 'dart:async' show | 7 import 'dart:async' show |
| 8 Future; | 8 Future; |
| 9 | 9 |
| 10 import 'dart:convert' show | 10 import 'dart:convert' show |
| (...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 | 838 |
| 839 updates.add( | 839 updates.add( |
| 840 js.statement( | 840 js.statement( |
| 841 r'# = #', [classAccess, invokeDefineClass(cls)])); | 841 r'# = #', [classAccess, invokeDefineClass(cls)])); |
| 842 | 842 |
| 843 ClassElement superclass = cls.superclass; | 843 ClassElement superclass = cls.superclass; |
| 844 if (superclass != null) { | 844 if (superclass != null) { |
| 845 jsAst.Node superAccess = emitter.constructorAccess(superclass); | 845 jsAst.Node superAccess = emitter.constructorAccess(superclass); |
| 846 inherits.add( | 846 inherits.add( |
| 847 js.statement( | 847 js.statement( |
| 848 r'#.inheritFrom(#, #)', [helper, classAccess, superAccess])); | 848 r'this.inheritFrom(#, #)', [classAccess, superAccess])); |
| 849 } | 849 } |
| 850 } | 850 } |
| 851 | 851 |
| 852 // Call inheritFrom after all classes have been created. This way we don't | 852 // Call inheritFrom after all classes have been created. This way we don't |
| 853 // need to sort the classes by having superclasses defined before their | 853 // need to sort the classes by having superclasses defined before their |
| 854 // subclasses. | 854 // subclasses. |
| 855 updates.addAll(inherits); | 855 updates.addAll(inherits); |
| 856 | 856 |
| 857 for (ClassElementX cls in changedClasses) { | 857 for (ClassElementX cls in changedClasses) { |
| 858 ClassElement superclass = cls.superclass; | 858 ClassElement superclass = cls.superclass; |
| 859 jsAst.Node superAccess = | 859 jsAst.Node superAccess = |
| 860 superclass == null ? js('null') | 860 superclass == null ? js('null') |
| 861 : emitter.constructorAccess(superclass); | 861 : emitter.constructorAccess(superclass); |
| 862 jsAst.Node classAccess = emitter.constructorAccess(cls); | 862 jsAst.Node classAccess = emitter.constructorAccess(cls); |
| 863 updates.add( | 863 updates.add( |
| 864 js.statement( | 864 js.statement( |
| 865 r'# = #.schemaChange(#, #, #)', | 865 r'# = this.schemaChange(#, #, #)', |
| 866 [classAccess, helper, | 866 [classAccess, invokeDefineClass(cls), classAccess, superAccess])); |
| 867 invokeDefineClass(cls), classAccess, superAccess])); | |
| 868 } | 867 } |
| 869 | 868 |
| 870 for (RemovalUpdate update in removals) { | 869 for (RemovalUpdate update in removals) { |
| 871 update.writeUpdateJsOn(updates); | 870 update.writeUpdateJsOn(updates); |
| 872 } | 871 } |
| 873 for (Element element in enqueuer.codegen.newlyEnqueuedElements) { | 872 for (Element element in enqueuer.codegen.newlyEnqueuedElements) { |
| 874 if (element.isField) { | 873 if (element.isField) { |
| 875 updates.addAll(computeFieldUpdateJs(element)); | 874 updates.addAll(computeFieldUpdateJs(element)); |
| 876 } else { | 875 } else { |
| 877 updates.add(computeMethodUpdateJs(element)); | 876 updates.add(computeMethodUpdateJs(element)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 892 jsAst.Statement constantInitializer = | 891 jsAst.Statement constantInitializer = |
| 893 emitter.oldEmitter.buildConstantInitializer(constant) | 892 emitter.oldEmitter.buildConstantInitializer(constant) |
| 894 .toStatement(); | 893 .toStatement(); |
| 895 updates.add(constantInitializer); | 894 updates.add(constantInitializer); |
| 896 } | 895 } |
| 897 } | 896 } |
| 898 } | 897 } |
| 899 } | 898 } |
| 900 | 899 |
| 901 updates.add(js.statement(r''' | 900 updates.add(js.statement(r''' |
| 902 if (#helper.pendingStubs) { | 901 if (this.pendingStubs) { |
| 903 #helper.pendingStubs.map(function(e) { return e(); }); | 902 this.pendingStubs.map(function(e) { return e(); }); |
| 904 #helper.pendingStubs = void 0; | 903 this.pendingStubs = void 0; |
| 905 } | 904 } |
| 906 ''', {'helper': helper})); | 905 ''')); |
| 907 | 906 |
| 908 if (updates.length == 1) { | 907 if (updates.length == 1) { |
| 909 return prettyPrintJs(updates.single); | 908 return prettyPrintJs(updates.single); |
| 910 } else { | 909 } else { |
| 911 return prettyPrintJs(js.statement('{#}', [updates])); | 910 return prettyPrintJs(js.statement('{#}', [updates])); |
| 912 } | 911 } |
| 913 } | 912 } |
| 914 | 913 |
| 915 jsAst.Expression invokeDefineClass(ClassElementX cls) { | 914 jsAst.Expression invokeDefineClass(ClassElementX cls) { |
| 916 String name = namer.getNameOfClass(cls); | 915 String name = namer.getNameOfClass(cls); |
| 917 var descriptor = js('Object.create(null)'); | 916 var descriptor = js('Object.create(null)'); |
| 918 return js( | 917 return js( |
| 919 r''' | 918 r''' |
| 920 (new Function( | 919 (new Function( |
| 921 "$collectedClasses", "$desc", | 920 "$collectedClasses", "$desc", |
| 922 #helper.defineClass(#name, #computeFields) +"\n;return " + #name))( | 921 this.defineClass(#name, #computeFields) +"\n;return " + #name))( |
| 923 {#name: #descriptor})''', | 922 {#name: #descriptor})''', |
| 924 {'helper': helper, | 923 {'name': js.string(name), |
| 925 'name': js.string(name), | |
| 926 'computeFields': js.stringArray(computeFields(cls)), | 924 'computeFields': js.stringArray(computeFields(cls)), |
| 927 'descriptor': descriptor}); | 925 'descriptor': descriptor}); |
| 928 } | 926 } |
| 929 | 927 |
| 930 jsAst.Node computeMethodUpdateJs(Element element) { | 928 jsAst.Node computeMethodUpdateJs(Element element) { |
| 931 MemberInfo info = containerBuilder.analyzeMemberMethod(element); | 929 MemberInfo info = containerBuilder.analyzeMemberMethod(element); |
| 932 if (info == null) { | 930 if (info == null) { |
| 933 compiler.internalError(element, '${element.runtimeType}'); | 931 compiler.internalError(element, '${element.runtimeType}'); |
| 934 } | 932 } |
| 935 ClassBuilder builder = new ClassBuilder(element, namer); | 933 ClassBuilder builder = new ClassBuilder(element, namer); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 948 if (element.isInstanceMember) { | 946 if (element.isInstanceMember) { |
| 949 holder = emitter.prototypeAccess(element.enclosingClass); | 947 holder = emitter.prototypeAccess(element.enclosingClass); |
| 950 } else { | 948 } else { |
| 951 holder = js('#', namer.globalObjectFor(element)); | 949 holder = js('#', namer.globalObjectFor(element)); |
| 952 } | 950 } |
| 953 | 951 |
| 954 jsAst.Expression globalFunctionsAccess = | 952 jsAst.Expression globalFunctionsAccess = |
| 955 emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS); | 953 emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS); |
| 956 | 954 |
| 957 return js.statement( | 955 return js.statement( |
| 958 r'#.addMethod(#, #, #, #, #)', | 956 r'this.addMethod(#, #, #, #, #)', |
| 959 [helper, partialDescriptor, js.string(name), holder, | 957 [partialDescriptor, js.string(name), holder, |
| 960 new jsAst.LiteralBool(isStatic), globalFunctionsAccess]); | 958 new jsAst.LiteralBool(isStatic), globalFunctionsAccess]); |
| 961 } | 959 } |
| 962 | 960 |
| 963 List<jsAst.Statement> computeFieldUpdateJs(FieldElementX element) { | 961 List<jsAst.Statement> computeFieldUpdateJs(FieldElementX element) { |
| 964 if (element.isInstanceMember) { | 962 if (element.isInstanceMember) { |
| 965 // Any initializers are inlined in factory methods, and the field is | 963 // Any initializers are inlined in factory methods, and the field is |
| 966 // declared by adding its class to [_classesWithSchemaChanges]. | 964 // declared by adding its class to [_classesWithSchemaChanges]. |
| 967 return const <jsAst.Statement>[]; | 965 return const <jsAst.Statement>[]; |
| 968 } | 966 } |
| 969 // A static (or top-level) field. | 967 // A static (or top-level) field. |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1454 | 1452 |
| 1455 JavaScriptBackend get backend => compiler.backend; | 1453 JavaScriptBackend get backend => compiler.backend; |
| 1456 | 1454 |
| 1457 Namer get namer => backend.namer; | 1455 Namer get namer => backend.namer; |
| 1458 | 1456 |
| 1459 CodeEmitterTask get emitter => backend.emitter; | 1457 CodeEmitterTask get emitter => backend.emitter; |
| 1460 | 1458 |
| 1461 ContainerBuilder get containerBuilder => emitter.oldEmitter.containerBuilder; | 1459 ContainerBuilder get containerBuilder => emitter.oldEmitter.containerBuilder; |
| 1462 | 1460 |
| 1463 EnqueueTask get enqueuer => compiler.enqueuer; | 1461 EnqueueTask get enqueuer => compiler.enqueuer; |
| 1464 | |
| 1465 jsAst.Expression get helper => namer.accessIncrementalHelper; | |
| 1466 } | 1462 } |
| 1467 | 1463 |
| 1468 class EmitterHelper extends JsFeatures { | 1464 class EmitterHelper extends JsFeatures { |
| 1469 final Compiler compiler; | 1465 final Compiler compiler; |
| 1470 | 1466 |
| 1471 EmitterHelper(this.compiler); | 1467 EmitterHelper(this.compiler); |
| 1472 | 1468 |
| 1473 ClassEmitter get classEmitter => backend.emitter.oldEmitter.classEmitter; | 1469 ClassEmitter get classEmitter => backend.emitter.oldEmitter.classEmitter; |
| 1474 | 1470 |
| 1475 List<String> computeFields(ClassElement cls) { | 1471 List<String> computeFields(ClassElement cls) { |
| 1476 // TODO(ahe): Rewrite for new emitter. | 1472 // TODO(ahe): Rewrite for new emitter. |
| 1477 ClassBuilder builder = new ClassBuilder(cls, namer); | 1473 ClassBuilder builder = new ClassBuilder(cls, namer); |
| 1478 classEmitter.emitFields(cls, builder); | 1474 classEmitter.emitFields(cls, builder); |
| 1479 return builder.fields; | 1475 return builder.fields; |
| 1480 } | 1476 } |
| 1481 } | 1477 } |
| 1482 | 1478 |
| 1483 // TODO(ahe): Remove this method. | 1479 // TODO(ahe): Remove this method. |
| 1484 NO_WARN(x) => x; | 1480 NO_WARN(x) => x; |
| OLD | NEW |