Chromium Code Reviews| 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 |