| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 operation.analysis; | 5 library operation.analysis; |
| 6 | 6 |
| 7 import 'package:analysis_server/src/analysis_server.dart'; | 7 import 'package:analysis_server/src/analysis_server.dart'; |
| 8 import 'package:analysis_server/src/computer/computer_highlights.dart'; | 8 import 'package:analysis_server/src/computer/computer_highlights.dart'; |
| 9 import 'package:analysis_server/src/computer/computer_navigation.dart'; | 9 import 'package:analysis_server/src/computer/computer_navigation.dart'; |
| 10 import 'package:analysis_server/src/computer/computer_occurrences.dart'; | 10 import 'package:analysis_server/src/computer/computer_occurrences.dart'; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 try { | 70 try { |
| 71 var occurrences = new DartUnitOccurrencesComputer(dartUnit).compute(); | 71 var occurrences = new DartUnitOccurrencesComputer(dartUnit).compute(); |
| 72 var params = new protocol.AnalysisOccurrencesParams(file, occurrences); | 72 var params = new protocol.AnalysisOccurrencesParams(file, occurrences); |
| 73 server.sendNotification(params.toNotification()); | 73 server.sendNotification(params.toNotification()); |
| 74 } catch (exception, stackTrace) { | 74 } catch (exception, stackTrace) { |
| 75 server.sendServerErrorNotification(exception, stackTrace); | 75 server.sendServerErrorNotification(exception, stackTrace); |
| 76 } | 76 } |
| 77 } | 77 } |
| 78 | 78 |
| 79 | 79 |
| 80 void sendAnalysisNotificationOutline(AnalysisServer server, Source source, | 80 void sendAnalysisNotificationOutline(AnalysisServer server, String file, |
| 81 LineInfo lineInfo, CompilationUnit dartUnit) { | 81 LineInfo lineInfo, CompilationUnit dartUnit) { |
| 82 try { | 82 try { |
| 83 var computer = new DartUnitOutlineComputer(source, lineInfo, dartUnit); | 83 var computer = new DartUnitOutlineComputer(file, lineInfo, dartUnit); |
| 84 var outline = computer.compute(); | 84 var outline = computer.compute(); |
| 85 var params = new protocol.AnalysisOutlineParams(source.fullName, outline); | 85 var params = new protocol.AnalysisOutlineParams(file, outline); |
| 86 server.sendNotification(params.toNotification()); | 86 server.sendNotification(params.toNotification()); |
| 87 } catch (exception, stackTrace) { | 87 } catch (exception, stackTrace) { |
| 88 server.sendServerErrorNotification(exception, stackTrace); | 88 server.sendServerErrorNotification(exception, stackTrace); |
| 89 } | 89 } |
| 90 } | 90 } |
| 91 | 91 |
| 92 | 92 |
| 93 void sendAnalysisNotificationOverrides(AnalysisServer server, String file, | 93 void sendAnalysisNotificationOverrides(AnalysisServer server, String file, |
| 94 CompilationUnit dartUnit) { | 94 CompilationUnit dartUnit) { |
| 95 try { | 95 try { |
| 96 var overrides = new DartUnitOverridesComputer(dartUnit).compute(); | 96 var overrides = new DartUnitOverridesComputer(dartUnit).compute(); |
| 97 var params = new protocol.AnalysisOverridesParams(file, overrides); | 97 var params = new protocol.AnalysisOverridesParams(file, overrides); |
| 98 server.sendNotification(params.toNotification()); | 98 server.sendNotification(params.toNotification()); |
| 99 } catch (exception, stackTrace) { | 99 } catch (exception, stackTrace) { |
| 100 server.sendServerErrorNotification(exception, stackTrace); | 100 server.sendServerErrorNotification(exception, stackTrace); |
| 101 } | 101 } |
| 102 } | 102 } |
| 103 | 103 |
| 104 | 104 |
| 105 /** | 105 /** |
| 106 * Instances of [PerformAnalysisOperation] perform a single analysis task. | 106 * Instances of [PerformAnalysisOperation] perform a single analysis task. |
| 107 */ | 107 */ |
| 108 class PerformAnalysisOperation extends ServerOperation { | 108 class PerformAnalysisOperation extends ServerOperation { |
| 109 static const int IDLE_CACHE_SIZE = AnalysisOptionsImpl.DEFAULT_CACHE_SIZE; | 109 static const int IDLE_CACHE_SIZE = AnalysisOptionsImpl.DEFAULT_CACHE_SIZE; |
| 110 static const int WORKING_CACHE_SIZE = 512; | 110 static const int WORKING_CACHE_SIZE = 512; |
| 111 | 111 |
| 112 final AnalysisContext context; | 112 final AnalysisContext context; |
| 113 final bool isPriority; |
| 113 final bool isContinue; | 114 final bool isContinue; |
| 114 | 115 |
| 115 PerformAnalysisOperation(this.context, this.isContinue); | 116 PerformAnalysisOperation(this.context, this.isPriority, this.isContinue); |
| 116 | 117 |
| 117 @override | 118 @override |
| 118 ServerOperationPriority get priority { | 119 ServerOperationPriority get priority { |
| 119 if (isContinue) { | 120 if (isPriority) { |
| 120 return ServerOperationPriority.ANALYSIS_CONTINUE; | 121 if (isContinue) { |
| 122 return ServerOperationPriority.PRIORITY_ANALYSIS_CONTINUE; |
| 123 } else { |
| 124 return ServerOperationPriority.PRIORITY_ANALYSIS; |
| 125 } |
| 121 } else { | 126 } else { |
| 122 return ServerOperationPriority.ANALYSIS; | 127 if (isContinue) { |
| 128 return ServerOperationPriority.ANALYSIS_CONTINUE; |
| 129 } else { |
| 130 return ServerOperationPriority.ANALYSIS; |
| 131 } |
| 123 } | 132 } |
| 124 } | 133 } |
| 125 | 134 |
| 126 @override | 135 @override |
| 127 void perform(AnalysisServer server) { | 136 void perform(AnalysisServer server) { |
| 128 // | 137 // |
| 129 // TODO(brianwilkerson) Add an optional function-valued parameter to | 138 // TODO(brianwilkerson) Add an optional function-valued parameter to |
| 130 // performAnalysisTask that will be called when the task has been computed | 139 // performAnalysisTask that will be called when the task has been computed |
| 131 // but before it is performed and send notification in the function: | 140 // but before it is performed and send notification in the function: |
| 132 // | 141 // |
| 133 // AnalysisResult result = context.performAnalysisTask((taskDescription) { | 142 // AnalysisResult result = context.performAnalysisTask((taskDescription) { |
| 134 // sendStatusNotification(context.toString(), taskDescription); | 143 // sendStatusNotification(context.toString(), taskDescription); |
| 135 // }); | 144 // }); |
| 136 if (!isContinue) { | 145 if (!isContinue) { |
| 137 _setCacheSize(WORKING_CACHE_SIZE); | 146 _setCacheSize(WORKING_CACHE_SIZE); |
| 138 } | 147 } |
| 139 // prepare results | 148 // prepare results |
| 140 AnalysisResult result = context.performAnalysisTask(); | 149 AnalysisResult result = context.performAnalysisTask(); |
| 141 List<ChangeNotice> notices = result.changeNotices; | 150 List<ChangeNotice> notices = result.changeNotices; |
| 142 if (notices == null) { | 151 if (notices == null) { |
| 143 _setCacheSize(IDLE_CACHE_SIZE); | 152 _setCacheSize(IDLE_CACHE_SIZE); |
| 144 server.sendContextAnalysisDoneNotifications( | 153 server.sendContextAnalysisDoneNotifications( |
| 145 context, | 154 context, |
| 146 AnalysisDoneReason.COMPLETE); | 155 AnalysisDoneReason.COMPLETE); |
| 147 return; | 156 return; |
| 148 } | 157 } |
| 149 // process results | 158 // process results |
| 150 sendNotices(server, notices); | 159 _sendNotices(server, notices); |
| 151 updateIndex(server, notices); | 160 _updateIndex(server, notices); |
| 152 // continue analysis | 161 // continue analysis |
| 153 server.addOperation(new PerformAnalysisOperation(context, true)); | 162 server.addOperation( |
| 154 } | 163 new PerformAnalysisOperation(context, isPriority, true)); |
| 155 | |
| 156 void _setCacheSize(int cacheSize) { | |
| 157 AnalysisOptionsImpl options = new AnalysisOptionsImpl.con1(context.analysisO
ptions); | |
| 158 options.cacheSize = cacheSize; | |
| 159 context.analysisOptions = options; | |
| 160 } | 164 } |
| 161 | 165 |
| 162 /** | 166 /** |
| 163 * Send the information in the given list of notices back to the client. | 167 * Send the information in the given list of notices back to the client. |
| 164 */ | 168 */ |
| 165 void sendNotices(AnalysisServer server, List<ChangeNotice> notices) { | 169 void _sendNotices(AnalysisServer server, List<ChangeNotice> notices) { |
| 166 for (int i = 0; i < notices.length; i++) { | 170 for (int i = 0; i < notices.length; i++) { |
| 167 ChangeNotice notice = notices[i]; | 171 ChangeNotice notice = notices[i]; |
| 168 Source source = notice.source; | 172 Source source = notice.source; |
| 169 String file = source.fullName; | 173 String file = source.fullName; |
| 170 // Dart | 174 // Dart |
| 171 CompilationUnit dartUnit = notice.compilationUnit; | 175 CompilationUnit dartUnit = notice.compilationUnit; |
| 172 if (dartUnit != null) { | 176 if (dartUnit != null) { |
| 173 if (server.hasAnalysisSubscription( | 177 if (server.hasAnalysisSubscription( |
| 174 protocol.AnalysisService.HIGHLIGHTS, | 178 protocol.AnalysisService.HIGHLIGHTS, |
| 175 file)) { | 179 file)) { |
| 176 sendAnalysisNotificationHighlights(server, file, dartUnit); | 180 server.addOperation(new _DartHighlightsOperation(file, dartUnit)); |
| 177 } | 181 } |
| 178 if (server.hasAnalysisSubscription( | 182 if (server.hasAnalysisSubscription( |
| 179 protocol.AnalysisService.NAVIGATION, | 183 protocol.AnalysisService.NAVIGATION, |
| 180 file)) { | 184 file)) { |
| 181 sendAnalysisNotificationNavigation(server, file, dartUnit); | 185 server.addOperation(new _DartNavigationOperation(file, dartUnit)); |
| 182 } | 186 } |
| 183 if (server.hasAnalysisSubscription( | 187 if (server.hasAnalysisSubscription( |
| 184 protocol.AnalysisService.OCCURRENCES, | 188 protocol.AnalysisService.OCCURRENCES, |
| 185 file)) { | 189 file)) { |
| 186 sendAnalysisNotificationOccurrences(server, file, dartUnit); | 190 server.addOperation(new _DartOccurrencesOperation(file, dartUnit)); |
| 187 } | 191 } |
| 188 if (server.hasAnalysisSubscription( | 192 if (server.hasAnalysisSubscription( |
| 189 protocol.AnalysisService.OUTLINE, | 193 protocol.AnalysisService.OUTLINE, |
| 190 file)) { | 194 file)) { |
| 191 LineInfo lineInfo = notice.lineInfo; | 195 LineInfo lineInfo = notice.lineInfo; |
| 192 sendAnalysisNotificationOutline(server, source, lineInfo, dartUnit); | 196 server.addOperation( |
| 197 new _DartOutlineOperation(file, lineInfo, dartUnit)); |
| 193 } | 198 } |
| 194 if (server.hasAnalysisSubscription( | 199 if (server.hasAnalysisSubscription( |
| 195 protocol.AnalysisService.OVERRIDES, | 200 protocol.AnalysisService.OVERRIDES, |
| 196 file)) { | 201 file)) { |
| 197 sendAnalysisNotificationOverrides(server, file, dartUnit); | 202 server.addOperation(new _DartOverridesOperation(file, dartUnit)); |
| 198 } | 203 } |
| 199 } | 204 } |
| 200 if (server.shouldSendErrorsNotificationFor(file)) { | 205 if (server.shouldSendErrorsNotificationFor(file)) { |
| 201 sendAnalysisNotificationErrors( | 206 server.addOperation( |
| 202 server, | 207 new _NotificationErrorsOperation(file, notice.lineInfo, notice.error
s)); |
| 203 file, | |
| 204 notice.lineInfo, | |
| 205 notice.errors); | |
| 206 } | 208 } |
| 207 server.fileAnalyzed(notice); | 209 server.fileAnalyzed(notice); |
| 208 } | 210 } |
| 209 } | 211 } |
| 210 | 212 |
| 211 void updateIndex(AnalysisServer server, List<ChangeNotice> notices) { | 213 void _setCacheSize(int cacheSize) { |
| 214 AnalysisOptionsImpl options = |
| 215 new AnalysisOptionsImpl.con1(context.analysisOptions); |
| 216 options.cacheSize = cacheSize; |
| 217 context.analysisOptions = options; |
| 218 } |
| 219 |
| 220 void _updateIndex(AnalysisServer server, List<ChangeNotice> notices) { |
| 212 Index index = server.index; | 221 Index index = server.index; |
| 213 if (index == null) { | 222 if (index == null) { |
| 214 return; | 223 return; |
| 215 } | 224 } |
| 216 for (ChangeNotice notice in notices) { | 225 for (ChangeNotice notice in notices) { |
| 217 // Dart | 226 // Dart |
| 218 try { | 227 try { |
| 219 CompilationUnit dartUnit = notice.compilationUnit; | 228 CompilationUnit dartUnit = notice.compilationUnit; |
| 220 if (dartUnit != null) { | 229 if (dartUnit != null) { |
| 221 index.indexUnit(context, dartUnit); | 230 index.indexUnit(context, dartUnit); |
| 222 } | 231 } |
| 223 } catch (exception, stackTrace) { | 232 } catch (exception, stackTrace) { |
| 224 server.sendServerErrorNotification(exception, stackTrace); | 233 server.sendServerErrorNotification(exception, stackTrace); |
| 225 } | 234 } |
| 226 // HTML | 235 // HTML |
| 227 try { | 236 try { |
| 228 HtmlUnit htmlUnit = notice.htmlUnit; | 237 HtmlUnit htmlUnit = notice.htmlUnit; |
| 229 if (htmlUnit != null) { | 238 if (htmlUnit != null) { |
| 230 index.indexHtmlUnit(context, htmlUnit); | 239 index.indexHtmlUnit(context, htmlUnit); |
| 231 } | 240 } |
| 232 } catch (exception, stackTrace) { | 241 } catch (exception, stackTrace) { |
| 233 server.sendServerErrorNotification(exception, stackTrace); | 242 server.sendServerErrorNotification(exception, stackTrace); |
| 234 } | 243 } |
| 235 } | 244 } |
| 236 } | 245 } |
| 237 } | 246 } |
| 247 |
| 248 |
| 249 class _DartHighlightsOperation extends _DartNotificationOperation { |
| 250 _DartHighlightsOperation(String file, CompilationUnit unit) |
| 251 : super(file, unit); |
| 252 |
| 253 @override |
| 254 void perform(AnalysisServer server) { |
| 255 sendAnalysisNotificationHighlights(server, file, unit); |
| 256 } |
| 257 } |
| 258 |
| 259 |
| 260 class _DartNavigationOperation extends _DartNotificationOperation { |
| 261 _DartNavigationOperation(String file, CompilationUnit unit) |
| 262 : super(file, unit); |
| 263 |
| 264 @override |
| 265 void perform(AnalysisServer server) { |
| 266 sendAnalysisNotificationNavigation(server, file, unit); |
| 267 } |
| 268 } |
| 269 |
| 270 |
| 271 abstract class _DartNotificationOperation extends ServerOperation { |
| 272 final String file; |
| 273 final CompilationUnit unit; |
| 274 |
| 275 _DartNotificationOperation(this.file, this.unit); |
| 276 |
| 277 @override |
| 278 ServerOperationPriority get priority { |
| 279 return ServerOperationPriority.ANALYSIS_NOTIFICATION; |
| 280 } |
| 281 } |
| 282 |
| 283 |
| 284 class _DartOccurrencesOperation extends _DartNotificationOperation { |
| 285 _DartOccurrencesOperation(String file, CompilationUnit unit) |
| 286 : super(file, unit); |
| 287 |
| 288 @override |
| 289 void perform(AnalysisServer server) { |
| 290 sendAnalysisNotificationOccurrences(server, file, unit); |
| 291 } |
| 292 } |
| 293 |
| 294 |
| 295 class _DartOutlineOperation extends _DartNotificationOperation { |
| 296 final LineInfo lineInfo; |
| 297 |
| 298 _DartOutlineOperation(String file, this.lineInfo, CompilationUnit unit) |
| 299 : super(file, unit); |
| 300 |
| 301 @override |
| 302 void perform(AnalysisServer server) { |
| 303 sendAnalysisNotificationOutline(server, file, lineInfo, unit); |
| 304 } |
| 305 } |
| 306 |
| 307 |
| 308 class _DartOverridesOperation extends _DartNotificationOperation { |
| 309 _DartOverridesOperation(String file, CompilationUnit unit) |
| 310 : super(file, unit); |
| 311 |
| 312 @override |
| 313 void perform(AnalysisServer server) { |
| 314 sendAnalysisNotificationOverrides(server, file, unit); |
| 315 } |
| 316 } |
| 317 |
| 318 |
| 319 class _NotificationErrorsOperation extends ServerOperation { |
| 320 final String file; |
| 321 final LineInfo lineInfo; |
| 322 final List<AnalysisError> errors; |
| 323 |
| 324 _NotificationErrorsOperation(this.file, this.lineInfo, this.errors); |
| 325 |
| 326 @override |
| 327 ServerOperationPriority get priority { |
| 328 return ServerOperationPriority.ANALYSIS_NOTIFICATION; |
| 329 } |
| 330 |
| 331 @override |
| 332 void perform(AnalysisServer server) { |
| 333 sendAnalysisNotificationErrors(server, file, lineInfo, errors); |
| 334 } |
| 335 } |
| OLD | NEW |