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

Side by Side Diff: pkg/front_end/lib/src/fasta/source/source_library_builder.dart

Issue 2780543002: Handle complicated imports. (Closed)
Patch Set: Fix infinite loop. Created 3 years, 8 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) 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 fasta.source_library_builder; 5 library fasta.source_library_builder;
6 6
7 import 'package:kernel/ast.dart' show AsyncMarker, ProcedureKind; 7 import 'package:kernel/ast.dart' show AsyncMarker, ProcedureKind;
8 8
9 import '../combinator.dart' show Combinator; 9 import '../combinator.dart' show Combinator;
10 10
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 } 266 }
267 Map<String, Builder> members = currentDeclaration.members; 267 Map<String, Builder> members = currentDeclaration.members;
268 Builder existing = members[name]; 268 Builder existing = members[name];
269 builder.next = existing; 269 builder.next = existing;
270 if (builder is PrefixBuilder && existing is PrefixBuilder) { 270 if (builder is PrefixBuilder && existing is PrefixBuilder) {
271 assert(existing.next == null); 271 assert(existing.next == null);
272 builder.exports.forEach((String name, Builder builder) { 272 builder.exports.forEach((String name, Builder builder) {
273 Builder other = existing.exports.putIfAbsent(name, () => builder); 273 Builder other = existing.exports.putIfAbsent(name, () => builder);
274 if (other != builder) { 274 if (other != builder) {
275 existing.exports[name] = 275 existing.exports[name] =
276 other.combineAmbiguousImport(name, builder, this); 276 buildAmbiguousBuilder(name, other, builder, charOffset);
277 } 277 }
278 }); 278 });
279 return existing; 279 return existing;
280 } else if (isDuplicatedDefinition(existing, builder)) { 280 } else if (isDuplicatedDefinition(existing, builder)) {
281 addCompileTimeError(charOffset, "Duplicated definition of '$name'."); 281 addCompileTimeError(charOffset, "Duplicated definition of '$name'.");
282 } 282 }
283 return members[name] = builder; 283 return members[name] = builder;
284 } 284 }
285 285
286 bool isDuplicatedDefinition(Builder existing, Builder other) { 286 bool isDuplicatedDefinition(Builder existing, Builder other) {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 addBuilder(name, builder, builder.charOffset); 376 addBuilder(name, builder, builder.charOffset);
377 }); 377 });
378 types.addAll(part.types); 378 types.addAll(part.types);
379 constructorReferences.addAll(part.constructorReferences); 379 constructorReferences.addAll(part.constructorReferences);
380 part.partOfLibrary = this; 380 part.partOfLibrary = this;
381 // TODO(ahe): Include metadata from part? 381 // TODO(ahe): Include metadata from part?
382 } 382 }
383 383
384 void buildInitialScopes() { 384 void buildInitialScopes() {
385 members.forEach(addToExportScope); 385 members.forEach(addToExportScope);
386 members.forEach(addToScope); 386 members.forEach((String name, Builder member) {
387 addToScope(name, member, member.charOffset, false);
388 });
387 } 389 }
388 390
389 void addImportsToScope() { 391 void addImportsToScope() {
390 bool explicitCoreImport = this == loader.coreLibrary; 392 bool explicitCoreImport = this == loader.coreLibrary;
391 for (Import import in imports) { 393 for (Import import in imports) {
392 if (import.imported == loader.coreLibrary) { 394 if (import.imported == loader.coreLibrary) {
393 explicitCoreImport = true; 395 explicitCoreImport = true;
394 } 396 }
395 import.finalizeImports(this); 397 import.finalizeImports(this);
396 } 398 }
397 if (!explicitCoreImport) { 399 if (!explicitCoreImport) {
398 loader.coreLibrary.exports.forEach(addToScope); 400 loader.coreLibrary.exports.forEach((String name, Builder member) {
401 addToScope(name, member, -1, true);
402 });
399 } 403 }
400 } 404 }
401 405
402 void addToScope(String name, Builder member) { 406 @override
407 void addToScope(String name, Builder member, int charOffset, bool isImport) {
403 Builder existing = scope.lookup(name, member.charOffset, fileUri); 408 Builder existing = scope.lookup(name, member.charOffset, fileUri);
404 if (existing != null) { 409 if (existing != null) {
405 if (existing != member) { 410 if (existing != member) {
406 scope.local[name] = existing.combineAmbiguousImport(name, member, this); 411 scope.local[name] = buildAmbiguousBuilder(
412 name, existing, member, charOffset,
413 isImport: isImport);
407 } 414 }
408 // TODO(ahe): handle duplicated names.
409 } else { 415 } else {
410 scope.local[name] = member; 416 scope.local[name] = member;
411 } 417 }
412 } 418 }
413 419
414 /// Returns true if the export scope was modified. 420 /// Returns true if the export scope was modified.
415 bool addToExportScope(String name, Builder member) { 421 bool addToExportScope(String name, Builder member) {
416 if (name.startsWith("_")) return false; 422 if (name.startsWith("_")) return false;
417 if (member is PrefixBuilder) return false; 423 if (member is PrefixBuilder) return false;
418 Builder existing = exports[name]; 424 Builder existing = exports[name];
419 if (existing == member) return false; 425 if (existing == member) return false;
420 if (existing != null) { 426 if (existing != null) {
421 exports[name] = buildAmbiguousBuilder(name, existing, member, -1); 427 Builder result =
428 buildAmbiguousBuilder(name, existing, member, -1, isExport: true);
429 exports[name] = result;
430 return result != existing;
422 } else { 431 } else {
423 exports[name] = member; 432 exports[name] = member;
424 } 433 }
425 return true; 434 return true;
426 } 435 }
427 436
428 int resolveTypes(_) { 437 int resolveTypes(_) {
429 int typeCount = types.length; 438 int typeCount = types.length;
430 for (T t in types) { 439 for (T t in types) {
431 t.resolveIn(scope); 440 t.resolveIn(scope);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 } 536 }
528 537
529 /// Called to register [procedure] as a factory whose types are collected in 538 /// Called to register [procedure] as a factory whose types are collected in
530 /// [factoryDeclaration]. Later, once the class has been built, we can 539 /// [factoryDeclaration]. Later, once the class has been built, we can
531 /// synthesize type variables on the factory matching the class'. 540 /// synthesize type variables on the factory matching the class'.
532 void addFactoryDeclaration( 541 void addFactoryDeclaration(
533 ProcedureBuilder procedure, DeclarationBuilder<T> factoryDeclaration) { 542 ProcedureBuilder procedure, DeclarationBuilder<T> factoryDeclaration) {
534 factoryDeclarations[procedure] = factoryDeclaration; 543 factoryDeclarations[procedure] = factoryDeclaration;
535 } 544 }
536 } 545 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart ('k') | tests/language/language_kernel.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698