| Index: pkg/polymer/lib/src/compiler.dart
|
| diff --git a/pkg/polymer/lib/src/compiler.dart b/pkg/polymer/lib/src/compiler.dart
|
| index 5e2c98f4238019f05062a9c45941b43928d780fe..0b90a2b3d7b0b2bcc815c52efbc62fbc7ec4ee68 100644
|
| --- a/pkg/polymer/lib/src/compiler.dart
|
| +++ b/pkg/polymer/lib/src/compiler.dart
|
| @@ -12,7 +12,6 @@ import 'package:analyzer_experimental/src/generated/ast.dart' show Directive, Ur
|
| import 'package:csslib/visitor.dart' show StyleSheet, treeToDebugString;
|
| import 'package:html5lib/dom.dart';
|
| import 'package:html5lib/parser.dart';
|
| -import 'package:observe/transform.dart' show transformObservables;
|
| import 'package:source_maps/span.dart' show Span;
|
| import 'package:source_maps/refactor.dart' show TextEditTransaction;
|
| import 'package:source_maps/printer.dart';
|
| @@ -23,13 +22,11 @@ import 'css_analyzer.dart' show analyzeCss, findUrlsImported,
|
| import 'css_emitters.dart' show rewriteCssUris,
|
| emitComponentStyleSheet, emitOriginalCss, emitStyleSheet;
|
| import 'dart_parser.dart';
|
| -import 'emitters.dart';
|
| import 'file_system.dart';
|
| import 'files.dart';
|
| import 'info.dart';
|
| import 'messages.dart';
|
| import 'compiler_options.dart';
|
| -import 'paths.dart';
|
| import 'utils.dart';
|
|
|
| /**
|
| @@ -57,12 +54,11 @@ class Compiler {
|
| final FileSystem fileSystem;
|
| final CompilerOptions options;
|
| final List<SourceFile> files = <SourceFile>[];
|
| - final List<OutputFile> output = <OutputFile>[];
|
|
|
| String _mainPath;
|
| + String _packageRoot;
|
| String _resetCssFile;
|
| StyleSheet _cssResetStyleSheet;
|
| - PathMapper _pathMapper;
|
| Messages _messages;
|
|
|
| FutureGroup _tasks;
|
| @@ -79,8 +75,7 @@ class Compiler {
|
| _mainPath = options.inputFile;
|
| var mainDir = path.dirname(_mainPath);
|
| var baseDir = options.baseDir != null ? options.baseDir : mainDir;
|
| - var outputDir = options.outputDir != null ? options.outputDir : mainDir;
|
| - var packageRoot = options.packageRoot != null ? options.packageRoot
|
| + _packageRoot = options.packageRoot != null ? options.packageRoot
|
| : path.join(path.dirname(_mainPath), 'packages');
|
|
|
| if (options.resetCssFile != null) {
|
| @@ -92,18 +87,14 @@ class Compiler {
|
| }
|
|
|
| // Normalize paths - all should be relative or absolute paths.
|
| - if (path.isAbsolute(_mainPath) || path.isAbsolute(baseDir) ||
|
| - path.isAbsolute(outputDir) || path.isAbsolute(packageRoot)) {
|
| + if (path.isAbsolute(_mainPath) || path.isAbsolute(baseDir)
|
| + || path.isAbsolute(_packageRoot)) {
|
| if (path.isRelative(_mainPath)) _mainPath = path.resolve(_mainPath);
|
| if (path.isRelative(baseDir)) baseDir = path.resolve(baseDir);
|
| - if (path.isRelative(outputDir)) outputDir = path.resolve(outputDir);
|
| - if (path.isRelative(packageRoot)) {
|
| - packageRoot = path.resolve(packageRoot);
|
| + if (path.isRelative(_packageRoot)) {
|
| + _packageRoot = path.resolve(_packageRoot);
|
| }
|
| }
|
| - _pathMapper = new PathMapper(
|
| - baseDir, outputDir, packageRoot, options.forceMangle,
|
| - options.rewriteUrls);
|
| }
|
|
|
| /** Compile the application starting from the given input file. */
|
| @@ -118,15 +109,9 @@ class Compiler {
|
|
|
| // Analyze all CSS files.
|
| _time('Analyzed Style Sheets', '', () =>
|
| - analyzeCss(_pathMapper.packageRoot, files, info,
|
| + analyzeCss(_packageRoot, files, info,
|
| global.pseudoElements, _messages,
|
| warningsAsErrors: options.warningsAsErrors));
|
| -
|
| - // TODO(jmesserly): need to go through our errors, and figure out if some
|
| - // of them should be warnings instead.
|
| - if (_messages.hasErrors || options.analysisOnly) return;
|
| - _transformDart();
|
| - _emit();
|
| });
|
| }
|
|
|
| @@ -151,8 +136,8 @@ class Compiler {
|
| files.add(file);
|
|
|
| var fileInfo = _time('Analyzed definitions', inputUrl.url, () {
|
| - return analyzeDefinitions(global, inputUrl, file.document,
|
| - _pathMapper.packageRoot, _messages, isEntryPoint: isEntryPoint);
|
| + return analyzeDefinitions(global, inputUrl, file.document, _packageRoot,
|
| + _messages, isEntryPoint: isEntryPoint);
|
| });
|
| info[inputUrl.resolvedPath] = fileInfo;
|
|
|
| @@ -162,7 +147,6 @@ class Compiler {
|
| null)));
|
| }
|
|
|
| - _setOutputFilenames(fileInfo);
|
| _processImports(fileInfo);
|
|
|
| // Load component files referenced by [file].
|
| @@ -179,8 +163,8 @@ class Compiler {
|
| _loadFile(fileInfo.externalFile, _parseDartFile);
|
|
|
| // Process any @imports inside of a <style> tag.
|
| - var urlInfos = findUrlsImported(fileInfo, fileInfo.inputUrl,
|
| - _pathMapper.packageRoot, file.document, _messages, options);
|
| + var urlInfos = findUrlsImported(fileInfo, fileInfo.inputUrl, _packageRoot,
|
| + file.document, _messages, options);
|
| for (var urlInfo in urlInfos) {
|
| _loadFile(urlInfo, _parseCssFile);
|
| }
|
| @@ -195,8 +179,8 @@ class Compiler {
|
|
|
| // Process any @imports inside of the <style> tag in a component.
|
| var urlInfos = findUrlsImported(component,
|
| - component.declaringFile.inputUrl, _pathMapper.packageRoot,
|
| - component.element, _messages, options);
|
| + component.declaringFile.inputUrl, _packageRoot, component.element,
|
| + _messages, options);
|
| for (var urlInfo in urlInfos) {
|
| _loadFile(urlInfo, _parseCssFile);
|
| }
|
| @@ -216,36 +200,8 @@ class Compiler {
|
| }
|
| }
|
|
|
| - void _setOutputFilenames(FileInfo fileInfo) {
|
| - var filePath = fileInfo.dartCodeUrl.resolvedPath;
|
| - fileInfo.outputFilename = _pathMapper.mangle(path.basename(filePath),
|
| - '.dart', path.extension(filePath) == '.html');
|
| - for (var component in fileInfo.declaredComponents) {
|
| - var externalFile = component.externalFile;
|
| - var name = null;
|
| - if (externalFile != null) {
|
| - name = _pathMapper.mangle(
|
| - path.basename(externalFile.resolvedPath), '.dart');
|
| - } else {
|
| - var declaringFile = component.declaringFile;
|
| - var prefix = path.basename(declaringFile.inputUrl.resolvedPath);
|
| - if (declaringFile.declaredComponents.length == 1
|
| - && !declaringFile.codeAttached && !declaringFile.isEntryPoint) {
|
| - name = _pathMapper.mangle(prefix, '.dart', true);
|
| - } else {
|
| - var componentName = component.tagName.replaceAll('-', '_');
|
| - name = _pathMapper.mangle('${prefix}_$componentName', '.dart', true);
|
| - }
|
| - }
|
| - component.outputFilename = name;
|
| - }
|
| - }
|
| -
|
| /** Parse an HTML file. */
|
| Future _parseHtmlFile(UrlInfo inputUrl) {
|
| - if (!_pathMapper.checkInputPath(inputUrl, _messages)) {
|
| - return new Future<SourceFile>.value(null);
|
| - }
|
| var filePath = inputUrl.resolvedPath;
|
| return fileSystem.readTextOrBytes(filePath)
|
| .catchError((e) => _readError(e, inputUrl))
|
| @@ -260,9 +216,6 @@ class Compiler {
|
|
|
| /** Parse a Dart file. */
|
| Future _parseDartFile(UrlInfo inputUrl) {
|
| - if (!_pathMapper.checkInputPath(inputUrl, _messages)) {
|
| - return new Future<SourceFile>.value(null);
|
| - }
|
| var filePath = inputUrl.resolvedPath;
|
| return fileSystem.readText(filePath)
|
| .catchError((e) => _readError(e, inputUrl))
|
| @@ -276,8 +229,7 @@ class Compiler {
|
|
|
| /** Parse a stylesheet file. */
|
| Future _parseCssFile(UrlInfo inputUrl) {
|
| - if (!options.emulateScopedCss ||
|
| - !_pathMapper.checkInputPath(inputUrl, _messages)) {
|
| + if (!options.emulateScopedCss) {
|
| return new Future<SourceFile>.value(null);
|
| }
|
| var filePath = inputUrl.resolvedPath;
|
| @@ -314,9 +266,6 @@ class Compiler {
|
| var fileInfo = new FileInfo(inputUrl);
|
| info[resolvedPath] = fileInfo;
|
| fileInfo.inlinedCode = parseDartCode(resolvedPath, dartFile.code);
|
| - fileInfo.outputFilename =
|
| - _pathMapper.mangle(path.basename(resolvedPath), '.dart', false);
|
| -
|
| _processImports(fileInfo);
|
| }
|
|
|
| @@ -349,8 +298,7 @@ class Compiler {
|
| void _resolveStyleSheetImports(UrlInfo inputUrl, String processingFile,
|
| StyleSheet styleSheet) {
|
| var urlInfos = _time('CSS imports', processingFile, () =>
|
| - findImportsInStyleSheet(styleSheet, _pathMapper.packageRoot, inputUrl,
|
| - _messages));
|
| + findImportsInStyleSheet(styleSheet, _packageRoot, inputUrl, _messages));
|
|
|
| for (var urlInfo in urlInfos) {
|
| if (urlInfo == null) break;
|
| @@ -374,39 +322,8 @@ class Compiler {
|
|
|
| var span = library.userCode.sourceFile.span(
|
| directive.offset, directive.end);
|
| - return UrlInfo.resolve(uri, library.dartCodeUrl, span,
|
| - _pathMapper.packageRoot, _messages);
|
| - }
|
| -
|
| - /**
|
| - * Transform Dart source code.
|
| - * Currently, the only transformation is [transformObservables].
|
| - * Calls _emitModifiedDartFiles to write the transformed files.
|
| - */
|
| - void _transformDart() {
|
| - var libraries = _findAllDartLibraries();
|
| -
|
| - var transformed = [];
|
| - for (var lib in libraries) {
|
| - var userCode = lib.userCode;
|
| - var transaction = transformObservables(userCode.compilationUnit,
|
| - userCode.sourceFile, userCode.code, _messages);
|
| - if (transaction != null) {
|
| - _edits[lib.userCode] = transaction;
|
| - if (transaction.hasEdits) {
|
| - transformed.add(lib);
|
| - } else if (lib.htmlFile != null) {
|
| - // All web components will be transformed too. Track that.
|
| - transformed.add(lib);
|
| - }
|
| - }
|
| - }
|
| -
|
| - _findModifiedDartFiles(libraries, transformed);
|
| -
|
| - libraries.forEach(_fixImports);
|
| -
|
| - _emitModifiedDartFiles(libraries);
|
| + return UrlInfo.resolve(uri, library.dartCodeUrl, span, _packageRoot,
|
| + _messages);
|
| }
|
|
|
| /**
|
| @@ -445,39 +362,6 @@ class Compiler {
|
| }
|
|
|
| /**
|
| - * Queue modified Dart files to be written.
|
| - * This will not write files that are handled by [WebComponentEmitter] and
|
| - * [EntryPointEmitter].
|
| - */
|
| - void _emitModifiedDartFiles(List<LibraryInfo> libraries) {
|
| - for (var lib in libraries) {
|
| - // Components will get emitted by WebComponentEmitter, and the
|
| - // entry point will get emitted by MainPageEmitter.
|
| - // So we only need to worry about other .dart files.
|
| - if (lib.modified && lib is FileInfo &&
|
| - lib.htmlFile == null && !lib.isEntryPoint) {
|
| - var transaction = _edits[lib.userCode];
|
| -
|
| - // Save imports that were modified by _fixImports.
|
| - for (var d in lib.userCode.directives) {
|
| - transaction.edit(d.offset, d.end, d.toString());
|
| - }
|
| -
|
| - if (!lib.userCode.isPart) {
|
| - var pos = lib.userCode.firstPartOffset;
|
| - // Note: we use a different prefix than "autogenerated" to make
|
| - // ChangeRecord unambiguous. Otherwise it would be imported by this
|
| - // and polymer, resulting in a collision.
|
| - // TODO(jmesserly): only generate this for libraries that need it.
|
| - transaction.edit(pos, pos, "\nimport "
|
| - "'package:observe/observe.dart' as __observe;\n");
|
| - }
|
| - _emitFileAndSourceMaps(lib, transaction.commit(), lib.dartCodeUrl);
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| * This method computes which Dart files have been modified, starting
|
| * from [transformed] and marking recursively through all files that import
|
| * the modified files.
|
| @@ -516,30 +400,6 @@ class Compiler {
|
| }
|
| }
|
|
|
| - void _fixImports(LibraryInfo library) {
|
| - // Fix imports. Modified files must use the generated path, otherwise
|
| - // we need to make the path relative to the input.
|
| - for (var directive in library.userCode.directives) {
|
| - var importPath = _getDirectiveUrlInfo(library, directive);
|
| - if (importPath == null) continue;
|
| - var importInfo = info[importPath.resolvedPath];
|
| - if (importInfo == null) continue;
|
| -
|
| - String newUri = null;
|
| - if (importInfo.modified) {
|
| - // Use the generated URI for this file.
|
| - newUri = _pathMapper.importUrlFor(library, importInfo);
|
| - } else if (options.rewriteUrls) {
|
| - // Get the relative path to the input file.
|
| - newUri = _pathMapper.transformUrl(
|
| - library.dartCodeUrl.resolvedPath, directive.uri.value);
|
| - }
|
| - if (newUri != null) {
|
| - directive.uri = createStringLiteral(newUri);
|
| - }
|
| - }
|
| - }
|
| -
|
| /** Run the analyzer on every input html file. */
|
| void _analyze() {
|
| var uniqueIds = new IntIterator();
|
| @@ -552,75 +412,6 @@ class Compiler {
|
| }
|
| }
|
|
|
| - /** Emit the generated code corresponding to each input file. */
|
| - void _emit() {
|
| - for (var file in files) {
|
| - if (file.isDart || file.isStyleSheet) continue;
|
| - _time('Codegen', file.path, () {
|
| - var fileInfo = info[file.path];
|
| - _emitComponents(fileInfo);
|
| - });
|
| - }
|
| -
|
| - var entryPoint = files[0];
|
| - assert(info[entryPoint.path].isEntryPoint);
|
| - _emitMainDart(entryPoint);
|
| - _emitMainHtml(entryPoint);
|
| -
|
| - assert(_unqiueOutputs());
|
| - }
|
| -
|
| - bool _unqiueOutputs() {
|
| - var seen = new Set();
|
| - for (var file in output) {
|
| - if (seen.contains(file.path)) {
|
| - throw new StateError('internal error: '
|
| - 'duplicate output file ${file.path}. Files were: $output');
|
| - }
|
| - seen.add(file.path);
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - /** Emit the main .dart file. */
|
| - void _emitMainDart(SourceFile file) {
|
| - var fileInfo = info[file.path];
|
| -
|
| - var codeInfo = fileInfo.userCode;
|
| - if (codeInfo != null) {
|
| - var printer = new NestedPrinter(0);
|
| - if (codeInfo.libraryName == null) {
|
| - printer.addLine('library ${fileInfo.libraryName};');
|
| - }
|
| - printer.add(codeInfo.code);
|
| - _emitFileAndSourceMaps(fileInfo, printer, fileInfo.dartCodeUrl);
|
| - }
|
| - }
|
| -
|
| - // TODO(jmesserly): refactor this out of Compiler.
|
| - /** Generate an html file with the (trimmed down) main html page. */
|
| - void _emitMainHtml(SourceFile file) {
|
| - var fileInfo = info[file.path];
|
| -
|
| - var bootstrapName = '${path.basename(file.path)}_bootstrap.dart';
|
| - var bootstrapPath = path.join(path.dirname(file.path), bootstrapName);
|
| - var bootstrapOutPath = _pathMapper.outputPath(bootstrapPath, '');
|
| - var bootstrapOutName = path.basename(bootstrapOutPath);
|
| - var bootstrapInfo = new FileInfo(new UrlInfo('', bootstrapPath, null));
|
| - var printer = generateBootstrapCode(bootstrapInfo, fileInfo, global,
|
| - _pathMapper, options);
|
| - printer.build(bootstrapOutPath);
|
| - output.add(new OutputFile(
|
| - bootstrapOutPath, printer.text, source: file.path));
|
| -
|
| - var document = file.document;
|
| - var hasCss = _emitAllCss();
|
| - transformMainHtml(document, fileInfo, _pathMapper, hasCss,
|
| - options.rewriteUrls, _messages, global, bootstrapOutName);
|
| - output.add(new OutputFile(_pathMapper.outputPath(file.path, '.html'),
|
| - document.outerHtml, source: file.path));
|
| - }
|
| -
|
| // TODO(jmesserly): refactor this and other CSS related transforms out of
|
| // Compiler.
|
| /**
|
| @@ -647,13 +438,6 @@ class Compiler {
|
| css.write(emitStyleSheet(styleSheet, fileInfo));
|
| css.write('\n\n');
|
| }
|
| -
|
| - // Emit the linked style sheet in the output directory.
|
| - if (fileInfo.inputUrl.url != _resetCssFile) {
|
| - var outCss = _pathMapper.outputPath(fileInfo.inputUrl.resolvedPath,
|
| - '');
|
| - output.add(new OutputFile(outCss, css.toString()));
|
| - }
|
| }
|
| }
|
|
|
| @@ -712,49 +496,6 @@ class Compiler {
|
| return true;
|
| }
|
|
|
| - /** Emits the Dart code for all components in [fileInfo]. */
|
| - void _emitComponents(FileInfo fileInfo) {
|
| - for (var component in fileInfo.declaredComponents) {
|
| - // TODO(terry): Handle more than one stylesheet per component
|
| - if (component.styleSheets.length > 1 && options.emulateScopedCss) {
|
| - var span = component.externalFile != null
|
| - ? component.externalFile.sourceSpan : null;
|
| - _messages.warning(
|
| - 'Component has more than one stylesheet - first stylesheet used.',
|
| - span);
|
| - }
|
| - var printer = emitPolymerElement(
|
| - component, _pathMapper, _edits[component.userCode], options);
|
| - _emitFileAndSourceMaps(component, printer, component.externalFile);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Emits a file that was created using [NestedPrinter] and it's corresponding
|
| - * source map file.
|
| - */
|
| - void _emitFileAndSourceMaps(
|
| - LibraryInfo lib, NestedPrinter printer, UrlInfo dartCodeUrl) {
|
| - // Bail if we had an error generating the code for the file.
|
| - if (printer == null) return;
|
| -
|
| - var libPath = _pathMapper.outputLibraryPath(lib);
|
| - var dir = path.dirname(libPath);
|
| - var filename = path.basename(libPath);
|
| - printer.add('\n//# sourceMappingURL=$filename.map');
|
| - printer.build(libPath);
|
| - var sourcePath = dartCodeUrl != null ? dartCodeUrl.resolvedPath : null;
|
| - output.add(new OutputFile(libPath, printer.text, source: sourcePath));
|
| - // Fix-up the paths in the source map file
|
| - var sourceMap = json.parse(printer.map);
|
| - var urls = sourceMap['sources'];
|
| - for (int i = 0; i < urls.length; i++) {
|
| - urls[i] = path.relative(urls[i], from: dir);
|
| - }
|
| - output.add(new OutputFile(path.join(dir, '$filename.map'),
|
| - json.stringify(sourceMap)));
|
| - }
|
| -
|
| _time(String logMessage, String filePath, callback(),
|
| {bool printTime: false}) {
|
| var message = new StringBuffer();
|
|
|