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

Side by Side Diff: pkg/analyzer/lib/src/context/source.dart

Issue 2015513003: Optimize more megamorphic dispatch sites (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) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 analyzer.src.context.source; 5 library analyzer.src.context.source;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/file_system/file_system.dart'; 9 import 'package:analyzer/file_system/file_system.dart';
10 import 'package:analyzer/file_system/physical_file_system.dart'; 10 import 'package:analyzer/file_system/physical_file_system.dart';
11 import 'package:analyzer/source/package_map_resolver.dart'; 11 import 'package:analyzer/source/package_map_resolver.dart';
12 import 'package:analyzer/src/generated/engine.dart'; 12 import 'package:analyzer/src/generated/engine.dart';
13 import 'package:analyzer/src/generated/java_core.dart'; 13 import 'package:analyzer/src/generated/java_core.dart';
14 import 'package:analyzer/src/generated/java_engine.dart'; 14 import 'package:analyzer/src/generated/java_engine.dart';
15 import 'package:analyzer/src/generated/sdk.dart'; 15 import 'package:analyzer/src/generated/sdk.dart';
16 import 'package:analyzer/src/generated/source.dart'; 16 import 'package:analyzer/src/generated/source.dart';
17 import 'package:analyzer/src/generated/utilities_dart.dart' as utils; 17 import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
18 import 'package:analyzer/src/util/fast_uri.dart'; 18 import 'package:analyzer/src/util/fast_uri.dart';
19 import 'package:package_config/packages.dart'; 19 import 'package:package_config/packages.dart';
20 20
21 /** 21 /**
22 * Instances of the class `SourceFactory` resolve possibly relative URI's 22 * Instances of the class `SourceFactory` resolve possibly relative URI's
23 * against an existing [Source]. 23 * against an existing [Source].
24 */ 24 */
25 class SourceFactoryImpl implements SourceFactory { 25 class SourceFactoryImpl implements SourceFactory {
26 /**
27 * The analysis context that this source factory is associated with.
28 */
29 @override 26 @override
30 AnalysisContext context; 27 AnalysisContext context;
31 28
32 /** 29 /**
33 * URI processor used to find mappings for `package:` URIs found in a 30 * URI processor used to find mappings for `package:` URIs found in a
34 * `.packages` config file. 31 * `.packages` config file.
35 */ 32 */
36 final Packages _packages; 33 final Packages _packages;
37 34
38 /** 35 /**
(...skipping 19 matching lines...) Expand all
58 55
59 /** 56 /**
60 * Initialize a newly created source factory with the given absolute URI 57 * Initialize a newly created source factory with the given absolute URI
61 * [resolvers] and optional [_packages] resolution helper. 58 * [resolvers] and optional [_packages] resolution helper.
62 */ 59 */
63 SourceFactoryImpl(this.resolvers, 60 SourceFactoryImpl(this.resolvers,
64 [this._packages, ResourceProvider resourceProvider]) 61 [this._packages, ResourceProvider resourceProvider])
65 : _resourceProvider = 62 : _resourceProvider =
66 resourceProvider ?? PhysicalResourceProvider.INSTANCE; 63 resourceProvider ?? PhysicalResourceProvider.INSTANCE;
67 64
68 /**
69 * Return the [DartSdk] associated with this [SourceFactory], or `null` if
70 * there is no such SDK.
71 *
72 * @return the [DartSdk] associated with this [SourceFactory], or `null` if
73 * there is no such SDK
74 */
75 @override 65 @override
76 DartSdk get dartSdk { 66 DartSdk get dartSdk {
77 for (UriResolver resolver in resolvers) { 67 List<UriResolver> resolvers = this.resolvers;
68 int length = resolvers.length;
69 for (int i = 0; i < length; i++) {
70 UriResolver resolver = resolvers[i];
78 if (resolver is DartUriResolver) { 71 if (resolver is DartUriResolver) {
79 DartUriResolver dartUriResolver = resolver; 72 DartUriResolver dartUriResolver = resolver;
80 return dartUriResolver.dartSdk; 73 return dartUriResolver.dartSdk;
81 } 74 }
82 } 75 }
83 return null; 76 return null;
84 } 77 }
85 78
86 /**
87 * Sets the [LocalSourcePredicate].
88 *
89 * @param localSourcePredicate the predicate to determine is [Source] is local
90 */
91 @override 79 @override
92 void set localSourcePredicate(LocalSourcePredicate localSourcePredicate) { 80 void set localSourcePredicate(LocalSourcePredicate localSourcePredicate) {
93 this._localSourcePredicate = localSourcePredicate; 81 this._localSourcePredicate = localSourcePredicate;
94 } 82 }
95 83
96 /// A table mapping package names to paths of directories containing
97 /// the package (or [null] if there is no registered package URI resolver).
98 @override 84 @override
99 Map<String, List<Folder>> get packageMap { 85 Map<String, List<Folder>> get packageMap {
100 // Start by looking in .packages. 86 // Start by looking in .packages.
101 if (_packages != null) { 87 if (_packages != null) {
102 Map<String, List<Folder>> packageMap = <String, List<Folder>>{}; 88 Map<String, List<Folder>> packageMap = <String, List<Folder>>{};
103 _packages.asMap().forEach((String name, Uri uri) { 89 _packages.asMap().forEach((String name, Uri uri) {
104 if (uri.scheme == 'file' || uri.scheme == '' /* unspecified */) { 90 if (uri.scheme == 'file' || uri.scheme == '' /* unspecified */) {
105 packageMap[name] = <Folder>[ 91 packageMap[name] = <Folder>[
106 _resourceProvider.getFolder(uri.toFilePath()) 92 _resourceProvider.getFolder(uri.toFilePath())
107 ]; 93 ];
108 } 94 }
109 }); 95 });
110 return packageMap; 96 return packageMap;
111 } 97 }
112 98
113 // Default to the PackageMapUriResolver. 99 // Default to the PackageMapUriResolver.
114 PackageMapUriResolver resolver = resolvers 100 PackageMapUriResolver resolver = resolvers
115 .firstWhere((r) => r is PackageMapUriResolver, orElse: () => null); 101 .firstWhere((r) => r is PackageMapUriResolver, orElse: () => null);
116 return resolver?.packageMap; 102 return resolver?.packageMap;
117 } 103 }
118 104
119 /**
120 * Return a source factory that will resolve URI's in the same way that this
121 * source factory does.
122 */
123 @override 105 @override
124 SourceFactory clone() { 106 SourceFactory clone() {
125 SourceFactory factory = 107 SourceFactory factory =
126 new SourceFactory(resolvers, _packages, _resourceProvider); 108 new SourceFactory(resolvers, _packages, _resourceProvider);
127 factory.localSourcePredicate = _localSourcePredicate; 109 factory.localSourcePredicate = _localSourcePredicate;
128 return factory; 110 return factory;
129 } 111 }
130 112
131 /**
132 * Return a source object representing the given absolute URI, or `null` if
133 * the URI is not a valid URI or if it is not an absolute URI.
134 *
135 * @param absoluteUri the absolute URI to be resolved
136 * @return a source object representing the absolute URI
137 */
138 @override 113 @override
139 Source forUri(String absoluteUri) { 114 Source forUri(String absoluteUri) {
140 try { 115 try {
141 Uri uri = FastUri.parse(absoluteUri); 116 Uri uri = FastUri.parse(absoluteUri);
142 if (uri.isAbsolute) { 117 if (uri.isAbsolute) {
143 return _internalResolveUri(null, uri); 118 return _internalResolveUri(null, uri);
144 } 119 }
145 } catch (exception, stackTrace) { 120 } catch (exception, stackTrace) {
146 AnalysisEngine.instance.logger.logError( 121 AnalysisEngine.instance.logger.logError(
147 "Could not resolve URI: $absoluteUri", 122 "Could not resolve URI: $absoluteUri",
148 new CaughtException(exception, stackTrace)); 123 new CaughtException(exception, stackTrace));
149 } 124 }
150 return null; 125 return null;
151 } 126 }
152 127
153 /**
154 * Return a source object representing the given absolute URI, or `null` if
155 * the URI is not an absolute URI.
156 *
157 * @param absoluteUri the absolute URI to be resolved
158 * @return a source object representing the absolute URI
159 */
160 @override 128 @override
161 Source forUri2(Uri absoluteUri) { 129 Source forUri2(Uri absoluteUri) {
162 if (absoluteUri.isAbsolute) { 130 if (absoluteUri.isAbsolute) {
163 try { 131 try {
164 return _internalResolveUri(null, absoluteUri); 132 return _internalResolveUri(null, absoluteUri);
165 } on AnalysisException catch (exception, stackTrace) { 133 } on AnalysisException catch (exception, stackTrace) {
166 AnalysisEngine.instance.logger.logError( 134 AnalysisEngine.instance.logger.logError(
167 "Could not resolve URI: $absoluteUri", 135 "Could not resolve URI: $absoluteUri",
168 new CaughtException(exception, stackTrace)); 136 new CaughtException(exception, stackTrace));
169 } 137 }
170 } 138 }
171 return null; 139 return null;
172 } 140 }
173 141
174 /**
175 * Return a source object that is equal to the source object used to obtain
176 * the given encoding.
177 *
178 * @param encoding the encoding of a source object
179 * @return a source object that is described by the given encoding
180 * @throws IllegalArgumentException if the argument is not a valid encoding
181 * See [Source.encoding].
182 */
183 @override 142 @override
184 Source fromEncoding(String encoding) { 143 Source fromEncoding(String encoding) {
185 Source source = forUri(encoding); 144 Source source = forUri(encoding);
186 if (source == null) { 145 if (source == null) {
187 throw new IllegalArgumentException( 146 throw new IllegalArgumentException(
188 "Invalid source encoding: '$encoding'"); 147 "Invalid source encoding: '$encoding'");
189 } 148 }
190 return source; 149 return source;
191 } 150 }
192 151
193 /**
194 * Determines if the given [Source] is local.
195 *
196 * @param source the [Source] to analyze
197 * @return `true` if the given [Source] is local
198 */
199 @override 152 @override
200 bool isLocalSource(Source source) => _localSourcePredicate.isLocal(source); 153 bool isLocalSource(Source source) => _localSourcePredicate.isLocal(source);
201 154
202 /**
203 * Return a source representing the URI that results from resolving the given
204 * (possibly relative) [containedUri] against the URI associated with the
205 * [containingSource], whether or not the resulting source exists, or `null`
206 * if either the [containedUri] is invalid or if it cannot be resolved against
207 * the [containingSource]'s URI.
208 */
209 @override 155 @override
210 Source resolveUri(Source containingSource, String containedUri) { 156 Source resolveUri(Source containingSource, String containedUri) {
211 if (containedUri == null || containedUri.isEmpty) { 157 if (containedUri == null || containedUri.isEmpty) {
212 return null; 158 return null;
213 } 159 }
214 try { 160 try {
215 // Force the creation of an escaped URI to deal with spaces, etc. 161 // Force the creation of an escaped URI to deal with spaces, etc.
216 return _internalResolveUri(containingSource, FastUri.parse(containedUri)); 162 return _internalResolveUri(containingSource, FastUri.parse(containedUri));
217 } on URISyntaxException { 163 } on URISyntaxException {
218 return null; 164 return null;
219 } catch (exception, stackTrace) { 165 } catch (exception, stackTrace) {
220 String containingFullName = 166 String containingFullName =
221 containingSource != null ? containingSource.fullName : '<null>'; 167 containingSource != null ? containingSource.fullName : '<null>';
222 AnalysisEngine.instance.logger.logInformation( 168 AnalysisEngine.instance.logger.logInformation(
223 "Could not resolve URI ($containedUri) " 169 "Could not resolve URI ($containedUri) "
224 "relative to source ($containingFullName)", 170 "relative to source ($containingFullName)",
225 new CaughtException(exception, stackTrace)); 171 new CaughtException(exception, stackTrace));
226 return null; 172 return null;
227 } 173 }
228 } 174 }
229 175
230 /**
231 * Return an absolute URI that represents the given source, or `null` if a
232 * valid URI cannot be computed.
233 *
234 * @param source the source to get URI for
235 * @return the absolute URI representing the given source
236 */
237 @override 176 @override
238 Uri restoreUri(Source source) { 177 Uri restoreUri(Source source) {
239 // First see if a resolver can restore the URI. 178 // First see if a resolver can restore the URI.
240 for (UriResolver resolver in resolvers) { 179 for (UriResolver resolver in resolvers) {
241 Uri uri = resolver.restoreAbsolute(source); 180 Uri uri = resolver.restoreAbsolute(source);
242 if (uri != null) { 181 if (uri != null) {
243 // Now see if there's a package mapping. 182 // Now see if there's a package mapping.
244 Uri packageMappedUri = _getPackageMapping(uri); 183 Uri packageMappedUri = _getPackageMapping(uri);
245 if (packageMappedUri != null) { 184 if (packageMappedUri != null) {
246 return packageMappedUri; 185 return packageMappedUri;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 for (UriResolver resolver in resolvers) { 261 for (UriResolver resolver in resolvers) {
323 Source result = resolver.resolveAbsolute(containedUri, actualUri); 262 Source result = resolver.resolveAbsolute(containedUri, actualUri);
324 if (result != null) { 263 if (result != null) {
325 return result; 264 return result;
326 } 265 }
327 } 266 }
328 return null; 267 return null;
329 }); 268 });
330 } 269 }
331 } 270 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698