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 analysis.server; | 5 library analysis.server; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:collection'; | 8 import 'dart:collection'; |
9 import 'dart:core'; | 9 import 'dart:core'; |
10 import 'dart:io' as io; | 10 import 'dart:io' as io; |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 ResolverProvider packageResolverProvider; | 315 ResolverProvider packageResolverProvider; |
316 | 316 |
317 /** | 317 /** |
318 * The manager of pub package summaries. | 318 * The manager of pub package summaries. |
319 */ | 319 */ |
320 PubSummaryManager pubSummaryManager; | 320 PubSummaryManager pubSummaryManager; |
321 | 321 |
322 ByteStore byteStore; | 322 ByteStore byteStore; |
323 | 323 |
324 /** | 324 /** |
| 325 * The set of the files that are currently priority. |
| 326 */ |
| 327 final Set<String> priorityFiles = new Set<String>(); |
| 328 |
| 329 /** |
| 330 * The cached results units for [priorityFiles]. |
| 331 */ |
| 332 final Map<String, nd.AnalysisResult> priorityFileResults = {}; |
| 333 |
| 334 /** |
325 * Initialize a newly created server to receive requests from and send | 335 * Initialize a newly created server to receive requests from and send |
326 * responses to the given [channel]. | 336 * responses to the given [channel]. |
327 * | 337 * |
328 * If [rethrowExceptions] is true, then any exceptions thrown by analysis are | 338 * If [rethrowExceptions] is true, then any exceptions thrown by analysis are |
329 * propagated up the call stack. The default is true to allow analysis | 339 * propagated up the call stack. The default is true to allow analysis |
330 * exceptions to show up in unit tests, but it should be set to false when | 340 * exceptions to show up in unit tests, but it should be set to false when |
331 * running a full analysis server. | 341 * running a full analysis server. |
332 */ | 342 */ |
333 AnalysisServer( | 343 AnalysisServer( |
334 this.channel, | 344 this.channel, |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 */ | 577 */ |
568 nd.AnalysisDriver getAnalysisDriver(String path) { | 578 nd.AnalysisDriver getAnalysisDriver(String path) { |
569 Iterable<nd.AnalysisDriver> drivers = driverMap.values; | 579 Iterable<nd.AnalysisDriver> drivers = driverMap.values; |
570 if (drivers.isNotEmpty) { | 580 if (drivers.isNotEmpty) { |
571 return drivers.firstWhere((driver) => driver.isAddedFile(path), | 581 return drivers.firstWhere((driver) => driver.isAddedFile(path), |
572 orElse: () => drivers.first); | 582 orElse: () => drivers.first); |
573 } | 583 } |
574 return null; | 584 return null; |
575 } | 585 } |
576 | 586 |
| 587 /** |
| 588 * Return the analysis result for the file with the given [path]. |
| 589 */ |
| 590 Future<nd.AnalysisResult> getAnalysisResult(String path) async { |
| 591 nd.AnalysisResult result = priorityFileResults[path]; |
| 592 if (result != null) { |
| 593 return result; |
| 594 } |
| 595 nd.AnalysisDriver driver = getAnalysisDriver(path); |
| 596 return driver.getResult(path); |
| 597 } |
| 598 |
577 CompilationUnitElement getCompilationUnitElement(String file) { | 599 CompilationUnitElement getCompilationUnitElement(String file) { |
578 ContextSourcePair pair = getContextSourcePair(file); | 600 ContextSourcePair pair = getContextSourcePair(file); |
579 if (pair == null) { | 601 if (pair == null) { |
580 return null; | 602 return null; |
581 } | 603 } |
582 // prepare AnalysisContext and Source | 604 // prepare AnalysisContext and Source |
583 AnalysisContext context = pair.context; | 605 AnalysisContext context = pair.context; |
584 Source unitSource = pair.source; | 606 Source unitSource = pair.source; |
585 if (context == null || unitSource == null) { | 607 if (context == null || unitSource == null) { |
586 return null; | 608 return null; |
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1224 prevAnalyzedFiles = null; | 1246 prevAnalyzedFiles = null; |
1225 } | 1247 } |
1226 generalAnalysisServices = newServices; | 1248 generalAnalysisServices = newServices; |
1227 } | 1249 } |
1228 | 1250 |
1229 /** | 1251 /** |
1230 * Set the priority files to the given [files]. | 1252 * Set the priority files to the given [files]. |
1231 */ | 1253 */ |
1232 void setPriorityFiles(String requestId, List<String> files) { | 1254 void setPriorityFiles(String requestId, List<String> files) { |
1233 if (options.enableNewAnalysisDriver) { | 1255 if (options.enableNewAnalysisDriver) { |
| 1256 // Flush results for files that are not priority anymore. |
| 1257 priorityFiles |
| 1258 .difference(files.toSet()) |
| 1259 .forEach(priorityFileResults.remove); |
| 1260 priorityFiles.clear(); |
| 1261 priorityFiles.addAll(files); |
| 1262 // Set priority files in drivers. |
1234 driverMap.values.forEach((driver) { | 1263 driverMap.values.forEach((driver) { |
1235 driver.priorityFiles = files; | 1264 driver.priorityFiles = files; |
1236 }); | 1265 }); |
1237 return; | 1266 return; |
1238 } | 1267 } |
1239 // Note: when a file is a priority file, that information needs to be | 1268 // Note: when a file is a priority file, that information needs to be |
1240 // propagated to all contexts that analyze the file, so that all contexts | 1269 // propagated to all contexts that analyze the file, so that all contexts |
1241 // will be able to do incremental resolution of the file. See | 1270 // will be able to do incremental resolution of the file. See |
1242 // dartbug.com/22209. | 1271 // dartbug.com/22209. |
1243 Map<AnalysisContext, List<Source>> sourceMap = | 1272 Map<AnalysisContext, List<Source>> sourceMap = |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1350 operation.perform(this); | 1379 operation.perform(this); |
1351 } | 1380 } |
1352 } | 1381 } |
1353 | 1382 |
1354 /** | 1383 /** |
1355 * Implementation for `analysis.updateContent`. | 1384 * Implementation for `analysis.updateContent`. |
1356 */ | 1385 */ |
1357 void updateContent(String id, Map<String, dynamic> changes) { | 1386 void updateContent(String id, Map<String, dynamic> changes) { |
1358 if (options.enableNewAnalysisDriver) { | 1387 if (options.enableNewAnalysisDriver) { |
1359 changes.forEach((file, change) { | 1388 changes.forEach((file, change) { |
| 1389 priorityFileResults.remove(file); |
| 1390 |
1360 // Prepare the new contents. | 1391 // Prepare the new contents. |
1361 String oldContents = fileContentOverlay[file]; | 1392 String oldContents = fileContentOverlay[file]; |
1362 String newContents; | 1393 String newContents; |
1363 if (change is AddContentOverlay) { | 1394 if (change is AddContentOverlay) { |
1364 newContents = change.content; | 1395 newContents = change.content; |
1365 } else if (change is ChangeContentOverlay) { | 1396 } else if (change is ChangeContentOverlay) { |
1366 if (oldContents == null) { | 1397 if (oldContents == null) { |
1367 // The client may only send a ChangeContentOverlay if there is | 1398 // The client may only send a ChangeContentOverlay if there is |
1368 // already an existing overlay for the source. | 1399 // already an existing overlay for the source. |
1369 throw new RequestFailure(new Response(id, | 1400 throw new RequestFailure(new Response(id, |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1721 resourceProvider, | 1752 resourceProvider, |
1722 analysisServer.byteStore, | 1753 analysisServer.byteStore, |
1723 analysisServer.fileContentOverlay, | 1754 analysisServer.fileContentOverlay, |
1724 sourceFactory, | 1755 sourceFactory, |
1725 analysisOptions); | 1756 analysisOptions); |
1726 analysisDriver.name = folder.shortName; | 1757 analysisDriver.name = folder.shortName; |
1727 analysisDriver.status.listen((status) { | 1758 analysisDriver.status.listen((status) { |
1728 // TODO(scheglov) send server status | 1759 // TODO(scheglov) send server status |
1729 }); | 1760 }); |
1730 analysisDriver.results.listen((result) { | 1761 analysisDriver.results.listen((result) { |
| 1762 if (analysisServer.priorityFiles.contains(result.path)) { |
| 1763 analysisServer.priorityFileResults[result.path] = result; |
| 1764 } |
1731 new_sendErrorNotification(analysisServer, result); | 1765 new_sendErrorNotification(analysisServer, result); |
1732 CompilationUnit unit = result.unit; | 1766 CompilationUnit unit = result.unit; |
1733 if (unit != null) { | 1767 if (unit != null) { |
1734 if (analysisServer._hasAnalysisServiceSubscription( | 1768 if (analysisServer._hasAnalysisServiceSubscription( |
1735 AnalysisService.HIGHLIGHTS, result.path)) { | 1769 AnalysisService.HIGHLIGHTS, result.path)) { |
1736 sendAnalysisNotificationHighlights(analysisServer, result.path, unit); | 1770 sendAnalysisNotificationHighlights(analysisServer, result.path, unit); |
1737 } | 1771 } |
1738 if (analysisServer._hasAnalysisServiceSubscription( | 1772 if (analysisServer._hasAnalysisServiceSubscription( |
1739 AnalysisService.NAVIGATION, result.path)) { | 1773 AnalysisService.NAVIGATION, result.path)) { |
1740 NavigationCollectorImpl collector = new NavigationCollectorImpl(); | 1774 NavigationCollectorImpl collector = new NavigationCollectorImpl(); |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1956 /** | 1990 /** |
1957 * The [PerformanceTag] for time spent in server request handlers. | 1991 * The [PerformanceTag] for time spent in server request handlers. |
1958 */ | 1992 */ |
1959 static PerformanceTag serverRequests = new PerformanceTag('serverRequests'); | 1993 static PerformanceTag serverRequests = new PerformanceTag('serverRequests'); |
1960 | 1994 |
1961 /** | 1995 /** |
1962 * The [PerformanceTag] for time spent in split store microtasks. | 1996 * The [PerformanceTag] for time spent in split store microtasks. |
1963 */ | 1997 */ |
1964 static PerformanceTag splitStore = new PerformanceTag('splitStore'); | 1998 static PerformanceTag splitStore = new PerformanceTag('splitStore'); |
1965 } | 1999 } |
OLD | NEW |