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 library kernel.analyzer.ast_from_analyzer; | 4 library kernel.analyzer.ast_from_analyzer; |
5 | 5 |
6 import '../ast.dart' as ast; | 6 import '../ast.dart' as ast; |
7 import '../frontend/accessors.dart'; | 7 import '../frontend/accessors.dart'; |
8 import '../frontend/super_initializers.dart'; | 8 import '../frontend/super_initializers.dart'; |
9 import '../log.dart'; | 9 import '../log.dart'; |
10 import '../type_algebra.dart'; | 10 import '../type_algebra.dart'; |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 | 449 |
450 case ParameterKind.POSITIONAL: | 450 case ParameterKind.POSITIONAL: |
451 positional.add(parameterNode); | 451 positional.add(parameterNode); |
452 break; | 452 break; |
453 | 453 |
454 case ParameterKind.NAMED: | 454 case ParameterKind.NAMED: |
455 named.add(parameterNode); | 455 named.add(parameterNode); |
456 break; | 456 break; |
457 } | 457 } |
458 } | 458 } |
| 459 if (named.isNotEmpty) { |
| 460 sortAndRemoveDuplicates(named); |
| 461 } |
459 var returnType = element is ConstructorElement | 462 var returnType = element is ConstructorElement |
460 ? const ast.VoidType() | 463 ? const ast.VoidType() |
461 : buildType(element.returnType); | 464 : buildType(element.returnType); |
462 return new ast.FunctionNode(null, | 465 return new ast.FunctionNode(null, |
463 typeParameters: typeParameters, | 466 typeParameters: typeParameters, |
464 positionalParameters: positional, | 467 positionalParameters: positional, |
465 namedParameters: named, | 468 namedParameters: named, |
466 requiredParameterCount: requiredParameterCount, | 469 requiredParameterCount: requiredParameterCount, |
467 returnType: returnType); | 470 returnType: returnType); |
468 } | 471 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 | 553 |
551 case ParameterKind.POSITIONAL: | 554 case ParameterKind.POSITIONAL: |
552 positional.add(declaration); | 555 positional.add(declaration); |
553 break; | 556 break; |
554 | 557 |
555 case ParameterKind.NAMED: | 558 case ParameterKind.NAMED: |
556 named.add(declaration); | 559 named.add(declaration); |
557 break; | 560 break; |
558 } | 561 } |
559 } | 562 } |
| 563 if (named.isNotEmpty) { |
| 564 sortAndRemoveDuplicates(named); |
| 565 } |
560 return new ast.FunctionNode(buildOptionalFunctionBody(body), | 566 return new ast.FunctionNode(buildOptionalFunctionBody(body), |
561 typeParameters: typeParameters, | 567 typeParameters: typeParameters, |
562 positionalParameters: positional, | 568 positionalParameters: positional, |
563 namedParameters: named, | 569 namedParameters: named, |
564 requiredParameterCount: requiredParameterCount, | 570 requiredParameterCount: requiredParameterCount, |
565 returnType: buildOptionalTypeAnnotation(returnType) ?? | 571 returnType: buildOptionalTypeAnnotation(returnType) ?? |
566 inferredReturnType ?? | 572 inferredReturnType ?? |
567 const ast.DynamicType(), | 573 const ast.DynamicType(), |
568 asyncMarker: getAsyncMarker( | 574 asyncMarker: getAsyncMarker( |
569 isAsync: body.isAsynchronous, isStar: body.isGenerator)); | 575 isAsync: body.isAsynchronous, isStar: body.isGenerator)); |
(...skipping 1373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1943 return new SuperPropertyAccessor( | 1949 return new SuperPropertyAccessor( |
1944 scope.buildName(node.propertyName), | 1950 scope.buildName(node.propertyName), |
1945 scope.resolveConcreteGet(element, auxiliary), | 1951 scope.resolveConcreteGet(element, auxiliary), |
1946 scope.resolveConcreteSet(element, auxiliary)); | 1952 scope.resolveConcreteSet(element, auxiliary)); |
1947 } else if (target is Identifier && target.staticElement is ClassElement) { | 1953 } else if (target is Identifier && target.staticElement is ClassElement) { |
1948 // Note that this case also covers null-aware static access on a class, | 1954 // Note that this case also covers null-aware static access on a class, |
1949 // which is equivalent to a regular static access. | 1955 // which is equivalent to a regular static access. |
1950 return scope.staticAccess(node.propertyName.name, element, auxiliary); | 1956 return scope.staticAccess(node.propertyName.name, element, auxiliary); |
1951 } else if (node.operator.value() == '?.') { | 1957 } else if (node.operator.value() == '?.') { |
1952 return new NullAwarePropertyAccessor( | 1958 return new NullAwarePropertyAccessor( |
1953 build(target), scope.buildName(node.propertyName), getter, setter, | 1959 build(target), |
| 1960 scope.buildName(node.propertyName), |
| 1961 getter, |
| 1962 setter, |
1954 scope.buildType(node.staticType)); | 1963 scope.buildType(node.staticType)); |
1955 } else { | 1964 } else { |
1956 return PropertyAccessor.make( | 1965 return PropertyAccessor.make( |
1957 build(target), scope.buildName(node.propertyName), getter, setter); | 1966 build(target), scope.buildName(node.propertyName), getter, setter); |
1958 } | 1967 } |
1959 } | 1968 } |
1960 | 1969 |
1961 ast.Expression visitRethrowExpression(RethrowExpression node) { | 1970 ast.Expression visitRethrowExpression(RethrowExpression node) { |
1962 return new ast.Rethrow(); | 1971 return new ast.Rethrow(); |
1963 } | 1972 } |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2143 .map((tp) => convertTypeParameter(tp, boundVariables)) | 2152 .map((tp) => convertTypeParameter(tp, boundVariables)) |
2144 .toList(); | 2153 .toList(); |
2145 } | 2154 } |
2146 | 2155 |
2147 List<ast.DartType> convertTypeList( | 2156 List<ast.DartType> convertTypeList( |
2148 Iterable<DartType> types, List<TypeParameterElement> boundVariables) { | 2157 Iterable<DartType> types, List<TypeParameterElement> boundVariables) { |
2149 if (types.isEmpty) return const <ast.DartType>[]; | 2158 if (types.isEmpty) return const <ast.DartType>[]; |
2150 return types.map((t) => convertType(t, boundVariables)).toList(); | 2159 return types.map((t) => convertType(t, boundVariables)).toList(); |
2151 } | 2160 } |
2152 | 2161 |
2153 Map<String, ast.DartType> convertTypeMap( | 2162 List<ast.NamedType> convertTypeMap( |
2154 Map<String, DartType> types, List<TypeParameterElement> boundVariables) { | 2163 Map<String, DartType> types, List<TypeParameterElement> boundVariables) { |
2155 if (types.isEmpty) return const <String, ast.DartType>{}; | 2164 if (types.isEmpty) return const <ast.NamedType>[]; |
2156 var result = <String, ast.DartType>{}; | 2165 List<ast.NamedType> result = <ast.NamedType>[]; |
2157 types.forEach((name, type) { | 2166 types.forEach((name, type) { |
2158 result[name] = convertType(type, boundVariables); | 2167 result.add(new ast.NamedType(name, convertType(type, boundVariables))); |
2159 }); | 2168 }); |
| 2169 sortAndRemoveDuplicates(result); |
2160 return result; | 2170 return result; |
2161 } | 2171 } |
2162 | 2172 |
2163 ast.DartType visitSimpleIdentifier(SimpleIdentifier node) { | 2173 ast.DartType visitSimpleIdentifier(SimpleIdentifier node) { |
2164 Element element = node.staticElement; | 2174 Element element = node.staticElement; |
2165 switch (ElementKind.of(element)) { | 2175 switch (ElementKind.of(element)) { |
2166 case ElementKind.CLASS: | 2176 case ElementKind.CLASS: |
2167 return new ast.InterfaceType(scope.getClassReference(element)); | 2177 return new ast.InterfaceType(scope.getClassReference(element)); |
2168 | 2178 |
2169 case ElementKind.DYNAMIC: | 2179 case ElementKind.DYNAMIC: |
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2776 if (element is FieldElement) return element.getter; | 2786 if (element is FieldElement) return element.getter; |
2777 return element; | 2787 return element; |
2778 } | 2788 } |
2779 | 2789 |
2780 Element desynthesizeSetter(Element element) { | 2790 Element desynthesizeSetter(Element element) { |
2781 if (element == null || !element.isSynthetic) return element; | 2791 if (element == null || !element.isSynthetic) return element; |
2782 if (element is PropertyAccessorElement) return element.variable; | 2792 if (element is PropertyAccessorElement) return element.variable; |
2783 if (element is FieldElement) return element.setter; | 2793 if (element is FieldElement) return element.setter; |
2784 return element; | 2794 return element; |
2785 } | 2795 } |
| 2796 |
| 2797 void sortAndRemoveDuplicates/*<T extends Comparable<T>>*/(List/*<T>*/ list) { |
| 2798 list.sort(); |
| 2799 int deleted = 0; |
| 2800 for (int i = 1; i < list.length; ++i) { |
| 2801 var item = list[i]; |
| 2802 if (list[i - 1].compareTo(item) == 0) { |
| 2803 ++deleted; |
| 2804 } else if (deleted > 0) { |
| 2805 list[i - deleted] = item; |
| 2806 } |
| 2807 } |
| 2808 if (deleted > 0) { |
| 2809 list.length -= deleted; |
| 2810 } |
| 2811 } |
OLD | NEW |