| OLD | NEW |
| 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 library initialize.transformer; | 4 library initialize.transformer; |
| 5 | 5 |
| 6 import 'dart:async'; | 6 import 'dart:async'; |
| 7 import 'dart:collection' show Queue; | 7 import 'dart:collection' show Queue; |
| 8 import 'package:analyzer/dart/ast/ast.dart'; | 8 import 'package:analyzer/dart/ast/ast.dart'; |
| 9 import 'package:analyzer/dart/element/element.dart'; | 9 import 'package:analyzer/dart/element/element.dart'; |
| 10 import 'package:analyzer/dart/element/type.dart'; | 10 import 'package:analyzer/dart/element/type.dart'; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 } | 122 } |
| 123 | 123 |
| 124 return uriToAssetId( | 124 return uriToAssetId( |
| 125 entryPoint, src, transform.logger, scripts[0].sourceSpan); | 125 entryPoint, src, transform.logger, scripts[0].sourceSpan); |
| 126 } | 126 } |
| 127 | 127 |
| 128 // Replaces script tags pointing to [originalDartFile] with [newDartFile] in | 128 // Replaces script tags pointing to [originalDartFile] with [newDartFile] in |
| 129 // [entryPoint]. | 129 // [entryPoint]. |
| 130 void _replaceEntryWithBootstrap(Transform transform, dom.Document document, | 130 void _replaceEntryWithBootstrap(Transform transform, dom.Document document, |
| 131 AssetId entryPoint, AssetId originalDartFile, AssetId newDartFile) { | 131 AssetId entryPoint, AssetId originalDartFile, AssetId newDartFile) { |
| 132 var scripts = _getScripts(document) | 132 var scripts = _getScripts(document).where((script) { |
| 133 .where((script) { | |
| 134 var assetId = uriToAssetId(entryPoint, _getScriptAttribute(script), | 133 var assetId = uriToAssetId(entryPoint, _getScriptAttribute(script), |
| 135 transform.logger, script.sourceSpan); | 134 transform.logger, script.sourceSpan); |
| 136 return assetId == originalDartFile; | 135 return assetId == originalDartFile; |
| 137 }).toList(); | 136 }).toList(); |
| 138 | 137 |
| 139 if (scripts.length != 1) { | 138 if (scripts.length != 1) { |
| 140 transform.logger | 139 transform.logger |
| 141 .error('Expected exactly one script pointing to $originalDartFile in ' | 140 .error('Expected exactly one script pointing to $originalDartFile in ' |
| 142 '$entryPoint, but found ${scripts.length}.'); | 141 '$entryPoint, but found ${scripts.length}.'); |
| 143 return; | 142 return; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 readSuperClassAnnotations(superClass.superclass); | 250 readSuperClassAnnotations(superClass.superclass); |
| 252 if (_readAnnotations(superClass.element) && | 251 if (_readAnnotations(superClass.element) && |
| 253 superClass.element.library != clazz.library) { | 252 superClass.element.library != clazz.library) { |
| 254 _logger.warning( | 253 _logger.warning( |
| 255 'We have detected a cycle in your import graph when running ' | 254 'We have detected a cycle in your import graph when running ' |
| 256 'initializers on ${clazz.name}. This means the super class ' | 255 'initializers on ${clazz.name}. This means the super class ' |
| 257 '${superClass.name} has a dependency on this library ' | 256 '${superClass.name} has a dependency on this library ' |
| 258 '(possibly transitive).'); | 257 '(possibly transitive).'); |
| 259 } | 258 } |
| 260 } | 259 } |
| 260 |
| 261 readSuperClassAnnotations(clazz.supertype); | 261 readSuperClassAnnotations(clazz.supertype); |
| 262 _readAnnotations(clazz); | 262 _readAnnotations(clazz); |
| 263 } | 263 } |
| 264 } | 264 } |
| 265 | 265 |
| 266 bool _readAnnotations(Element element) { | 266 bool _readAnnotations(Element element) { |
| 267 var found = false; | 267 var found = false; |
| 268 // analyzer 0.29 doesn't allow this optimization : | 268 // analyzer 0.29 doesn't allow this optimization : |
| 269 //if (element.metadata.isEmpty) return found; | 269 //if (element.metadata.isEmpty) return found; |
| 270 | 270 |
| 271 var metaNodes; | 271 var metaNodes; |
| 272 var node = element.computeNode(); | 272 var node = element.computeNode(); |
| 273 if (node is SimpleIdentifier && node.parent is LibraryIdentifier) { | 273 if (node is SimpleIdentifier && node.parent is LibraryIdentifier) { |
| 274 metaNodes = node.parent.parent.metadata; | 274 metaNodes = (node.parent.parent as AnnotatedNode).metadata; |
| 275 } else if (node is ClassDeclaration || node is FunctionDeclaration) { | 275 } else if (node is ClassDeclaration || node is FunctionDeclaration) { |
| 276 metaNodes = node.metadata; | 276 metaNodes = (node as AnnotatedNode).metadata; |
| 277 } else { | 277 } else { |
| 278 return found; | 278 return found; |
| 279 } | 279 } |
| 280 | 280 |
| 281 metaNodes.where((Annotation metaNode) { | 281 metaNodes.where((Annotation metaNode) { |
| 282 // First filter out anything that is not a Initializer. | 282 // First filter out anything that is not a Initializer. |
| 283 var meta = metaNode.elementAnnotation; | 283 var meta = metaNode.elementAnnotation; |
| 284 var e = meta.element; | 284 var e = meta.element; |
| 285 if (e is PropertyAccessorElement) { | 285 if (e is PropertyAccessorElement) { |
| 286 return _isInitializer(e.variable.evaluationResult.value.type); | 286 // 'as dynamic' is because evaluationResult is a property on an impl cla
ss, e.g. one that |
| 287 // isn't supposed to be used externally. |
| 288 return _isInitializer( |
| 289 (e.variable as dynamic).evaluationResult.value.type); |
| 287 } else if (e is ConstructorElement) { | 290 } else if (e is ConstructorElement) { |
| 288 return _isInitializer(e.returnType); | 291 return _isInitializer(e.returnType); |
| 289 } | 292 } |
| 290 return false; | 293 return false; |
| 291 }).where((Annotation metaNode) { | 294 }).where((Annotation metaNode) { |
| 292 var meta = metaNode.elementAnnotation; | 295 var meta = metaNode.elementAnnotation; |
| 293 _seenAnnotations.putIfAbsent(element, () => new Set<ElementAnnotation>()); | 296 _seenAnnotations.putIfAbsent(element, () => new Set<ElementAnnotation>()); |
| 294 return !_seenAnnotations[element].contains(meta); | 297 return !_seenAnnotations[element].contains(meta); |
| 295 }).forEach((Annotation metaNode) { | 298 }).forEach((Annotation metaNode) { |
| 296 var meta = metaNode.elementAnnotation; | 299 var meta = metaNode.elementAnnotation; |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 error = false; | 491 error = false; |
| 489 } else { | 492 } else { |
| 490 error = true; | 493 error = true; |
| 491 } | 494 } |
| 492 if (error) { | 495 if (error) { |
| 493 print('Bad value for "$field" in the initialize transformer. ' | 496 print('Bad value for "$field" in the initialize transformer. ' |
| 494 'Expected either one String or a list of Strings.'); | 497 'Expected either one String or a list of Strings.'); |
| 495 } | 498 } |
| 496 return files; | 499 return files; |
| 497 } | 500 } |
| OLD | NEW |