| 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 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 | 43 |
| 44 final List<ConstructorReferenceBuilder> constructorReferences = | 44 final List<ConstructorReferenceBuilder> constructorReferences = |
| 45 <ConstructorReferenceBuilder>[]; | 45 <ConstructorReferenceBuilder>[]; |
| 46 | 46 |
| 47 final List<SourceLibraryBuilder<T, R>> parts = <SourceLibraryBuilder<T, R>>[]; | 47 final List<SourceLibraryBuilder<T, R>> parts = <SourceLibraryBuilder<T, R>>[]; |
| 48 | 48 |
| 49 final List<Import> imports = <Import>[]; | 49 final List<Import> imports = <Import>[]; |
| 50 | 50 |
| 51 final Map<String, Builder> exports = <String, Builder>{}; | 51 final Map<String, Builder> exports = <String, Builder>{}; |
| 52 | 52 |
| 53 final Scope scope = new Scope(<String, Builder>{}, null, isModifiable: false); | 53 final Scope scope = new Scope.top(); |
| 54 | 54 |
| 55 final Uri fileUri; | 55 final Uri fileUri; |
| 56 | 56 |
| 57 final List<List> implementationBuilders = <List<List>>[]; | 57 final List<List> implementationBuilders = <List<List>>[]; |
| 58 | 58 |
| 59 String name; | 59 String name; |
| 60 | 60 |
| 61 String partOfName; | 61 String partOfName; |
| 62 | 62 |
| 63 Uri partOfUri; | 63 Uri partOfUri; |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 // extends Object with Mixin {}` in the same library. | 296 // extends Object with Mixin {}` in the same library. |
| 297 return !existing.isMixinApplication || !other.isMixinApplication; | 297 return !existing.isMixinApplication || !other.isMixinApplication; |
| 298 } | 298 } |
| 299 return true; | 299 return true; |
| 300 } | 300 } |
| 301 | 301 |
| 302 void buildBuilder(Builder builder); | 302 void buildBuilder(Builder builder); |
| 303 | 303 |
| 304 R build() { | 304 R build() { |
| 305 assert(implementationBuilders.isEmpty); | 305 assert(implementationBuilders.isEmpty); |
| 306 members.forEach((String name, Builder builder) { | 306 forEach((String name, Builder builder) { |
| 307 do { | 307 do { |
| 308 buildBuilder(builder); | 308 buildBuilder(builder); |
| 309 builder = builder.next; | 309 builder = builder.next; |
| 310 } while (builder != null); | 310 } while (builder != null); |
| 311 }); | 311 }); |
| 312 for (List list in implementationBuilders) { | 312 for (List list in implementationBuilders) { |
| 313 String name = list[0]; | 313 String name = list[0]; |
| 314 Builder builder = list[1]; | 314 Builder builder = list[1]; |
| 315 int charOffset = list[2]; | 315 int charOffset = list[2]; |
| 316 addBuilder(name, builder, charOffset); | 316 addBuilder(name, builder, charOffset); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 if (part.partOfName != name && part.partOfUri != uri) { | 362 if (part.partOfName != name && part.partOfUri != uri) { |
| 363 String partName = part.partOfName ?? "${part.partOfUri}"; | 363 String partName = part.partOfName ?? "${part.partOfUri}"; |
| 364 String myName = name == null ? "'$uri'" : "'${name}' ($uri)"; | 364 String myName = name == null ? "'$uri'" : "'${name}' ($uri)"; |
| 365 addWarning( | 365 addWarning( |
| 366 -1, | 366 -1, |
| 367 "Using '${part.fileUri}' as part of '$myName' but it's 'part of'" | 367 "Using '${part.fileUri}' as part of '$myName' but it's 'part of'" |
| 368 " declaration says '$partName'."); | 368 " declaration says '$partName'."); |
| 369 // The part is still included. | 369 // The part is still included. |
| 370 } | 370 } |
| 371 } | 371 } |
| 372 part.members.forEach((String name, Builder builder) { | 372 part.forEach((String name, Builder builder) { |
| 373 if (builder.next != null) { | 373 if (builder.next != null) { |
| 374 assert(builder.next.next == null); | 374 assert(builder.next.next == null); |
| 375 addBuilder(name, builder.next, builder.next.charOffset); | 375 addBuilder(name, builder.next, builder.next.charOffset); |
| 376 } | 376 } |
| 377 addBuilder(name, builder, builder.charOffset); | 377 addBuilder(name, builder, builder.charOffset); |
| 378 }); | 378 }); |
| 379 types.addAll(part.types); | 379 types.addAll(part.types); |
| 380 constructorReferences.addAll(part.constructorReferences); | 380 constructorReferences.addAll(part.constructorReferences); |
| 381 part.partOfLibrary = this; | 381 part.partOfLibrary = this; |
| 382 // TODO(ahe): Include metadata from part? | 382 // TODO(ahe): Include metadata from part? |
| 383 } | 383 } |
| 384 | 384 |
| 385 void buildInitialScopes() { | 385 void buildInitialScopes() { |
| 386 members.forEach(addToExportScope); | 386 forEach(addToExportScope); |
| 387 members.forEach((String name, Builder member) { | 387 forEach((String name, Builder member) { |
| 388 addToScope(name, member, member.charOffset, false); | 388 addToScope(name, member, member.charOffset, false); |
| 389 }); | 389 }); |
| 390 } | 390 } |
| 391 | 391 |
| 392 void addImportsToScope() { | 392 void addImportsToScope() { |
| 393 bool explicitCoreImport = this == loader.coreLibrary; | 393 bool explicitCoreImport = this == loader.coreLibrary; |
| 394 for (Import import in imports) { | 394 for (Import import in imports) { |
| 395 if (import.imported == loader.coreLibrary) { | 395 if (import.imported == loader.coreLibrary) { |
| 396 explicitCoreImport = true; | 396 explicitCoreImport = true; |
| 397 } | 397 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 exports[name] = member; | 433 exports[name] = member; |
| 434 } | 434 } |
| 435 return true; | 435 return true; |
| 436 } | 436 } |
| 437 | 437 |
| 438 int resolveTypes(_) { | 438 int resolveTypes(_) { |
| 439 int typeCount = types.length; | 439 int typeCount = types.length; |
| 440 for (T t in types) { | 440 for (T t in types) { |
| 441 t.resolveIn(scope); | 441 t.resolveIn(scope); |
| 442 } | 442 } |
| 443 members.forEach((String name, Builder member) { | 443 forEach((String name, Builder member) { |
| 444 typeCount += member.resolveTypes(this); | 444 typeCount += member.resolveTypes(this); |
| 445 }); | 445 }); |
| 446 return typeCount; | 446 return typeCount; |
| 447 } | 447 } |
| 448 | 448 |
| 449 int resolveConstructors(_) { | 449 int resolveConstructors(_) { |
| 450 int count = 0; | 450 int count = 0; |
| 451 members.forEach((String name, Builder member) { | 451 forEach((String name, Builder member) { |
| 452 count += member.resolveConstructors(this); | 452 count += member.resolveConstructors(this); |
| 453 }); | 453 }); |
| 454 return count; | 454 return count; |
| 455 } | 455 } |
| 456 | 456 |
| 457 List<TypeVariableBuilder> copyTypeVariables( | 457 List<TypeVariableBuilder> copyTypeVariables( |
| 458 List<TypeVariableBuilder> original); | 458 List<TypeVariableBuilder> original); |
| 459 | 459 |
| 460 @override | 460 @override |
| 461 String get fullNameForErrors => name ?? "<library '$relativeFileUri'>"; | 461 String get fullNameForErrors => name ?? "<library '$relativeFileUri'>"; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 } | 537 } |
| 538 | 538 |
| 539 /// Called to register [procedure] as a factory whose types are collected in | 539 /// Called to register [procedure] as a factory whose types are collected in |
| 540 /// [factoryDeclaration]. Later, once the class has been built, we can | 540 /// [factoryDeclaration]. Later, once the class has been built, we can |
| 541 /// synthesize type variables on the factory matching the class'. | 541 /// synthesize type variables on the factory matching the class'. |
| 542 void addFactoryDeclaration( | 542 void addFactoryDeclaration( |
| 543 ProcedureBuilder procedure, DeclarationBuilder<T> factoryDeclaration) { | 543 ProcedureBuilder procedure, DeclarationBuilder<T> factoryDeclaration) { |
| 544 factoryDeclarations[procedure] = factoryDeclaration; | 544 factoryDeclarations[procedure] = factoryDeclaration; |
| 545 } | 545 } |
| 546 } | 546 } |
| OLD | NEW |