[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:
Johnni Winther 2024-06-10 13:41:24 +00:00 committed by Commit Queue
parent 911b8d11a7
commit b6249b851f
23 changed files with 415 additions and 299 deletions

View file

@ -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 {

View file

@ -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;

View file

@ -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);
}
}

View file

@ -72,6 +72,9 @@ class DillLibraryBuilder extends LibraryBuilderImpl {
lazyExportScope.libraryBuilder = this;
}
@override
LibraryBuilder get libraryBuilder => this;
@override
LibraryBuilder get origin => this;

View file

@ -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;
}

View file

@ -15,7 +15,7 @@ class Export {
final LibraryBuilder exporter;
/// The library being exported.
LibraryBuilder exported;
CompilationUnit exported;
final List<CombinatorBuilder>? combinators;

View file

@ -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);
}

View file

@ -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.

View file

@ -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!) {

View file

@ -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) {

View file

@ -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);
}

View file

@ -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.

View file

@ -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;

View file

@ -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(

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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.");
}

View file

@ -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
};

View file

@ -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);

View file

@ -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/")) {

View file

@ -1,4 +1,3 @@
Errors: {
}
method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
return 0;
<no procedure>

View file

@ -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

View file

@ -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();