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_highlights2.dart'; | 9 import 'package:analysis_server/src/computer/computer_highlights2.dart'; |
10 import 'package:analysis_server/src/computer/computer_outline.dart'; | 10 import 'package:analysis_server/src/computer/computer_outline.dart'; |
11 import 'package:analysis_server/src/computer/computer_overrides.dart'; | 11 import 'package:analysis_server/src/computer/computer_overrides.dart'; |
12 import 'package:analysis_server/src/domains/analysis/implemented_dart.dart'; | 12 import 'package:analysis_server/src/domains/analysis/implemented_dart.dart'; |
13 import 'package:analysis_server/src/domains/analysis/navigation.dart'; | 13 import 'package:analysis_server/src/domains/analysis/navigation.dart'; |
14 import 'package:analysis_server/src/domains/analysis/occurrences.dart'; | 14 import 'package:analysis_server/src/domains/analysis/occurrences.dart'; |
15 import 'package:analysis_server/src/operation/operation.dart'; | 15 import 'package:analysis_server/src/operation/operation.dart'; |
16 import 'package:analysis_server/src/protocol_server.dart' as protocol; | 16 import 'package:analysis_server/src/protocol_server.dart' as protocol; |
17 import 'package:analysis_server/src/services/dependencies/library_dependencies.d
art'; | 17 import 'package:analysis_server/src/services/dependencies/library_dependencies.d
art'; |
18 import 'package:analysis_server/src/services/search/search_engine.dart'; | 18 import 'package:analysis_server/src/services/search/search_engine.dart'; |
19 import 'package:analyzer/dart/ast/ast.dart'; | 19 import 'package:analyzer/dart/ast/ast.dart'; |
20 import 'package:analyzer/dart/element/element.dart'; | 20 import 'package:analyzer/dart/element/element.dart'; |
21 import 'package:analyzer/src/generated/engine.dart'; | 21 import 'package:analyzer/src/generated/engine.dart'; |
22 import 'package:analyzer/src/generated/error.dart'; | 22 import 'package:analyzer/src/generated/error.dart'; |
23 import 'package:analyzer/src/generated/source.dart'; | 23 import 'package:analyzer/src/generated/source.dart'; |
24 | 24 |
25 /** | 25 /** |
26 * Runs the given function [f] with the working cache size in [context]. | 26 * Run the given function [f] with the given [context] made active. |
27 * Returns the result of [f] invocation. | 27 * Return the result of [f] invocation. |
28 */ | 28 */ |
29 runWithWorkingCacheSize(AnalysisContext context, f()) { | 29 runWithActiveContext(AnalysisContext context, f()) { |
30 int currentCacheSize = context.analysisOptions.cacheSize; | 30 if (context is InternalAnalysisContext && !context.isActive) { |
31 if (currentCacheSize < PerformAnalysisOperation.WORKING_CACHE_SIZE) { | 31 context.isActive = true; |
32 setCacheSize(context, PerformAnalysisOperation.WORKING_CACHE_SIZE); | |
33 try { | 32 try { |
34 return f(); | 33 return f(); |
35 } finally { | 34 } finally { |
36 setCacheSize(context, currentCacheSize); | 35 context.isActive = false; |
37 } | 36 } |
38 } else { | 37 } else { |
39 return f(); | 38 f(); |
40 } | 39 } |
41 } | 40 } |
42 | 41 |
43 scheduleImplementedNotification( | 42 scheduleImplementedNotification( |
44 AnalysisServer server, Iterable<String> files) async { | 43 AnalysisServer server, Iterable<String> files) async { |
45 SearchEngine searchEngine = server.searchEngine; | 44 SearchEngine searchEngine = server.searchEngine; |
46 if (searchEngine == null) { | 45 if (searchEngine == null) { |
47 return; | 46 return; |
48 } | 47 } |
49 for (String file in files) { | 48 for (String file in files) { |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 | 237 |
239 void sendAnalysisNotificationOverrides( | 238 void sendAnalysisNotificationOverrides( |
240 AnalysisServer server, String file, CompilationUnit dartUnit) { | 239 AnalysisServer server, String file, CompilationUnit dartUnit) { |
241 _sendNotification(server, () { | 240 _sendNotification(server, () { |
242 var overrides = new DartUnitOverridesComputer(dartUnit).compute(); | 241 var overrides = new DartUnitOverridesComputer(dartUnit).compute(); |
243 var params = new protocol.AnalysisOverridesParams(file, overrides); | 242 var params = new protocol.AnalysisOverridesParams(file, overrides); |
244 server.sendNotification(params.toNotification()); | 243 server.sendNotification(params.toNotification()); |
245 }); | 244 }); |
246 } | 245 } |
247 | 246 |
248 /** | |
249 * Sets the cache size in the given [context] to the given value. | |
250 */ | |
251 void setCacheSize(AnalysisContext context, int cacheSize) { | |
252 // TODO(scheglov) The cache size cannot be changed with task model. | |
253 // TODO(scheglov) Consider removing this function. | |
254 // AnalysisOptionsImpl options = | |
255 // new AnalysisOptionsImpl.from(context.analysisOptions); | |
256 // options.cacheSize = cacheSize; | |
257 // context.analysisOptions = options; | |
258 } | |
259 | |
260 String _computeLibraryName(CompilationUnit unit) { | 247 String _computeLibraryName(CompilationUnit unit) { |
261 for (Directive directive in unit.directives) { | 248 for (Directive directive in unit.directives) { |
262 if (directive is LibraryDirective && directive.name != null) { | 249 if (directive is LibraryDirective && directive.name != null) { |
263 return directive.name.name; | 250 return directive.name.name; |
264 } | 251 } |
265 } | 252 } |
266 for (Directive directive in unit.directives) { | 253 for (Directive directive in unit.directives) { |
267 if (directive is PartOfDirective && directive.libraryName != null) { | 254 if (directive is PartOfDirective && directive.libraryName != null) { |
268 return directive.libraryName.name; | 255 return directive.libraryName.name; |
269 } | 256 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 @override | 305 @override |
319 void perform(AnalysisServer server) { | 306 void perform(AnalysisServer server) { |
320 sendAnalysisNotificationOccurrences(server, context, source); | 307 sendAnalysisNotificationOccurrences(server, context, source); |
321 } | 308 } |
322 } | 309 } |
323 | 310 |
324 /** | 311 /** |
325 * Instances of [PerformAnalysisOperation] perform a single analysis task. | 312 * Instances of [PerformAnalysisOperation] perform a single analysis task. |
326 */ | 313 */ |
327 class PerformAnalysisOperation extends ServerOperation { | 314 class PerformAnalysisOperation extends ServerOperation { |
328 static const int IDLE_CACHE_SIZE = AnalysisOptionsImpl.DEFAULT_CACHE_SIZE; | |
329 static const int WORKING_CACHE_SIZE = 512; | |
330 | |
331 final bool isContinue; | 315 final bool isContinue; |
332 | 316 |
333 PerformAnalysisOperation(AnalysisContext context, this.isContinue) | 317 PerformAnalysisOperation(AnalysisContext context, this.isContinue) |
334 : super(context); | 318 : super(context); |
335 | 319 |
336 @override | 320 @override |
337 ServerOperationPriority get priority { | 321 ServerOperationPriority get priority { |
338 if (_isPriorityContext) { | 322 if (_isPriorityContext) { |
339 if (isContinue) { | 323 if (isContinue) { |
340 return ServerOperationPriority.PRIORITY_ANALYSIS_CONTINUE; | 324 return ServerOperationPriority.PRIORITY_ANALYSIS_CONTINUE; |
(...skipping 17 matching lines...) Expand all Loading... |
358 void perform(AnalysisServer server) { | 342 void perform(AnalysisServer server) { |
359 // | 343 // |
360 // TODO(brianwilkerson) Add an optional function-valued parameter to | 344 // TODO(brianwilkerson) Add an optional function-valued parameter to |
361 // performAnalysisTask that will be called when the task has been computed | 345 // performAnalysisTask that will be called when the task has been computed |
362 // but before it is performed and send notification in the function: | 346 // but before it is performed and send notification in the function: |
363 // | 347 // |
364 // AnalysisResult result = context.performAnalysisTask((taskDescription) { | 348 // AnalysisResult result = context.performAnalysisTask((taskDescription) { |
365 // sendStatusNotification(context.toString(), taskDescription); | 349 // sendStatusNotification(context.toString(), taskDescription); |
366 // }); | 350 // }); |
367 if (!isContinue) { | 351 if (!isContinue) { |
368 setCacheSize(context, WORKING_CACHE_SIZE); | 352 _setContextActive(true); |
369 } | 353 } |
370 // prepare results | 354 // prepare results |
371 AnalysisResult result = context.performAnalysisTask(); | 355 AnalysisResult result = context.performAnalysisTask(); |
372 List<ChangeNotice> notices = result.changeNotices; | 356 List<ChangeNotice> notices = result.changeNotices; |
373 // nothing to analyze | 357 // nothing to analyze |
374 if (notices == null) { | 358 if (notices == null) { |
375 server.scheduleCacheConsistencyValidation(context); | 359 server.scheduleCacheConsistencyValidation(context); |
376 setCacheSize(context, IDLE_CACHE_SIZE); | 360 _setContextActive(false); |
377 server.sendContextAnalysisDoneNotifications( | 361 server.sendContextAnalysisDoneNotifications( |
378 context, AnalysisDoneReason.COMPLETE); | 362 context, AnalysisDoneReason.COMPLETE); |
379 return; | 363 return; |
380 } | 364 } |
381 // process results | 365 // process results |
382 ServerPerformanceStatistics.notices.makeCurrentWhile(() { | 366 ServerPerformanceStatistics.notices.makeCurrentWhile(() { |
383 _sendNotices(server, notices); | 367 _sendNotices(server, notices); |
384 _updateIndex(server, notices); | 368 _updateIndex(server, notices); |
385 }); | 369 }); |
386 // continue analysis | 370 // continue analysis |
(...skipping 11 matching lines...) Expand all Loading... |
398 // Dart | 382 // Dart |
399 CompilationUnit parsedDartUnit = notice.parsedDartUnit; | 383 CompilationUnit parsedDartUnit = notice.parsedDartUnit; |
400 CompilationUnit resolvedDartUnit = notice.resolvedDartUnit; | 384 CompilationUnit resolvedDartUnit = notice.resolvedDartUnit; |
401 scheduleNotificationOperations(server, source, file, notice.lineInfo, | 385 scheduleNotificationOperations(server, source, file, notice.lineInfo, |
402 context, parsedDartUnit, resolvedDartUnit, notice.errors); | 386 context, parsedDartUnit, resolvedDartUnit, notice.errors); |
403 // done | 387 // done |
404 server.fileAnalyzed(notice); | 388 server.fileAnalyzed(notice); |
405 } | 389 } |
406 } | 390 } |
407 | 391 |
| 392 /** |
| 393 * Make the [context] active or idle. |
| 394 */ |
| 395 void _setContextActive(bool active) { |
| 396 AnalysisContext context = this.context; |
| 397 if (context is InternalAnalysisContext) { |
| 398 context.isActive = active; |
| 399 } |
| 400 } |
| 401 |
408 void _updateIndex(AnalysisServer server, List<ChangeNotice> notices) { | 402 void _updateIndex(AnalysisServer server, List<ChangeNotice> notices) { |
409 if (server.index == null) { | 403 if (server.index == null) { |
410 return; | 404 return; |
411 } | 405 } |
412 for (ChangeNotice notice in notices) { | 406 for (ChangeNotice notice in notices) { |
413 String file = notice.source.fullName; | 407 String file = notice.source.fullName; |
414 // Dart | 408 // Dart |
415 try { | 409 try { |
416 CompilationUnit dartUnit = notice.resolvedDartUnit; | 410 CompilationUnit dartUnit = notice.resolvedDartUnit; |
417 if (dartUnit != null) { | 411 if (dartUnit != null) { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 abstract class _SingleFileOperation extends SourceSensitiveOperation { | 529 abstract class _SingleFileOperation extends SourceSensitiveOperation { |
536 final String file; | 530 final String file; |
537 | 531 |
538 _SingleFileOperation(AnalysisContext context, this.file) : super(context); | 532 _SingleFileOperation(AnalysisContext context, this.file) : super(context); |
539 | 533 |
540 @override | 534 @override |
541 bool shouldBeDiscardedOnSourceChange(Source source) { | 535 bool shouldBeDiscardedOnSourceChange(Source source) { |
542 return source.fullName == file; | 536 return source.fullName == file; |
543 } | 537 } |
544 } | 538 } |
OLD | NEW |