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 import 'dart:async'; | 5 import 'dart:async'; |
6 import 'dart:collection'; | 6 import 'dart:collection'; |
7 import 'dart:typed_data'; | 7 import 'dart:typed_data'; |
8 | 8 |
9 import 'package:analyzer/context/context_root.dart'; | 9 import 'package:analyzer/context/context_root.dart'; |
10 import 'package:analyzer/context/declared_variables.dart'; | 10 import 'package:analyzer/context/declared_variables.dart'; |
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
561 * be analyzed, the [Future] completes with `null`. | 561 * be analyzed, the [Future] completes with `null`. |
562 * | 562 * |
563 * The [path] must be absolute and normalized. | 563 * The [path] must be absolute and normalized. |
564 * | 564 * |
565 * This method does not use analysis priorities, and must not be used in | 565 * This method does not use analysis priorities, and must not be used in |
566 * interactive analysis, such as Analysis Server or its plugins. | 566 * interactive analysis, such as Analysis Server or its plugins. |
567 */ | 567 */ |
568 Future<ErrorsResult> getErrors(String path) async { | 568 Future<ErrorsResult> getErrors(String path) async { |
569 // Ask the analysis result without unit, so return cached errors. | 569 // Ask the analysis result without unit, so return cached errors. |
570 // If no cached analysis result, it will be computed. | 570 // If no cached analysis result, it will be computed. |
571 AnalysisResult analysisResult = _computeAnalysisResult(path); | 571 AnalysisResult analysisResult = await _computeAnalysisResult(path); |
572 | |
573 // Check for asynchronous changes during computing the result. | |
574 _runTestAsyncWorkDuringAnalysis(path); | |
Brian Wilkerson
2017/08/25 19:44:12
Missing await?
Also, could we document when we ne
| |
575 if (_fileTracker.hasChangedFiles) { | |
576 analysisResult = null; | |
577 } | |
Brian Wilkerson
2017/08/25 19:44:12
And when do we need to check for changed files, an
scheglov
2017/08/25 19:51:56
I added comments to `_runTestAsyncWorkDuringAnalys
| |
572 | 578 |
573 // If not computed yet, because a part file without a known library, | 579 // If not computed yet, because a part file without a known library, |
574 // we have to compute the full analysis result, with the unit. | 580 // we have to compute the full analysis result, with the unit. |
575 analysisResult ??= await getResult(path); | 581 analysisResult ??= await getResult(path); |
576 if (analysisResult == null) { | 582 if (analysisResult == null) { |
577 return null; | 583 return null; |
578 } | 584 } |
579 | 585 |
580 return new ErrorsResult(currentSession, path, analysisResult.uri, | 586 return new ErrorsResult(currentSession, path, analysisResult.uri, |
581 analysisResult.lineInfo, analysisResult.errors); | 587 analysisResult.lineInfo, analysisResult.errors); |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
799 @override | 805 @override |
800 Future<Null> performWork() async { | 806 Future<Null> performWork() async { |
801 if (_fileTracker.verifyChangedFilesIfNeeded()) { | 807 if (_fileTracker.verifyChangedFilesIfNeeded()) { |
802 return; | 808 return; |
803 } | 809 } |
804 | 810 |
805 // Analyze a requested file. | 811 // Analyze a requested file. |
806 if (_requestedFiles.isNotEmpty) { | 812 if (_requestedFiles.isNotEmpty) { |
807 String path = _requestedFiles.keys.first; | 813 String path = _requestedFiles.keys.first; |
808 try { | 814 try { |
809 AnalysisResult result = _computeAnalysisResult(path, withUnit: true); | 815 AnalysisResult result = |
816 await _computeAnalysisResult(path, withUnit: true); | |
817 // Check for asynchronous changes during computing the result. | |
818 await _runTestAsyncWorkDuringAnalysis(path); | |
819 if (_fileTracker.hasChangedFiles) { | |
820 return; | |
821 } | |
810 // If a part without a library, delay its analysis. | 822 // If a part without a library, delay its analysis. |
811 if (result == null) { | 823 if (result == null) { |
812 _requestedParts | 824 _requestedParts |
813 .putIfAbsent(path, () => []) | 825 .putIfAbsent(path, () => []) |
814 .addAll(_requestedFiles.remove(path)); | 826 .addAll(_requestedFiles.remove(path)); |
815 return; | 827 return; |
816 } | 828 } |
817 // Notify the completers. | 829 // Notify the completers. |
818 _requestedFiles.remove(path).forEach((completer) { | 830 _requestedFiles.remove(path).forEach((completer) { |
819 completer.complete(result); | 831 completer.complete(result); |
820 }); | 832 }); |
821 // Remove from to be analyzed and produce it now. | 833 // Remove from to be analyzed and produce it now. |
822 _fileTracker.fileWasAnalyzed(path); | 834 _fileTracker.fileWasAnalyzed(path); |
823 _resultController.add(result); | 835 _resultController.add(result); |
824 } catch (exception, stackTrace) { | 836 } catch (exception, stackTrace) { |
825 _fileTracker.fileWasAnalyzed(path); | 837 _fileTracker.fileWasAnalyzed(path); |
826 _requestedFiles.remove(path).forEach((completer) { | 838 _requestedFiles.remove(path).forEach((completer) { |
827 completer.completeError(exception, stackTrace); | 839 completer.completeError(exception, stackTrace); |
828 }); | 840 }); |
829 } | 841 } |
830 return; | 842 return; |
831 } | 843 } |
832 | 844 |
833 // Process an index request. | 845 // Process an index request. |
834 if (_indexRequestedFiles.isNotEmpty) { | 846 if (_indexRequestedFiles.isNotEmpty) { |
835 String path = _indexRequestedFiles.keys.first; | 847 String path = _indexRequestedFiles.keys.first; |
836 AnalysisDriverUnitIndex index = _computeIndex(path); | 848 AnalysisDriverUnitIndex index = await _computeIndex(path); |
837 _indexRequestedFiles.remove(path).forEach((completer) { | 849 _indexRequestedFiles.remove(path).forEach((completer) { |
838 completer.complete(index); | 850 completer.complete(index); |
839 }); | 851 }); |
840 return; | 852 return; |
841 } | 853 } |
842 | 854 |
843 // Process a unit element key request. | 855 // Process a unit element key request. |
844 if (_unitElementSignatureRequests.isNotEmpty) { | 856 if (_unitElementSignatureRequests.isNotEmpty) { |
845 String path = _unitElementSignatureRequests.keys.first; | 857 String path = _unitElementSignatureRequests.keys.first; |
846 String signature = _computeUnitElementSignature(path); | 858 String signature = _computeUnitElementSignature(path); |
847 _unitElementSignatureRequests.remove(path).forEach((completer) { | 859 _unitElementSignatureRequests.remove(path).forEach((completer) { |
848 completer.complete(signature); | 860 completer.complete(signature); |
849 }); | 861 }); |
850 return; | 862 return; |
851 } | 863 } |
852 | 864 |
853 // Process a unit element request. | 865 // Process a unit element request. |
854 if (_unitElementRequestedFiles.isNotEmpty) { | 866 if (_unitElementRequestedFiles.isNotEmpty) { |
855 String path = _unitElementRequestedFiles.keys.first; | 867 String path = _unitElementRequestedFiles.keys.first; |
856 UnitElementResult result = _computeUnitElement(path); | 868 UnitElementResult result = await _computeUnitElement(path); |
857 _unitElementRequestedFiles.remove(path).forEach((completer) { | 869 _unitElementRequestedFiles.remove(path).forEach((completer) { |
858 completer.complete(result); | 870 completer.complete(result); |
859 }); | 871 }); |
860 return; | 872 return; |
861 } | 873 } |
862 | 874 |
863 // Compute files defining a name. | 875 // Compute files defining a name. |
864 if (_definingClassMemberNameTasks.isNotEmpty) { | 876 if (_definingClassMemberNameTasks.isNotEmpty) { |
865 _FilesDefiningClassMemberNameTask task = | 877 _FilesDefiningClassMemberNameTask task = |
866 _definingClassMemberNameTasks.first; | 878 _definingClassMemberNameTasks.first; |
(...skipping 23 matching lines...) Expand all Loading... | |
890 } | 902 } |
891 return; | 903 return; |
892 } | 904 } |
893 | 905 |
894 // Analyze a priority file. | 906 // Analyze a priority file. |
895 if (_priorityFiles.isNotEmpty) { | 907 if (_priorityFiles.isNotEmpty) { |
896 for (String path in _priorityFiles) { | 908 for (String path in _priorityFiles) { |
897 if (_fileTracker.isFilePending(path)) { | 909 if (_fileTracker.isFilePending(path)) { |
898 try { | 910 try { |
899 AnalysisResult result = | 911 AnalysisResult result = |
900 _computeAnalysisResult(path, withUnit: true); | 912 await _computeAnalysisResult(path, withUnit: true); |
913 await _runTestAsyncWorkDuringAnalysis(path); | |
901 if (result == null) { | 914 if (result == null) { |
902 _partsToAnalyze.add(path); | 915 _partsToAnalyze.add(path); |
903 } else { | 916 } else { |
904 _resultController.add(result); | 917 _resultController.add(result); |
905 } | 918 } |
906 } catch (exception, stackTrace) { | 919 } catch (exception, stackTrace) { |
907 _reportException(path, exception, stackTrace); | 920 _reportException(path, exception, stackTrace); |
908 } finally { | 921 } finally { |
909 _fileTracker.fileWasAnalyzed(path); | 922 _fileTracker.fileWasAnalyzed(path); |
910 } | 923 } |
911 return; | 924 return; |
912 } | 925 } |
913 } | 926 } |
914 } | 927 } |
915 | 928 |
916 // Analyze a general file. | 929 // Analyze a general file. |
917 if (_fileTracker.hasPendingFiles) { | 930 if (_fileTracker.hasPendingFiles) { |
918 String path = _fileTracker.anyPendingFile; | 931 String path = _fileTracker.anyPendingFile; |
919 try { | 932 try { |
920 AnalysisResult result = _computeAnalysisResult(path, | 933 AnalysisResult result = await _computeAnalysisResult(path, |
921 withUnit: false, skipIfSameSignature: true); | 934 withUnit: false, skipIfSameSignature: true); |
935 await _runTestAsyncWorkDuringAnalysis(path); | |
922 if (result == null) { | 936 if (result == null) { |
923 _partsToAnalyze.add(path); | 937 _partsToAnalyze.add(path); |
924 } else if (result == AnalysisResult._UNCHANGED) { | 938 } else if (result == AnalysisResult._UNCHANGED) { |
925 // We found that the set of errors is the same as we produced the | 939 // We found that the set of errors is the same as we produced the |
926 // last time, so we don't need to produce it again now. | 940 // last time, so we don't need to produce it again now. |
927 } else { | 941 } else { |
928 _resultController.add(result); | 942 _resultController.add(result); |
929 _lastProducedSignatures[result.path] = result._signature; | 943 _lastProducedSignatures[result.path] = result._signature; |
930 } | 944 } |
931 } catch (exception, stackTrace) { | 945 } catch (exception, stackTrace) { |
932 _reportException(path, exception, stackTrace); | 946 _reportException(path, exception, stackTrace); |
933 } finally { | 947 } finally { |
934 _fileTracker.fileWasAnalyzed(path); | 948 _fileTracker.fileWasAnalyzed(path); |
935 } | 949 } |
936 return; | 950 return; |
937 } | 951 } |
938 | 952 |
939 // Analyze a requested part file. | 953 // Analyze a requested part file. |
940 if (_requestedParts.isNotEmpty) { | 954 if (_requestedParts.isNotEmpty) { |
941 String path = _requestedParts.keys.first; | 955 String path = _requestedParts.keys.first; |
942 try { | 956 try { |
943 AnalysisResult result = _computeAnalysisResult(path, | 957 AnalysisResult result = await _computeAnalysisResult(path, |
944 withUnit: true, asIsIfPartWithoutLibrary: true); | 958 withUnit: true, asIsIfPartWithoutLibrary: true); |
959 // Check for asynchronous changes during computing the result. | |
960 if (_fileTracker.hasChangedFiles) { | |
961 return; | |
962 } | |
945 // Notify the completers. | 963 // Notify the completers. |
946 _requestedParts.remove(path).forEach((completer) { | 964 _requestedParts.remove(path).forEach((completer) { |
947 completer.complete(result); | 965 completer.complete(result); |
948 }); | 966 }); |
949 // Remove from to be analyzed and produce it now. | 967 // Remove from to be analyzed and produce it now. |
950 _partsToAnalyze.remove(path); | 968 _partsToAnalyze.remove(path); |
951 _resultController.add(result); | 969 _resultController.add(result); |
952 } catch (exception, stackTrace) { | 970 } catch (exception, stackTrace) { |
953 _partsToAnalyze.remove(path); | 971 _partsToAnalyze.remove(path); |
954 _requestedParts.remove(path).forEach((completer) { | 972 _requestedParts.remove(path).forEach((completer) { |
955 completer.completeError(exception, stackTrace); | 973 completer.completeError(exception, stackTrace); |
956 }); | 974 }); |
957 } | 975 } |
958 return; | 976 return; |
959 } | 977 } |
960 | 978 |
961 // Analyze a general part. | 979 // Analyze a general part. |
962 if (_partsToAnalyze.isNotEmpty) { | 980 if (_partsToAnalyze.isNotEmpty) { |
963 String path = _partsToAnalyze.first; | 981 String path = _partsToAnalyze.first; |
964 _partsToAnalyze.remove(path); | 982 _partsToAnalyze.remove(path); |
965 try { | 983 try { |
966 AnalysisResult result = _computeAnalysisResult(path, | 984 AnalysisResult result = await _computeAnalysisResult(path, |
967 withUnit: _priorityFiles.contains(path), | 985 withUnit: _priorityFiles.contains(path), |
968 asIsIfPartWithoutLibrary: true); | 986 asIsIfPartWithoutLibrary: true); |
969 _resultController.add(result); | 987 _resultController.add(result); |
970 } catch (exception, stackTrace) { | 988 } catch (exception, stackTrace) { |
971 _reportException(path, exception, stackTrace); | 989 _reportException(path, exception, stackTrace); |
972 } | 990 } |
973 return; | 991 return; |
974 } | 992 } |
975 } | 993 } |
976 | 994 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1014 * compute only if [withUnit] is `true`. | 1032 * compute only if [withUnit] is `true`. |
1015 * | 1033 * |
1016 * Return `null` if the file is a part of an unknown library, so cannot be | 1034 * Return `null` if the file is a part of an unknown library, so cannot be |
1017 * analyzed yet. But [asIsIfPartWithoutLibrary] is `true`, then the file is | 1035 * analyzed yet. But [asIsIfPartWithoutLibrary] is `true`, then the file is |
1018 * analyzed anyway, even without a library. | 1036 * analyzed anyway, even without a library. |
1019 * | 1037 * |
1020 * Return [AnalysisResult._UNCHANGED] if [skipIfSameSignature] is `true` and | 1038 * Return [AnalysisResult._UNCHANGED] if [skipIfSameSignature] is `true` and |
1021 * the resolved signature of the file in its library is the same as the one | 1039 * the resolved signature of the file in its library is the same as the one |
1022 * that was the most recently produced to the client. | 1040 * that was the most recently produced to the client. |
1023 */ | 1041 */ |
1024 AnalysisResult _computeAnalysisResult(String path, | 1042 Future<AnalysisResult> _computeAnalysisResult(String path, |
1025 {bool withUnit: false, | 1043 {bool withUnit: false, |
1026 bool asIsIfPartWithoutLibrary: false, | 1044 bool asIsIfPartWithoutLibrary: false, |
1027 bool skipIfSameSignature: false}) { | 1045 bool skipIfSameSignature: false}) async { |
1028 FileState file = _fsState.getFileForPath(path); | 1046 FileState file = _fsState.getFileForPath(path); |
1029 | 1047 |
1030 // Prepare the library - the file itself, or the known library. | 1048 // Prepare the library - the file itself, or the known library. |
1031 FileState library = file.isPart ? file.library : file; | 1049 FileState library = file.isPart ? file.library : file; |
1032 if (library == null) { | 1050 if (library == null) { |
1033 if (asIsIfPartWithoutLibrary) { | 1051 if (asIsIfPartWithoutLibrary) { |
1034 library = file; | 1052 library = file; |
1035 } else { | 1053 } else { |
1036 return null; | 1054 return null; |
1037 } | 1055 } |
(...skipping 15 matching lines...) Expand all Loading... | |
1053 if (!withUnit) { | 1071 if (!withUnit) { |
1054 List<int> bytes = DriverPerformance.cache.makeCurrentWhile(() { | 1072 List<int> bytes = DriverPerformance.cache.makeCurrentWhile(() { |
1055 return _byteStore.get(key); | 1073 return _byteStore.get(key); |
1056 }); | 1074 }); |
1057 if (bytes != null) { | 1075 if (bytes != null) { |
1058 return _getAnalysisResultFromBytes(file, signature, bytes); | 1076 return _getAnalysisResultFromBytes(file, signature, bytes); |
1059 } | 1077 } |
1060 } | 1078 } |
1061 | 1079 |
1062 // We need the fully resolved unit, or the result is not cached. | 1080 // We need the fully resolved unit, or the result is not cached. |
1063 return _logger.run('Compute analysis result for $path', () { | 1081 return _logger.runAsync('Compute analysis result for $path', () async { |
1064 try { | 1082 try { |
1065 LibraryContext libraryContext = _createLibraryContext(library); | 1083 LibraryContext libraryContext = await _createLibraryContext(library); |
1066 try { | 1084 try { |
1067 _testView.numOfAnalyzedLibraries++; | 1085 _testView.numOfAnalyzedLibraries++; |
1068 LibraryAnalyzer analyzer = new LibraryAnalyzer( | 1086 LibraryAnalyzer analyzer = new LibraryAnalyzer( |
1069 analysisOptions, | 1087 analysisOptions, |
1070 declaredVariables, | 1088 declaredVariables, |
1071 sourceFactory, | 1089 sourceFactory, |
1072 _fsState, | 1090 _fsState, |
1073 libraryContext.store, | 1091 libraryContext.store, |
1074 library); | 1092 library); |
1075 Map<FileState, UnitAnalysisResult> results = analyzer.analyze(); | 1093 Map<FileState, UnitAnalysisResult> results = analyzer.analyze(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1109 libraryContext.dispose(); | 1127 libraryContext.dispose(); |
1110 } | 1128 } |
1111 } catch (exception, stackTrace) { | 1129 } catch (exception, stackTrace) { |
1112 String contextKey = | 1130 String contextKey = |
1113 _storeExceptionContext(path, library, exception, stackTrace); | 1131 _storeExceptionContext(path, library, exception, stackTrace); |
1114 throw new _ExceptionState(exception, stackTrace, contextKey); | 1132 throw new _ExceptionState(exception, stackTrace, contextKey); |
1115 } | 1133 } |
1116 }); | 1134 }); |
1117 } | 1135 } |
1118 | 1136 |
1119 AnalysisDriverUnitIndex _computeIndex(String path) { | 1137 Future<AnalysisDriverUnitIndex> _computeIndex(String path) async { |
1120 AnalysisResult analysisResult = _computeAnalysisResult(path, | 1138 AnalysisResult analysisResult = await _computeAnalysisResult(path, |
1121 withUnit: false, asIsIfPartWithoutLibrary: true); | 1139 withUnit: false, asIsIfPartWithoutLibrary: true); |
1122 return analysisResult._index; | 1140 return analysisResult._index; |
1123 } | 1141 } |
1124 | 1142 |
1125 UnitElementResult _computeUnitElement(String path) { | 1143 Future<UnitElementResult> _computeUnitElement(String path) async { |
1126 FileState file = _fsState.getFileForPath(path); | 1144 FileState file = _fsState.getFileForPath(path); |
1127 FileState library = file.library ?? file; | 1145 FileState library = file.library ?? file; |
1128 | 1146 |
1129 // Create the AnalysisContext to resynthesize elements in. | 1147 // Create the AnalysisContext to resynthesize elements in. |
1130 LibraryContext libraryContext = _createLibraryContext(library); | 1148 LibraryContext libraryContext = await _createLibraryContext(library); |
1131 | 1149 |
1132 // Resynthesize the CompilationUnitElement in the context. | 1150 // Resynthesize the CompilationUnitElement in the context. |
1133 try { | 1151 try { |
1134 CompilationUnitElement element = | 1152 CompilationUnitElement element = |
1135 libraryContext.computeUnitElement(library.source, file.source); | 1153 libraryContext.computeUnitElement(library.source, file.source); |
1136 String signature = library.transitiveSignature; | 1154 String signature = library.transitiveSignature; |
1137 return new UnitElementResult( | 1155 return new UnitElementResult( |
1138 currentSession, path, file.uri, signature, element); | 1156 currentSession, path, file.uri, signature, element); |
1139 } finally { | 1157 } finally { |
1140 libraryContext.dispose(); | 1158 libraryContext.dispose(); |
(...skipping 16 matching lines...) Expand all Loading... | |
1157 _fillSalt(); | 1175 _fillSalt(); |
1158 _fsState = new FileSystemState(_logger, _byteStore, _contentOverlay, | 1176 _fsState = new FileSystemState(_logger, _byteStore, _contentOverlay, |
1159 _resourceProvider, sourceFactory, analysisOptions, _salt, | 1177 _resourceProvider, sourceFactory, analysisOptions, _salt, |
1160 externalSummaries: _externalSummaries); | 1178 externalSummaries: _externalSummaries); |
1161 _fileTracker = new FileTracker(_logger, _fsState, _changeHook); | 1179 _fileTracker = new FileTracker(_logger, _fsState, _changeHook); |
1162 } | 1180 } |
1163 | 1181 |
1164 /** | 1182 /** |
1165 * Return the context in which the [library] should be analyzed. | 1183 * Return the context in which the [library] should be analyzed. |
1166 */ | 1184 */ |
1167 LibraryContext _createLibraryContext(FileState library) { | 1185 Future<LibraryContext> _createLibraryContext(FileState library) async { |
1168 _testView.numOfCreatedLibraryContexts++; | 1186 _testView.numOfCreatedLibraryContexts++; |
1169 return new LibraryContext.forSingleLibrary( | 1187 return new LibraryContext.forSingleLibrary( |
1170 library, | 1188 library, |
1171 _logger, | 1189 _logger, |
1172 _sdkBundle, | 1190 _sdkBundle, |
1173 _byteStore, | 1191 _byteStore, |
1174 _analysisOptions, | 1192 _analysisOptions, |
1175 declaredVariables, | 1193 declaredVariables, |
1176 _sourceFactory, | 1194 _sourceFactory, |
1177 _externalSummaries, | 1195 _externalSummaries, |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1288 var state = exception as _ExceptionState; | 1306 var state = exception as _ExceptionState; |
1289 exception = state.exception; | 1307 exception = state.exception; |
1290 stackTrace = state.stackTrace; | 1308 stackTrace = state.stackTrace; |
1291 contextKey = state.contextKey; | 1309 contextKey = state.contextKey; |
1292 } | 1310 } |
1293 CaughtException caught = new CaughtException(exception, stackTrace); | 1311 CaughtException caught = new CaughtException(exception, stackTrace); |
1294 _exceptionController.add(new ExceptionResult(path, caught, contextKey)); | 1312 _exceptionController.add(new ExceptionResult(path, caught, contextKey)); |
1295 } | 1313 } |
1296 | 1314 |
1297 /** | 1315 /** |
1316 * Tests need a reliable way to simulate work during analysis. | |
1317 */ | |
1318 Future _runTestAsyncWorkDuringAnalysis(String path) { | |
1319 var work = _testView.workToWaitAfterComputingResult; | |
1320 _testView.workToWaitAfterComputingResult = null; | |
1321 return work != null ? work(path) : null; | |
Paul Berry
2017/08/25 20:01:55
I get scared when I see a method with a return typ
scheglov
2017/08/25 20:30:46
Done.
| |
1322 } | |
1323 | |
1324 /** | |
1298 * Serialize the given [resolvedUnit] errors and index into bytes. | 1325 * Serialize the given [resolvedUnit] errors and index into bytes. |
1299 */ | 1326 */ |
1300 List<int> _serializeResolvedUnit( | 1327 List<int> _serializeResolvedUnit( |
1301 CompilationUnit resolvedUnit, List<AnalysisError> errors) { | 1328 CompilationUnit resolvedUnit, List<AnalysisError> errors) { |
1302 AnalysisDriverUnitIndexBuilder index = indexUnit(resolvedUnit); | 1329 AnalysisDriverUnitIndexBuilder index = indexUnit(resolvedUnit); |
1303 return new AnalysisDriverResolvedUnitBuilder( | 1330 return new AnalysisDriverResolvedUnitBuilder( |
1304 errors: errors | 1331 errors: errors |
1305 .map((error) => new AnalysisDriverUnitErrorBuilder( | 1332 .map((error) => new AnalysisDriverUnitErrorBuilder( |
1306 offset: error.offset, | 1333 offset: error.offset, |
1307 length: error.length, | 1334 length: error.length, |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1636 } | 1663 } |
1637 | 1664 |
1638 @visibleForTesting | 1665 @visibleForTesting |
1639 class AnalysisDriverTestView { | 1666 class AnalysisDriverTestView { |
1640 final AnalysisDriver driver; | 1667 final AnalysisDriver driver; |
1641 | 1668 |
1642 int numOfCreatedLibraryContexts = 0; | 1669 int numOfCreatedLibraryContexts = 0; |
1643 | 1670 |
1644 int numOfAnalyzedLibraries = 0; | 1671 int numOfAnalyzedLibraries = 0; |
1645 | 1672 |
1673 Future<Null> Function(String path) workToWaitAfterComputingResult; | |
Paul Berry
2017/08/25 20:01:55
Would you mind adding a doc comment for this? It'
scheglov
2017/08/25 20:30:46
Done.
| |
1674 | |
1646 AnalysisDriverTestView(this.driver); | 1675 AnalysisDriverTestView(this.driver); |
1647 | 1676 |
1648 FileTracker get fileTracker => driver._fileTracker; | 1677 FileTracker get fileTracker => driver._fileTracker; |
1649 | 1678 |
1650 Map<String, AnalysisResult> get priorityResults => driver._priorityResults; | 1679 Map<String, AnalysisResult> get priorityResults => driver._priorityResults; |
1651 | 1680 |
1652 SummaryDataStore getSummaryStore(String libraryPath) { | 1681 Future<SummaryDataStore> getSummaryStore(String libraryPath) async { |
1653 FileState library = driver.fsState.getFileForPath(libraryPath); | 1682 FileState library = driver.fsState.getFileForPath(libraryPath); |
1654 LibraryContext libraryContext = driver._createLibraryContext(library); | 1683 LibraryContext libraryContext = await driver._createLibraryContext(library); |
1655 try { | 1684 try { |
1656 return libraryContext.store; | 1685 return libraryContext.store; |
1657 } finally { | 1686 } finally { |
1658 libraryContext.dispose(); | 1687 libraryContext.dispose(); |
1659 } | 1688 } |
1660 } | 1689 } |
1661 } | 1690 } |
1662 | 1691 |
1663 /** | 1692 /** |
1664 * The result of analyzing of a single file. | 1693 * The result of analyzing of a single file. |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2073 libraryDeclarations.add(new TopLevelDeclarationInSource( | 2102 libraryDeclarations.add(new TopLevelDeclarationInSource( |
2074 file.source, declaration, isExported)); | 2103 file.source, declaration, isExported)); |
2075 } | 2104 } |
2076 } | 2105 } |
2077 } | 2106 } |
2078 | 2107 |
2079 // We're not done yet. | 2108 // We're not done yet. |
2080 return false; | 2109 return false; |
2081 } | 2110 } |
2082 } | 2111 } |
OLD | NEW |