| 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/ast/standard_ast_factory.dart'; | 10 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 TypeProvider get typeProvider => _typeProvider; | 90 TypeProvider get typeProvider => _typeProvider; |
| 91 | 91 |
| 92 @override | 92 @override |
| 93 Element getElement(ElementLocation location) { | 93 Element getElement(ElementLocation location) { |
| 94 List<String> components = location.components; | 94 List<String> components = location.components; |
| 95 String libraryUri = components[0]; | 95 String libraryUri = components[0]; |
| 96 // Resynthesize locally. | 96 // Resynthesize locally. |
| 97 if (components.length == 1) { | 97 if (components.length == 1) { |
| 98 return getLibraryElement(libraryUri); | 98 return getLibraryElement(libraryUri); |
| 99 } else if (components.length == 2) { | 99 } else if (components.length == 2) { |
| 100 Map<String, CompilationUnitElement> libraryMap = | 100 LibraryElement libraryElement = getLibraryElement(libraryUri); |
| 101 _resynthesizedUnits[libraryUri]; | 101 // Try to find the unit element. |
| 102 if (libraryMap == null) { | 102 { |
| 103 getLibraryElement(libraryUri); | 103 Map<String, CompilationUnitElement> libraryMap = |
| 104 libraryMap = _resynthesizedUnits[libraryUri]; | 104 _resynthesizedUnits[libraryUri]; |
| 105 assert(libraryMap != null); | 105 assert(libraryMap != null); |
| 106 String unitUri = components[1]; |
| 107 CompilationUnitElement unitElement = libraryMap[unitUri]; |
| 108 if (unitElement != null) { |
| 109 return unitElement; |
| 110 } |
| 106 } | 111 } |
| 107 String unitUri = components[1]; | 112 // Try to find the prefix element. |
| 108 CompilationUnitElement element = libraryMap[unitUri]; | 113 { |
| 109 if (element == null) { | 114 String name = components[1]; |
| 110 throw new Exception('Unit element not found in summary: $location'); | 115 for (PrefixElement prefix in libraryElement.prefixes) { |
| 116 if (prefix.name == name) { |
| 117 return prefix; |
| 118 } |
| 119 } |
| 111 } | 120 } |
| 112 return element; | 121 // Fail. |
| 122 throw new Exception('The element not found in summary: $location'); |
| 113 } else if (components.length == 3 || components.length == 4) { | 123 } else if (components.length == 3 || components.length == 4) { |
| 114 String unitUri = components[1]; | 124 String unitUri = components[1]; |
| 115 // Prepare elements-in-units in the library. | 125 // Prepare elements-in-units in the library. |
| 116 Map<String, Map<String, Element>> unitsInLibrary = | 126 Map<String, Map<String, Element>> unitsInLibrary = |
| 117 _resynthesizedElements[libraryUri]; | 127 _resynthesizedElements[libraryUri]; |
| 118 if (unitsInLibrary == null) { | 128 if (unitsInLibrary == null) { |
| 119 unitsInLibrary = new HashMap<String, Map<String, Element>>(); | 129 unitsInLibrary = new HashMap<String, Map<String, Element>>(); |
| 120 _resynthesizedElements[libraryUri] = unitsInLibrary; | 130 _resynthesizedElements[libraryUri] = unitsInLibrary; |
| 121 } | 131 } |
| 122 // Prepare elements in the unit. | 132 // Prepare elements in the unit. |
| (...skipping 1672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1795 if (enclosingInfo != null && enclosingInfo.element is ClassElement) { | 1805 if (enclosingInfo != null && enclosingInfo.element is ClassElement) { |
| 1796 String identifier = _getElementIdentifier(name, linkedReference.kind); | 1806 String identifier = _getElementIdentifier(name, linkedReference.kind); |
| 1797 locationComponents = | 1807 locationComponents = |
| 1798 enclosingInfo.element.location.components.toList(); | 1808 enclosingInfo.element.location.components.toList(); |
| 1799 locationComponents.add(identifier); | 1809 locationComponents.add(identifier); |
| 1800 } else { | 1810 } else { |
| 1801 String identifier = _getElementIdentifier(name, linkedReference.kind); | 1811 String identifier = _getElementIdentifier(name, linkedReference.kind); |
| 1802 locationComponents = | 1812 locationComponents = |
| 1803 libraryResynthesizer.getReferencedLocationComponents( | 1813 libraryResynthesizer.getReferencedLocationComponents( |
| 1804 linkedReference.dependency, linkedReference.unit, identifier); | 1814 linkedReference.dependency, linkedReference.unit, identifier); |
| 1815 if (linkedReference.kind == ReferenceKind.prefix) { |
| 1816 locationComponents = <String>[ |
| 1817 locationComponents[0], |
| 1818 locationComponents[2] |
| 1819 ]; |
| 1820 } |
| 1805 } | 1821 } |
| 1806 if (!_resynthesizerContext.isStrongMode && | 1822 if (!_resynthesizerContext.isStrongMode && |
| 1807 locationComponents.length == 3 && | 1823 locationComponents.length == 3 && |
| 1808 locationComponents[0] == 'dart:async' && | 1824 locationComponents[0] == 'dart:async' && |
| 1809 locationComponents[2] == 'FutureOr') { | 1825 locationComponents[2] == 'FutureOr') { |
| 1810 type = typeProvider.dynamicType; | 1826 type = typeProvider.dynamicType; |
| 1811 numTypeParameters = 0; | 1827 numTypeParameters = 0; |
| 1812 } | 1828 } |
| 1813 ElementLocation location = | 1829 ElementLocation location = |
| 1814 new ElementLocationImpl.con3(locationComponents); | 1830 new ElementLocationImpl.con3(locationComponents); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1868 element = new _DeferredInitializerElement(enclosingElement); | 1884 element = new _DeferredInitializerElement(enclosingElement); |
| 1869 } else if (enclosingElement is ExecutableElement) { | 1885 } else if (enclosingElement is ExecutableElement) { |
| 1870 element = new _DeferredLocalFunctionElement( | 1886 element = new _DeferredLocalFunctionElement( |
| 1871 enclosingElement, linkedReference.localIndex); | 1887 enclosingElement, linkedReference.localIndex); |
| 1872 } else { | 1888 } else { |
| 1873 throw new StateError('Unexpected element enclosing function:' | 1889 throw new StateError('Unexpected element enclosing function:' |
| 1874 ' ${enclosingElement.runtimeType}'); | 1890 ' ${enclosingElement.runtimeType}'); |
| 1875 } | 1891 } |
| 1876 break; | 1892 break; |
| 1877 case ReferenceKind.prefix: | 1893 case ReferenceKind.prefix: |
| 1894 element = new PrefixElementHandle(summaryResynthesizer, location); |
| 1895 break; |
| 1878 case ReferenceKind.unresolved: | 1896 case ReferenceKind.unresolved: |
| 1879 break; | 1897 break; |
| 1880 } | 1898 } |
| 1881 } | 1899 } |
| 1882 result = new _ReferenceInfo(libraryResynthesizer, enclosingInfo, name, | 1900 result = new _ReferenceInfo(libraryResynthesizer, enclosingInfo, name, |
| 1883 isDeclarableType, element, type, numTypeParameters); | 1901 isDeclarableType, element, type, numTypeParameters); |
| 1884 referenceInfos[index] = result; | 1902 referenceInfos[index] = result; |
| 1885 } | 1903 } |
| 1886 return result; | 1904 return result; |
| 1887 } | 1905 } |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1975 static String _getElementIdentifier(String name, ReferenceKind kind) { | 1993 static String _getElementIdentifier(String name, ReferenceKind kind) { |
| 1976 if (kind == ReferenceKind.topLevelPropertyAccessor || | 1994 if (kind == ReferenceKind.topLevelPropertyAccessor || |
| 1977 kind == ReferenceKind.propertyAccessor) { | 1995 kind == ReferenceKind.propertyAccessor) { |
| 1978 if (!name.endsWith('=')) { | 1996 if (!name.endsWith('=')) { |
| 1979 return name + '?'; | 1997 return name + '?'; |
| 1980 } | 1998 } |
| 1981 } | 1999 } |
| 1982 return name; | 2000 return name; |
| 1983 } | 2001 } |
| 1984 } | 2002 } |
| OLD | NEW |