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

Unified Diff: pkg/kernel/lib/analyzer/loader.dart

Issue 2665723002: Implement canonical name scheme in kernel. (Closed)
Patch Set: Address Kevin's comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/kernel/lib/analyzer/ast_from_analyzer.dart ('k') | pkg/kernel/lib/ast.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/kernel/lib/analyzer/loader.dart
diff --git a/pkg/kernel/lib/analyzer/loader.dart b/pkg/kernel/lib/analyzer/loader.dart
index d9dbf130209a83aa8396307babdb9012a0c8f8fc..c6320a9c2a025bfb8ef7a98d2e61d32aedcc3740 100644
--- a/pkg/kernel/lib/analyzer/loader.dart
+++ b/pkg/kernel/lib/analyzer/loader.dart
@@ -22,7 +22,6 @@ import 'package:package_config/discovery.dart';
import 'package:package_config/packages.dart';
import '../ast.dart' as ast;
-import '../repository.dart';
import '../target/targets.dart' show Target;
import '../type_algebra.dart';
import 'analyzer.dart';
@@ -88,7 +87,7 @@ abstract class ReferenceLevelLoader {
}
class DartLoader implements ReferenceLevelLoader {
- final Repository repository;
+ final ast.Program program;
final ApplicationRoot applicationRoot;
final Bimap<ClassElement, ast.Class> _classes =
new Bimap<ClassElement, ast.Class>();
@@ -97,6 +96,8 @@ class DartLoader implements ReferenceLevelLoader {
<TypeParameterElement, ast.TypeParameter>{};
final Map<ast.Library, Map<String, ast.Class>> _mixinApplications =
<ast.Library, Map<String, ast.Class>>{};
+ final Map<LibraryElement, ast.Library> _libraries =
+ <LibraryElement, ast.Library>{};
final AnalysisContext context;
LibraryElement _dartCoreLibrary;
final List errors = [];
@@ -114,7 +115,7 @@ class DartLoader implements ReferenceLevelLoader {
bool get strongMode => context.analysisOptions.strongMode;
- DartLoader(this.repository, DartOptions options, Packages packages,
+ DartLoader(this.program, DartOptions options, Packages packages,
{DartSdk dartSdk,
AnalysisContext context,
this.ignoreRedirectingFactories: true})
@@ -126,11 +127,28 @@ class DartLoader implements ReferenceLevelLoader {
return element.name.isEmpty ? null : element.name;
}
+ LibraryElement getLibraryElementFromUri(Uri uri) {
+ var source = context.sourceFactory.forUri2(uri);
+ if (source == null) return null;
+ return context.computeLibraryElement(source);
+ }
+
ast.Library getLibraryReference(LibraryElement element) {
var uri = applicationRoot.relativeUri(element.source.uri);
- return repository.getLibraryReference(uri)
- ..name ??= getLibraryName(element)
- ..fileUri = '${element.source.uri}';
+ var library = _libraries[element];
+ if (library == null) {
+ library = new ast.Library(uri)
+ ..isExternal = true
+ ..name = getLibraryName(element)
+ ..fileUri = '${element.source.uri}';
+ program.libraries.add(library..parent = program);
+ _libraries[element] = library;
+ }
+ return library;
+ }
+
+ ast.Library getLibraryReferenceFromUri(Uri uri) {
+ return getLibraryReference(getLibraryElementFromUri(uri));
}
void _buildTopLevelMember(
@@ -348,9 +366,9 @@ class DartLoader implements ReferenceLevelLoader {
mixedInType: freshParameters.substituteSuper(mixinType),
fileUri: classNode.fileUri)..fileOffset = element.nameOffset;
mixinClass.level = ast.ClassLevel.Type;
+ addMixinClassToLibrary(mixinClass, classNode.enclosingLibrary);
supertype = new ast.Supertype(mixinClass,
classNode.typeParameters.map(makeTypeParameterType).toList());
- addMixinClassToLibrary(mixinClass, classNode.enclosingLibrary);
// This class cannot be used from anywhere else, so don't try to
// generate shared mixin applications using it.
useSharedMixin = false;
@@ -446,25 +464,25 @@ class DartLoader implements ReferenceLevelLoader {
ast.Member _buildMemberReference(Element element) {
assert(element != null);
- var node = _buildOrphanedMemberReference(element);
+ var member = _buildOrphanedMemberReference(element);
// Set the parent pointer and store it in the enclosing class or library.
// If the enclosing library is being built from the AST, do not add the
// member, since the AST builder will put it in there.
var parent = element.enclosingElement;
if (parent is ClassElement) {
var class_ = getClassReference(parent);
- node.parent = class_;
+ member.parent = class_;
if (!isLibraryBeingLoaded(element.library)) {
- class_.addMember(node);
+ class_.addMember(member);
}
} else {
var library = getLibraryReference(element.library);
- node.parent = library;
+ member.parent = library;
if (!isLibraryBeingLoaded(element.library)) {
- library.addMember(node);
+ library.addMember(member);
}
}
- return node;
+ return member;
}
ast.Member _buildOrphanedMemberReference(Element element) {
@@ -717,8 +735,8 @@ class DartLoader implements ReferenceLevelLoader {
}
}
}
- for (int i = 0; i < repository.libraries.length; ++i) {
- var library = repository.libraries[i];
+ for (int i = 0; i < program.libraries.length; ++i) {
+ var library = program.libraries[i];
if (compileSdk || library.importUri.scheme != 'dart') {
ensureLibraryIsLoaded(library);
}
@@ -730,7 +748,7 @@ class DartLoader implements ReferenceLevelLoader {
/// This operation may be expensive and should only be used for diagnostics.
List<String> getLoadedFileNames() {
var list = <String>[];
- for (var library in repository.libraries) {
+ for (var library in program.libraries) {
LibraryElement element = context.computeLibraryElement(context
.sourceFactory
.forUri2(applicationRoot.absoluteUri(library.importUri)));
@@ -788,13 +806,11 @@ class DartLoader implements ReferenceLevelLoader {
return main;
}
- ast.Program loadProgram(Uri mainLibrary, {Target target, bool compileSdk}) {
- Uri uri = applicationRoot.relativeUri(mainLibrary);
- ast.Library library = repository.getLibraryReference(uri);
+ void loadProgram(Uri mainLibrary, {Target target, bool compileSdk}) {
+ ast.Library library = getLibraryReferenceFromUri(mainLibrary);
ensureLibraryIsLoaded(library);
var mainMethod = _getMainMethod(mainLibrary);
loadEverything(target: target, compileSdk: compileSdk);
- var program = new ast.Program(repository.libraries);
if (mainMethod == null) {
mainMethod = _makeMissingMainMethod(library);
}
@@ -815,12 +831,10 @@ class DartLoader implements ReferenceLevelLoader {
new ast.Source(lineInfo.lineStarts, sourceCode);
}
}
- return program;
}
ast.Library loadLibrary(Uri uri) {
- ast.Library library =
- repository.getLibraryReference(applicationRoot.relativeUri(uri));
+ ast.Library library = getLibraryReferenceFromUri(uri);
ensureLibraryIsLoaded(library);
return library;
}
@@ -851,7 +865,7 @@ class DartLoaderBatch {
String lastPackagePath;
bool lastStrongMode;
- Future<DartLoader> getLoader(Repository repository, DartOptions options,
+ Future<DartLoader> getLoader(ast.Program program, DartOptions options,
{String packageDiscoveryPath}) async {
if (dartSdk == null ||
lastSdk != options.sdk ||
@@ -867,7 +881,7 @@ class DartLoaderBatch {
packages = await createPackages(options.packagePath,
discoveryPath: packageDiscoveryPath);
}
- return new DartLoader(repository, options, packages, dartSdk: dartSdk);
+ return new DartLoader(program, options, packages, dartSdk: dartSdk);
}
}
« no previous file with comments | « pkg/kernel/lib/analyzer/ast_from_analyzer.dart ('k') | pkg/kernel/lib/ast.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698