OLD | NEW |
---|---|
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 dart2js.serialization_helper; | 5 library dart2js.serialization_helper; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:io'; | 8 import 'dart:io'; |
9 | 9 |
10 import 'package:compiler/src/commandline_options.dart'; | 10 import 'package:compiler/src/commandline_options.dart'; |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
224 script.file = newScript.file; | 224 script.file = newScript.file; |
225 _resolvedAstDeserializer.sourceFiles[script.resourceUri] = | 225 _resolvedAstDeserializer.sourceFiles[script.resourceUri] = |
226 newScript.file; | 226 newScript.file; |
227 }); | 227 }); |
228 }).then((_) => library); | 228 }).then((_) => library); |
229 } | 229 } |
230 return new Future<LibraryElement>.value(library); | 230 return new Future<LibraryElement>.value(library); |
231 } | 231 } |
232 | 232 |
233 @override | 233 @override |
234 bool hasResolvedAst(ExecutableElement element) { | 234 bool hasResolvedAst(ExecutableElement element) { |
Siggi Cherem (dart-lang)
2016/05/13 19:43:51
I wonder if we can get rid of `hasResovledAst` now
Johnni Winther
2016/05/17 11:59:52
Soon. Adding a TODO.
| |
235 return _resolvedAstDeserializer.hasResolvedAst(element); | 235 return getResolvedAst(element) != null; |
236 } | 236 } |
237 | 237 |
238 @override | 238 @override |
239 ResolvedAst getResolvedAst(ExecutableElement element) { | 239 ResolvedAst getResolvedAst(ExecutableElement element) { |
240 if (element.hasResolvedAst) { | |
241 return element.resolvedAst; | |
242 } | |
240 return _resolvedAstDeserializer.getResolvedAst(element); | 243 return _resolvedAstDeserializer.getResolvedAst(element); |
241 } | 244 } |
242 | 245 |
243 @override | 246 @override |
244 bool hasResolutionImpact(Element element) { | 247 bool hasResolutionImpact(Element element) { |
245 if (element.isConstructor && | 248 if (element.isConstructor && |
246 element.enclosingClass.isUnnamedMixinApplication) { | 249 element.enclosingClass.isUnnamedMixinApplication) { |
247 return true; | 250 return true; |
248 } | 251 } |
249 return _resolutionImpactDeserializer.impactMap.containsKey(element); | 252 return _resolutionImpactDeserializer.impactMap.containsKey(element); |
(...skipping 18 matching lines...) Expand all Loading... | |
268 }); | 271 }); |
269 } | 272 } |
270 return _resolutionImpactDeserializer.impactMap[element]; | 273 return _resolutionImpactDeserializer.impactMap[element]; |
271 } | 274 } |
272 | 275 |
273 @override | 276 @override |
274 WorldImpact computeWorldImpact(Element element) { | 277 WorldImpact computeWorldImpact(Element element) { |
275 ResolutionImpact resolutionImpact = getResolutionImpact(element); | 278 ResolutionImpact resolutionImpact = getResolutionImpact(element); |
276 assert(invariant(element, resolutionImpact != null, | 279 assert(invariant(element, resolutionImpact != null, |
277 message: 'No impact found for $element (${element.library})')); | 280 message: 'No impact found for $element (${element.library})')); |
281 if (element is ExecutableElement) { | |
282 getResolvedAst(element); | |
283 } | |
278 return _impactTransformer.transformResolutionImpact(resolutionImpact); | 284 return _impactTransformer.transformResolutionImpact(resolutionImpact); |
279 } | 285 } |
280 | 286 |
281 @override | 287 @override |
282 bool isDeserialized(Element element) { | 288 bool isDeserialized(Element element) { |
283 return deserializedLibraries.contains(element.library); | 289 return deserializedLibraries.contains(element.library); |
284 } | 290 } |
285 } | 291 } |
286 | 292 |
287 const String RESOLVED_AST_TAG = 'resolvedAst'; | 293 const String RESOLVED_AST_TAG = 'resolvedAst'; |
(...skipping 19 matching lines...) Expand all Loading... | |
307 nativeDataSerializer).serialize(); | 313 nativeDataSerializer).serialize(); |
308 } | 314 } |
309 } | 315 } |
310 } | 316 } |
311 | 317 |
312 class ResolvedAstDeserializerPlugin extends DeserializerPlugin { | 318 class ResolvedAstDeserializerPlugin extends DeserializerPlugin { |
313 final ParsingContext parsingContext; | 319 final ParsingContext parsingContext; |
314 final DeserializerPlugin nativeDataDeserializer; | 320 final DeserializerPlugin nativeDataDeserializer; |
315 final Map<Uri, SourceFile> sourceFiles = <Uri, SourceFile>{}; | 321 final Map<Uri, SourceFile> sourceFiles = <Uri, SourceFile>{}; |
316 | 322 |
317 Map<ExecutableElement, ResolvedAst> _resolvedAstMap = | |
318 <ExecutableElement, ResolvedAst>{}; | |
319 Map<MemberElement, ObjectDecoder> _decoderMap = | 323 Map<MemberElement, ObjectDecoder> _decoderMap = |
320 <MemberElement, ObjectDecoder>{}; | 324 <MemberElement, ObjectDecoder>{}; |
321 Map<Uri, Token> beginTokenMap = <Uri, Token>{}; | 325 Map<Uri, Token> beginTokenMap = <Uri, Token>{}; |
322 | 326 |
323 ResolvedAstDeserializerPlugin( | 327 ResolvedAstDeserializerPlugin( |
324 this.parsingContext, this.nativeDataDeserializer); | 328 this.parsingContext, this.nativeDataDeserializer); |
325 | 329 |
326 bool hasResolvedAst(ExecutableElement element) { | 330 bool hasResolvedAst(ExecutableElement element) { |
327 return _resolvedAstMap.containsKey(element) || | 331 return getResolvedAst(element) != null; |
328 _decoderMap.containsKey(element.memberContext); | |
329 } | 332 } |
330 | 333 |
331 ResolvedAst getResolvedAst(ExecutableElement element) { | 334 ResolvedAst getResolvedAst(ExecutableElement element) { |
332 ResolvedAst resolvedAst = _resolvedAstMap[element]; | 335 if (element.hasResolvedAst) { |
Siggi Cherem (dart-lang)
2016/05/13 19:43:51
correct me if I'm wrong, Is this always called fro
Johnni Winther
2016/05/17 11:59:51
Done.
| |
333 if (resolvedAst == null) { | 336 return element.resolvedAst; |
334 ObjectDecoder decoder = _decoderMap[element.memberContext]; | |
335 if (decoder != null) { | |
336 ResolvedAstDeserializer.deserialize( | |
337 element.memberContext, decoder, parsingContext, findToken, | |
338 nativeDataDeserializer, | |
339 _resolvedAstMap); | |
340 _decoderMap.remove(element); | |
341 resolvedAst = _resolvedAstMap[element]; | |
342 } | |
343 } | 337 } |
344 return resolvedAst; | 338 |
339 ObjectDecoder decoder = _decoderMap[element.memberContext]; | |
340 if (decoder != null) { | |
341 ResolvedAstDeserializer.deserialize( | |
342 element.memberContext, decoder, parsingContext, findToken, | |
343 nativeDataDeserializer); | |
344 _decoderMap.remove(element); | |
345 return element.resolvedAst; | |
Siggi Cherem (dart-lang)
2016/05/13 19:43:51
could we assert here that element.resolvedAst != n
Johnni Winther
2016/05/17 11:59:52
Done.
| |
346 } | |
347 return null; | |
345 } | 348 } |
346 | 349 |
347 Token findToken(Uri uri, int offset) { | 350 Token findToken(Uri uri, int offset) { |
348 Token beginToken = beginTokenMap.putIfAbsent(uri, () { | 351 Token beginToken = beginTokenMap.putIfAbsent(uri, () { |
349 SourceFile sourceFile = sourceFiles[uri]; | 352 SourceFile sourceFile = sourceFiles[uri]; |
350 if (sourceFile == null) { | 353 if (sourceFile == null) { |
351 throw 'No source file found for $uri in:\n ' | 354 throw 'No source file found for $uri in:\n ' |
352 '${sourceFiles.keys.join('\n ')}'; | 355 '${sourceFiles.keys.join('\n ')}'; |
353 } | 356 } |
354 return new Scanner(sourceFile).tokenize(); | 357 return new Scanner(sourceFile).tokenize(); |
355 }); | 358 }); |
356 return ResolvedAstDeserializer.findTokenInStream(beginToken, offset); | 359 return ResolvedAstDeserializer.findTokenInStream(beginToken, offset); |
357 } | 360 } |
358 | 361 |
359 @override | 362 @override |
360 void onElement(Element element, ObjectDecoder getDecoder(String tag)) { | 363 void onElement(Element element, ObjectDecoder getDecoder(String tag)) { |
361 ObjectDecoder decoder = getDecoder(RESOLVED_AST_TAG); | 364 ObjectDecoder decoder = getDecoder(RESOLVED_AST_TAG); |
362 if (decoder != null) { | 365 if (decoder != null) { |
363 _decoderMap[element] = decoder; | 366 _decoderMap[element] = decoder; |
364 } | 367 } |
365 } | 368 } |
366 } | 369 } |
367 | 370 |
OLD | NEW |