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

Unified Diff: lib/src/compiler/code_generator.dart

Issue 1917863005: Qualify library names in packages (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | lib/src/compiler/command.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/compiler/code_generator.dart
diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart
index 72e053a27c390badf0c2b8c49f4364c416e5de34..d6e8a5d91e68e0603021bd950b6397c45b103203 100644
--- a/lib/src/compiler/code_generator.dart
+++ b/lib/src/compiler/code_generator.dart
@@ -113,6 +113,8 @@ class CodeGenerator extends GeneralizingAstVisitor
BuildUnit _buildUnit;
+ String _buildRoot;
+
CodeGenerator(AnalysisContext c, this.options, this._extensionTypes)
: context = c,
types = c.typeProvider,
@@ -131,6 +133,10 @@ class CodeGenerator extends GeneralizingAstVisitor
JSModuleFile compile(BuildUnit unit, List<CompilationUnit> compilationUnits,
List<String> errors) {
_buildUnit = unit;
+ _buildRoot = _buildUnit.buildRoot;
+ if (!_buildRoot.endsWith('/')) {
Paul Berry 2016/04/28 15:49:30 AFAICT, buildRoot uses OS conventions, this won't
vsm 2016/04/28 21:18:04 Hmm, buildRoot might not actually be a native file
+ _buildRoot = '$_buildRoot/';
+ }
var jsTree = _emitModule(compilationUnits);
var codeAndSourceMap = _writeJSText(unit, jsTree);
@@ -190,7 +196,7 @@ class CodeGenerator extends GeneralizingAstVisitor
var libraryTemp = _isDartRuntime(library)
? _runtimeLibVar
- : new JS.TemporaryId(jsLibraryName(library));
+ : new JS.TemporaryId(jsLibraryName(_buildRoot, library));
_libraries[library] = libraryTemp;
items.add(new JS.ExportDeclaration(
js.call('const # = Object.create(null)', [libraryTemp])));
@@ -3760,8 +3766,8 @@ class CodeGenerator extends GeneralizingAstVisitor
JS.Identifier emitLibraryName(LibraryElement library) {
// It's either one of the libraries in this module, or it's an import.
return _libraries[library] ??
- _imports.putIfAbsent(
- library, () => new JS.TemporaryId(jsLibraryName(library)));
+ _imports.putIfAbsent(library,
+ () => new JS.TemporaryId(jsLibraryName(_buildRoot, library)));
}
JS.Node annotate(JS.Node node, AstNode original, [Element element]) {
@@ -3837,8 +3843,27 @@ class CodeGenerator extends GeneralizingAstVisitor
/// Choose a canonical name from the library element.
/// This never uses the library's name (the identifier in the `library`
/// declaration) as it doesn't have any meaningful rules enforced.
-String jsLibraryName(LibraryElement library) {
- return pathToJSIdentifier(library.source.uri.pathSegments.last);
+String jsLibraryName(String buildRoot, LibraryElement library) {
+ var uri = library.source.uri;
+ if (uri.scheme == 'dart') {
+ return uri.path;
+ }
+ // TODO(vsm): This is not necessarily unique if '__' appears in a file name.
+ var separator = '__';
+ String qualifiedPath;
+ if (uri.scheme == 'package') {
+ // Strip the package name.
+ // TODO(vsm): This is not unique if an escaped '/'appears in a filename.
+ // E.g., "foo/bar.dart" and "foo$47bar.dart" would collide.
+ qualifiedPath = uri.pathSegments.skip(1).join(separator);
+ } else if (uri.path.startsWith(buildRoot)) {
Paul Berry 2016/04/28 15:49:30 This won't be correct on Windows, because uri.path
+ qualifiedPath =
+ uri.path.substring(buildRoot.length).replaceAll('/', separator);
Paul Berry 2016/04/28 15:49:30 Use path.separator instead of '/'.
+ } else {
+ // We don't have a unique name.
+ throw 'Invalid build root. $buildRoot does not contain ${uri.path}';
Siggi Cherem (dart-lang) 2016/04/28 15:13:28 nit: maybe rephrase as "Invalid build root. ${uri.
vsm 2016/04/28 15:31:45 I was thinking "contain" in the directory sense no
Siggi Cherem (dart-lang) 2016/04/28 15:43:49 Ah! :) makes sense. maybe: "is not a parent of"?
+ }
+ return pathToJSIdentifier(qualifiedPath);
}
/// Shorthand for identifier-like property names.
« no previous file with comments | « no previous file | lib/src/compiler/command.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698