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 library summary_resynthesizer; | 5 library summary_resynthesizer; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 | 8 |
9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
10 import 'package:analyzer/dart/element/element.dart'; | 10 import 'package:analyzer/dart/element/element.dart'; |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 ? null | 460 ? null |
461 : typeArguments.map(_buildTypeAst).toList(); | 461 : typeArguments.map(_buildTypeAst).toList(); |
462 TypeName node = AstFactory.typeName4(type.name, argumentNodes); | 462 TypeName node = AstFactory.typeName4(type.name, argumentNodes); |
463 node.type = type; | 463 node.type = type; |
464 (node.name as SimpleIdentifier).staticElement = type.element; | 464 (node.name as SimpleIdentifier).staticElement = type.element; |
465 return node; | 465 return node; |
466 } | 466 } |
467 throw new StateError('Unsupported type $type'); | 467 throw new StateError('Unsupported type $type'); |
468 } | 468 } |
469 | 469 |
470 /** | |
471 * Return the [ConstructorElement] by applying [typeArgumentRefs] to the | |
472 * given linked [info]. Both cases when [info] is a [ClassElement] and | |
473 * [ConstructorElement] are supported. | |
474 */ | |
475 _DeferredConstructorElement _createConstructorElement( | |
476 _ReferenceInfo info, List<EntityRef> typeArgumentRefs) { | |
477 bool isClass = info.element is ClassElement; | |
478 _ReferenceInfo classInfo = isClass ? info : info.enclosing; | |
479 List<DartType> typeArguments = | |
480 typeArgumentRefs.map(resynthesizer.buildType).toList(); | |
481 InterfaceType classType = classInfo.buildType((i) { | |
482 if (i < typeArguments.length) { | |
483 return typeArguments[i]; | |
484 } else { | |
485 return DynamicTypeImpl.instance; | |
486 } | |
487 }, const <int>[]); | |
488 String name = isClass ? '' : info.name; | |
489 return new _DeferredConstructorElement(classType, name); | |
490 } | |
491 | |
492 InterpolationElement _newInterpolationElement(Expression expr) { | 470 InterpolationElement _newInterpolationElement(Expression expr) { |
493 if (expr is SimpleStringLiteral) { | 471 if (expr is SimpleStringLiteral) { |
494 return new InterpolationString(expr.literal, expr.value); | 472 return new InterpolationString(expr.literal, expr.value); |
495 } else { | 473 } else { |
496 return new InterpolationExpression( | 474 return new InterpolationExpression( |
497 TokenFactory.tokenFromType(TokenType.STRING_INTERPOLATION_EXPRESSION), | 475 TokenFactory.tokenFromType(TokenType.STRING_INTERPOLATION_EXPRESSION), |
498 expr, | 476 expr, |
499 TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET)); | 477 TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET)); |
500 } | 478 } |
501 } | 479 } |
(...skipping 27 matching lines...) Expand all Loading... |
529 String constructorName; | 507 String constructorName; |
530 if (info.element is ConstructorElement) { | 508 if (info.element is ConstructorElement) { |
531 constructorName = info.name; | 509 constructorName = info.name; |
532 } else if (info.element is ClassElement) { | 510 } else if (info.element is ClassElement) { |
533 constructorName = null; | 511 constructorName = null; |
534 } else { | 512 } else { |
535 throw new StateError('Unsupported element for invokeConstructor ' | 513 throw new StateError('Unsupported element for invokeConstructor ' |
536 '${info.element?.runtimeType}'); | 514 '${info.element?.runtimeType}'); |
537 } | 515 } |
538 _DeferredConstructorElement constructorElement = | 516 _DeferredConstructorElement constructorElement = |
539 _createConstructorElement(info, ref.typeArguments); | 517 resynthesizer._createConstructorElement(info, ref.typeArguments); |
540 // prepare arguments | 518 // prepare arguments |
541 List<Expression> arguments; | 519 List<Expression> arguments; |
542 { | 520 { |
543 int numNamedArgs = uc.ints[intPtr++]; | 521 int numNamedArgs = uc.ints[intPtr++]; |
544 int numPositionalArgs = uc.ints[intPtr++]; | 522 int numPositionalArgs = uc.ints[intPtr++]; |
545 int numArgs = numNamedArgs + numPositionalArgs; | 523 int numArgs = numNamedArgs + numPositionalArgs; |
546 arguments = _removeTopItems(numArgs); | 524 arguments = _removeTopItems(numArgs); |
547 // add names to the named arguments | 525 // add names to the named arguments |
548 for (int i = 0; i < numNamedArgs; i++) { | 526 for (int i = 0; i < numNamedArgs; i++) { |
549 String name = uc.strings[stringPtr++]; | 527 String name = uc.strings[stringPtr++]; |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
932 serializedExecutable.name, serializedExecutable.nameOffset); | 910 serializedExecutable.name, serializedExecutable.nameOffset); |
933 constructors[serializedExecutable.name] = currentConstructor; | 911 constructors[serializedExecutable.name] = currentConstructor; |
934 currentConstructor.returnType = classType; | 912 currentConstructor.returnType = classType; |
935 buildExecutableCommonParts(currentConstructor, serializedExecutable); | 913 buildExecutableCommonParts(currentConstructor, serializedExecutable); |
936 currentConstructor.factory = serializedExecutable.isFactory; | 914 currentConstructor.factory = serializedExecutable.isFactory; |
937 currentConstructor.const2 = serializedExecutable.isConst; | 915 currentConstructor.const2 = serializedExecutable.isConst; |
938 currentConstructor.constantInitializers = serializedExecutable | 916 currentConstructor.constantInitializers = serializedExecutable |
939 .constantInitializers | 917 .constantInitializers |
940 .map(buildConstantInitializer) | 918 .map(buildConstantInitializer) |
941 .toList(); | 919 .toList(); |
| 920 if (serializedExecutable.isRedirectedConstructor) { |
| 921 if (serializedExecutable.isFactory) { |
| 922 EntityRef redirectedConstructor = |
| 923 serializedExecutable.redirectedConstructor; |
| 924 currentConstructor.redirectedConstructor = _createConstructorElement( |
| 925 referenceInfos[redirectedConstructor.reference], |
| 926 redirectedConstructor.typeArguments); |
| 927 } else { |
| 928 List<String> locationComponents = |
| 929 currentCompilationUnit.location.components.toList(); |
| 930 locationComponents.add(classType.name); |
| 931 locationComponents.add(serializedExecutable.redirectedConstructorName); |
| 932 currentConstructor.redirectedConstructor = |
| 933 new _DeferredConstructorElement._( |
| 934 classType, |
| 935 serializedExecutable.redirectedConstructorName, |
| 936 new ElementLocationImpl.con3(locationComponents)); |
| 937 } |
| 938 } |
942 holder.addConstructor(currentConstructor); | 939 holder.addConstructor(currentConstructor); |
943 currentConstructor = null; | 940 currentConstructor = null; |
944 } | 941 } |
945 | 942 |
946 /** | 943 /** |
947 * Build the documentation for the given [element]. Does nothing if | 944 * Build the documentation for the given [element]. Does nothing if |
948 * [serializedDocumentationComment] is `null`. | 945 * [serializedDocumentationComment] is `null`. |
949 */ | 946 */ |
950 void buildDocumentation(ElementImpl element, | 947 void buildDocumentation(ElementImpl element, |
951 UnlinkedDocumentationComment serializedDocumentationComment) { | 948 UnlinkedDocumentationComment serializedDocumentationComment) { |
(...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1884 /** | 1881 /** |
1885 * Return the new handle of the `String.length` getter element. | 1882 * Return the new handle of the `String.length` getter element. |
1886 */ | 1883 */ |
1887 PropertyAccessorElementHandle _buildStringLengthPropertyAccessorElement() => | 1884 PropertyAccessorElementHandle _buildStringLengthPropertyAccessorElement() => |
1888 new PropertyAccessorElementHandle( | 1885 new PropertyAccessorElementHandle( |
1889 summaryResynthesizer, | 1886 summaryResynthesizer, |
1890 new ElementLocationImpl.con3( | 1887 new ElementLocationImpl.con3( |
1891 <String>['dart:core', 'dart:core', 'String', 'length?'])); | 1888 <String>['dart:core', 'dart:core', 'String', 'length?'])); |
1892 | 1889 |
1893 /** | 1890 /** |
| 1891 * Return the [ConstructorElement] by applying [typeArgumentRefs] to the |
| 1892 * given linked [info]. Both cases when [info] is a [ClassElement] and |
| 1893 * [ConstructorElement] are supported. |
| 1894 */ |
| 1895 _DeferredConstructorElement _createConstructorElement( |
| 1896 _ReferenceInfo info, List<EntityRef> typeArgumentRefs) { |
| 1897 bool isClass = info.element is ClassElement; |
| 1898 _ReferenceInfo classInfo = isClass ? info : info.enclosing; |
| 1899 List<DartType> typeArguments = typeArgumentRefs.map(buildType).toList(); |
| 1900 InterfaceType classType = classInfo.buildType((i) { |
| 1901 if (i < typeArguments.length) { |
| 1902 return typeArguments[i]; |
| 1903 } else { |
| 1904 return DynamicTypeImpl.instance; |
| 1905 } |
| 1906 }, const <int>[]); |
| 1907 String name = isClass ? '' : info.name; |
| 1908 return new _DeferredConstructorElement(classType, name); |
| 1909 } |
| 1910 |
| 1911 /** |
1894 * If the given [kind] is a top-level or class member property accessor, and | 1912 * If the given [kind] is a top-level or class member property accessor, and |
1895 * the given [name] does not end with `=`, i.e. does not denote a setter, | 1913 * the given [name] does not end with `=`, i.e. does not denote a setter, |
1896 * return the getter identifier by appending `?`. | 1914 * return the getter identifier by appending `?`. |
1897 */ | 1915 */ |
1898 static String _getElementIdentifier(String name, ReferenceKind kind) { | 1916 static String _getElementIdentifier(String name, ReferenceKind kind) { |
1899 if (kind == ReferenceKind.topLevelPropertyAccessor || | 1917 if (kind == ReferenceKind.topLevelPropertyAccessor || |
1900 kind == ReferenceKind.propertyAccessor) { | 1918 kind == ReferenceKind.propertyAccessor) { |
1901 if (!name.endsWith('=')) { | 1919 if (!name.endsWith('=')) { |
1902 return name + '?'; | 1920 return name + '?'; |
1903 } | 1921 } |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2024 } | 2042 } |
2025 : () => this.element; | 2043 : () => this.element; |
2026 // TODO(paulberry): Is it a bug that we have to pass `false` for | 2044 // TODO(paulberry): Is it a bug that we have to pass `false` for |
2027 // isInstantiated? | 2045 // isInstantiated? |
2028 return new DeferredFunctionTypeImpl(computer, null, typeArguments, false); | 2046 return new DeferredFunctionTypeImpl(computer, null, typeArguments, false); |
2029 } else { | 2047 } else { |
2030 return null; | 2048 return null; |
2031 } | 2049 } |
2032 } | 2050 } |
2033 } | 2051 } |
OLD | NEW |