| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 /** | 5 /** |
| 6 * This library is capable of producing linked summaries from unlinked | 6 * This library is capable of producing linked summaries from unlinked |
| 7 * ones (or prelinked ones). It functions by building a miniature | 7 * ones (or prelinked ones). It functions by building a miniature |
| 8 * element model to represent the contents of the summaries, and then | 8 * element model to represent the contents of the summaries, and then |
| 9 * scanning the element model to gather linked information and adding | 9 * scanning the element model to gather linked information and adding |
| 10 * it to the summary data structures. | 10 * it to the summary data structures. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 import 'package:analyzer/dart/ast/ast.dart'; | 60 import 'package:analyzer/dart/ast/ast.dart'; |
| 61 import 'package:analyzer/dart/ast/token.dart' show TokenType; | 61 import 'package:analyzer/dart/ast/token.dart' show TokenType; |
| 62 import 'package:analyzer/dart/element/element.dart'; | 62 import 'package:analyzer/dart/element/element.dart'; |
| 63 import 'package:analyzer/dart/element/type.dart'; | 63 import 'package:analyzer/dart/element/type.dart'; |
| 64 import 'package:analyzer/src/dart/constant/value.dart'; | 64 import 'package:analyzer/src/dart/constant/value.dart'; |
| 65 import 'package:analyzer/src/dart/element/element.dart'; | 65 import 'package:analyzer/src/dart/element/element.dart'; |
| 66 import 'package:analyzer/src/dart/element/type.dart'; | 66 import 'package:analyzer/src/dart/element/type.dart'; |
| 67 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart'; | 67 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart'; |
| 68 import 'package:analyzer/src/generated/engine.dart'; | 68 import 'package:analyzer/src/generated/engine.dart'; |
| 69 import 'package:analyzer/src/generated/resolver.dart'; | 69 import 'package:analyzer/src/generated/resolver.dart'; |
| 70 import 'package:analyzer/src/generated/static_type_analyzer.dart'; |
| 70 import 'package:analyzer/src/generated/utilities_dart.dart'; | 71 import 'package:analyzer/src/generated/utilities_dart.dart'; |
| 71 import 'package:analyzer/src/summary/format.dart'; | 72 import 'package:analyzer/src/summary/format.dart'; |
| 72 import 'package:analyzer/src/summary/idl.dart'; | 73 import 'package:analyzer/src/summary/idl.dart'; |
| 73 import 'package:analyzer/src/summary/prelink.dart'; | 74 import 'package:analyzer/src/summary/prelink.dart'; |
| 74 import 'package:analyzer/src/task/strong_mode.dart'; | 75 import 'package:analyzer/src/task/strong_mode.dart'; |
| 75 import 'package:front_end/src/dependency_walker.dart'; | 76 import 'package:front_end/src/dependency_walker.dart'; |
| 76 | 77 |
| 77 bool isIncrementOrDecrement(UnlinkedExprAssignOperator operator) { | 78 bool isIncrementOrDecrement(UnlinkedExprAssignOperator operator) { |
| 78 switch (operator) { | 79 switch (operator) { |
| 79 case UnlinkedExprAssignOperator.prefixDecrement: | 80 case UnlinkedExprAssignOperator.prefixDecrement: |
| (...skipping 1593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1673 } | 1674 } |
| 1674 } | 1675 } |
| 1675 | 1676 |
| 1676 @override | 1677 @override |
| 1677 ConstructorElementForLink get asConstructor => this; | 1678 ConstructorElementForLink get asConstructor => this; |
| 1678 | 1679 |
| 1679 @override | 1680 @override |
| 1680 ClassElementImpl get enclosingElement => super.enclosingClass; | 1681 ClassElementImpl get enclosingElement => super.enclosingClass; |
| 1681 | 1682 |
| 1682 @override | 1683 @override |
| 1684 String get identifier => name; |
| 1685 |
| 1686 @override |
| 1683 bool get isCycleFree { | 1687 bool get isCycleFree { |
| 1684 if (!_constNode.isEvaluated) { | 1688 if (!_constNode.isEvaluated) { |
| 1685 new ConstDependencyWalker().walk(_constNode); | 1689 new ConstDependencyWalker().walk(_constNode); |
| 1686 } | 1690 } |
| 1687 return _constNode.isCycleFree; | 1691 return _constNode.isCycleFree; |
| 1688 } | 1692 } |
| 1689 | 1693 |
| 1694 @override |
| 1695 DartType get returnType => enclosingElement.type; |
| 1696 |
| 1697 @override |
| 1698 List<TypeParameterElement> get typeParameters => const []; |
| 1699 |
| 1690 /** | 1700 /** |
| 1691 * Perform const cycle detection on this constructor. | 1701 * Perform const cycle detection on this constructor. |
| 1692 */ | 1702 */ |
| 1693 void link(CompilationUnitElementInBuildUnit compilationUnit) { | 1703 void link(CompilationUnitElementInBuildUnit compilationUnit) { |
| 1694 if (_constNode != null && !isCycleFree) { | 1704 if (_constNode != null && !isCycleFree) { |
| 1695 compilationUnit._storeConstCycle(_unlinkedExecutable.constCycleSlot); | 1705 compilationUnit._storeConstCycle(_unlinkedExecutable.constCycleSlot); |
| 1696 } | 1706 } |
| 1697 // TODO(paulberry): call super. | 1707 // TODO(paulberry): call super. |
| 1698 } | 1708 } |
| 1699 | 1709 |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2314 | 2324 |
| 2315 void _doIfNull() { | 2325 void _doIfNull() { |
| 2316 DartType secondType = stack.removeLast(); | 2326 DartType secondType = stack.removeLast(); |
| 2317 DartType firstType = stack.removeLast(); | 2327 DartType firstType = stack.removeLast(); |
| 2318 DartType type = _leastUpperBound(firstType, secondType); | 2328 DartType type = _leastUpperBound(firstType, secondType); |
| 2319 type = _dynamicIfNull(type); | 2329 type = _dynamicIfNull(type); |
| 2320 stack.add(type); | 2330 stack.add(type); |
| 2321 } | 2331 } |
| 2322 | 2332 |
| 2323 void _doInvokeConstructor() { | 2333 void _doInvokeConstructor() { |
| 2324 int numNamed = _getNextInt(); | 2334 int numNamed = unlinkedConst.ints[intPtr++]; |
| 2325 int numPositional = _getNextInt(); | 2335 int numPositional = unlinkedConst.ints[intPtr++]; |
| 2326 // TODO(paulberry): don't just pop the args; use their types | 2336 List<String> namedArgNames = _getNextStrings(numNamed); |
| 2327 // to infer the type of type arguments. | 2337 List<DartType> namedArgTypeList = _popList(numNamed); |
| 2328 stack.length -= numNamed + numPositional; | 2338 List<DartType> positionalArgTypes = _popList(numPositional); |
| 2329 strPtr += numNamed; | 2339 |
| 2330 EntityRef ref = _getNextRef(); | 2340 EntityRef ref = _getNextRef(); |
| 2331 ClassElementForLink_Class element = | 2341 ReferenceableElementForLink refElement = unit.resolveRef(ref.reference); |
| 2332 unit.resolveConstructorClassRef(ref.reference).asClass; | 2342 ConstructorElementForLink constructorElement = refElement.asConstructor; |
| 2333 if (element != null) { | 2343 |
| 2334 stack.add(element.buildType((int i) { | 2344 if (constructorElement != null) { |
| 2335 // Type argument explicitly specified. | 2345 stack.add(() { |
| 2336 if (i < ref.typeArguments.length) { | 2346 if (ref.typeArguments.isNotEmpty) { |
| 2337 return unit.resolveTypeRef( | 2347 return constructorElement.enclosingClass.buildType((int i) { |
| 2338 ref.typeArguments[i], function.typeParameterContext); | 2348 if (i < ref.typeArguments.length) { |
| 2349 return unit.resolveTypeRef( |
| 2350 ref.typeArguments[i], function.typeParameterContext); |
| 2351 } else { |
| 2352 return null; |
| 2353 } |
| 2354 }, const <int>[]); |
| 2339 } else { | 2355 } else { |
| 2340 return null; | 2356 FunctionType rawType = StaticTypeAnalyzer |
| 2357 .constructorToGenericFunctionType(constructorElement); |
| 2358 FunctionType inferredType = _inferExecutableType( |
| 2359 rawType, |
| 2360 numNamed, |
| 2361 numPositional, |
| 2362 namedArgNames, |
| 2363 namedArgTypeList, |
| 2364 positionalArgTypes, const <DartType>[]); |
| 2365 if (identical(inferredType, rawType)) { |
| 2366 inferredType = linker.typeSystem.instantiateToBounds(rawType); |
| 2367 } |
| 2368 return inferredType.returnType; |
| 2341 } | 2369 } |
| 2342 }, const [])); | 2370 }()); |
| 2343 } else { | 2371 } else { |
| 2344 stack.add(DynamicTypeImpl.instance); | 2372 ClassElementForLink classElement = |
| 2373 unit.resolveConstructorClassRef(ref.reference).asClass; |
| 2374 stack.add(classElement?.type ?? DynamicTypeImpl.instance); |
| 2345 } | 2375 } |
| 2346 } | 2376 } |
| 2347 | 2377 |
| 2348 void _doInvokeMethod() { | 2378 void _doInvokeMethod() { |
| 2349 int numNamed = unlinkedConst.ints[intPtr++]; | 2379 int numNamed = unlinkedConst.ints[intPtr++]; |
| 2350 int numPositional = unlinkedConst.ints[intPtr++]; | 2380 int numPositional = unlinkedConst.ints[intPtr++]; |
| 2351 List<String> namedArgNames = _getNextStrings(numNamed); | 2381 List<String> namedArgNames = _getNextStrings(numNamed); |
| 2352 List<DartType> namedArgTypeList = _popList(numNamed); | 2382 List<DartType> namedArgTypeList = _popList(numNamed); |
| 2353 List<DartType> positionalArgTypes = _popList(numPositional); | 2383 List<DartType> positionalArgTypes = _popList(numPositional); |
| 2354 // TODO(scheglov) if we pushed target and method name first, we might be | 2384 // TODO(scheglov) if we pushed target and method name first, we might be |
| (...skipping 2671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5026 * there are no type parameters in scope. | 5056 * there are no type parameters in scope. |
| 5027 */ | 5057 */ |
| 5028 TypeParameterizedElementMixin get _typeParameterContext; | 5058 TypeParameterizedElementMixin get _typeParameterContext; |
| 5029 | 5059 |
| 5030 @override | 5060 @override |
| 5031 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 5061 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 5032 | 5062 |
| 5033 @override | 5063 @override |
| 5034 String toString() => '$enclosingElement.$name'; | 5064 String toString() => '$enclosingElement.$name'; |
| 5035 } | 5065 } |
| OLD | NEW |