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

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

Issue 2078993002: Remove embedder locator from analysis context (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 6 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
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 context.directory.manager; 5 library context.directory.manager;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:collection'; 8 import 'dart:collection';
9 import 'dart:convert'; 9 import 'dart:convert';
10 import 'dart:core' hide Resource; 10 import 'dart:core' hide Resource;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 * objects. 69 * objects.
70 */ 70 */
71 ContextInfo parent; 71 ContextInfo parent;
72 72
73 /** 73 /**
74 * The package description file path for this context. 74 * The package description file path for this context.
75 */ 75 */
76 String packageDescriptionPath; 76 String packageDescriptionPath;
77 77
78 /** 78 /**
79 * The folder disposition for this context.
80 */
81 final FolderDisposition disposition;
82
83 /**
79 * Paths to files which determine the folder disposition and package map. 84 * Paths to files which determine the folder disposition and package map.
80 * 85 *
81 * TODO(paulberry): if any of these files are outside of [folder], they won't 86 * TODO(paulberry): if any of these files are outside of [folder], they won't
82 * be watched for changes. I believe the use case for watching these files 87 * be watched for changes. I believe the use case for watching these files
83 * is no longer relevant. 88 * is no longer relevant.
84 */ 89 */
85 Set<String> _dependencies = new Set<String>(); 90 Set<String> _dependencies = new Set<String>();
86 91
87 /** 92 /**
88 * The analysis context that was created for the [folder]. 93 * The analysis context that was created for the [folder].
89 */ 94 */
90 AnalysisContext context; 95 AnalysisContext context;
91 96
92 /** 97 /**
93 * Map from full path to the [Source] object, for each source that has been 98 * Map from full path to the [Source] object, for each source that has been
94 * added to the context. 99 * added to the context.
95 */ 100 */
96 Map<String, Source> sources = new HashMap<String, Source>(); 101 Map<String, Source> sources = new HashMap<String, Source>();
97 102
98 ContextInfo(ContextManagerImpl contextManager, this.parent, Folder folder, 103 ContextInfo(ContextManagerImpl contextManager, this.parent, Folder folder,
99 File packagespecFile, this.packageRoot) 104 File packagespecFile, this.packageRoot, this.disposition)
100 : folder = folder, 105 : folder = folder,
101 pathFilter = new PathFilter( 106 pathFilter = new PathFilter(
102 folder.path, null, contextManager.resourceProvider.pathContext) { 107 folder.path, null, contextManager.resourceProvider.pathContext) {
103 packageDescriptionPath = packagespecFile.path; 108 packageDescriptionPath = packagespecFile.path;
104 parent.children.add(this); 109 parent.children.add(this);
105 } 110 }
106 111
107 /** 112 /**
108 * Create the virtual [ContextInfo] which acts as an ancestor to all other 113 * Create the virtual [ContextInfo] which acts as an ancestor to all other
109 * [ContextInfo]s. 114 * [ContextInfo]s.
110 */ 115 */
111 ContextInfo._root() 116 ContextInfo._root()
112 : folder = null, 117 : folder = null,
113 pathFilter = null; 118 pathFilter = null,
119 packageRoot = null,
120 disposition = null;
114 121
115 /** 122 /**
116 * Iterate through all [children] and their children, recursively. 123 * Iterate through all [children] and their children, recursively.
117 */ 124 */
118 Iterable<ContextInfo> get descendants sync* { 125 Iterable<ContextInfo> get descendants sync* {
119 for (ContextInfo child in children) { 126 for (ContextInfo child in children) {
120 yield child; 127 yield child;
121 yield* child.descendants; 128 yield* child.descendants;
122 } 129 }
123 } 130 }
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 if (options == null && !optionsRemoved) { 583 if (options == null && !optionsRemoved) {
577 return; 584 return;
578 } 585 }
579 586
580 // In case options files are removed, revert to defaults. 587 // In case options files are removed, revert to defaults.
581 if (optionsRemoved) { 588 if (optionsRemoved) {
582 // Start with defaults. 589 // Start with defaults.
583 info.context.analysisOptions = new AnalysisOptionsImpl(); 590 info.context.analysisOptions = new AnalysisOptionsImpl();
584 591
585 // Apply inherited options. 592 // Apply inherited options.
586 options = _toStringMap(_getEmbeddedOptions(info.context)); 593 options = _toStringMap(_getEmbeddedOptions(info));
587 if (options != null) { 594 if (options != null) {
588 configureContextOptions(info.context, options); 595 configureContextOptions(info.context, options);
589 } 596 }
590 } else { 597 } else {
591 // Check for embedded options. 598 // Check for embedded options.
592 Map embeddedOptions = _getEmbeddedOptions(info.context); 599 Map embeddedOptions = _getEmbeddedOptions(info);
593 if (embeddedOptions != null) { 600 if (embeddedOptions != null) {
594 options = _toStringMap(new Merger().merge(embeddedOptions, options)); 601 options = _toStringMap(new Merger().merge(embeddedOptions, options));
595 } 602 }
596 } 603 }
597 604
598 // Notify options processors. 605 // Notify options processors.
599 AnalysisEngine.instance.optionsPlugin.optionsProcessors 606 AnalysisEngine.instance.optionsPlugin.optionsProcessors
600 .forEach((OptionsProcessor p) { 607 .forEach((OptionsProcessor p) {
601 try { 608 try {
602 p.optionsProcessed(info.context, options); 609 p.optionsProcessed(info.context, options);
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 return new PackageMapDisposition(packageMapInfo.packageMap); 1039 return new PackageMapDisposition(packageMapInfo.packageMap);
1033 } 1040 }
1034 } 1041 }
1035 1042
1036 /** 1043 /**
1037 * Create a new empty context associated with [folder], having parent 1044 * Create a new empty context associated with [folder], having parent
1038 * [parent] and using [packagespecFile] to resolve package URI's. 1045 * [parent] and using [packagespecFile] to resolve package URI's.
1039 */ 1046 */
1040 ContextInfo _createContext( 1047 ContextInfo _createContext(
1041 ContextInfo parent, Folder folder, File packagespecFile) { 1048 ContextInfo parent, Folder folder, File packagespecFile) {
1049 List<String> dependencies = <String>[];
1050 FolderDisposition disposition =
1051 _computeFolderDisposition(folder, dependencies.add, packagespecFile);
1042 ContextInfo info = new ContextInfo(this, parent, folder, packagespecFile, 1052 ContextInfo info = new ContextInfo(this, parent, folder, packagespecFile,
1043 normalizedPackageRoots[folder.path]); 1053 normalizedPackageRoots[folder.path], disposition);
1044
1045 FolderDisposition disposition;
1046 List<String> dependencies = <String>[];
1047
1048 // Next resort to a package uri resolver.
1049 if (disposition == null) {
1050 disposition =
1051 _computeFolderDisposition(folder, dependencies.add, packagespecFile);
1052 }
1053 1054
1054 Map<String, Object> optionMap = readOptions(info.folder); 1055 Map<String, Object> optionMap = readOptions(info.folder);
1055 AnalysisOptions options = 1056 AnalysisOptions options =
1056 new AnalysisOptionsImpl.from(defaultContextOptions); 1057 new AnalysisOptionsImpl.from(defaultContextOptions);
1057 applyToAnalysisOptions(options, optionMap); 1058 applyToAnalysisOptions(options, optionMap);
1058 1059
1059 info.setDependencies(dependencies); 1060 info.setDependencies(dependencies);
1060 info.context = callbacks.addContext(folder, options, disposition); 1061 info.context = callbacks.addContext(folder, options, disposition);
1061 folderMap[folder] = info.context; 1062 folderMap[folder] = info.context;
1062 info.context.name = folder.path; 1063 info.context.name = folder.path;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1147 /** 1148 /**
1148 * Set up a [SourceFactory] that resolves packages as appropriate for the 1149 * Set up a [SourceFactory] that resolves packages as appropriate for the
1149 * given [disposition]. 1150 * given [disposition].
1150 */ 1151 */
1151 SourceFactory _createSourceFactory(InternalAnalysisContext context, 1152 SourceFactory _createSourceFactory(InternalAnalysisContext context,
1152 AnalysisOptions options, FolderDisposition disposition, Folder folder) { 1153 AnalysisOptions options, FolderDisposition disposition, Folder folder) {
1153 List<UriResolver> resolvers = []; 1154 List<UriResolver> resolvers = [];
1154 List<UriResolver> packageUriResolvers = 1155 List<UriResolver> packageUriResolvers =
1155 disposition.createPackageUriResolvers(resourceProvider); 1156 disposition.createPackageUriResolvers(resourceProvider);
1156 1157
1157 EmbedderSdk sdk = 1158 EmbedderYamlLocator locator =
1158 new EmbedderSdk(context.embedderYamlLocator.embedderYamls); 1159 disposition.getEmbedderLocator(resourceProvider);
1160 EmbedderSdk sdk = new EmbedderSdk(locator.embedderYamls);
1159 if (sdk.libraryMap.size() == 0) { 1161 if (sdk.libraryMap.size() == 0) {
1160 // The embedder uri resolver has no mappings. Use the default Dart SDK 1162 // The embedder uri resolver has no mappings. Use the default Dart SDK
1161 // uri resolver. 1163 // uri resolver.
1162 resolvers.add(new DartUriResolver(sdkManager.getSdkForOptions(options))); 1164 resolvers.add(new DartUriResolver(sdkManager.getSdkForOptions(options)));
1163 } else { 1165 } else {
1164 // The embedder uri resolver has mappings, use it instead of the default 1166 // The embedder uri resolver has mappings, use it instead of the default
1165 // Dart SDK uri resolver. 1167 // Dart SDK uri resolver.
1166 resolvers.add(new DartUriResolver(sdk)); 1168 resolvers.add(new DartUriResolver(sdk));
1167 } 1169 }
1168 1170
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1236 } 1238 }
1237 return packageSpec; 1239 return packageSpec;
1238 } 1240 }
1239 1241
1240 /// Get analysis options inherited from an `_embedder.yaml` (deprecated) 1242 /// Get analysis options inherited from an `_embedder.yaml` (deprecated)
1241 /// and/or a package specified configuration. If more than one 1243 /// and/or a package specified configuration. If more than one
1242 /// `_embedder.yaml` is associated with the given context, the embedder is 1244 /// `_embedder.yaml` is associated with the given context, the embedder is
1243 /// skipped. 1245 /// skipped.
1244 /// 1246 ///
1245 /// Returns null if there are no embedded/configured options. 1247 /// Returns null if there are no embedded/configured options.
1246 Map _getEmbeddedOptions(AnalysisContext context) { 1248 Map _getEmbeddedOptions(ContextInfo info) {
1247 Map embeddedOptions; 1249 Map embeddedOptions = null;
1250 EmbedderYamlLocator locator =
1251 info.disposition.getEmbedderLocator(resourceProvider);
1252 Iterable<YamlMap> maps = locator.embedderYamls.values;
1253 if (maps.length == 1) {
1254 embeddedOptions = maps.first;
1255 }
1248 1256
1249 if (context is InternalAnalysisContext) { 1257 AnalysisConfiguration configuration = getConfiguration(info.context);
1250 EmbedderYamlLocator locator = context.embedderYamlLocator; 1258 if (configuration != null) {
1251 Iterable<YamlMap> maps = locator.embedderYamls.values; 1259 Map configMap = configuration.options;
1252 if (maps.length == 1) { 1260 if (configMap != null) {
1253 embeddedOptions = maps.first; 1261 if (embeddedOptions != null) {
1254 } 1262 embeddedOptions = new Merger().merge(embeddedOptions, configMap);
1255 1263 } else {
1256 AnalysisConfiguration configuration = getConfiguration(context); 1264 embeddedOptions = configMap;
1257 if (configuration != null) {
1258 Map configMap = configuration.options;
1259 if (configMap != null) {
1260 if (embeddedOptions != null) {
1261 embeddedOptions = new Merger().merge(embeddedOptions, configMap);
1262 } else {
1263 embeddedOptions = configMap;
1264 }
1265 } 1265 }
1266 } 1266 }
1267 } 1267 }
1268
1269 return embeddedOptions; 1268 return embeddedOptions;
1270 } 1269 }
1271 1270
1272 /** 1271 /**
1273 * Return the [ContextInfo] for the "innermost" context whose associated 1272 * Return the [ContextInfo] for the "innermost" context whose associated
1274 * folder is or contains the given path. ("innermost" refers to the nesting 1273 * folder is or contains the given path. ("innermost" refers to the nesting
1275 * of contexts, so if there is a context for path /foo and a context for 1274 * of contexts, so if there is a context for path /foo and a context for
1276 * path /foo/bar, then the innermost context containing /foo/bar/baz.dart is 1275 * path /foo/bar, then the innermost context containing /foo/bar/baz.dart is
1277 * the context for /foo/bar.) 1276 * the context for /foo/bar.)
1278 * 1277 *
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
1690 @override 1689 @override
1691 String get packageRoot => null; 1690 String get packageRoot => null;
1692 1691
1693 @override 1692 @override
1694 Packages get packages => null; 1693 Packages get packages => null;
1695 1694
1696 @override 1695 @override
1697 Iterable<UriResolver> createPackageUriResolvers( 1696 Iterable<UriResolver> createPackageUriResolvers(
1698 ResourceProvider resourceProvider) => 1697 ResourceProvider resourceProvider) =>
1699 <UriResolver>[resolver]; 1698 <UriResolver>[resolver];
1699
1700 @override
1701 EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider) =>
1702 new EmbedderYamlLocator(null);
1700 } 1703 }
1701 1704
1702 /** 1705 /**
1703 * An instance of the class [FolderDisposition] represents the information 1706 * An instance of the class [FolderDisposition] represents the information
1704 * gathered by the [ContextManagerImpl] to determine how to create an 1707 * gathered by the [ContextManagerImpl] to determine how to create an
1705 * [AnalysisContext] for a given folder. 1708 * [AnalysisContext] for a given folder.
1706 * 1709 *
1707 * Note: [ContextManagerImpl] may use equality testing and hash codes to 1710 * Note: [ContextManagerImpl] may use equality testing and hash codes to
1708 * determine when two folders should share the same context, so derived classes 1711 * determine when two folders should share the same context, so derived classes
1709 * may need to override operator== and hashCode() if object identity is 1712 * may need to override operator== and hashCode() if object identity is
(...skipping 20 matching lines...) Expand all
1730 1733
1731 /** 1734 /**
1732 * Create all the [UriResolver]s which should be used to resolve packages in 1735 * Create all the [UriResolver]s which should be used to resolve packages in
1733 * contexts governed by this [FolderDisposition]. 1736 * contexts governed by this [FolderDisposition].
1734 * 1737 *
1735 * [resourceProvider] is provided since it is needed to construct most 1738 * [resourceProvider] is provided since it is needed to construct most
1736 * [UriResolver]s. 1739 * [UriResolver]s.
1737 */ 1740 */
1738 Iterable<UriResolver> createPackageUriResolvers( 1741 Iterable<UriResolver> createPackageUriResolvers(
1739 ResourceProvider resourceProvider); 1742 ResourceProvider resourceProvider);
1743
1744 /**
1745 * Return the locator used to locate the _embedder.yaml file used to configure
1746 * the SDK. The [resourceProvider] is used to access the file system in cases
1747 * where that is necessary.
1748 */
1749 EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider);
1740 } 1750 }
1741 1751
1742 /** 1752 /**
1743 * Concrete [FolderDisposition] object indicating that the context for a given 1753 * Concrete [FolderDisposition] object indicating that the context for a given
1744 * folder should not resolve "package:" URIs at all. 1754 * folder should not resolve "package:" URIs at all.
1745 */ 1755 */
1746 class NoPackageFolderDisposition extends FolderDisposition { 1756 class NoPackageFolderDisposition extends FolderDisposition {
1747 @override 1757 @override
1748 final String packageRoot; 1758 final String packageRoot;
1749 1759
1750 NoPackageFolderDisposition({this.packageRoot}); 1760 NoPackageFolderDisposition({this.packageRoot});
1751 1761
1752 @override 1762 @override
1753 Packages get packages => null; 1763 Packages get packages => null;
1754 1764
1755 @override 1765 @override
1756 Iterable<UriResolver> createPackageUriResolvers( 1766 Iterable<UriResolver> createPackageUriResolvers(
1757 ResourceProvider resourceProvider) => 1767 ResourceProvider resourceProvider) =>
1758 const <UriResolver>[]; 1768 const <UriResolver>[];
1769
1770 @override
1771 EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider) =>
1772 new EmbedderYamlLocator(null);
1759 } 1773 }
1760 1774
1761 /** 1775 /**
1762 * Concrete [FolderDisposition] object indicating that the context for a given 1776 * Concrete [FolderDisposition] object indicating that the context for a given
1763 * folder should resolve packages using a package map. 1777 * folder should resolve packages using a package map.
1764 */ 1778 */
1765 class PackageMapDisposition extends FolderDisposition { 1779 class PackageMapDisposition extends FolderDisposition {
1766 final Map<String, List<Folder>> packageMap; 1780 final Map<String, List<Folder>> packageMap;
1767 1781
1782 EmbedderYamlLocator _embedderLocator;
1783
1768 @override 1784 @override
1769 final String packageRoot; 1785 final String packageRoot;
1770 1786
1771 PackageMapDisposition(this.packageMap, {this.packageRoot}); 1787 PackageMapDisposition(this.packageMap, {this.packageRoot});
1772 1788
1773 @override 1789 @override
1774 Packages get packages => null; 1790 Packages get packages => null;
1775 1791
1776 @override 1792 @override
1777 Iterable<UriResolver> createPackageUriResolvers( 1793 Iterable<UriResolver> createPackageUriResolvers(
1778 ResourceProvider resourceProvider) => 1794 ResourceProvider resourceProvider) =>
1779 <UriResolver>[ 1795 <UriResolver>[
1780 new SdkExtUriResolver(packageMap), 1796 new SdkExtUriResolver(packageMap),
1781 new PackageMapUriResolver(resourceProvider, packageMap) 1797 new PackageMapUriResolver(resourceProvider, packageMap)
1782 ]; 1798 ];
1799
1800 @override
1801 EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider) {
1802 if (_embedderLocator == null) {
1803 _embedderLocator = new EmbedderYamlLocator(packageMap);
1804 }
1805 return _embedderLocator;
1806 }
1783 } 1807 }
1784 1808
1785 /** 1809 /**
1786 * Concrete [FolderDisposition] object indicating that the context for a given 1810 * Concrete [FolderDisposition] object indicating that the context for a given
1787 * folder should resolve packages using a ".packages" file. 1811 * folder should resolve packages using a ".packages" file.
1788 */ 1812 */
1789 class PackagesFileDisposition extends FolderDisposition { 1813 class PackagesFileDisposition extends FolderDisposition {
1790 @override 1814 @override
1791 final Packages packages; 1815 final Packages packages;
1792 1816
1817 Map<String, List<Folder>> packageMap;
1818
1819 EmbedderYamlLocator _embedderLocator;
1820
1793 PackagesFileDisposition(this.packages); 1821 PackagesFileDisposition(this.packages);
1794 1822
1795 @override 1823 @override
1796 String get packageRoot => null; 1824 String get packageRoot => null;
1797 1825
1798 Map<String, List<Folder>> buildPackageMap(ResourceProvider resourceProvider) { 1826 Map<String, List<Folder>> buildPackageMap(ResourceProvider resourceProvider) {
1799 Map<String, List<Folder>> packageMap = <String, List<Folder>>{}; 1827 if (packageMap == null) {
1800 if (packages == null) { 1828 packageMap = <String, List<Folder>>{};
1801 return packageMap; 1829 if (packages != null) {
1830 packages.asMap().forEach((String name, Uri uri) {
1831 if (uri.scheme == 'file' || uri.scheme == '' /* unspecified */) {
1832 var path = resourceProvider.pathContext.fromUri(uri);
1833 packageMap[name] = <Folder>[resourceProvider.getFolder(path)];
1834 }
1835 });
1836 }
1802 } 1837 }
1803 packages.asMap().forEach((String name, Uri uri) {
1804 if (uri.scheme == 'file' || uri.scheme == '' /* unspecified */) {
1805 var path = resourceProvider.pathContext.fromUri(uri);
1806 packageMap[name] = <Folder>[resourceProvider.getFolder(path)];
1807 }
1808 });
1809 return packageMap; 1838 return packageMap;
1810 } 1839 }
1811 1840
1812 @override 1841 @override
1813 Iterable<UriResolver> createPackageUriResolvers( 1842 Iterable<UriResolver> createPackageUriResolvers(
1814 ResourceProvider resourceProvider) { 1843 ResourceProvider resourceProvider) {
1815 if (packages != null) { 1844 if (packages != null) {
1816 // Construct package map for the SdkExtUriResolver. 1845 // Construct package map for the SdkExtUriResolver.
1817 Map<String, List<Folder>> packageMap = buildPackageMap(resourceProvider); 1846 Map<String, List<Folder>> packageMap = buildPackageMap(resourceProvider);
1818 return <UriResolver>[new SdkExtUriResolver(packageMap)]; 1847 return <UriResolver>[new SdkExtUriResolver(packageMap)];
1819 } else { 1848 } else {
1820 return const <UriResolver>[]; 1849 return const <UriResolver>[];
1821 } 1850 }
1822 } 1851 }
1852
1853 @override
1854 EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider) {
1855 if (_embedderLocator == null) {
1856 _embedderLocator =
1857 new EmbedderYamlLocator(buildPackageMap(resourceProvider));
1858 }
1859 return _embedderLocator;
1860 }
1823 } 1861 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/lib/src/analysis_server.dart ('k') | pkg/analysis_server/test/context_manager_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698