OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 import 'dart:collection' show HashMap, HashSet; | 5 import 'dart:collection' show HashMap, HashSet; |
6 import 'dart:math' show min, max; | 6 import 'dart:math' show min, max; |
7 | 7 |
8 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; | 8 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; |
9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
10 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType; | 10 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType; |
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 void _registerPropertyOverrides( | 645 void _registerPropertyOverrides( |
646 ClassElement classElem, | 646 ClassElement classElem, |
647 JS.Expression className, | 647 JS.Expression className, |
648 List<ClassElement> superclasses, | 648 List<ClassElement> superclasses, |
649 List<FieldDeclaration> fields, | 649 List<FieldDeclaration> fields, |
650 Map<FieldElement, JS.TemporaryId> virtualFields, | 650 Map<FieldElement, JS.TemporaryId> virtualFields, |
651 List<JS.Statement> virtualFieldSymbols, | 651 List<JS.Statement> virtualFieldSymbols, |
652 Set<FieldElement> staticFieldOverrides) { | 652 Set<FieldElement> staticFieldOverrides) { |
653 for (var field in fields) { | 653 for (var field in fields) { |
654 for (VariableDeclaration field in field.fields.variables) { | 654 for (VariableDeclaration field in field.fields.variables) { |
655 var overrideInfo = checkForPropertyOverride( | 655 var overrideInfo = |
656 field.element, superclasses, _extensionTypes); | 656 checkForPropertyOverride(field.element, superclasses); |
657 if (overrideInfo.foundGetter || overrideInfo.foundSetter) { | 657 if (overrideInfo.foundGetter || overrideInfo.foundSetter) { |
658 if (field.element.isStatic) { | 658 if (field.element.isStatic) { |
659 staticFieldOverrides.add(field.element); | 659 staticFieldOverrides.add(field.element); |
660 } else { | 660 } else { |
661 var fieldName = | 661 var fieldName = |
662 _emitMemberName(field.element.name, type: classElem.type); | 662 _emitMemberName(field.element.name, type: classElem.type); |
663 var virtualField = new JS.TemporaryId(field.element.name); | 663 var virtualField = new JS.TemporaryId(field.element.name); |
664 virtualFields[field.element] = virtualField; | 664 virtualFields[field.element] = virtualField; |
665 virtualFieldSymbols.add(js.statement( | 665 virtualFieldSymbols.add(js.statement( |
666 'const # = Symbol(#.name + "." + #.toString());', | 666 'const # = Symbol(#.name + "." + #.toString());', |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
957 | 957 |
958 /// Emit a getter or setter that simply forwards to the superclass getter or | 958 /// Emit a getter or setter that simply forwards to the superclass getter or |
959 /// setter. This is needed because in ES6, if you only override a getter | 959 /// setter. This is needed because in ES6, if you only override a getter |
960 /// (alternatively, a setter), then there is an implicit override of the | 960 /// (alternatively, a setter), then there is an implicit override of the |
961 /// setter (alternatively, the getter) that does nothing. | 961 /// setter (alternatively, the getter) that does nothing. |
962 JS.Method _emitSuperAccessorWrapper(MethodDeclaration method, | 962 JS.Method _emitSuperAccessorWrapper(MethodDeclaration method, |
963 InterfaceType type, List<ClassElement> superclasses) { | 963 InterfaceType type, List<ClassElement> superclasses) { |
964 var methodElement = method.element as PropertyAccessorElement; | 964 var methodElement = method.element as PropertyAccessorElement; |
965 var field = methodElement.variable; | 965 var field = methodElement.variable; |
966 if (!field.isSynthetic) return null; | 966 if (!field.isSynthetic) return null; |
967 var propertyOverrideResult = checkForPropertyOverride( | 967 var propertyOverrideResult = |
968 methodElement.variable, superclasses, _extensionTypes); | 968 checkForPropertyOverride(methodElement.variable, superclasses); |
969 | 969 |
970 // Generate a corresponding virtual getter / setter. | 970 // Generate a corresponding virtual getter / setter. |
971 var name = _elementMemberName(methodElement, | 971 var name = _elementMemberName(methodElement, |
972 useExtension: _extensionTypes.isNativeClass(type.element)); | 972 useExtension: _extensionTypes.isNativeClass(type.element)); |
973 if (method.isGetter) { | 973 if (method.isGetter) { |
974 // Generate a setter | 974 // Generate a setter |
975 if (field.setter != null || !propertyOverrideResult.foundSetter) | 975 if (field.setter != null || !propertyOverrideResult.foundSetter) |
976 return null; | 976 return null; |
977 var fn = js.call('function(value) { super[#] = value; }', [name]); | 977 var fn = js.call('function(value) { super[#] = value; }', [name]); |
978 return new JS.Method(name, fn, isSetter: true); | 978 return new JS.Method(name, fn, isSetter: true); |
(...skipping 1966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2945 JS.Statement _emitLazyFields( | 2945 JS.Statement _emitLazyFields( |
2946 Element target, List<VariableDeclaration> fields) { | 2946 Element target, List<VariableDeclaration> fields) { |
2947 var methods = []; | 2947 var methods = []; |
2948 for (var node in fields) { | 2948 for (var node in fields) { |
2949 var name = node.name.name; | 2949 var name = node.name.name; |
2950 var element = node.element; | 2950 var element = node.element; |
2951 var access = _emitMemberName(name, isStatic: true); | 2951 var access = _emitMemberName(name, isStatic: true); |
2952 methods.add(annotate( | 2952 methods.add(annotate( |
2953 new JS.Method( | 2953 new JS.Method( |
2954 access, | 2954 access, |
2955 js.call('function() { return #; }', _visit(node.initializer)) | 2955 js.call('function() { return #; }', _visitInitializer(node)) |
2956 as JS.Fun, | 2956 as JS.Fun, |
2957 isGetter: true), | 2957 isGetter: true), |
2958 node, | 2958 node, |
2959 _findAccessor(element, getter: true))); | 2959 _findAccessor(element, getter: true))); |
2960 | 2960 |
2961 // TODO(jmesserly): currently uses a dummy setter to indicate writable. | 2961 // TODO(jmesserly): currently uses a dummy setter to indicate writable. |
2962 if (!node.isFinal && !node.isConst) { | 2962 if (!node.isFinal && !node.isConst) { |
2963 methods.add(annotate( | 2963 methods.add(annotate( |
2964 new JS.Method(access, js.call('function(_) {}') as JS.Fun, | 2964 new JS.Method(access, js.call('function(_) {}') as JS.Fun, |
2965 isSetter: true), | 2965 isSetter: true), |
(...skipping 1442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4408 } | 4408 } |
4409 | 4409 |
4410 bool isLibraryPrefix(Expression node) => | 4410 bool isLibraryPrefix(Expression node) => |
4411 node is SimpleIdentifier && node.staticElement is PrefixElement; | 4411 node is SimpleIdentifier && node.staticElement is PrefixElement; |
4412 | 4412 |
4413 LibraryElement _getLibrary(AnalysisContext c, String uri) => | 4413 LibraryElement _getLibrary(AnalysisContext c, String uri) => |
4414 c.computeLibraryElement(c.sourceFactory.forUri(uri)); | 4414 c.computeLibraryElement(c.sourceFactory.forUri(uri)); |
4415 | 4415 |
4416 bool _isDartRuntime(LibraryElement l) => | 4416 bool _isDartRuntime(LibraryElement l) => |
4417 l.isInSdk && l.source.uri.toString() == 'dart:_runtime'; | 4417 l.isInSdk && l.source.uri.toString() == 'dart:_runtime'; |
OLD | NEW |