mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 15:21:54 +00:00
[cfe] Introduce compilation unit
This adds CompilationUnit as a supertype of LibraryBuilder as a first step towards splitting libraries from compilation units. The SourceLoader._builders are now compilation units and lookups in to the SourceLoader are split into compilation units, loaded library builders and source library builders. Change-Id: If9958a5a67443170cc1a538106d9efd424e36889 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/369643 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Jens Johansen <jensj@google.com>
This commit is contained in:
parent
911b8d11a7
commit
b6249b851f
|
@ -36,7 +36,62 @@ import 'nullability_builder.dart';
|
|||
import 'prefix_builder.dart';
|
||||
import 'type_builder.dart';
|
||||
|
||||
abstract class LibraryBuilder implements Builder {
|
||||
abstract class CompilationUnit {
|
||||
/// Returns the import uri for the compilation unit.
|
||||
///
|
||||
/// This is the canonical uri for the compilation unit, for instance
|
||||
/// 'dart:core'.
|
||||
Uri get importUri;
|
||||
Uri get fileUri;
|
||||
bool get isSynthetic;
|
||||
|
||||
/// If true, the library is not supported through the 'dart.library.*' value
|
||||
/// used in conditional imports and `bool.fromEnvironment` constants.
|
||||
bool get isUnsupported;
|
||||
|
||||
Loader get loader;
|
||||
|
||||
/// The [LibraryBuilder] for the library that this compilation unit belongs
|
||||
/// to.
|
||||
///
|
||||
/// This is only valid after `SourceLoader.resolveParts` has be called.
|
||||
LibraryBuilder get libraryBuilder;
|
||||
|
||||
bool get isPart;
|
||||
|
||||
abstract LibraryBuilder? partOfLibrary;
|
||||
|
||||
/// Returns the [Uri]s for the libraries that this library depend upon, either
|
||||
/// through import or export.
|
||||
Iterable<Uri> get dependencies;
|
||||
|
||||
void recordAccess(
|
||||
CompilationUnit accessor, int charOffset, int length, Uri fileUri);
|
||||
|
||||
void addExporter(LibraryBuilder exporter,
|
||||
List<CombinatorBuilder>? combinators, int charOffset);
|
||||
|
||||
/// Returns an iterator of all members (typedefs, classes and members)
|
||||
/// declared in this library, including duplicate declarations.
|
||||
///
|
||||
/// Compared to [localMembersIterator] this also gives access to the name
|
||||
/// that the builders are mapped to.
|
||||
NameIterator<Builder> get localMembersNameIterator;
|
||||
|
||||
/// Add a problem with a severity determined by the severity of the message.
|
||||
///
|
||||
/// If [fileUri] is null, it defaults to `this.fileUri`.
|
||||
///
|
||||
/// See `Loader.addMessage` for an explanation of the
|
||||
/// arguments passed to this method.
|
||||
void addProblem(Message message, int charOffset, int length, Uri? fileUri,
|
||||
{bool wasHandled = false,
|
||||
List<LocatedMessage>? context,
|
||||
Severity? severity,
|
||||
bool problemOnLibrary = false});
|
||||
}
|
||||
|
||||
abstract class LibraryBuilder implements Builder, CompilationUnit {
|
||||
Scope get scope;
|
||||
|
||||
Scope get exportScope;
|
||||
|
@ -46,14 +101,17 @@ abstract class LibraryBuilder implements Builder {
|
|||
@override
|
||||
LibraryBuilder get origin;
|
||||
|
||||
@override
|
||||
abstract LibraryBuilder? partOfLibrary;
|
||||
|
||||
LibraryBuilder get nameOriginBuilder;
|
||||
|
||||
abstract bool mayImplementRestrictedTypes;
|
||||
|
||||
@override
|
||||
bool get isPart;
|
||||
|
||||
@override
|
||||
Loader get loader;
|
||||
|
||||
/// Returns the [Library] built by this builder.
|
||||
|
@ -64,15 +122,18 @@ abstract class LibraryBuilder implements Builder {
|
|||
|
||||
/// Returns the [Uri]s for the libraries that this library depend upon, either
|
||||
/// through import or export.
|
||||
@override
|
||||
Iterable<Uri> get dependencies;
|
||||
|
||||
/// Returns the import uri for the library.
|
||||
///
|
||||
/// This is the canonical uri for the library, for instance 'dart:core'.
|
||||
@override
|
||||
Uri get importUri;
|
||||
|
||||
/// If true, the library is not supported through the 'dart.library.*' value
|
||||
/// used in conditional imports and `bool.fromEnvironment` constants.
|
||||
@override
|
||||
bool get isUnsupported;
|
||||
|
||||
/// Returns an iterator of all members (typedefs, classes and members)
|
||||
|
@ -90,6 +151,7 @@ abstract class LibraryBuilder implements Builder {
|
|||
///
|
||||
/// Compared to [localMembersIterator] this also gives access to the name
|
||||
/// that the builders are mapped to.
|
||||
@override
|
||||
NameIterator<Builder> get localMembersNameIterator;
|
||||
|
||||
/// [Iterator] for all declarations declared in this library or any of its
|
||||
|
@ -104,6 +166,7 @@ abstract class LibraryBuilder implements Builder {
|
|||
/// Duplicates and augmenting members are _not_ included.
|
||||
NameIterator<T> fullMemberNameIterator<T extends Builder>();
|
||||
|
||||
@override
|
||||
void addExporter(LibraryBuilder exporter,
|
||||
List<CombinatorBuilder>? combinators, int charOffset);
|
||||
|
||||
|
@ -113,6 +176,7 @@ abstract class LibraryBuilder implements Builder {
|
|||
///
|
||||
/// See `Loader.addMessage` for an explanation of the
|
||||
/// arguments passed to this method.
|
||||
@override
|
||||
FormattedMessage? addProblem(
|
||||
Message message, int charOffset, int length, Uri? fileUri,
|
||||
{bool wasHandled = false,
|
||||
|
@ -156,8 +220,9 @@ abstract class LibraryBuilder implements Builder {
|
|||
/// reported.
|
||||
Builder? lookupLocalMember(String name, {bool required = false});
|
||||
|
||||
@override
|
||||
void recordAccess(
|
||||
LibraryBuilder accessor, int charOffset, int length, Uri fileUri);
|
||||
CompilationUnit accessor, int charOffset, int length, Uri fileUri);
|
||||
|
||||
Nullability get nullable;
|
||||
|
||||
|
@ -372,7 +437,7 @@ abstract class LibraryBuilderImpl extends ModifierBuilderImpl
|
|||
|
||||
@override
|
||||
void recordAccess(
|
||||
LibraryBuilder accessor, int charOffset, int length, Uri fileUri) {}
|
||||
CompilationUnit accessor, int charOffset, int length, Uri fileUri) {}
|
||||
|
||||
@override
|
||||
Nullability get nullable {
|
||||
|
|
|
@ -28,19 +28,19 @@ class PrefixBuilder extends BuilderImpl {
|
|||
|
||||
final int importIndex;
|
||||
|
||||
final LibraryDependency? dependency;
|
||||
final LoadLibraryBuilder? loadLibraryBuilder;
|
||||
|
||||
LoadLibraryBuilder? loadLibraryBuilder;
|
||||
|
||||
PrefixBuilder(this.name, this.deferred, this.parent, this.dependency,
|
||||
PrefixBuilder(this.name, this.deferred, this.parent, this.loadLibraryBuilder,
|
||||
this.charOffset, this.importIndex) {
|
||||
if (deferred) {
|
||||
loadLibraryBuilder =
|
||||
new LoadLibraryBuilder(parent, dependency!, charOffset);
|
||||
assert(deferred == (loadLibraryBuilder != null),
|
||||
"LoadLibraryBuilder must be provided iff prefix is deferred.");
|
||||
if (loadLibraryBuilder != null) {
|
||||
addToExportScope('loadLibrary', loadLibraryBuilder!, charOffset);
|
||||
}
|
||||
}
|
||||
|
||||
LibraryDependency? get dependency => loadLibraryBuilder?.importDependency;
|
||||
|
||||
@override
|
||||
Uri get fileUri => parent.fileUri;
|
||||
|
||||
|
|
|
@ -21,56 +21,57 @@ import 'source/source_library_builder.dart' show Part, SourceLibraryBuilder;
|
|||
import 'incremental_compiler.dart' show getPartUri;
|
||||
|
||||
class BuilderGraph implements Graph<Uri> {
|
||||
final Map<Uri, LibraryBuilder> builders;
|
||||
final Map<Uri, CompilationUnit> compilationUnits;
|
||||
|
||||
final Map<Uri, List<Uri>> _neighborsCache = {};
|
||||
|
||||
BuilderGraph(this.builders);
|
||||
BuilderGraph(this.compilationUnits);
|
||||
|
||||
@override
|
||||
Iterable<Uri> get vertices => builders.keys;
|
||||
Iterable<Uri> get vertices => compilationUnits.keys;
|
||||
|
||||
List<Uri> _computeNeighborsOf(Uri vertex) {
|
||||
List<Uri> neighbors = [];
|
||||
LibraryBuilder? library = builders[vertex];
|
||||
if (library == null) {
|
||||
CompilationUnit? compilationUnit = compilationUnits[vertex];
|
||||
if (compilationUnit == null) {
|
||||
throw "Library not found: $vertex";
|
||||
}
|
||||
if (library is SourceLibraryBuilder) {
|
||||
for (Import import in library.imports) {
|
||||
if (compilationUnit is SourceLibraryBuilder) {
|
||||
for (Import import in compilationUnit.imports) {
|
||||
// 'imported' can be null for fake imports, such as dart-ext:.
|
||||
if (import.imported != null) {
|
||||
Uri uri = import.imported!.importUri;
|
||||
if (builders.containsKey(uri)) {
|
||||
if (compilationUnits.containsKey(uri)) {
|
||||
neighbors.add(uri);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Export export in library.exports) {
|
||||
for (Export export in compilationUnit.exports) {
|
||||
Uri uri = export.exported.importUri;
|
||||
if (builders.containsKey(uri)) {
|
||||
if (compilationUnits.containsKey(uri)) {
|
||||
neighbors.add(uri);
|
||||
}
|
||||
}
|
||||
for (Part part in library.parts) {
|
||||
Uri uri = part.builder.importUri;
|
||||
if (builders.containsKey(uri)) {
|
||||
for (Part part in compilationUnit.parts) {
|
||||
Uri uri = part.compilationUnit.importUri;
|
||||
if (compilationUnits.containsKey(uri)) {
|
||||
neighbors.add(uri);
|
||||
}
|
||||
}
|
||||
} else if (library is DillLibraryBuilder) {
|
||||
} else if (compilationUnit is DillLibraryBuilder) {
|
||||
// Imports and exports
|
||||
for (LibraryDependency dependency in library.library.dependencies) {
|
||||
for (LibraryDependency dependency
|
||||
in compilationUnit.library.dependencies) {
|
||||
Uri uri = dependency.targetLibrary.importUri;
|
||||
if (builders.containsKey(uri)) {
|
||||
if (compilationUnits.containsKey(uri)) {
|
||||
neighbors.add(uri);
|
||||
}
|
||||
}
|
||||
|
||||
// Parts
|
||||
for (LibraryPart part in library.library.parts) {
|
||||
Uri uri = getPartUri(library.importUri, part);
|
||||
if (builders.containsKey(uri)) {
|
||||
for (LibraryPart part in compilationUnit.library.parts) {
|
||||
Uri uri = getPartUri(compilationUnit.importUri, part);
|
||||
if (compilationUnits.containsKey(uri)) {
|
||||
neighbors.add(uri);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -72,6 +72,9 @@ class DillLibraryBuilder extends LibraryBuilderImpl {
|
|||
lazyExportScope.libraryBuilder = this;
|
||||
}
|
||||
|
||||
@override
|
||||
LibraryBuilder get libraryBuilder => this;
|
||||
|
||||
@override
|
||||
LibraryBuilder get origin => this;
|
||||
|
||||
|
|
|
@ -308,8 +308,8 @@ severity: $severity
|
|||
Library kernelLibrary = cls.enclosingLibrary;
|
||||
LibraryBuilder? library = lookupLibraryBuilder(kernelLibrary.importUri);
|
||||
if (library == null) {
|
||||
library =
|
||||
currentSourceLoader?.lookupLibraryBuilder(kernelLibrary.importUri);
|
||||
library = currentSourceLoader
|
||||
?.lookupLoadedLibraryBuilder(kernelLibrary.importUri);
|
||||
}
|
||||
return library!.lookupLocalMember(cls.name, required: true) as ClassBuilder;
|
||||
}
|
||||
|
@ -318,13 +318,13 @@ severity: $severity
|
|||
ExtensionTypeDeclarationBuilder
|
||||
computeExtensionTypeBuilderFromTargetExtensionType(
|
||||
ExtensionTypeDeclaration extensionType) {
|
||||
Library kernelLibrary = extensionType.enclosingLibrary;
|
||||
LibraryBuilder? library = lookupLibraryBuilder(kernelLibrary.importUri);
|
||||
if (library == null) {
|
||||
library =
|
||||
currentSourceLoader?.lookupLibraryBuilder(kernelLibrary.importUri);
|
||||
Library library = extensionType.enclosingLibrary;
|
||||
LibraryBuilder? libraryBuilder = lookupLibraryBuilder(library.importUri);
|
||||
if (libraryBuilder == null) {
|
||||
libraryBuilder =
|
||||
currentSourceLoader?.lookupLoadedLibraryBuilder(library.importUri);
|
||||
}
|
||||
return library!.lookupLocalMember(extensionType.name, required: true)
|
||||
return libraryBuilder!.lookupLocalMember(extensionType.name, required: true)
|
||||
as ExtensionTypeDeclarationBuilder;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ class Export {
|
|||
final LibraryBuilder exporter;
|
||||
|
||||
/// The library being exported.
|
||||
LibraryBuilder exported;
|
||||
CompilationUnit exported;
|
||||
|
||||
final List<CombinatorBuilder>? combinators;
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ import 'builder/library_builder.dart';
|
|||
import 'builder/name_iterator.dart';
|
||||
import 'builder/prefix_builder.dart';
|
||||
|
||||
import 'kernel/load_library_builder.dart';
|
||||
import 'kernel/utils.dart' show toKernelCombinators;
|
||||
|
||||
import 'combinator.dart' show CombinatorBuilder;
|
||||
|
@ -24,7 +25,7 @@ class Import {
|
|||
final SourceLibraryBuilder importer;
|
||||
|
||||
/// The library being imported.
|
||||
LibraryBuilder? imported;
|
||||
CompilationUnit? imported;
|
||||
|
||||
final PrefixBuilder? prefixBuilder;
|
||||
|
||||
|
@ -78,8 +79,9 @@ class Import {
|
|||
prefixBuilder!.addToExportScope(name, member, charOffset);
|
||||
};
|
||||
}
|
||||
NameIterator<Builder> iterator = imported!.exportScope.filteredNameIterator(
|
||||
includeDuplicates: false, includeAugmentations: false);
|
||||
NameIterator<Builder> iterator = imported!.libraryBuilder.exportScope
|
||||
.filteredNameIterator(
|
||||
includeDuplicates: false, includeAugmentations: false);
|
||||
while (iterator.moveNext()) {
|
||||
String name = iterator.name;
|
||||
Builder member = iterator.current;
|
||||
|
@ -113,19 +115,19 @@ class Import {
|
|||
PrefixBuilder? createPrefixBuilder(
|
||||
String? prefix,
|
||||
SourceLibraryBuilder importer,
|
||||
LibraryBuilder? imported,
|
||||
CompilationUnit? imported,
|
||||
List<CombinatorBuilder>? combinators,
|
||||
bool deferred,
|
||||
int charOffset,
|
||||
int prefixCharOffset,
|
||||
int importIndex) {
|
||||
if (prefix == null) return null;
|
||||
LibraryDependency? dependency = null;
|
||||
LoadLibraryBuilder? loadLibraryBuilder;
|
||||
if (deferred) {
|
||||
dependency = new LibraryDependency.deferredImport(imported!.library, prefix,
|
||||
combinators: toKernelCombinators(combinators))
|
||||
..fileOffset = charOffset;
|
||||
loadLibraryBuilder = new LoadLibraryBuilder(importer, prefixCharOffset,
|
||||
imported!, prefix, charOffset, toKernelCombinators(combinators));
|
||||
}
|
||||
return new PrefixBuilder(
|
||||
prefix, deferred, importer, dependency, prefixCharOffset, importIndex);
|
||||
|
||||
return new PrefixBuilder(prefix, deferred, importer, loadLibraryBuilder,
|
||||
prefixCharOffset, importIndex);
|
||||
}
|
||||
|
|
|
@ -97,13 +97,14 @@ abstract class LoadedLibraries {
|
|||
|
||||
class LoadedLibrariesImpl implements LoadedLibraries {
|
||||
/// The library of the compilation entry point.
|
||||
final LibraryBuilder rootLibrary;
|
||||
final Map<Uri, LibraryBuilder> libraryBuilders = <Uri, LibraryBuilder>{};
|
||||
final CompilationUnit rootCompilationUnit;
|
||||
final Map<Uri, CompilationUnit> compilationUnits = {};
|
||||
|
||||
// TODO(johnniwinther): Support multiple entry-points.
|
||||
LoadedLibrariesImpl(this.rootLibrary, Iterable<LibraryBuilder> libraries) {
|
||||
libraries.forEach((LibraryBuilder libraryBuilder) {
|
||||
libraryBuilders[libraryBuilder.importUri] = libraryBuilder;
|
||||
LoadedLibrariesImpl(
|
||||
this.rootCompilationUnit, Iterable<CompilationUnit> compilationUnits) {
|
||||
compilationUnits.forEach((CompilationUnit compilationUnit) {
|
||||
this.compilationUnits[compilationUnit.importUri] = compilationUnit;
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -112,27 +113,28 @@ class LoadedLibrariesImpl implements LoadedLibraries {
|
|||
{required bool callback(Link<Uri> importChainReversed)}) {
|
||||
bool aborted = false;
|
||||
|
||||
/// Map from libraries to the set of (unreversed) paths to [targetUri].
|
||||
Map<LibraryBuilder, Iterable<Link<Uri>>> suffixChainMap =
|
||||
<LibraryBuilder, Iterable<Link<Uri>>>{};
|
||||
/// Map from compilation units to the set of (unreversed) paths to
|
||||
/// [targetUri].
|
||||
Map<CompilationUnit, Iterable<Link<Uri>>> suffixChainMap = {};
|
||||
|
||||
/// Computes the set of (unreversed) paths to [targetUri].
|
||||
///
|
||||
/// Finds all paths (suffixes) from the current [library] to [targetUri] and
|
||||
/// stores it in [suffixChainMap].
|
||||
/// Finds all paths (suffixes) from the current [compilationUnit] to
|
||||
/// [targetUri] and stores it in [suffixChainMap].
|
||||
///
|
||||
/// For every found suffix it prepends the given [prefix] and the [library]
|
||||
/// and invokes the [callback] with the concatenated chain.
|
||||
void computeSuffixes(LibraryBuilder library, Link<Uri> prefix) {
|
||||
/// For every found suffix it prepends the given [prefix] and the
|
||||
/// [compilationUnit] and invokes the [callback] with the concatenated
|
||||
/// chain.
|
||||
void computeSuffixes(CompilationUnit compilationUnit, Link<Uri> prefix) {
|
||||
if (aborted) return;
|
||||
|
||||
Uri canonicalUri = library.importUri;
|
||||
Uri canonicalUri = compilationUnit.importUri;
|
||||
prefix = prefix.prepend(canonicalUri);
|
||||
suffixChainMap[library] = const <Link<Uri>>[];
|
||||
suffixChainMap[compilationUnit] = const <Link<Uri>>[];
|
||||
List<Link<Uri>> suffixes = [];
|
||||
if (targetUri != canonicalUri) {
|
||||
/// Process the import (or export) of [importedLibrary].
|
||||
void processLibrary(LibraryBuilder importedLibrary) {
|
||||
void processCompilationUnit(CompilationUnit importedLibrary) {
|
||||
bool suffixesArePrecomputed =
|
||||
suffixChainMap.containsKey(importedLibrary);
|
||||
|
||||
|
@ -157,12 +159,12 @@ class LoadedLibrariesImpl implements LoadedLibraries {
|
|||
}
|
||||
}
|
||||
|
||||
for (Uri dependency in library.dependencies) {
|
||||
LibraryBuilder? libraryBuilder = libraryBuilders[dependency];
|
||||
if (libraryBuilder != null) {
|
||||
// Library builder is only available if the dependency has been
|
||||
for (Uri dependency in compilationUnit.dependencies) {
|
||||
CompilationUnit? compilationUnit = compilationUnits[dependency];
|
||||
if (compilationUnit != null) {
|
||||
// The compilation unit is only available if the dependency has been
|
||||
// loaded.
|
||||
processLibrary(libraryBuilder);
|
||||
processCompilationUnit(compilationUnit);
|
||||
}
|
||||
if (aborted) return;
|
||||
}
|
||||
|
@ -174,15 +176,16 @@ class LoadedLibrariesImpl implements LoadedLibraries {
|
|||
}
|
||||
suffixes.add(const Link<Uri>().prepend(canonicalUri));
|
||||
}
|
||||
suffixChainMap[library] = suffixes;
|
||||
suffixChainMap[compilationUnit] = suffixes;
|
||||
return;
|
||||
}
|
||||
|
||||
computeSuffixes(rootLibrary, const Link<Uri>());
|
||||
computeSuffixes(rootCompilationUnit, const Link<Uri>());
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() => 'root=$rootLibrary,libraries=${libraryBuilders.keys}';
|
||||
String toString() =>
|
||||
'root=$rootCompilationUnit,compilationUnits=${compilationUnits.keys}';
|
||||
}
|
||||
|
||||
/// [CodeLocation] divides uris into different classes.
|
||||
|
|
|
@ -80,7 +80,7 @@ import 'builder/declaration_builders.dart'
|
|||
ExtensionTypeDeclarationBuilder,
|
||||
TypeDeclarationBuilder;
|
||||
import 'builder/field_builder.dart' show FieldBuilder;
|
||||
import 'builder/library_builder.dart' show LibraryBuilder;
|
||||
import 'builder/library_builder.dart' show CompilationUnit, LibraryBuilder;
|
||||
import 'builder/member_builder.dart' show MemberBuilder;
|
||||
import 'builder/name_iterator.dart' show NameIterator;
|
||||
import 'builder/type_builder.dart' show NamedTypeBuilder, TypeBuilder;
|
||||
|
@ -105,7 +105,7 @@ import 'scope.dart' show Scope, ScopeKind;
|
|||
import 'source/source_class_builder.dart' show SourceClassBuilder;
|
||||
import 'source/source_extension_builder.dart';
|
||||
import 'source/source_library_builder.dart'
|
||||
show ImplicitLanguageVersion, Part, SourceLibraryBuilder;
|
||||
show ImplicitLanguageVersion, SourceLibraryBuilder;
|
||||
import 'source/source_loader.dart';
|
||||
import 'ticker.dart' show Ticker;
|
||||
import 'uri_translator.dart' show UriTranslator;
|
||||
|
@ -226,8 +226,9 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
|
||||
/// Returns the [Library] with the given [importUri] from the most recent
|
||||
/// compilation.
|
||||
Library? lookupLibrary(Uri importUri) =>
|
||||
_lastGoodKernelTarget?.loader.lookupLibraryBuilder(importUri)?.library;
|
||||
Library? lookupLibrary(Uri importUri) => _lastGoodKernelTarget?.loader
|
||||
.lookupLoadedLibraryBuilder(importUri)
|
||||
?.library;
|
||||
|
||||
void _enableExperimentsBasedOnEnvironment({Set<String>? enabledExperiments}) {
|
||||
// Note that these are all experimental. Use at your own risk.
|
||||
|
@ -316,7 +317,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
|
||||
if (lastGoodKernelTarget != null) {
|
||||
_ticker.logMs("Decided to reuse ${reusedLibraries.length}"
|
||||
" of ${lastGoodKernelTarget.loader.libraryBuilders.length}"
|
||||
" of ${lastGoodKernelTarget.loader.loadedLibraryBuilders.length}"
|
||||
" libraries");
|
||||
}
|
||||
|
||||
|
@ -337,7 +338,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
_benchmarker?.enterPhase(BenchmarkPhases.incremental_setupInLoop);
|
||||
currentKernelTarget = _setupNewKernelTarget(c, uriTranslator, hierarchy,
|
||||
reusedLibraries, experimentalInvalidation, entryPoints);
|
||||
Map<LibraryBuilder, List<LibraryBuilder>>? rebuildBodiesMap =
|
||||
Map<LibraryBuilder, List<CompilationUnit>>? rebuildBodiesMap =
|
||||
_experimentalInvalidationCreateRebuildBodiesBuilders(
|
||||
currentKernelTarget, experimentalInvalidation, uriTranslator);
|
||||
entryPoints = currentKernelTarget.setEntryPoints(entryPoints);
|
||||
|
@ -547,7 +548,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
}
|
||||
DillLibraryBuilder dillBuilder =
|
||||
_dillLoadedData!.loader.appendLibrary(builder.library);
|
||||
nextGoodKernelTarget.loader.registerLibraryBuilder(dillBuilder);
|
||||
nextGoodKernelTarget.loader.registerLoadedLibraryBuilder(dillBuilder);
|
||||
_userBuilders![builder.importUri] = dillBuilder;
|
||||
newDillLibraryBuilders.add(builder.library);
|
||||
changed = true;
|
||||
|
@ -610,18 +611,15 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
|
||||
bool _checkEquivalentScopes(
|
||||
SourceLoader sourceLoader, DillLoader dillLoader) {
|
||||
// TODO(johnniwinther): Use [SourceLoader.sourceLibraryBuilders] here.
|
||||
// Currently this causes a failure in incremental_dartino_suite.dart.
|
||||
for (LibraryBuilder sourceLibraryBuilder in sourceLoader.libraryBuilders) {
|
||||
if (sourceLibraryBuilder is SourceLibraryBuilder) {
|
||||
Uri uri = sourceLibraryBuilder.importUri;
|
||||
DillLibraryBuilder dillLibraryBuilder =
|
||||
dillLoader.lookupLibraryBuilder(uri)!;
|
||||
assert(
|
||||
_hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder) ==
|
||||
null,
|
||||
_hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder));
|
||||
}
|
||||
for (SourceLibraryBuilder sourceLibraryBuilder
|
||||
in sourceLoader.sourceLibraryBuilders) {
|
||||
Uri uri = sourceLibraryBuilder.importUri;
|
||||
DillLibraryBuilder dillLibraryBuilder =
|
||||
dillLoader.lookupLibraryBuilder(uri)!;
|
||||
assert(
|
||||
_hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder) ==
|
||||
null,
|
||||
_hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -791,18 +789,18 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
/// Fill in the replacement maps that describe the replacements that need to
|
||||
/// happen because of experimental invalidation.
|
||||
void _experimentalInvalidationFillReplacementMaps(
|
||||
Map<LibraryBuilder, List<LibraryBuilder>> rebuildBodiesMap,
|
||||
Map<LibraryBuilder, List<CompilationUnit>> rebuildBodiesMap,
|
||||
Map<LibraryBuilder, Map<String, Builder>> replacementMap,
|
||||
Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap) {
|
||||
for (MapEntry<LibraryBuilder, List<LibraryBuilder>> entry
|
||||
for (MapEntry<LibraryBuilder, List<CompilationUnit>> entry
|
||||
in rebuildBodiesMap.entries) {
|
||||
Map<String, Builder> childReplacementMap = {};
|
||||
Map<String, Builder> childReplacementSettersMap = {};
|
||||
List<LibraryBuilder> builders = rebuildBodiesMap[entry.key]!;
|
||||
List<CompilationUnit> compilationUnits = rebuildBodiesMap[entry.key]!;
|
||||
replacementMap[entry.key] = childReplacementMap;
|
||||
replacementSettersMap[entry.key] = childReplacementSettersMap;
|
||||
for (LibraryBuilder builder in builders) {
|
||||
NameIterator iterator = builder.localMembersNameIterator;
|
||||
for (CompilationUnit compilationUnit in compilationUnits) {
|
||||
NameIterator iterator = compilationUnit.localMembersNameIterator;
|
||||
while (iterator.moveNext()) {
|
||||
Builder childBuilder = iterator.current;
|
||||
if (childBuilder is SourceExtensionBuilder &&
|
||||
|
@ -818,9 +816,9 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
}
|
||||
assert(
|
||||
!map.containsKey(name),
|
||||
"Unexpected double-entry for $name in ${builder.importUri} "
|
||||
"(org from ${entry.key.importUri}): $childBuilder and "
|
||||
"${map[name]}");
|
||||
"Unexpected double-entry for $name in "
|
||||
"${compilationUnit.importUri} (org from ${entry.key.importUri}): "
|
||||
"$childBuilder and ${map[name]}");
|
||||
map[name] = childBuilder;
|
||||
}
|
||||
}
|
||||
|
@ -831,24 +829,24 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
/// be rebuild special, namely they have to be
|
||||
/// [currentKernelTarget.loader.read] with references from the original
|
||||
/// [Library] for things to work.
|
||||
Map<LibraryBuilder, List<LibraryBuilder>>
|
||||
Map<LibraryBuilder, List<CompilationUnit>>
|
||||
_experimentalInvalidationCreateRebuildBodiesBuilders(
|
||||
IncrementalKernelTarget currentKernelTarget,
|
||||
ExperimentalInvalidation? experimentalInvalidation,
|
||||
UriTranslator uriTranslator) {
|
||||
// Any builder(s) in [rebuildBodies] should be semi-reused: Create source
|
||||
// builders based on the underlying libraries.
|
||||
// Maps from old library builder to list of new library builder(s).
|
||||
Map<LibraryBuilder, List<LibraryBuilder>> rebuildBodiesMap =
|
||||
new Map<LibraryBuilder, List<LibraryBuilder>>.identity();
|
||||
// compilation units based on the underlying libraries.
|
||||
// Maps from old library builder to list of new compilation unit(s).
|
||||
Map<LibraryBuilder, List<CompilationUnit>> rebuildBodiesMap =
|
||||
new Map<LibraryBuilder, List<CompilationUnit>>.identity();
|
||||
if (experimentalInvalidation != null) {
|
||||
for (LibraryBuilder library in experimentalInvalidation.rebuildBodies) {
|
||||
LibraryBuilder newBuilder = currentKernelTarget.loader.readAsEntryPoint(
|
||||
library.importUri,
|
||||
fileUri: library.fileUri,
|
||||
referencesFromIndex: new IndexedLibrary(library.library));
|
||||
List<LibraryBuilder> builders = [newBuilder];
|
||||
rebuildBodiesMap[library] = builders;
|
||||
CompilationUnit newMainCompilationUnit = currentKernelTarget.loader
|
||||
.readAsEntryPoint(library.importUri,
|
||||
fileUri: library.fileUri,
|
||||
referencesFromIndex: new IndexedLibrary(library.library));
|
||||
List<CompilationUnit> compilationUnits = [newMainCompilationUnit];
|
||||
rebuildBodiesMap[library] = compilationUnits;
|
||||
for (LibraryPart part in library.library.parts) {
|
||||
// We need to pass the reference to make any class, procedure etc
|
||||
// overwrite correctly, but the library itself should not be
|
||||
|
@ -857,13 +855,13 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
Uri partUri = getPartUri(library.importUri, part);
|
||||
Uri? fileUri =
|
||||
uriTranslator.getPartFileUri(library.library.fileUri, part);
|
||||
LibraryBuilder newPartBuilder = currentKernelTarget.loader.read(
|
||||
partUri, -1,
|
||||
accessor: library,
|
||||
fileUri: fileUri,
|
||||
referencesFromIndex: new IndexedLibrary(library.library),
|
||||
referenceIsPartOwner: true);
|
||||
builders.add(newPartBuilder);
|
||||
CompilationUnit newPartCompilationUnit = currentKernelTarget.loader
|
||||
.read(partUri, -1,
|
||||
accessor: library,
|
||||
fileUri: fileUri,
|
||||
referencesFromIndex: new IndexedLibrary(library.library),
|
||||
referenceIsPartOwner: true);
|
||||
compilationUnits.add(newPartCompilationUnit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -875,7 +873,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
/// didn't do anything special.
|
||||
void _experimentalInvalidationPatchUpScopes(
|
||||
ExperimentalInvalidation? experimentalInvalidation,
|
||||
Map<LibraryBuilder, List<LibraryBuilder>> rebuildBodiesMap) {
|
||||
Map<LibraryBuilder, List<CompilationUnit>> rebuildBodiesMap) {
|
||||
if (experimentalInvalidation != null) {
|
||||
// Maps from old library builder to map of new content.
|
||||
Map<LibraryBuilder, Map<String, Builder>> replacementMap = {};
|
||||
|
@ -892,7 +890,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
builder.clearExtensionsInScopeCache();
|
||||
for (Import import in builder.imports) {
|
||||
assert(import.importer == builder);
|
||||
List<LibraryBuilder>? replacements =
|
||||
List<CompilationUnit>? replacements =
|
||||
rebuildBodiesMap[import.imported];
|
||||
if (replacements != null) {
|
||||
import.imported = replacements.first;
|
||||
|
@ -904,7 +902,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
}
|
||||
for (Export export in builder.exports) {
|
||||
assert(export.exporter == builder);
|
||||
List<LibraryBuilder>? replacements =
|
||||
List<CompilationUnit>? replacements =
|
||||
rebuildBodiesMap[export.exported];
|
||||
|
||||
if (replacements != null) {
|
||||
|
@ -989,7 +987,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
List<bool> seenModes = [false, false, false, false];
|
||||
for (LibraryBuilder library in reusedLibraries) {
|
||||
seenModes[library.library.nonNullableByDefaultCompiledMode.index] = true;
|
||||
kernelTarget.loader.registerLibraryBuilder(library);
|
||||
kernelTarget.loader.registerLoadedLibraryBuilder(library);
|
||||
}
|
||||
// Check compilation mode up against what we've seen here and set
|
||||
// `hasInvalidNnbdModeLibrary` accordingly.
|
||||
|
@ -1716,7 +1714,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
for (Uri uri in potentiallyReferencedLibraries.keys) {
|
||||
if (uri.isScheme("package")) continue;
|
||||
LibraryBuilder? builder =
|
||||
currentKernelTarget.loader.deregisterLibraryBuilder(uri);
|
||||
currentKernelTarget.loader.deregisterLoadedLibraryBuilder(uri);
|
||||
if (builder != null) {
|
||||
cleanedUpBuilders.add(builder);
|
||||
Library lib = builder.library;
|
||||
|
@ -1788,7 +1786,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
Uri? partImportUri = uriToSource[partFileUri]?.importUri;
|
||||
if (partImportUri != null &&
|
||||
lastGoodKernelTarget!.loader
|
||||
.containsLibraryBuilder(partImportUri)) {
|
||||
.containsLoadedLibraryBuilder(partImportUri)) {
|
||||
continue;
|
||||
}
|
||||
} else if (reusedResult != null) {
|
||||
|
@ -1839,9 +1837,15 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
new Map<String, DartType>.of(inputDefinitions);
|
||||
|
||||
return await context.runInContext((_) async {
|
||||
// TODO(jensj): We should probably allow for this not being an import uri.
|
||||
LibraryBuilder libraryBuilder =
|
||||
lastGoodKernelTarget!.loader.readAsEntryPoint(libraryUri);
|
||||
CompilationUnit? compilationUnit =
|
||||
lastGoodKernelTarget!.loader.lookupCompilationUnit(libraryUri);
|
||||
compilationUnit ??= lastGoodKernelTarget.loader
|
||||
.lookupCompilationUnitByFileUri(libraryUri);
|
||||
if (compilationUnit == null) {
|
||||
// TODO(johnniwinther): Report an error?
|
||||
return null;
|
||||
}
|
||||
LibraryBuilder libraryBuilder = compilationUnit.libraryBuilder;
|
||||
if (scriptUri != null && offset != TreeNode.noOffset) {
|
||||
Uri? scriptUriAsUri = Uri.tryParse(scriptUri);
|
||||
if (scriptUriAsUri != null) {
|
||||
|
@ -2174,15 +2178,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
invalidatedImportUris.add(uri);
|
||||
}
|
||||
if (libraryBuilder is SourceLibraryBuilder) {
|
||||
// TODO(jensj): This shouldn't be possible anymore.
|
||||
for (Part part in libraryBuilder.parts) {
|
||||
partUriToParent[part.builder.importUri] = libraryBuilder;
|
||||
partUriToParent[part.builder.fileUri] = libraryBuilder;
|
||||
if (isInvalidated(part.builder.importUri, part.builder.fileUri)) {
|
||||
invalidatedImportUris.add(part.builder.importUri);
|
||||
builders[part.builder.importUri] = part.builder;
|
||||
}
|
||||
}
|
||||
assert(false, "Unexpected SourceLibraryBuilder $libraryBuilder");
|
||||
} else if (libraryBuilder is DillLibraryBuilder) {
|
||||
for (LibraryPart part in libraryBuilder.library.parts) {
|
||||
Uri partUri = getPartUri(libraryBuilder.importUri, part);
|
||||
|
@ -2209,7 +2205,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
// [lastGoodKernelTarget] already contains the builders from
|
||||
// [userBuilders].
|
||||
for (LibraryBuilder libraryBuilder
|
||||
in lastGoodKernelTarget.loader.libraryBuilders) {
|
||||
in lastGoodKernelTarget.loader.loadedLibraryBuilders) {
|
||||
addBuilderAndInvalidateUris(libraryBuilder.importUri, libraryBuilder);
|
||||
}
|
||||
} else {
|
||||
|
@ -2269,7 +2265,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
// https://dart-review.googlesource.com/47442 lands.
|
||||
if (builder.isAugmenting) continue;
|
||||
if (!seenUris.add(builder.importUri)) continue;
|
||||
reusedLibraries.add(builder);
|
||||
reusedLibraries.add(builder.libraryBuilder);
|
||||
}
|
||||
return new ReusageResult(notReusedLibraries, directlyInvalidated,
|
||||
invalidatedBecauseOfPackageUpdate, reusedLibraries, partUriToParent);
|
||||
|
@ -2285,7 +2281,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
IncrementalKernelTarget? lastGoodKernelTarget = this._lastGoodKernelTarget;
|
||||
if (lastGoodKernelTarget != null) {
|
||||
Set<Uri> uris =
|
||||
new Set<Uri>.of(lastGoodKernelTarget.loader.libraryImportUris);
|
||||
new Set<Uri>.of(lastGoodKernelTarget.loader.loadedLibraryImportUris);
|
||||
uris.removeAll(_dillLoadedData!.loader.libraryImportUris);
|
||||
if (_previousSourceBuilders != null) {
|
||||
for (Library library in _previousSourceBuilders!) {
|
||||
|
|
|
@ -1478,7 +1478,7 @@ class BodyBuilder extends StackListenerImpl
|
|||
if (member == null) return;
|
||||
Library ensureLibraryLoaded = member.enclosingLibrary;
|
||||
LibraryBuilder? builder = libraryBuilder.loader
|
||||
.lookupLibraryBuilder(ensureLibraryLoaded.importUri) ??
|
||||
.lookupLoadedLibraryBuilder(ensureLibraryLoaded.importUri) ??
|
||||
libraryBuilder.loader.target.dillTarget.loader
|
||||
.lookupLibraryBuilder(ensureLibraryLoaded.importUri);
|
||||
if (builder is DillLibraryBuilder) {
|
||||
|
|
|
@ -17,23 +17,16 @@ class KernelConstantErrorReporter extends ErrorReporter {
|
|||
@override
|
||||
void report(LocatedMessage message, [List<LocatedMessage>? context]) {
|
||||
// Try to find library.
|
||||
LibraryBuilder? builder = loader.lookupLibraryBuilder(message.uri!);
|
||||
if (builder == null) {
|
||||
for (LibraryBuilder candidate in loader.libraryBuilders) {
|
||||
if (candidate.fileUri == message.uri) {
|
||||
// Found it.
|
||||
builder = candidate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (builder == null) {
|
||||
Uri uri = message.uri!;
|
||||
CompilationUnit? compilationUnit = loader.lookupCompilationUnit(uri);
|
||||
compilationUnit ??= loader.lookupCompilationUnitByFileUri(uri);
|
||||
if (compilationUnit == null) {
|
||||
// TODO(jensj): Probably a part or something.
|
||||
loader.addProblem(message.messageObject, message.charOffset,
|
||||
message.length, message.uri,
|
||||
context: context);
|
||||
} else {
|
||||
builder.addProblem(message.messageObject, message.charOffset,
|
||||
compilationUnit.addProblem(message.messageObject, message.charOffset,
|
||||
message.length, message.uri,
|
||||
context: context);
|
||||
}
|
||||
|
|
|
@ -187,8 +187,8 @@ class KernelTarget {
|
|||
/// type String, which is the name of the native method.
|
||||
MemberBuilder getNativeAnnotation(SourceLoader loader) {
|
||||
if (_cachedNativeAnnotation != null) return _cachedNativeAnnotation!;
|
||||
LibraryBuilder internal = loader.read(Uri.parse("dart:_internal"), -1,
|
||||
accessor: loader.coreLibrary);
|
||||
LibraryBuilder internal =
|
||||
loader.lookupLoadedLibraryBuilder(Uri.parse("dart:_internal"))!;
|
||||
return _cachedNativeAnnotation = internal.getConstructor("ExternalName");
|
||||
}
|
||||
|
||||
|
@ -437,7 +437,7 @@ class KernelTarget {
|
|||
}
|
||||
|
||||
benchmarker?.enterPhase(BenchmarkPhases.outline_computeLibraryScopes);
|
||||
loader.computeLibraryScopes(loader.libraryBuilders);
|
||||
loader.computeLibraryScopes(loader.loadedLibraryBuilders);
|
||||
|
||||
benchmarker?.enterPhase(BenchmarkPhases.outline_computeMacroApplications);
|
||||
MacroApplications? macroApplications =
|
||||
|
@ -745,7 +745,7 @@ class KernelTarget {
|
|||
|
||||
Reference? mainReference;
|
||||
|
||||
LibraryBuilder? firstRoot = loader.firstRoot;
|
||||
LibraryBuilder? firstRoot = loader.rootLibrary;
|
||||
if (firstRoot != null) {
|
||||
// TODO(sigmund): do only for full program
|
||||
Builder? declaration =
|
||||
|
@ -1258,7 +1258,7 @@ class KernelTarget {
|
|||
...backendTarget.extraIndexedLibraries
|
||||
]) {
|
||||
Uri uri = Uri.parse(platformLibrary);
|
||||
LibraryBuilder? libraryBuilder = loader.lookupLibraryBuilder(uri);
|
||||
LibraryBuilder? libraryBuilder = loader.lookupLoadedLibraryBuilder(uri);
|
||||
if (libraryBuilder == null) {
|
||||
// TODO(ahe): This is working around a bug in kernel_driver_test or
|
||||
// kernel_driver.
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
import 'package:kernel/ast.dart'
|
||||
show
|
||||
Arguments,
|
||||
Combinator,
|
||||
DartType,
|
||||
DynamicType,
|
||||
FunctionNode,
|
||||
|
@ -18,6 +19,7 @@ import 'package:kernel/ast.dart'
|
|||
Reference,
|
||||
ReturnStatement;
|
||||
|
||||
import '../builder/library_builder.dart';
|
||||
import '../source/source_library_builder.dart' show SourceLibraryBuilder;
|
||||
|
||||
import '../builder/builder.dart';
|
||||
|
@ -29,7 +31,11 @@ class LoadLibraryBuilder extends BuilderImpl {
|
|||
@override
|
||||
final SourceLibraryBuilder parent;
|
||||
|
||||
final LibraryDependency importDependency;
|
||||
late final LibraryDependency importDependency =
|
||||
new LibraryDependency.deferredImport(
|
||||
_imported.libraryBuilder.library, _prefix,
|
||||
combinators: _combinators)
|
||||
..fileOffset = _importCharOffset;
|
||||
|
||||
/// Offset of the import prefix.
|
||||
@override
|
||||
|
@ -39,7 +45,16 @@ class LoadLibraryBuilder extends BuilderImpl {
|
|||
/// null, no tear-offs were seen in the code and no method is generated.
|
||||
Procedure? tearoff;
|
||||
|
||||
LoadLibraryBuilder(this.parent, this.importDependency, this.charOffset);
|
||||
final CompilationUnit _imported;
|
||||
|
||||
final String _prefix;
|
||||
|
||||
final int _importCharOffset;
|
||||
|
||||
final List<Combinator>? _combinators;
|
||||
|
||||
LoadLibraryBuilder(this.parent, this.charOffset, this._imported, this._prefix,
|
||||
this._importCharOffset, this._combinators);
|
||||
|
||||
@override
|
||||
Uri get fileUri => parent.fileUri;
|
||||
|
|
|
@ -673,7 +673,8 @@ class _TypePhaseIntrospector implements macro.TypePhaseIntrospector {
|
|||
|
||||
@override
|
||||
Future<macro.Identifier> resolveIdentifier(Uri library, String name) {
|
||||
LibraryBuilder? libraryBuilder = sourceLoader.lookupLibraryBuilder(library);
|
||||
LibraryBuilder? libraryBuilder =
|
||||
sourceLoader.lookupLoadedLibraryBuilder(library);
|
||||
if (libraryBuilder == null) {
|
||||
return new Future.error(
|
||||
new macro.MacroImplementationExceptionImpl(
|
||||
|
|
|
@ -751,7 +751,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
yield export.exported.importUri;
|
||||
}
|
||||
for (Import import in imports) {
|
||||
LibraryBuilder? imported = import.imported;
|
||||
CompilationUnit? imported = import.imported;
|
||||
if (imported != null) {
|
||||
yield imported.importUri;
|
||||
}
|
||||
|
@ -777,7 +777,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
}
|
||||
}
|
||||
|
||||
LibraryBuilder exportedLibrary = loader.read(
|
||||
CompilationUnit exportedLibrary = loader.read(
|
||||
resolve(this.importUri, uri, uriOffset), charOffset,
|
||||
accessor: this);
|
||||
exportedLibrary.addExporter(this, combinators, charOffset);
|
||||
|
@ -810,7 +810,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
}
|
||||
}
|
||||
|
||||
LibraryBuilder? builder = null;
|
||||
CompilationUnit? compilationUnit = null;
|
||||
Uri? resolvedUri;
|
||||
String? nativePath;
|
||||
const String nativeExtensionScheme = "dart-ext:";
|
||||
|
@ -828,7 +828,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
}
|
||||
} else {
|
||||
resolvedUri = resolve(this.importUri, uri, uriOffset);
|
||||
builder = loader.read(resolvedUri, uriOffset,
|
||||
compilationUnit = loader.read(resolvedUri, uriOffset,
|
||||
origin: isAugmentationImport ? this : null,
|
||||
accessor: this,
|
||||
isAugmentation: isAugmentationImport,
|
||||
|
@ -837,7 +837,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
|
||||
Import import = new Import(
|
||||
this,
|
||||
builder,
|
||||
compilationUnit,
|
||||
isAugmentationImport,
|
||||
deferred,
|
||||
prefix,
|
||||
|
@ -861,12 +861,12 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
resolve(fileUri, uri, charOffset);
|
||||
// TODO(johnniwinther): Add a LibraryPartBuilder instead of using
|
||||
// [LibraryBuilder] to represent both libraries and parts.
|
||||
LibraryBuilder builder = loader.read(resolvedUri, charOffset,
|
||||
CompilationUnit compilationUnit = loader.read(resolvedUri, charOffset,
|
||||
origin: isAugmenting ? origin : null,
|
||||
fileUri: newFileUri,
|
||||
accessor: this,
|
||||
isPatch: isAugmenting);
|
||||
parts.add(new Part(charOffset, builder));
|
||||
parts.add(new Part(charOffset, compilationUnit));
|
||||
|
||||
// TODO(ahe): [metadata] should be stored, evaluated, and added to [part].
|
||||
LibraryPart part = new LibraryPart(<Expression>[], uri)
|
||||
|
@ -1214,6 +1214,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
}
|
||||
|
||||
void validatePart(SourceLibraryBuilder? library, Set<Uri>? usedParts) {
|
||||
_libraryBuilder = library ?? this;
|
||||
if (library != null && parts.isNotEmpty) {
|
||||
// If [library] is null, we have already reported a problem that this
|
||||
// part is orphaned.
|
||||
|
@ -1226,7 +1227,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
}
|
||||
for (Part part in parts) {
|
||||
// Mark this part as used so we don't report it as orphaned.
|
||||
usedParts!.add(part.builder.importUri);
|
||||
usedParts!.add(part.compilationUnit.importUri);
|
||||
}
|
||||
}
|
||||
parts.clear();
|
||||
|
@ -1253,34 +1254,47 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
}
|
||||
}
|
||||
|
||||
LibraryBuilder? _libraryBuilder;
|
||||
|
||||
@override
|
||||
LibraryBuilder get libraryBuilder {
|
||||
assert(_libraryBuilder != null,
|
||||
"Library builder for $this has not been computed yet.");
|
||||
return _libraryBuilder!;
|
||||
}
|
||||
|
||||
void includeParts(Set<Uri> usedParts) {
|
||||
_libraryBuilder = this;
|
||||
Set<Uri> seenParts = new Set<Uri>();
|
||||
int index = 0;
|
||||
while (index < parts.length) {
|
||||
Part part = parts[index];
|
||||
bool keepPart = true;
|
||||
// TODO(johnniwinther): Use [part.offset] in messages.
|
||||
if (part.builder == this) {
|
||||
if (part.compilationUnit == this) {
|
||||
addProblem(messagePartOfSelf, -1, noLength, fileUri);
|
||||
keepPart = false;
|
||||
} else if (seenParts.add(part.builder.fileUri)) {
|
||||
if (part.builder.partOfLibrary != null) {
|
||||
addProblem(
|
||||
messagePartOfTwoLibraries, -1, noLength, part.builder.fileUri,
|
||||
} else if (seenParts.add(part.compilationUnit.fileUri)) {
|
||||
if (part.compilationUnit.partOfLibrary != null) {
|
||||
addProblem(messagePartOfTwoLibraries, -1, noLength,
|
||||
part.compilationUnit.fileUri,
|
||||
context: [
|
||||
messagePartOfTwoLibrariesContext.withLocation(
|
||||
part.builder.partOfLibrary!.fileUri, -1, noLength),
|
||||
part.compilationUnit.partOfLibrary!.fileUri, -1, noLength),
|
||||
messagePartOfTwoLibrariesContext.withLocation(
|
||||
this.fileUri, -1, noLength)
|
||||
]);
|
||||
keepPart = false;
|
||||
} else {
|
||||
usedParts.add(part.builder.importUri);
|
||||
keepPart = _includePart(part.builder, usedParts, part.offset);
|
||||
usedParts.add(part.compilationUnit.importUri);
|
||||
keepPart = _includePart(part.compilationUnit, usedParts, part.offset);
|
||||
}
|
||||
} else {
|
||||
addProblem(templatePartTwice.withArguments(part.builder.fileUri), -1,
|
||||
noLength, fileUri);
|
||||
addProblem(
|
||||
templatePartTwice.withArguments(part.compilationUnit.fileUri),
|
||||
-1,
|
||||
noLength,
|
||||
fileUri);
|
||||
keepPart = false;
|
||||
}
|
||||
if (keepPart) {
|
||||
|
@ -1291,7 +1305,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
}
|
||||
}
|
||||
|
||||
bool _includePart(LibraryBuilder part, Set<Uri> usedParts, int partOffset) {
|
||||
bool _includePart(CompilationUnit part, Set<Uri> usedParts, int partOffset) {
|
||||
if (part is SourceLibraryBuilder) {
|
||||
if (part.partOfUri != null) {
|
||||
if (uriIsValid(part.partOfUri!) && part.partOfUri != importUri) {
|
||||
|
@ -1777,7 +1791,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
|
||||
@override
|
||||
void recordAccess(
|
||||
LibraryBuilder accessor, int charOffset, int length, Uri fileUri) {
|
||||
CompilationUnit accessor, int charOffset, int length, Uri fileUri) {
|
||||
accessors.add(new LibraryAccess(accessor, fileUri, charOffset, length));
|
||||
if (accessProblem != null) {
|
||||
addProblem(accessProblem!, charOffset, length, fileUri);
|
||||
|
@ -3881,7 +3895,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
if (import.deferred && import.prefixBuilder?.dependency != null) {
|
||||
libraryDependency = import.prefixBuilder!.dependency!;
|
||||
} else {
|
||||
LibraryBuilder imported = import.imported!.origin;
|
||||
LibraryBuilder imported = import.imported!.libraryBuilder.origin;
|
||||
Library targetLibrary = imported.library;
|
||||
libraryDependency = new LibraryDependency.import(targetLibrary,
|
||||
name: import.prefix,
|
||||
|
@ -3894,7 +3908,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
// Add export
|
||||
Export export = exports[exportIndex++];
|
||||
LibraryDependency libraryDependency = new LibraryDependency.export(
|
||||
export.exported.library,
|
||||
export.exported.libraryBuilder.library,
|
||||
combinators: toKernelCombinators(export.combinators))
|
||||
..fileOffset = export.charOffset;
|
||||
library.addDependency(libraryDependency);
|
||||
|
@ -3903,9 +3917,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
}
|
||||
|
||||
for (Part part in parts) {
|
||||
LibraryBuilder builder = part.builder;
|
||||
if (builder is SourceLibraryBuilder) {
|
||||
builder.addDependencies(library, seen);
|
||||
CompilationUnit compilationUnit = part.compilationUnit;
|
||||
if (compilationUnit is SourceLibraryBuilder) {
|
||||
compilationUnit.addDependencies(library, seen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6228,7 +6242,7 @@ class GenericFunctionTypeCheck {
|
|||
}
|
||||
|
||||
class LibraryAccess {
|
||||
final LibraryBuilder accessor;
|
||||
final CompilationUnit accessor;
|
||||
final Uri fileUri;
|
||||
final int charOffset;
|
||||
final int length;
|
||||
|
@ -6339,15 +6353,15 @@ class SourceLibraryBuilderMemberNameIterator<T extends Builder>
|
|||
|
||||
class Part {
|
||||
final int offset;
|
||||
final LibraryBuilder builder;
|
||||
final CompilationUnit compilationUnit;
|
||||
|
||||
Part(this.offset, this.builder);
|
||||
Part(this.offset, this.compilationUnit);
|
||||
|
||||
OffsetMap get offsetMap {
|
||||
if (builder is SourceLibraryBuilder) {
|
||||
return (builder as SourceLibraryBuilder).offsetMap;
|
||||
if (compilationUnit is SourceLibraryBuilder) {
|
||||
return (compilationUnit as SourceLibraryBuilder).offsetMap;
|
||||
}
|
||||
assert(false, "No offset map for $builder.");
|
||||
return new OffsetMap(builder.fileUri);
|
||||
assert(false, "No offset map for $compilationUnit.");
|
||||
return new OffsetMap(compilationUnit.fileUri);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -150,7 +150,9 @@ class SourceLoader extends Loader {
|
|||
|
||||
final SourceLoaderDataForTesting? dataForTesting;
|
||||
|
||||
final Map<Uri, LibraryBuilder> _builders = <Uri, LibraryBuilder>{};
|
||||
final Map<Uri, CompilationUnit> _compilationUnits = {};
|
||||
|
||||
Map<Uri, LibraryBuilder> _loadedLibraryBuilders = <Uri, LibraryBuilder>{};
|
||||
|
||||
List<SourceLibraryBuilder>? _sourceLibraryBuilders;
|
||||
|
||||
|
@ -205,9 +207,17 @@ class SourceLoader extends Loader {
|
|||
|
||||
// TODO(johnniwinther): Replace with a `singleRoot`.
|
||||
// See also https://dart-review.googlesource.com/c/sdk/+/273381.
|
||||
LibraryBuilder? get firstRoot {
|
||||
LibraryBuilder? get rootLibrary {
|
||||
for (Uri uri in roots) {
|
||||
LibraryBuilder? builder = _builders[uri];
|
||||
LibraryBuilder? builder = lookupLoadedLibraryBuilder(uri);
|
||||
if (builder != null) return builder;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
CompilationUnit? get rootCompilationUnit {
|
||||
for (Uri uri in roots) {
|
||||
CompilationUnit? builder = _compilationUnits[uri];
|
||||
if (builder != null) return builder;
|
||||
}
|
||||
return null;
|
||||
|
@ -226,16 +236,31 @@ class SourceLoader extends Loader {
|
|||
: dataForTesting =
|
||||
retainDataForTesting ? new SourceLoaderDataForTesting() : null;
|
||||
|
||||
bool containsLibraryBuilder(Uri importUri) =>
|
||||
_builders.containsKey(importUri);
|
||||
bool containsLoadedLibraryBuilder(Uri importUri) =>
|
||||
lookupLoadedLibraryBuilder(importUri) != null;
|
||||
|
||||
LibraryBuilder? lookupLibraryBuilder(Uri importUri) => _builders[importUri];
|
||||
LibraryBuilder? lookupLoadedLibraryBuilder(Uri importUri) {
|
||||
return _loadedLibraryBuilders[importUri];
|
||||
}
|
||||
|
||||
/// The [LibraryBuilder]s for libraries built from source or loaded from dill.
|
||||
///
|
||||
/// Before [resolveParts] have been called, this includes parts and
|
||||
/// augmentations.
|
||||
Iterable<LibraryBuilder> get libraryBuilders => _builders.values;
|
||||
CompilationUnit? lookupCompilationUnit(Uri importUri) =>
|
||||
_compilationUnits[importUri];
|
||||
|
||||
CompilationUnit? lookupCompilationUnitByFileUri(Uri fileUri) {
|
||||
// TODO(johnniwinther): Store compilation units in a map by file URI?
|
||||
for (CompilationUnit compilationUnit in _compilationUnits.values) {
|
||||
if (compilationUnit.fileUri == fileUri) {
|
||||
return compilationUnit;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Iterable<CompilationUnit> get compilationUnits => _compilationUnits.values;
|
||||
|
||||
Iterable<LibraryBuilder> get loadedLibraryBuilders {
|
||||
return _loadedLibraryBuilders.values;
|
||||
}
|
||||
|
||||
/// The [SourceLibraryBuilder]s for the libraries built from source by this
|
||||
/// source loader.
|
||||
|
@ -258,20 +283,29 @@ class SourceLoader extends Loader {
|
|||
_sourceLibraryBuilders!.clear();
|
||||
}
|
||||
|
||||
Iterable<Uri> get libraryImportUris => _builders.keys;
|
||||
Iterable<Uri> get loadedLibraryImportUris => _loadedLibraryBuilders.keys;
|
||||
|
||||
void registerLibraryBuilder(LibraryBuilder libraryBuilder) {
|
||||
void registerLoadedLibraryBuilder(LibraryBuilder libraryBuilder) {
|
||||
assert(!libraryBuilder.isPart, "Unexpected part $libraryBuilder.");
|
||||
assert(!libraryBuilder.isAugmenting,
|
||||
"Unexpected augmenting library $libraryBuilder.");
|
||||
Uri uri = libraryBuilder.importUri;
|
||||
_markDartLibraries(uri, libraryBuilder);
|
||||
_builders[uri] = libraryBuilder;
|
||||
_compilationUnits[uri] = libraryBuilder;
|
||||
_loadedLibraryBuilders[uri] = libraryBuilder;
|
||||
}
|
||||
|
||||
LibraryBuilder? deregisterLibraryBuilder(Uri importUri) {
|
||||
return _builders.remove(importUri);
|
||||
LibraryBuilder? deregisterLoadedLibraryBuilder(Uri importUri) {
|
||||
LibraryBuilder? libraryBuilder = _loadedLibraryBuilders.remove(importUri);
|
||||
if (libraryBuilder != null) {
|
||||
_compilationUnits.remove(importUri);
|
||||
}
|
||||
return libraryBuilder;
|
||||
}
|
||||
|
||||
void clearLibraryBuilders() {
|
||||
_builders.clear();
|
||||
_compilationUnits.clear();
|
||||
_loadedLibraryBuilders.clear();
|
||||
}
|
||||
|
||||
/// Run [f] with [uri] and [fileOffset] as the current uri/offset used for
|
||||
|
@ -356,7 +390,8 @@ class SourceLoader extends Loader {
|
|||
}
|
||||
String libraryName = DartLibrarySupport.getDartLibraryName(dottedName);
|
||||
Uri uri = new Uri(scheme: "dart", path: libraryName);
|
||||
LibraryBuilder? library = lookupLibraryBuilder(uri);
|
||||
// TODO(johnniwinther): This should really be libraries only.
|
||||
CompilationUnit? library = lookupCompilationUnit(uri);
|
||||
// TODO(johnniwinther): Why is the dill target sometimes not loaded at this
|
||||
// point? And does it matter?
|
||||
library ??= target.dillTarget.loader.lookupLibraryBuilder(uri);
|
||||
|
@ -555,7 +590,7 @@ class SourceLoader extends Loader {
|
|||
/// as part [uri], and [charOffset] is the location of the corresponding
|
||||
/// directive. If [accessor] isn't allowed to access [uri], it's a
|
||||
/// compile-time error.
|
||||
LibraryBuilder read(Uri uri, int charOffset,
|
||||
CompilationUnit read(Uri uri, int charOffset,
|
||||
{Uri? fileUri,
|
||||
required LibraryBuilder accessor,
|
||||
LibraryBuilder? origin,
|
||||
|
@ -563,7 +598,7 @@ class SourceLoader extends Loader {
|
|||
bool? referenceIsPartOwner,
|
||||
bool isAugmentation = false,
|
||||
bool isPatch = false}) {
|
||||
LibraryBuilder libraryBuilder = _read(uri,
|
||||
CompilationUnit libraryBuilder = _read(uri,
|
||||
fileUri: fileUri,
|
||||
origin: origin,
|
||||
referencesFromIndex: referencesFromIndex,
|
||||
|
@ -587,12 +622,12 @@ class SourceLoader extends Loader {
|
|||
///
|
||||
/// This differs from [read] in that there is no accessor library, meaning
|
||||
/// that access to platform private libraries cannot be granted.
|
||||
LibraryBuilder readAsEntryPoint(
|
||||
CompilationUnit readAsEntryPoint(
|
||||
Uri uri, {
|
||||
Uri? fileUri,
|
||||
IndexedLibrary? referencesFromIndex,
|
||||
}) {
|
||||
LibraryBuilder libraryBuilder = _read(uri,
|
||||
CompilationUnit libraryBuilder = _read(uri,
|
||||
fileUri: fileUri,
|
||||
referencesFromIndex: referencesFromIndex,
|
||||
addAsRoot: true,
|
||||
|
@ -603,7 +638,7 @@ class SourceLoader extends Loader {
|
|||
// handle errors reported without an accessor, since the messages are not
|
||||
// associated with a library. This currently has the side effect that
|
||||
// the first library is the accessor of itself.
|
||||
LibraryBuilder? firstLibrary = firstRoot;
|
||||
CompilationUnit? firstLibrary = rootCompilationUnit;
|
||||
if (firstLibrary != null) {
|
||||
libraryBuilder.recordAccess(
|
||||
firstLibrary, -1, noLength, firstLibrary.fileUri);
|
||||
|
@ -631,7 +666,7 @@ class SourceLoader extends Loader {
|
|||
return true;
|
||||
}
|
||||
|
||||
LibraryBuilder _read(Uri uri,
|
||||
CompilationUnit _read(Uri uri,
|
||||
{Uri? fileUri,
|
||||
LibraryBuilder? origin,
|
||||
IndexedLibrary? referencesFromIndex,
|
||||
|
@ -639,13 +674,13 @@ class SourceLoader extends Loader {
|
|||
required bool isAugmentation,
|
||||
required bool isPatch,
|
||||
required bool addAsRoot}) {
|
||||
LibraryBuilder? libraryBuilder = _builders[uri];
|
||||
if (libraryBuilder == null) {
|
||||
CompilationUnit? compilationUnit = _compilationUnits[uri];
|
||||
if (compilationUnit == null) {
|
||||
if (target.dillTarget.isLoaded) {
|
||||
libraryBuilder = _lookupDillLibraryBuilder(uri);
|
||||
compilationUnit = _lookupDillLibraryBuilder(uri);
|
||||
}
|
||||
if (libraryBuilder == null) {
|
||||
libraryBuilder = _createSourceLibraryBuilder(
|
||||
if (compilationUnit == null) {
|
||||
compilationUnit = _createSourceLibraryBuilder(
|
||||
uri,
|
||||
fileUri,
|
||||
origin as SourceLibraryBuilder?,
|
||||
|
@ -655,9 +690,9 @@ class SourceLoader extends Loader {
|
|||
isPatch,
|
||||
addAsRoot);
|
||||
}
|
||||
_builders[uri] = libraryBuilder;
|
||||
_compilationUnits[uri] = compilationUnit;
|
||||
}
|
||||
return libraryBuilder;
|
||||
return compilationUnit;
|
||||
}
|
||||
|
||||
void _ensureCoreLibrary() {
|
||||
|
@ -688,12 +723,9 @@ class SourceLoader extends Loader {
|
|||
void logSummary(Template<SummaryTemplate> template) {
|
||||
ticker.log((Duration elapsed, Duration sinceStart) {
|
||||
int libraryCount = 0;
|
||||
for (LibraryBuilder library in libraryBuilders) {
|
||||
for (CompilationUnit library in compilationUnits) {
|
||||
if (library.loader == this) {
|
||||
libraryCount++;
|
||||
if (library is SourceLibraryBuilder) {
|
||||
libraryCount += library.augmentationLibraries?.length ?? 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
double ms = elapsed.inMicroseconds / Duration.microsecondsPerMillisecond;
|
||||
|
@ -1028,7 +1060,7 @@ severity: $severity
|
|||
_nnbdMismatchLibraries = null;
|
||||
}
|
||||
if (_unavailableDartLibraries.isNotEmpty) {
|
||||
LibraryBuilder? rootLibrary = firstRoot;
|
||||
CompilationUnit? rootLibrary = rootCompilationUnit;
|
||||
LoadedLibraries? loadedLibraries;
|
||||
for (SourceLibraryBuilder libraryBuilder in _unavailableDartLibraries) {
|
||||
List<LocatedMessage>? context;
|
||||
|
@ -1037,7 +1069,7 @@ severity: $severity
|
|||
templateUnavailableDartLibrary.withArguments(importUri);
|
||||
if (rootLibrary != null) {
|
||||
loadedLibraries ??=
|
||||
new LoadedLibrariesImpl(rootLibrary, libraryBuilders);
|
||||
new LoadedLibrariesImpl(rootLibrary, compilationUnits);
|
||||
Set<String> importChain = computeImportChainsFor(
|
||||
rootLibrary.importUri, loadedLibraries, importUri,
|
||||
verbose: false);
|
||||
|
@ -1166,9 +1198,10 @@ severity: $severity
|
|||
allowPatterns: library.libraryFeatures.patterns.isEnabled);
|
||||
parser.parseUnit(tokens);
|
||||
for (Part part in library.parts) {
|
||||
assert(part.builder.partOfLibrary == library,
|
||||
"Part ${part.builder} is not part of ${library}.");
|
||||
Token tokens = await tokenize(part.builder as SourceLibraryBuilder,
|
||||
assert(part.compilationUnit.partOfLibrary == library,
|
||||
"Part ${part.compilationUnit} is not part of ${library}.");
|
||||
Token tokens = await tokenize(
|
||||
part.compilationUnit as SourceLibraryBuilder,
|
||||
suppressLexicalErrors: true);
|
||||
DietListener listener = createDietListener(library, part.offsetMap);
|
||||
DietParser parser = new DietParser(listener,
|
||||
|
@ -1270,64 +1303,70 @@ severity: $severity
|
|||
}
|
||||
|
||||
void resolveParts() {
|
||||
List<Uri> parts = <Uri>[];
|
||||
Map<Uri, SourceLibraryBuilder> parts = {};
|
||||
List<SourceLibraryBuilder> libraries = [];
|
||||
List<SourceLibraryBuilder> sourceLibraries = [];
|
||||
List<SourceLibraryBuilder> augmentationLibraries = [];
|
||||
_builders.forEach((Uri uri, LibraryBuilder library) {
|
||||
_compilationUnits.forEach((Uri uri, CompilationUnit library) {
|
||||
if (library.loader == this && library is SourceLibraryBuilder) {
|
||||
if (library.isPart) {
|
||||
parts.add(uri);
|
||||
parts[uri] = library;
|
||||
} else {
|
||||
if (library.isAugmenting) {
|
||||
augmentationLibraries.add(library);
|
||||
} else {
|
||||
sourceLibraries.add(library);
|
||||
_loadedLibraryBuilders[uri] = library;
|
||||
}
|
||||
libraries.add(library);
|
||||
}
|
||||
} else {
|
||||
_loadedLibraryBuilders[uri] = library as DillLibraryBuilder;
|
||||
}
|
||||
});
|
||||
Set<Uri> usedParts = new Set<Uri>();
|
||||
for (SourceLibraryBuilder library in libraries) {
|
||||
library.includeParts(usedParts);
|
||||
}
|
||||
for (Uri uri in parts) {
|
||||
for (MapEntry<Uri, SourceLibraryBuilder> entry in parts.entries) {
|
||||
Uri uri = entry.key;
|
||||
SourceLibraryBuilder part = entry.value;
|
||||
if (usedParts.contains(uri)) {
|
||||
LibraryBuilder? part = _builders.remove(uri);
|
||||
_compilationUnits.remove(uri);
|
||||
if (roots.contains(uri)) {
|
||||
roots.remove(uri);
|
||||
roots.add(part!.partOfLibrary!.importUri);
|
||||
roots.add(part.partOfLibrary!.importUri);
|
||||
}
|
||||
} else {
|
||||
SourceLibraryBuilder part =
|
||||
lookupLibraryBuilder(uri) as SourceLibraryBuilder;
|
||||
part.addProblem(messagePartOrphan, 0, 1, part.fileUri);
|
||||
part.validatePart(null, null);
|
||||
sourceLibraries.add(part);
|
||||
_loadedLibraryBuilders[uri] = part;
|
||||
}
|
||||
}
|
||||
ticker.logMs("Resolved parts");
|
||||
|
||||
for (SourceLibraryBuilder augmentationLibrary in augmentationLibraries) {
|
||||
_builders.remove(augmentationLibrary.fileUri);
|
||||
_compilationUnits.remove(augmentationLibrary.fileUri);
|
||||
augmentationLibrary.origin.addAugmentationLibrary(augmentationLibrary);
|
||||
augmentationLibrary.applyAugmentations();
|
||||
}
|
||||
_sourceLibraryBuilders = sourceLibraries;
|
||||
assert(
|
||||
libraryBuilders.every((library) => !library.isAugmenting),
|
||||
_compilationUnits.values.every((library) =>
|
||||
!(library is SourceLibraryBuilder && library.isAugmenting)),
|
||||
"Augmentation library found in libraryBuilders: "
|
||||
"${libraryBuilders.where((library) => library.isAugmenting)}.");
|
||||
// ignore: lines_longer_than_80_chars
|
||||
"${_compilationUnits.values.where((library) => !(library is SourceLibraryBuilder && library.isAugmenting))}.");
|
||||
assert(
|
||||
sourceLibraries.every((library) => !library.isAugmenting),
|
||||
"Augmentation library found in sourceLibraryBuilders: "
|
||||
"${sourceLibraries.where((library) => library.isAugmenting)}.");
|
||||
assert(
|
||||
libraryBuilders.every((library) =>
|
||||
_compilationUnits.values.every((library) =>
|
||||
library.loader != this || sourceLibraries.contains(library)),
|
||||
"Source library not found in sourceLibraryBuilders:"
|
||||
"${libraryBuilders.where((library) => // force line break
|
||||
"${_compilationUnits.values.where((library) => // force line break
|
||||
library.loader == this && !sourceLibraries.contains(library))}");
|
||||
ticker.logMs("Applied augmentations");
|
||||
}
|
||||
|
@ -1390,31 +1429,6 @@ severity: $severity
|
|||
exportee.exporters.clear();
|
||||
}
|
||||
ticker.logMs("Computed library scopes");
|
||||
// debugPrintExports();
|
||||
}
|
||||
|
||||
void debugPrintExports() {
|
||||
// TODO(sigmund): should be `covariant SourceLibraryBuilder`.
|
||||
_builders.forEach((Uri uri, dynamic l) {
|
||||
SourceLibraryBuilder library = l;
|
||||
Set<Builder> members = new Set<Builder>();
|
||||
Iterator<Builder> memberIterator = library.localMembersIterator;
|
||||
while (memberIterator.moveNext()) {
|
||||
members.add(memberIterator.current);
|
||||
}
|
||||
List<String> exports = <String>[];
|
||||
NameIterator<Builder> exportsIterator = library.exportScope
|
||||
.filteredNameIterator(
|
||||
includeDuplicates: true, includeAugmentations: false);
|
||||
while (exportsIterator.moveNext()) {
|
||||
if (!members.contains(exportsIterator.current)) {
|
||||
exports.add(exportsIterator.name);
|
||||
}
|
||||
}
|
||||
if (exports.isNotEmpty) {
|
||||
print("$uri exports $exports");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/// Resolve [NamedTypeBuilder]s in [libraryBuilders].
|
||||
|
@ -1431,7 +1445,8 @@ severity: $severity
|
|||
///
|
||||
/// If no macros need precompilation, `null` is returned.
|
||||
NeededPrecompilations? computeMacroDeclarations() {
|
||||
LibraryBuilder? macroLibraryBuilder = lookupLibraryBuilder(macroLibraryUri);
|
||||
LibraryBuilder? macroLibraryBuilder =
|
||||
lookupLoadedLibraryBuilder(macroLibraryUri);
|
||||
if (macroLibraryBuilder == null) {
|
||||
// The macro library might not be directly imported by the source
|
||||
// libraries, so we look up in the dill loader as well.
|
||||
|
@ -1520,7 +1535,7 @@ severity: $severity
|
|||
return layeredComponents;
|
||||
}
|
||||
|
||||
Graph<Uri> graph = new BuilderGraph(_builders);
|
||||
Graph<Uri> graph = new BuilderGraph(_compilationUnits);
|
||||
|
||||
/// Libraries that are considered precompiled. These are libraries that are
|
||||
/// either given as precompiled macro libraries, or libraries that these
|
||||
|
@ -1537,7 +1552,7 @@ severity: $severity
|
|||
}
|
||||
}
|
||||
|
||||
for (LibraryBuilder builder in _builders.values) {
|
||||
for (CompilationUnit builder in _compilationUnits.values) {
|
||||
if (builder.importUri.isScheme("dart") && !builder.isSynthetic) {
|
||||
// Assume the platform is precompiled.
|
||||
addPrecompiledLibrary(builder.importUri);
|
||||
|
@ -2446,11 +2461,12 @@ severity: $severity
|
|||
Component computeFullComponent() {
|
||||
Set<Library> libraries = new Set<Library>();
|
||||
List<Library> workList = <Library>[];
|
||||
for (LibraryBuilder libraryBuilder in libraryBuilders) {
|
||||
if (!libraryBuilder.isAugmenting &&
|
||||
(libraryBuilder.loader == this ||
|
||||
libraryBuilder.importUri.isScheme("dart") ||
|
||||
roots.contains(libraryBuilder.importUri))) {
|
||||
for (LibraryBuilder libraryBuilder in loadedLibraryBuilders) {
|
||||
assert(!libraryBuilder.isAugmenting,
|
||||
"Unexpected augmentation library $libraryBuilder.");
|
||||
if ((libraryBuilder.loader == this ||
|
||||
libraryBuilder.importUri.isScheme("dart") ||
|
||||
roots.contains(libraryBuilder.importUri))) {
|
||||
if (libraries.add(libraryBuilder.library)) {
|
||||
workList.add(libraryBuilder.library);
|
||||
}
|
||||
|
@ -2919,7 +2935,7 @@ severity: $severity
|
|||
_hierarchyBuilder = null;
|
||||
_membersBuilder = null;
|
||||
_typeInferenceEngine = null;
|
||||
_builders.clear();
|
||||
_compilationUnits.clear();
|
||||
libraries.clear();
|
||||
sourceBytes.clear();
|
||||
target.releaseAncillaryResources();
|
||||
|
@ -2929,12 +2945,14 @@ severity: $severity
|
|||
|
||||
@override
|
||||
ClassBuilder computeClassBuilderFromTargetClass(Class cls) {
|
||||
Library kernelLibrary = cls.enclosingLibrary;
|
||||
LibraryBuilder? library = lookupLibraryBuilder(kernelLibrary.importUri);
|
||||
if (library == null) {
|
||||
Library library = cls.enclosingLibrary;
|
||||
LibraryBuilder? libraryBuilder =
|
||||
lookupLoadedLibraryBuilder(library.importUri);
|
||||
if (libraryBuilder == null) {
|
||||
return target.dillTarget.loader.computeClassBuilderFromTargetClass(cls);
|
||||
}
|
||||
return library.lookupLocalMember(cls.name, required: true) as ClassBuilder;
|
||||
return libraryBuilder.lookupLocalMember(cls.name, required: true)
|
||||
as ClassBuilder;
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -2942,7 +2960,8 @@ severity: $severity
|
|||
computeExtensionTypeBuilderFromTargetExtensionType(
|
||||
ExtensionTypeDeclaration extensionType) {
|
||||
Library kernelLibrary = extensionType.enclosingLibrary;
|
||||
LibraryBuilder? library = lookupLibraryBuilder(kernelLibrary.importUri);
|
||||
LibraryBuilder? library =
|
||||
lookupLoadedLibraryBuilder(kernelLibrary.importUri);
|
||||
if (library == null) {
|
||||
return target.dillTarget.loader
|
||||
.computeExtensionTypeBuilderFromTargetExtensionType(extensionType);
|
||||
|
|
|
@ -127,7 +127,8 @@ LibraryBuilder? lookupLibraryBuilder(
|
|||
InternalCompilerResult compilerResult, Library library,
|
||||
{bool required = true}) {
|
||||
SourceLoader loader = compilerResult.kernelTargetForTesting!.loader;
|
||||
LibraryBuilder? builder = loader.lookupLibraryBuilder(library.importUri);
|
||||
LibraryBuilder? builder =
|
||||
loader.lookupLoadedLibraryBuilder(library.importUri);
|
||||
if (builder == null && required) {
|
||||
throw new ArgumentError("DeclarationBuilder for $library not found.");
|
||||
}
|
||||
|
|
|
@ -1753,7 +1753,7 @@ worlds:
|
|||
bool _knownByCompiler(Uri uri) {
|
||||
LibraryBuilder? libraryBuilder = _latestCrashingIncrementalCompiler!
|
||||
.kernelTargetForTesting!.loader
|
||||
.lookupLibraryBuilder(_getImportUri(uri));
|
||||
.lookupLoadedLibraryBuilder(_getImportUri(uri));
|
||||
if (libraryBuilder != null) {
|
||||
return true;
|
||||
}
|
||||
|
@ -1832,7 +1832,7 @@ worlds:
|
|||
|
||||
knownInitialBuilders = <Uri, LibraryBuilder>{
|
||||
for (var v in incrementalCompiler
|
||||
.kernelTargetForTesting!.loader.libraryBuilders)
|
||||
.kernelTargetForTesting!.loader.loadedLibraryBuilders)
|
||||
v.importUri: v
|
||||
};
|
||||
|
||||
|
|
|
@ -41,8 +41,7 @@ import 'package:kernel/ast.dart'
|
|||
TypeParameter,
|
||||
VariableDeclaration,
|
||||
VariableGet,
|
||||
defaultLanguageVersion,
|
||||
dummyLibraryDependency;
|
||||
defaultLanguageVersion;
|
||||
import 'package:kernel/class_hierarchy.dart';
|
||||
import 'package:kernel/core_types.dart';
|
||||
import 'package:kernel/target/targets.dart' show NoneTarget, TargetFlags;
|
||||
|
@ -87,8 +86,13 @@ Future<void> main() async {
|
|||
isAugmentation: false,
|
||||
isPatch: false);
|
||||
libraryBuilder.markLanguageVersionFinal();
|
||||
LoadLibraryBuilder loadLibraryBuilder =
|
||||
new LoadLibraryBuilder(libraryBuilder, dummyLibraryDependency, -1);
|
||||
LoadLibraryBuilder loadLibraryBuilder = new LoadLibraryBuilder(
|
||||
libraryBuilder,
|
||||
/*dummyLibraryDependency,*/ -1,
|
||||
libraryBuilder,
|
||||
'prefix',
|
||||
-1,
|
||||
null);
|
||||
Procedure getter = new Procedure(
|
||||
new Name("myGetter"), ProcedureKind.Getter, new FunctionNode(null),
|
||||
fileUri: uri);
|
||||
|
|
|
@ -1184,8 +1184,8 @@ class FuzzCompiles
|
|||
|
||||
// Create lookup-table from file uri to whatever.
|
||||
Map<Uri, LibraryBuilder> builders = {};
|
||||
for (LibraryBuilder builder
|
||||
in incrementalCompiler.kernelTargetForTesting!.loader.libraryBuilders) {
|
||||
for (LibraryBuilder builder in incrementalCompiler
|
||||
.kernelTargetForTesting!.loader.loadedLibraryBuilders) {
|
||||
if (builder.importUri.isScheme("dart") && !builder.isSynthetic) continue;
|
||||
builders[builder.fileUri] = builder;
|
||||
for (LibraryPart part in builder.library.parts) {
|
||||
|
@ -1332,8 +1332,8 @@ class FuzzCompiles
|
|||
|
||||
// Create lookup-table from file uri to whatever.
|
||||
Map<Uri, LibraryBuilder> builders = {};
|
||||
for (LibraryBuilder builder
|
||||
in incrementalCompiler.kernelTargetForTesting!.loader.libraryBuilders) {
|
||||
for (LibraryBuilder builder in incrementalCompiler
|
||||
.kernelTargetForTesting!.loader.loadedLibraryBuilders) {
|
||||
if (builder.importUri.isScheme("dart") && !builder.isSynthetic) continue;
|
||||
if (builder.importUri.isScheme("package") &&
|
||||
!builder.fileUri.toString().contains("/pkg/front_end/testcases/")) {
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
Errors: {
|
||||
}
|
||||
method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
|
||||
return 0;
|
||||
<no procedure>
|
||||
|
|
|
@ -317,4 +317,4 @@ wildcard_variables/local_var_no_shadowing: semiFuzzFailureOnForceRebuildBodies #
|
|||
# Verifier crashes in semi-fuzzing
|
||||
macros/extend_augmented: SemiFuzzCrash
|
||||
macros/augment_concrete: SemiFuzzCrash
|
||||
macros/multiple_augment_class: SemiFuzzCrash
|
||||
macros/multiple_augment_class: SemiFuzzCrash
|
||||
|
|
|
@ -790,8 +790,8 @@ class DocTestIncrementalCompiler extends IncrementalCompiler {
|
|||
assert(dillTargetForTesting != null && kernelTargetForTesting != null);
|
||||
|
||||
return await context.runInContext((_) async {
|
||||
LibraryBuilder libraryBuilder =
|
||||
kernelTargetForTesting!.loader.readAsEntryPoint(libraryUri);
|
||||
LibraryBuilder libraryBuilder = kernelTargetForTesting!.loader
|
||||
.lookupLoadedLibraryBuilder(libraryUri)!;
|
||||
|
||||
kernelTargetForTesting!.loader.resetSeenMessages();
|
||||
|
||||
|
|
Loading…
Reference in a new issue