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/token.dart'; | 10 import 'package:analyzer/dart/ast/token.dart'; |
(...skipping 1002 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1013 } | 1013 } |
1014 classElement.constructors = memberHolder.constructors; | 1014 classElement.constructors = memberHolder.constructors; |
1015 } | 1015 } |
1016 classElement.accessors = memberHolder.accessors; | 1016 classElement.accessors = memberHolder.accessors; |
1017 classElement.fields = memberHolder.fields; | 1017 classElement.fields = memberHolder.fields; |
1018 classElement.methods = memberHolder.methods; | 1018 classElement.methods = memberHolder.methods; |
1019 correspondingType.typeArguments = getCurrentTypeArguments(); | 1019 correspondingType.typeArguments = getCurrentTypeArguments(); |
1020 classElement.type = correspondingType; | 1020 classElement.type = correspondingType; |
1021 buildDocumentation(classElement, serializedClass.documentationComment); | 1021 buildDocumentation(classElement, serializedClass.documentationComment); |
1022 buildAnnotations(classElement, serializedClass.annotations); | 1022 buildAnnotations(classElement, serializedClass.annotations); |
| 1023 buildCodeRange(classElement, serializedClass); |
1023 resolveConstructorInitializers(classElement); | 1024 resolveConstructorInitializers(classElement); |
1024 unitHolder.addType(classElement); | 1025 unitHolder.addType(classElement); |
1025 currentTypeParameters.removeLast(); | 1026 currentTypeParameters.removeLast(); |
1026 assert(currentTypeParameters.isEmpty); | 1027 assert(currentTypeParameters.isEmpty); |
1027 fields = null; | 1028 fields = null; |
1028 constructors = null; | 1029 constructors = null; |
1029 } | 1030 } |
1030 | 1031 |
| 1032 void buildCodeRange(ElementImpl element, Object summary) { |
| 1033 int offset; |
| 1034 int length; |
| 1035 if (summary is UnlinkedClass) { |
| 1036 if (summary.hasCodeRange) { |
| 1037 offset = summary.codeOffset; |
| 1038 length = summary.codeLength; |
| 1039 } |
| 1040 } else if (summary is UnlinkedEnum) { |
| 1041 if (summary.hasCodeRange) { |
| 1042 offset = summary.codeOffset; |
| 1043 length = summary.codeLength; |
| 1044 } |
| 1045 } else if (summary is UnlinkedExecutable) { |
| 1046 if (summary.hasCodeRange) { |
| 1047 offset = summary.codeOffset; |
| 1048 length = summary.codeLength; |
| 1049 } |
| 1050 } else if (summary is UnlinkedParam) { |
| 1051 if (summary.hasCodeRange) { |
| 1052 offset = summary.codeOffset; |
| 1053 length = summary.codeLength; |
| 1054 } |
| 1055 } else if (summary is UnlinkedTypedef) { |
| 1056 if (summary.hasCodeRange) { |
| 1057 offset = summary.codeOffset; |
| 1058 length = summary.codeLength; |
| 1059 } |
| 1060 } else if (summary is UnlinkedTypeParam) { |
| 1061 if (summary.hasCodeRange) { |
| 1062 offset = summary.codeOffset; |
| 1063 length = summary.codeLength; |
| 1064 } |
| 1065 } else if (summary is UnlinkedUnit) { |
| 1066 if (summary.hasCodeRange) { |
| 1067 offset = summary.codeOffset; |
| 1068 length = summary.codeLength; |
| 1069 } |
| 1070 } else if (summary is UnlinkedVariable) { |
| 1071 if (summary.hasCodeRange) { |
| 1072 offset = summary.codeOffset; |
| 1073 length = summary.codeLength; |
| 1074 } |
| 1075 } |
| 1076 if (offset != null) { |
| 1077 element.setCodeRange(offset, length); |
| 1078 } |
| 1079 } |
| 1080 |
1031 /** | 1081 /** |
1032 * Resynthesize a [NamespaceCombinator]. | 1082 * Resynthesize a [NamespaceCombinator]. |
1033 */ | 1083 */ |
1034 NamespaceCombinator buildCombinator(UnlinkedCombinator serializedCombinator) { | 1084 NamespaceCombinator buildCombinator(UnlinkedCombinator serializedCombinator) { |
1035 if (serializedCombinator.shows.isNotEmpty) { | 1085 if (serializedCombinator.shows.isNotEmpty) { |
1036 ShowElementCombinatorImpl combinator = new ShowElementCombinatorImpl(); | 1086 ShowElementCombinatorImpl combinator = new ShowElementCombinatorImpl(); |
1037 // Note: we call toList() so that we don't retain a reference to the | 1087 // Note: we call toList() so that we don't retain a reference to the |
1038 // deserialized data structure. | 1088 // deserialized data structure. |
1039 combinator.shownNames = serializedCombinator.shows.toList(); | 1089 combinator.shownNames = serializedCombinator.shows.toList(); |
1040 combinator.offset = serializedCombinator.offset; | 1090 combinator.offset = serializedCombinator.offset; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1144 void buildEnum(UnlinkedEnum serializedEnum) { | 1194 void buildEnum(UnlinkedEnum serializedEnum) { |
1145 assert(!isCoreLibrary); | 1195 assert(!isCoreLibrary); |
1146 ClassElementImpl classElement = | 1196 ClassElementImpl classElement = |
1147 new ClassElementImpl(serializedEnum.name, serializedEnum.nameOffset); | 1197 new ClassElementImpl(serializedEnum.name, serializedEnum.nameOffset); |
1148 classElement.enum2 = true; | 1198 classElement.enum2 = true; |
1149 InterfaceType enumType = new InterfaceTypeImpl(classElement); | 1199 InterfaceType enumType = new InterfaceTypeImpl(classElement); |
1150 classElement.type = enumType; | 1200 classElement.type = enumType; |
1151 classElement.supertype = summaryResynthesizer.typeProvider.objectType; | 1201 classElement.supertype = summaryResynthesizer.typeProvider.objectType; |
1152 buildDocumentation(classElement, serializedEnum.documentationComment); | 1202 buildDocumentation(classElement, serializedEnum.documentationComment); |
1153 buildAnnotations(classElement, serializedEnum.annotations); | 1203 buildAnnotations(classElement, serializedEnum.annotations); |
| 1204 buildCodeRange(classElement, serializedEnum); |
1154 ElementHolder memberHolder = new ElementHolder(); | 1205 ElementHolder memberHolder = new ElementHolder(); |
1155 // Build the 'index' field. | 1206 // Build the 'index' field. |
1156 FieldElementImpl indexField = new FieldElementImpl('index', -1); | 1207 FieldElementImpl indexField = new FieldElementImpl('index', -1); |
1157 indexField.final2 = true; | 1208 indexField.final2 = true; |
1158 indexField.synthetic = true; | 1209 indexField.synthetic = true; |
1159 indexField.type = summaryResynthesizer.typeProvider.intType; | 1210 indexField.type = summaryResynthesizer.typeProvider.intType; |
1160 memberHolder.addField(indexField); | 1211 memberHolder.addField(indexField); |
1161 buildImplicitAccessors(indexField, memberHolder); | 1212 buildImplicitAccessors(indexField, memberHolder); |
1162 // Build the 'values' field. | 1213 // Build the 'values' field. |
1163 FieldElementImpl valuesField = new ConstFieldElementImpl('values', -1); | 1214 FieldElementImpl valuesField = new ConstFieldElementImpl('values', -1); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1299 defaultVoid: isSetter && summaryResynthesizer.strongMode); | 1350 defaultVoid: isSetter && summaryResynthesizer.strongMode); |
1300 executableElement.hasImplicitReturnType = | 1351 executableElement.hasImplicitReturnType = |
1301 serializedExecutable.returnType == null; | 1352 serializedExecutable.returnType == null; |
1302 } | 1353 } |
1303 executableElement.type = new FunctionTypeImpl.elementWithNameAndArgs( | 1354 executableElement.type = new FunctionTypeImpl.elementWithNameAndArgs( |
1304 executableElement, null, getCurrentTypeArguments(skipLevels: 1), false); | 1355 executableElement, null, getCurrentTypeArguments(skipLevels: 1), false); |
1305 executableElement.external = serializedExecutable.isExternal; | 1356 executableElement.external = serializedExecutable.isExternal; |
1306 buildDocumentation( | 1357 buildDocumentation( |
1307 executableElement, serializedExecutable.documentationComment); | 1358 executableElement, serializedExecutable.documentationComment); |
1308 buildAnnotations(executableElement, serializedExecutable.annotations); | 1359 buildAnnotations(executableElement, serializedExecutable.annotations); |
| 1360 buildCodeRange(executableElement, serializedExecutable); |
1309 executableElement.functions = | 1361 executableElement.functions = |
1310 serializedExecutable.localFunctions.map(buildLocalFunction).toList(); | 1362 serializedExecutable.localFunctions.map(buildLocalFunction).toList(); |
1311 executableElement.labels = | 1363 executableElement.labels = |
1312 serializedExecutable.localLabels.map(buildLocalLabel).toList(); | 1364 serializedExecutable.localLabels.map(buildLocalLabel).toList(); |
1313 executableElement.localVariables = | 1365 executableElement.localVariables = |
1314 serializedExecutable.localVariables.map(buildLocalVariable).toList(); | 1366 serializedExecutable.localVariables.map(buildLocalVariable).toList(); |
1315 currentTypeParameters.removeLast(); | 1367 currentTypeParameters.removeLast(); |
1316 } | 1368 } |
1317 | 1369 |
1318 /** | 1370 /** |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1700 if (serializedParameter.defaultValue != null) { | 1752 if (serializedParameter.defaultValue != null) { |
1701 defaultParameter.constantInitializer = | 1753 defaultParameter.constantInitializer = |
1702 _buildConstExpression(serializedParameter.defaultValue); | 1754 _buildConstExpression(serializedParameter.defaultValue); |
1703 defaultParameter.defaultValueCode = | 1755 defaultParameter.defaultValueCode = |
1704 serializedParameter.defaultValueCode; | 1756 serializedParameter.defaultValueCode; |
1705 } | 1757 } |
1706 } | 1758 } |
1707 } | 1759 } |
1708 parameterElement.synthetic = synthetic; | 1760 parameterElement.synthetic = synthetic; |
1709 buildAnnotations(parameterElement, serializedParameter.annotations); | 1761 buildAnnotations(parameterElement, serializedParameter.annotations); |
| 1762 buildCodeRange(parameterElement, serializedParameter); |
1710 if (serializedParameter.isFunctionTyped) { | 1763 if (serializedParameter.isFunctionTyped) { |
1711 FunctionElementImpl parameterTypeElement = | 1764 FunctionElementImpl parameterTypeElement = |
1712 new FunctionElementImpl('', -1); | 1765 new FunctionElementImpl('', -1); |
1713 parameterTypeElement.synthetic = true; | 1766 parameterTypeElement.synthetic = true; |
1714 parameterElement.parameters = | 1767 parameterElement.parameters = |
1715 serializedParameter.parameters.map(buildParameter).toList(); | 1768 serializedParameter.parameters.map(buildParameter).toList(); |
1716 parameterTypeElement.enclosingElement = parameterElement; | 1769 parameterTypeElement.enclosingElement = parameterElement; |
1717 parameterTypeElement.shareParameters(parameterElement.parameters); | 1770 parameterTypeElement.shareParameters(parameterElement.parameters); |
1718 parameterTypeElement.returnType = buildType(serializedParameter.type); | 1771 parameterTypeElement.returnType = buildType(serializedParameter.type); |
1719 parameterElement.type = new FunctionTypeImpl.elementWithNameAndArgs( | 1772 parameterElement.type = new FunctionTypeImpl.elementWithNameAndArgs( |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1833 buildTypeParameters(serializedTypedef.typeParameters); | 1886 buildTypeParameters(serializedTypedef.typeParameters); |
1834 functionTypeAliasElement.parameters = | 1887 functionTypeAliasElement.parameters = |
1835 serializedTypedef.parameters.map(buildParameter).toList(); | 1888 serializedTypedef.parameters.map(buildParameter).toList(); |
1836 functionTypeAliasElement.returnType = | 1889 functionTypeAliasElement.returnType = |
1837 buildType(serializedTypedef.returnType); | 1890 buildType(serializedTypedef.returnType); |
1838 functionTypeAliasElement.type = | 1891 functionTypeAliasElement.type = |
1839 new FunctionTypeImpl.forTypedef(functionTypeAliasElement); | 1892 new FunctionTypeImpl.forTypedef(functionTypeAliasElement); |
1840 buildDocumentation( | 1893 buildDocumentation( |
1841 functionTypeAliasElement, serializedTypedef.documentationComment); | 1894 functionTypeAliasElement, serializedTypedef.documentationComment); |
1842 buildAnnotations(functionTypeAliasElement, serializedTypedef.annotations); | 1895 buildAnnotations(functionTypeAliasElement, serializedTypedef.annotations); |
| 1896 buildCodeRange(functionTypeAliasElement, serializedTypedef); |
1843 unitHolder.addTypeAlias(functionTypeAliasElement); | 1897 unitHolder.addTypeAlias(functionTypeAliasElement); |
1844 currentTypeParameters.removeLast(); | 1898 currentTypeParameters.removeLast(); |
1845 assert(currentTypeParameters.isEmpty); | 1899 assert(currentTypeParameters.isEmpty); |
1846 } | 1900 } |
1847 | 1901 |
1848 /** | 1902 /** |
1849 * Resynthesize a [TypeParameterElement], handling all parts of its except | 1903 * Resynthesize a [TypeParameterElement], handling all parts of its except |
1850 * its bound. | 1904 * its bound. |
1851 * | 1905 * |
1852 * The bound is deferred until later since it may refer to other type | 1906 * The bound is deferred until later since it may refer to other type |
1853 * parameters that have not been resynthesized yet. To handle the bound, | 1907 * parameters that have not been resynthesized yet. To handle the bound, |
1854 * call [finishTypeParameter]. | 1908 * call [finishTypeParameter]. |
1855 */ | 1909 */ |
1856 TypeParameterElement buildTypeParameter( | 1910 TypeParameterElement buildTypeParameter( |
1857 UnlinkedTypeParam serializedTypeParameter) { | 1911 UnlinkedTypeParam serializedTypeParameter) { |
1858 TypeParameterElementImpl typeParameterElement = | 1912 TypeParameterElementImpl typeParameterElement = |
1859 new TypeParameterElementImpl( | 1913 new TypeParameterElementImpl( |
1860 serializedTypeParameter.name, serializedTypeParameter.nameOffset); | 1914 serializedTypeParameter.name, serializedTypeParameter.nameOffset); |
1861 typeParameterElement.type = new TypeParameterTypeImpl(typeParameterElement); | 1915 typeParameterElement.type = new TypeParameterTypeImpl(typeParameterElement); |
1862 buildAnnotations(typeParameterElement, serializedTypeParameter.annotations); | 1916 buildAnnotations(typeParameterElement, serializedTypeParameter.annotations); |
| 1917 buildCodeRange(typeParameterElement, serializedTypeParameter); |
1863 return typeParameterElement; | 1918 return typeParameterElement; |
1864 } | 1919 } |
1865 | 1920 |
1866 /** | 1921 /** |
1867 * Build [TypeParameterElement]s corresponding to the type parameters in | 1922 * Build [TypeParameterElement]s corresponding to the type parameters in |
1868 * [serializedTypeParameters] and store them in [currentTypeParameters]. | 1923 * [serializedTypeParameters] and store them in [currentTypeParameters]. |
1869 * Also return them. | 1924 * Also return them. |
1870 */ | 1925 */ |
1871 List<TypeParameterElement> buildTypeParameters( | 1926 List<TypeParameterElement> buildTypeParameters( |
1872 List<UnlinkedTypeParam> serializedTypeParameters) { | 1927 List<UnlinkedTypeParam> serializedTypeParameters) { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1926 void buildVariableCommonParts( | 1981 void buildVariableCommonParts( |
1927 VariableElementImpl element, UnlinkedVariable serializedVariable) { | 1982 VariableElementImpl element, UnlinkedVariable serializedVariable) { |
1928 element.type = buildLinkedType(serializedVariable.inferredTypeSlot) ?? | 1983 element.type = buildLinkedType(serializedVariable.inferredTypeSlot) ?? |
1929 buildType(serializedVariable.type); | 1984 buildType(serializedVariable.type); |
1930 element.const3 = serializedVariable.isConst; | 1985 element.const3 = serializedVariable.isConst; |
1931 element.final2 = serializedVariable.isFinal; | 1986 element.final2 = serializedVariable.isFinal; |
1932 element.hasImplicitType = serializedVariable.type == null; | 1987 element.hasImplicitType = serializedVariable.type == null; |
1933 buildVariableInitializer(element, serializedVariable.initializer); | 1988 buildVariableInitializer(element, serializedVariable.initializer); |
1934 buildDocumentation(element, serializedVariable.documentationComment); | 1989 buildDocumentation(element, serializedVariable.documentationComment); |
1935 buildAnnotations(element, serializedVariable.annotations); | 1990 buildAnnotations(element, serializedVariable.annotations); |
| 1991 buildCodeRange(element, serializedVariable); |
1936 } | 1992 } |
1937 | 1993 |
1938 /** | 1994 /** |
1939 * If the given [serializedInitializer] is not `null`, create the | 1995 * If the given [serializedInitializer] is not `null`, create the |
1940 * corresponding [FunctionElementImpl] and set it for the [variable]. | 1996 * corresponding [FunctionElementImpl] and set it for the [variable]. |
1941 */ | 1997 */ |
1942 void buildVariableInitializer( | 1998 void buildVariableInitializer( |
1943 VariableElementImpl variable, UnlinkedExecutable serializedInitializer) { | 1999 VariableElementImpl variable, UnlinkedExecutable serializedInitializer) { |
1944 if (serializedInitializer == null) { | 2000 if (serializedInitializer == null) { |
1945 return null; | 2001 return null; |
1946 } | 2002 } |
1947 FunctionElementImpl initializerElement = | 2003 FunctionElementImpl initializerElement = |
1948 buildLocalFunction(serializedInitializer); | 2004 buildLocalFunction(serializedInitializer); |
1949 initializerElement.synthetic = true; | 2005 initializerElement.synthetic = true; |
| 2006 initializerElement.setCodeRange(null, null); |
1950 variable.initializer = initializerElement; | 2007 variable.initializer = initializerElement; |
1951 } | 2008 } |
1952 | 2009 |
1953 /** | 2010 /** |
1954 * Finish creating a [TypeParameterElement] by deserializing its bound. | 2011 * Finish creating a [TypeParameterElement] by deserializing its bound. |
1955 */ | 2012 */ |
1956 void finishTypeParameter(UnlinkedTypeParam serializedTypeParameter, | 2013 void finishTypeParameter(UnlinkedTypeParam serializedTypeParameter, |
1957 TypeParameterElementImpl typeParameterElement) { | 2014 TypeParameterElementImpl typeParameterElement) { |
1958 if (serializedTypeParameter.bound != null) { | 2015 if (serializedTypeParameter.bound != null) { |
1959 typeParameterElement.bound = buildType(serializedTypeParameter.bound); | 2016 typeParameterElement.bound = buildType(serializedTypeParameter.bound); |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2197 } | 2254 } |
2198 for (FunctionTypeAliasElement typeAlias in unit.functionTypeAliases) { | 2255 for (FunctionTypeAliasElement typeAlias in unit.functionTypeAliases) { |
2199 elementMap[typeAlias.name] = typeAlias; | 2256 elementMap[typeAlias.name] = typeAlias; |
2200 } | 2257 } |
2201 for (FunctionElement function in unit.functions) { | 2258 for (FunctionElement function in unit.functions) { |
2202 elementMap[function.name] = function; | 2259 elementMap[function.name] = function; |
2203 } | 2260 } |
2204 for (PropertyAccessorElementImpl accessor in unit.accessors) { | 2261 for (PropertyAccessorElementImpl accessor in unit.accessors) { |
2205 elementMap[accessor.identifier] = accessor; | 2262 elementMap[accessor.identifier] = accessor; |
2206 } | 2263 } |
| 2264 buildCodeRange(unit, unlinkedUnit); |
2207 resynthesizedUnits[absoluteUri] = unit; | 2265 resynthesizedUnits[absoluteUri] = unit; |
2208 resynthesizedElements[absoluteUri] = elementMap; | 2266 resynthesizedElements[absoluteUri] = elementMap; |
2209 assert(currentTypeParameters.isEmpty); | 2267 assert(currentTypeParameters.isEmpty); |
2210 } | 2268 } |
2211 | 2269 |
2212 /** | 2270 /** |
2213 * Set up data structures for deserializing a compilation unit. | 2271 * Set up data structures for deserializing a compilation unit. |
2214 */ | 2272 */ |
2215 void prepareUnit(CompilationUnitElementImpl unit, int unitNum) { | 2273 void prepareUnit(CompilationUnitElementImpl unit, int unitNum) { |
2216 linkedUnit = linkedLibrary.units[unitNum]; | 2274 linkedUnit = linkedLibrary.units[unitNum]; |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2457 List<DartType> typeArguments = const <DartType>[]; | 2515 List<DartType> typeArguments = const <DartType>[]; |
2458 if (numTypeArguments != 0) { | 2516 if (numTypeArguments != 0) { |
2459 typeArguments = <DartType>[]; | 2517 typeArguments = <DartType>[]; |
2460 for (int i = 0; i < numTypeArguments; i++) { | 2518 for (int i = 0; i < numTypeArguments; i++) { |
2461 typeArguments.add(getTypeArgument(i)); | 2519 typeArguments.add(getTypeArgument(i)); |
2462 } | 2520 } |
2463 } | 2521 } |
2464 return typeArguments; | 2522 return typeArguments; |
2465 } | 2523 } |
2466 } | 2524 } |
OLD | NEW |