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