Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Side by Side Diff: pkg/analysis_server/lib/src/analysis_server.dart

Issue 2286923002: Convert analysis server over to use ContextBuilder (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: address comment, fix bugs, clean-up Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/analysis_server/lib/src/context_manager.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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' hide Resource; 9 import 'dart:core' hide Resource;
10 import 'dart:io' as io; 10 import 'dart:io' as io;
(...skipping 14 matching lines...) Expand all
25 import 'package:analysis_server/src/services/search/search_engine_internal.dart' ; 25 import 'package:analysis_server/src/services/search/search_engine_internal.dart' ;
26 import 'package:analysis_server/src/single_context_manager.dart'; 26 import 'package:analysis_server/src/single_context_manager.dart';
27 import 'package:analyzer/dart/ast/ast.dart'; 27 import 'package:analyzer/dart/ast/ast.dart';
28 import 'package:analyzer/dart/element/element.dart'; 28 import 'package:analyzer/dart/element/element.dart';
29 import 'package:analyzer/file_system/file_system.dart'; 29 import 'package:analyzer/file_system/file_system.dart';
30 import 'package:analyzer/instrumentation/instrumentation.dart'; 30 import 'package:analyzer/instrumentation/instrumentation.dart';
31 import 'package:analyzer/plugin/resolver_provider.dart'; 31 import 'package:analyzer/plugin/resolver_provider.dart';
32 import 'package:analyzer/source/pub_package_map_provider.dart'; 32 import 'package:analyzer/source/pub_package_map_provider.dart';
33 import 'package:analyzer/src/context/builder.dart'; 33 import 'package:analyzer/src/context/builder.dart';
34 import 'package:analyzer/src/dart/ast/utilities.dart'; 34 import 'package:analyzer/src/dart/ast/utilities.dart';
35 import 'package:analyzer/src/dart/sdk/sdk.dart';
36 import 'package:analyzer/src/generated/engine.dart'; 35 import 'package:analyzer/src/generated/engine.dart';
37 import 'package:analyzer/src/generated/java_engine.dart'; 36 import 'package:analyzer/src/generated/java_engine.dart';
38 import 'package:analyzer/src/generated/java_io.dart'; 37 import 'package:analyzer/src/generated/java_io.dart';
39 import 'package:analyzer/src/generated/sdk.dart'; 38 import 'package:analyzer/src/generated/sdk.dart';
40 import 'package:analyzer/src/generated/source.dart'; 39 import 'package:analyzer/src/generated/source.dart';
41 import 'package:analyzer/src/generated/source_io.dart'; 40 import 'package:analyzer/src/generated/source_io.dart';
42 import 'package:analyzer/src/generated/utilities_general.dart'; 41 import 'package:analyzer/src/generated/utilities_general.dart';
43 import 'package:analyzer/src/summary/package_bundle_reader.dart'; 42 import 'package:analyzer/src/summary/package_bundle_reader.dart';
44 import 'package:analyzer/src/summary/pub_summary.dart'; 43 import 'package:analyzer/src/summary/pub_summary.dart';
45 import 'package:analyzer/src/task/dart.dart'; 44 import 'package:analyzer/src/task/dart.dart';
46 import 'package:analyzer/src/util/glob.dart'; 45 import 'package:analyzer/src/util/glob.dart';
47 import 'package:analyzer/task/dart.dart'; 46 import 'package:analyzer/task/dart.dart';
48 import 'package:plugin/plugin.dart'; 47 import 'package:plugin/plugin.dart';
49 import 'package:yaml/yaml.dart';
50 48
51 typedef void OptionUpdater(AnalysisOptionsImpl options); 49 typedef void OptionUpdater(AnalysisOptionsImpl options);
52 50
53 /** 51 /**
54 * Enum representing reasons why analysis might be done for a given file. 52 * Enum representing reasons why analysis might be done for a given file.
55 */ 53 */
56 class AnalysisDoneReason { 54 class AnalysisDoneReason {
57 /** 55 /**
58 * Analysis of the file completed successfully. 56 * Analysis of the file completed successfully.
59 */ 57 */
(...skipping 1529 matching lines...) Expand 10 before | Expand all | Expand 10 after
1589 /** 1587 /**
1590 * The [ResourceProvider] by which paths are converted into [Resource]s. 1588 * The [ResourceProvider] by which paths are converted into [Resource]s.
1591 */ 1589 */
1592 final ResourceProvider resourceProvider; 1590 final ResourceProvider resourceProvider;
1593 1591
1594 ServerContextManagerCallbacks(this.analysisServer, this.resourceProvider); 1592 ServerContextManagerCallbacks(this.analysisServer, this.resourceProvider);
1595 1593
1596 @override 1594 @override
1597 AnalysisContext addContext( 1595 AnalysisContext addContext(
1598 Folder folder, AnalysisOptions options, FolderDisposition disposition) { 1596 Folder folder, AnalysisOptions options, FolderDisposition disposition) {
1599 InternalAnalysisContext context = 1597 ContextBuilder builder = createContextBuilder(folder, options);
1600 AnalysisEngine.instance.createAnalysisContext(); 1598 AnalysisContext context = builder.buildContext(folder.path);
1601 context.contentCache = analysisServer.overlayState; 1599
1602 analysisServer.folderMap[folder] = context; 1600 // TODO(brianwilkerson) Move bundle discovery into ContextBuilder
1603 context.fileResolverProvider = analysisServer.fileResolverProvider;
1604 context.sourceFactory =
1605 _createSourceFactory(context, options, disposition, folder);
1606 context.analysisOptions = options;
1607 if (analysisServer.options.enablePubSummaryManager) { 1601 if (analysisServer.options.enablePubSummaryManager) {
1608 List<LinkedPubPackage> linkedBundles = 1602 List<LinkedPubPackage> linkedBundles =
1609 analysisServer.pubSummaryManager.getLinkedBundles(context); 1603 analysisServer.pubSummaryManager.getLinkedBundles(context);
1610 if (linkedBundles.isNotEmpty) { 1604 if (linkedBundles.isNotEmpty) {
1611 SummaryDataStore store = new SummaryDataStore([]); 1605 SummaryDataStore store = new SummaryDataStore([]);
1612 for (LinkedPubPackage package in linkedBundles) { 1606 for (LinkedPubPackage package in linkedBundles) {
1613 store.addBundle(null, package.unlinked); 1607 store.addBundle(null, package.unlinked);
1614 store.addBundle(null, package.linked); 1608 store.addBundle(null, package.linked);
1615 } 1609 }
1616 context.resultProvider = 1610 (context as InternalAnalysisContext).resultProvider =
1617 new InputPackagesResultProvider(context, store); 1611 new InputPackagesResultProvider(context, store);
1618 } 1612 }
1619 } 1613 }
1620 1614
1615 analysisServer.folderMap[folder] = context;
1621 analysisServer._onContextsChangedController 1616 analysisServer._onContextsChangedController
1622 .add(new ContextsChangedEvent(added: [context])); 1617 .add(new ContextsChangedEvent(added: [context]));
1623 analysisServer.schedulePerformAnalysisOperation(context); 1618 analysisServer.schedulePerformAnalysisOperation(context);
1624 1619
1625 return context; 1620 return context;
1626 } 1621 }
1627 1622
1628 @override 1623 @override
1629 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) { 1624 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
1630 AnalysisContext context = analysisServer.folderMap[contextFolder]; 1625 AnalysisContext context = analysisServer.folderMap[contextFolder];
1631 if (context != null) { 1626 if (context != null) {
1632 ApplyChangesStatus changesStatus = context.applyChanges(changeSet); 1627 ApplyChangesStatus changesStatus = context.applyChanges(changeSet);
1633 if (changesStatus.hasChanges) { 1628 if (changesStatus.hasChanges) {
1634 analysisServer.schedulePerformAnalysisOperation(context); 1629 analysisServer.schedulePerformAnalysisOperation(context);
1635 } 1630 }
1636 List<String> flushedFiles = new List<String>(); 1631 List<String> flushedFiles = new List<String>();
1637 for (Source source in changeSet.removedSources) { 1632 for (Source source in changeSet.removedSources) {
1638 flushedFiles.add(source.fullName); 1633 flushedFiles.add(source.fullName);
1639 } 1634 }
1640 sendAnalysisNotificationFlushResults(analysisServer, flushedFiles); 1635 sendAnalysisNotificationFlushResults(analysisServer, flushedFiles);
1641 } 1636 }
1642 } 1637 }
1643 1638
1644 @override 1639 @override
1645 void computingPackageMap(bool computing) => 1640 void computingPackageMap(bool computing) =>
1646 analysisServer._computingPackageMap(computing); 1641 analysisServer._computingPackageMap(computing);
1647 1642
1648 @override 1643 @override
1644 ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options) {
1645 String defaultPackageFilePath = null;
1646 String defaultPackagesDirectoryPath = null;
1647 String path = (analysisServer.contextManager as ContextManagerImpl)
1648 .normalizedPackageRoots[folder.path];
1649 if (path != null) {
1650 Resource resource = resourceProvider.getResource(path);
1651 if (resource.exists) {
1652 if (resource is File) {
1653 defaultPackageFilePath = path;
1654 } else {
1655 defaultPackagesDirectoryPath = path;
1656 }
1657 }
1658 }
1659
1660 ContextBuilder builder = new ContextBuilder(resourceProvider,
1661 analysisServer.sdkManager, analysisServer.overlayState);
1662 builder.defaultOptions = options;
1663 builder.fileResolverProvider = analysisServer.fileResolverProvider;
1664 builder.defaultPackageFilePath = defaultPackageFilePath;
1665 builder.defaultPackagesDirectoryPath = defaultPackagesDirectoryPath;
1666 return builder;
1667 }
1668
1669 @override
1649 void moveContext(Folder from, Folder to) { 1670 void moveContext(Folder from, Folder to) {
1650 // There is nothing to do. 1671 // There is nothing to do.
1651 // This method is mostly for tests. 1672 // This method is mostly for tests.
1652 // Context managers manage folders and contexts themselves. 1673 // Context managers manage folders and contexts themselves.
1653 } 1674 }
1654 1675
1655 @override 1676 @override
1656 void removeContext(Folder folder, List<String> flushedFiles) { 1677 void removeContext(Folder folder, List<String> flushedFiles) {
1657 AnalysisContext context = analysisServer.folderMap.remove(folder); 1678 AnalysisContext context = analysisServer.folderMap.remove(folder);
1658 sendAnalysisNotificationFlushResults(analysisServer, flushedFiles); 1679 sendAnalysisNotificationFlushResults(analysisServer, flushedFiles);
1659 1680
1660 analysisServer.operationQueue.contextRemoved(context); 1681 analysisServer.operationQueue.contextRemoved(context);
1661 analysisServer._onContextsChangedController 1682 analysisServer._onContextsChangedController
1662 .add(new ContextsChangedEvent(removed: [context])); 1683 .add(new ContextsChangedEvent(removed: [context]));
1663 analysisServer.sendContextAnalysisDoneNotifications( 1684 analysisServer.sendContextAnalysisDoneNotifications(
1664 context, AnalysisDoneReason.CONTEXT_REMOVED); 1685 context, AnalysisDoneReason.CONTEXT_REMOVED);
1665 context.dispose(); 1686 context.dispose();
1666 } 1687 }
1667 1688
1668 @override 1689 @override
1669 void updateContextPackageUriResolver(AnalysisContext context) { 1690 void updateContextPackageUriResolver(AnalysisContext context) {
1670 analysisServer._onContextsChangedController 1691 analysisServer._onContextsChangedController
1671 .add(new ContextsChangedEvent(changed: [context])); 1692 .add(new ContextsChangedEvent(changed: [context]));
1672 analysisServer.schedulePerformAnalysisOperation(context); 1693 analysisServer.schedulePerformAnalysisOperation(context);
1673 } 1694 }
1674
1675 /**
1676 * Set up a [SourceFactory] that resolves packages as appropriate for the
1677 * given [disposition].
1678 */
1679 SourceFactory _createSourceFactory(InternalAnalysisContext context,
1680 AnalysisOptions options, FolderDisposition disposition, Folder folder) {
1681 List<UriResolver> resolvers = [];
1682 List<UriResolver> packageUriResolvers =
1683 disposition.createPackageUriResolvers(resourceProvider);
1684
1685 // If no embedded URI resolver was provided, defer to a locator-backed one.
1686 SdkExtensionFinder extFinder =
1687 disposition.getSdkExtensionFinder(resourceProvider);
1688 List<String> extFilePaths = extFinder.extensionFilePaths;
1689 EmbedderYamlLocator locator =
1690 disposition.getEmbedderLocator(resourceProvider);
1691 Map<Folder, YamlMap> embedderYamls = locator.embedderYamls;
1692 EmbedderSdk embedderSdk = new EmbedderSdk(resourceProvider, embedderYamls);
1693 if (embedderSdk.libraryMap.size() == 0) {
1694 // There was no embedder file, or the file was empty, so used the default
1695 // SDK.
1696 resolvers.add(new DartUriResolver(
1697 analysisServer.sdkManager.getSdkForOptions(options)));
1698 } else {
1699 // The embedder file defines an alternate SDK, so use it.
1700 List<String> paths = <String>[];
1701 for (Folder folder in embedderYamls.keys) {
1702 paths.add(folder
1703 .getChildAssumingFile(EmbedderYamlLocator.EMBEDDER_FILE_NAME)
1704 .path);
1705 }
1706 paths.addAll(extFilePaths);
1707 DartSdk dartSdk = analysisServer.sdkManager
1708 .getSdk(new SdkDescription(paths, options), () {
1709 if (extFilePaths.isNotEmpty) {
1710 embedderSdk.addExtensions(extFinder.urlMappings);
1711 }
1712 embedderSdk.analysisOptions = options;
1713 // TODO(brianwilkerson) Enable summary use after we have decided where
1714 // summary files for embedder files will live.
1715 embedderSdk.useSummary = false;
1716 return embedderSdk;
1717 });
1718 resolvers.add(new DartUriResolver(dartSdk));
1719 }
1720
1721 resolvers.addAll(packageUriResolvers);
1722 UriResolver fileResolver;
1723 if (context.fileResolverProvider != null) {
1724 fileResolver = context.fileResolverProvider(folder);
1725 }
1726 resolvers.add(fileResolver ?? new ResourceUriResolver(resourceProvider));
1727 return new SourceFactory(resolvers, disposition.packages);
1728 }
1729 } 1695 }
1730 1696
1731 /** 1697 /**
1732 * A class used by [AnalysisServer] to record performance information 1698 * A class used by [AnalysisServer] to record performance information
1733 * such as request latency. 1699 * such as request latency.
1734 */ 1700 */
1735 class ServerPerformance { 1701 class ServerPerformance {
1736 /** 1702 /**
1737 * The creation time and the time when performance information 1703 * The creation time and the time when performance information
1738 * started to be recorded here. 1704 * started to be recorded here.
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1822 /** 1788 /**
1823 * The [PerformanceTag] for time spent in server request handlers. 1789 * The [PerformanceTag] for time spent in server request handlers.
1824 */ 1790 */
1825 static PerformanceTag serverRequests = new PerformanceTag('serverRequests'); 1791 static PerformanceTag serverRequests = new PerformanceTag('serverRequests');
1826 1792
1827 /** 1793 /**
1828 * The [PerformanceTag] for time spent in split store microtasks. 1794 * The [PerformanceTag] for time spent in split store microtasks.
1829 */ 1795 */
1830 static PerformanceTag splitStore = new PerformanceTag('splitStore'); 1796 static PerformanceTag splitStore = new PerformanceTag('splitStore');
1831 } 1797 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/lib/src/context_manager.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698