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

Side by Side Diff: lib/transformer.dart

Issue 880713002: add LibraryIdentifier (Closed) Base URL: git@github.com:dart-lang/static-init.git@master
Patch Set: code review updates Created 5 years, 10 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
« no previous file with comments | « lib/src/mirror_loader.dart ('k') | pubspec.yaml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 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/src/generated/ast.dart'; 8 import 'package:analyzer/src/generated/ast.dart';
9 import 'package:analyzer/src/generated/element.dart'; 9 import 'package:analyzer/src/generated/element.dart';
10 import 'package:barback/barback.dart'; 10 import 'package:barback/barback.dart';
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 found = true; 235 found = true;
236 }); 236 });
237 return found; 237 return found;
238 } 238 }
239 239
240 String _buildNewEntryPoint(LibraryElement entryLib) { 240 String _buildNewEntryPoint(LibraryElement entryLib) {
241 var importsBuffer = new StringBuffer(); 241 var importsBuffer = new StringBuffer();
242 var initializersBuffer = new StringBuffer(); 242 var initializersBuffer = new StringBuffer();
243 var libraryPrefixes = new Map<LibraryElement, String>(); 243 var libraryPrefixes = new Map<LibraryElement, String>();
244 244
245 // Import the static_loader and original entry point. 245 // Import the static_loader, initializer, and original entry point.
246 importsBuffer 246 importsBuffer
247 .writeln("import 'package:initialize/src/static_loader.dart';"); 247 .writeln("import 'package:initialize/src/static_loader.dart';");
248 importsBuffer.writeln("import 'package:initialize/initialize.dart';");
248 libraryPrefixes[entryLib] = 'i0'; 249 libraryPrefixes[entryLib] = 'i0';
249 250
250 initializersBuffer.writeln(' initializers.addAll(['); 251 initializersBuffer.writeln(' initializers.addAll([');
251 while (_initQueue.isNotEmpty) { 252 while (_initQueue.isNotEmpty) {
252 var next = _initQueue.removeFirst(); 253 var next = _initQueue.removeFirst();
253 254
254 libraryPrefixes.putIfAbsent( 255 libraryPrefixes.putIfAbsent(
255 next.element.library, () => 'i${libraryPrefixes.length}'); 256 next.element.library, () => 'i${libraryPrefixes.length}');
256 libraryPrefixes.putIfAbsent( 257 libraryPrefixes.putIfAbsent(
257 next.annotation.element.library, () => 'i${libraryPrefixes.length}'); 258 next.annotation.element.library, () => 'i${libraryPrefixes.length}');
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 } 294 }
294 295
295 _writeInitializer(_InitializerData data, 296 _writeInitializer(_InitializerData data,
296 Map<LibraryElement, String> libraryPrefixes, StringBuffer buffer) { 297 Map<LibraryElement, String> libraryPrefixes, StringBuffer buffer) {
297 final annotationElement = data.annotation.element; 298 final annotationElement = data.annotation.element;
298 final element = data.element; 299 final element = data.element;
299 300
300 final metaPrefix = libraryPrefixes[annotationElement.library]; 301 final metaPrefix = libraryPrefixes[annotationElement.library];
301 var elementString; 302 var elementString;
302 if (element is LibraryElement) { 303 if (element is LibraryElement) {
303 elementString = '#${element.name}'; 304 var segments = element.source.uri.pathSegments;
305 var package = segments[0];
306 var libraryPath;
307 var packageString;
308 if (_newEntryPoint.package == package &&
309 _newEntryPoint.path.startsWith('${segments[1]}/')) {
310 // reset `package` to null, we will do a relative path in this case.
311 packageString = 'null';
312 libraryPath = path.url.relative(
313 path.url.joinAll(segments.getRange(1, segments.length)),
314 from: path.url.dirname(path.url.join(_newEntryPoint.path)));
315 } else if (segments[1] == 'lib') {
316 packageString = "'$package'";
317 libraryPath = path.url.joinAll(segments.getRange(2, segments.length));
318 } else {
319 _logger.error('Unable to import `${element.source.uri.path}` from '
320 '${_newEntryPoint.path}.');
321 }
322
323 elementString = "const LibraryIdentifier("
324 "#${element.name}, $packageString, '$libraryPath')";
304 } else if (element is ClassElement || element is FunctionElement) { 325 } else if (element is ClassElement || element is FunctionElement) {
305 elementString = 326 elementString =
306 '${libraryPrefixes[data.element.library]}.${element.name}'; 327 '${libraryPrefixes[data.element.library]}.${element.name}';
307 } else { 328 } else {
308 _logger.error('Initializers can only be applied to top level functins, ' 329 _logger.error('Initializers can only be applied to top level functins, '
309 'libraries, and classes.'); 330 'libraries, and classes.');
310 } 331 }
311 332
312 if (annotationElement is ConstructorElement) { 333 if (annotationElement is ConstructorElement) {
313 var node = data.element.node; 334 var node = data.element.node;
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 })).map((import) => import.importedLibrary); 537 })).map((import) => import.importedLibrary);
517 } 538 }
518 539
519 // Element/ElementAnnotation pair. 540 // Element/ElementAnnotation pair.
520 class _InitializerData { 541 class _InitializerData {
521 final Element element; 542 final Element element;
522 final ElementAnnotation annotation; 543 final ElementAnnotation annotation;
523 544
524 _InitializerData(this.element, this.annotation); 545 _InitializerData(this.element, this.annotation);
525 } 546 }
OLDNEW
« no previous file with comments | « lib/src/mirror_loader.dart ('k') | pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698