| Index: pkg/polymer/lib/src/compiler.dart
|
| diff --git a/pkg/polymer/lib/src/compiler.dart b/pkg/polymer/lib/src/compiler.dart
|
| deleted file mode 100644
|
| index 9d5d10de5ed1168d0dd1eeec801ba2b26e4fcfde..0000000000000000000000000000000000000000
|
| --- a/pkg/polymer/lib/src/compiler.dart
|
| +++ /dev/null
|
| @@ -1,360 +0,0 @@
|
| -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -library compiler;
|
| -
|
| -import 'dart:async';
|
| -import 'dart:collection' show SplayTreeMap;
|
| -
|
| -import 'package:csslib/visitor.dart' show StyleSheet, treeToDebugString;
|
| -import 'package:html5lib/dom.dart';
|
| -import 'package:html5lib/parser.dart';
|
| -
|
| -import 'analyzer.dart';
|
| -import 'css_analyzer.dart' show analyzeCss, findUrlsImported,
|
| - findImportsInStyleSheet, parseCss;
|
| -import 'css_emitters.dart' show rewriteCssUris,
|
| - emitComponentStyleSheet, emitOriginalCss, emitStyleSheet;
|
| -import 'file_system.dart';
|
| -import 'files.dart';
|
| -import 'info.dart';
|
| -import 'messages.dart';
|
| -import 'compiler_options.dart';
|
| -import 'utils.dart';
|
| -
|
| -/**
|
| - * Parses an HTML file [contents] and returns a DOM-like tree.
|
| - * Note that [contents] will be a [String] if coming from a browser-based
|
| - * [FileSystem], or it will be a [List<int>] if running on the command line.
|
| - *
|
| - * Adds emitted error/warning to [messages], if [messages] is supplied.
|
| - */
|
| -Document parseHtml(contents, String sourcePath, Messages messages,
|
| - bool checkDocType) {
|
| - var parser = new HtmlParser(contents, generateSpans: true,
|
| - sourceUrl: sourcePath);
|
| - var document = parser.parse();
|
| -
|
| - // Note: errors aren't fatal in HTML (unless strict mode is on).
|
| - // So just print them as warnings.
|
| - for (var e in parser.errors) {
|
| - if (checkDocType || e.errorCode != 'expected-doctype-but-got-start-tag') {
|
| - messages.warning(e.message, e.span);
|
| - }
|
| - }
|
| - return document;
|
| -}
|
| -
|
| -/** Compiles an application written with Dart web components. */
|
| -class Compiler {
|
| - final FileSystem fileSystem;
|
| - final CompilerOptions options;
|
| - final List<SourceFile> files = <SourceFile>[];
|
| -
|
| - String _mainPath;
|
| - String _packageRoot;
|
| - String _resetCssFile;
|
| - StyleSheet _cssResetStyleSheet;
|
| - Messages _messages;
|
| -
|
| - FutureGroup _tasks;
|
| - Set _processed;
|
| -
|
| - /** Information about source [files] given their href. */
|
| - final Map<String, FileInfo> info = new SplayTreeMap<String, FileInfo>();
|
| -
|
| - final GlobalInfo global = new GlobalInfo();
|
| -
|
| - /** Creates a compiler with [options] using [fileSystem]. */
|
| - Compiler(this.fileSystem, this.options, this._messages) {
|
| - _mainPath = options.inputFile;
|
| - var mainDir = path.dirname(_mainPath);
|
| - var baseDir = options.baseDir != null ? options.baseDir : mainDir;
|
| - _packageRoot = options.packageRoot != null ? options.packageRoot
|
| - : path.join(path.dirname(_mainPath), 'packages');
|
| -
|
| - if (options.resetCssFile != null) {
|
| - _resetCssFile = options.resetCssFile;
|
| - if (path.isRelative(_resetCssFile)) {
|
| - // If CSS reset file path is relative from our current path.
|
| - _resetCssFile = path.resolve(_resetCssFile);
|
| - }
|
| - }
|
| -
|
| - // Normalize paths - all should be relative or absolute paths.
|
| - 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(_packageRoot)) {
|
| - _packageRoot = path.resolve(_packageRoot);
|
| - }
|
| - }
|
| - }
|
| -
|
| - /** Compile the application starting from the given input file. */
|
| - Future run() {
|
| - if (path.basename(_mainPath).endsWith('.dart')) {
|
| - _messages.error("Please provide an HTML file as your entry point.",
|
| - null);
|
| - return new Future.value(null);
|
| - }
|
| - return _parseAndDiscover(_mainPath).then((_) {
|
| - _analyze();
|
| -
|
| - // Analyze all CSS files.
|
| - _time('Analyzed Style Sheets', '', () =>
|
| - analyzeCss(_packageRoot, files, info,
|
| - global.pseudoElements, _messages,
|
| - warningsAsErrors: options.warningsAsErrors));
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Asynchronously parse [inputFile] and transitively discover web components
|
| - * to load and parse. Returns a future that completes when all files are
|
| - * processed.
|
| - */
|
| - Future _parseAndDiscover(String inputFile) {
|
| - _tasks = new FutureGroup();
|
| - _processed = new Set();
|
| - _processed.add(inputFile);
|
| - _tasks.add(_parseHtmlFile(new UrlInfo(inputFile, inputFile, null), true));
|
| - return _tasks.future;
|
| - }
|
| -
|
| - void _processHtmlFile(UrlInfo inputUrl, SourceFile file) {
|
| - if (file == null) return;
|
| -
|
| - bool isEntryPoint = _processed.length == 1;
|
| -
|
| - files.add(file);
|
| -
|
| - var fileInfo = _time('Analyzed definitions', inputUrl.url, () {
|
| - return analyzeDefinitions(global, inputUrl, file.document, _packageRoot,
|
| - _messages);
|
| - });
|
| - info[inputUrl.resolvedPath] = fileInfo;
|
| -
|
| - if (isEntryPoint && _resetCssFile != null) {
|
| - _processed.add(_resetCssFile);
|
| - _tasks.add(_parseCssFile(new UrlInfo(_resetCssFile, _resetCssFile,
|
| - null)));
|
| - }
|
| -
|
| - // Load component files referenced by [file].
|
| - for (var link in fileInfo.componentLinks) {
|
| - _loadFile(link, _parseHtmlFile);
|
| - }
|
| -
|
| - // Load stylesheet files referenced by [file].
|
| - for (var link in fileInfo.styleSheetHrefs) {
|
| - _loadFile(link, _parseCssFile);
|
| - }
|
| -
|
| - // Process any @imports inside of a <style> tag.
|
| - var urlInfos = findUrlsImported(fileInfo, fileInfo.inputUrl, _packageRoot,
|
| - file.document, _messages, options);
|
| - for (var urlInfo in urlInfos) {
|
| - _loadFile(urlInfo, _parseCssFile);
|
| - }
|
| -
|
| - // Load .dart files being referenced in components.
|
| - for (var component in fileInfo.declaredComponents) {
|
| - // Process any @imports inside of the <style> tag in a component.
|
| - var urlInfos = findUrlsImported(component, fileInfo.inputUrl,
|
| - _packageRoot, component.element, _messages, options);
|
| - for (var urlInfo in urlInfos) {
|
| - _loadFile(urlInfo, _parseCssFile);
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Helper function to load [urlInfo] and parse it using [loadAndParse] if it
|
| - * hasn't been loaded before.
|
| - */
|
| - void _loadFile(UrlInfo urlInfo, Future loadAndParse(UrlInfo inputUrl)) {
|
| - if (urlInfo == null) return;
|
| - var resolvedPath = urlInfo.resolvedPath;
|
| - if (!_processed.contains(resolvedPath)) {
|
| - _processed.add(resolvedPath);
|
| - _tasks.add(loadAndParse(urlInfo));
|
| - }
|
| - }
|
| -
|
| - /** Parse an HTML file. */
|
| - Future _parseHtmlFile(UrlInfo inputUrl, [bool checkDocType = false]) {
|
| - var filePath = inputUrl.resolvedPath;
|
| - return fileSystem.readTextOrBytes(filePath)
|
| - .catchError((e) => _readError(e, inputUrl))
|
| - .then((source) {
|
| - if (source == null) return;
|
| - var file = new SourceFile(filePath);
|
| - file.document = _time('Parsed', filePath,
|
| - () => parseHtml(source, filePath, _messages, checkDocType));
|
| - _processHtmlFile(inputUrl, file);
|
| - });
|
| - }
|
| -
|
| - /** Parse a stylesheet file. */
|
| - Future _parseCssFile(UrlInfo inputUrl) {
|
| - if (!options.emulateScopedCss) {
|
| - return new Future<SourceFile>.value(null);
|
| - }
|
| - var filePath = inputUrl.resolvedPath;
|
| - return fileSystem.readText(filePath)
|
| - .catchError((e) => _readError(e, inputUrl, isWarning: true))
|
| - .then((code) {
|
| - if (code == null) return;
|
| - var file = new SourceFile(filePath, type: SourceFile.STYLESHEET);
|
| - file.code = code;
|
| - _processCssFile(inputUrl, file);
|
| - });
|
| - }
|
| -
|
| -
|
| - SourceFile _readError(error, UrlInfo inputUrl, {isWarning: false}) {
|
| - var message = 'unable to open file "${inputUrl.resolvedPath}"';
|
| - if (options.verbose) {
|
| - message = '$message. original message:\n $error';
|
| - }
|
| - if (isWarning) {
|
| - _messages.warning(message, inputUrl.sourceSpan);
|
| - } else {
|
| - _messages.error(message, inputUrl.sourceSpan);
|
| - }
|
| - return null;
|
| - }
|
| -
|
| - void _processCssFile(UrlInfo inputUrl, SourceFile cssFile) {
|
| - if (cssFile == null) return;
|
| -
|
| - files.add(cssFile);
|
| -
|
| - var fileInfo = new FileInfo(inputUrl);
|
| - info[inputUrl.resolvedPath] = fileInfo;
|
| -
|
| - var styleSheet = parseCss(cssFile.code, _messages, options);
|
| - if (inputUrl.url == _resetCssFile) {
|
| - _cssResetStyleSheet = styleSheet;
|
| - } else if (styleSheet != null) {
|
| - _resolveStyleSheetImports(inputUrl, cssFile.path, styleSheet);
|
| - fileInfo.styleSheets.add(styleSheet);
|
| - }
|
| - }
|
| -
|
| - /** Load and parse all style sheets referenced with an @imports. */
|
| - void _resolveStyleSheetImports(UrlInfo inputUrl, String processingFile,
|
| - StyleSheet styleSheet) {
|
| - var urlInfos = _time('CSS imports', processingFile, () =>
|
| - findImportsInStyleSheet(styleSheet, _packageRoot, inputUrl, _messages));
|
| -
|
| - for (var urlInfo in urlInfos) {
|
| - if (urlInfo == null) break;
|
| - // Load any @imported stylesheet files referenced in this style sheet.
|
| - _loadFile(urlInfo, _parseCssFile);
|
| - }
|
| - }
|
| -
|
| - /** Run the analyzer on every input html file. */
|
| - void _analyze() {
|
| - var uniqueIds = new IntIterator();
|
| - for (var file in files) {
|
| - if (file.isHtml) {
|
| - _time('Analyzed contents', file.path, () =>
|
| - analyzeFile(file, info, uniqueIds, global, _messages,
|
| - options.emulateScopedCss));
|
| - }
|
| - }
|
| - }
|
| -
|
| - // TODO(jmesserly): refactor this and other CSS related transforms out of
|
| - // Compiler.
|
| - /**
|
| - * Generate an CSS file for all style sheets (main and components).
|
| - * Returns true if a file was generated, otherwise false.
|
| - */
|
| - bool _emitAllCss() {
|
| - if (!options.emulateScopedCss) return false;
|
| -
|
| - var buff = new StringBuffer();
|
| -
|
| - // Emit all linked style sheet files first.
|
| - for (var file in files) {
|
| - var css = new StringBuffer();
|
| - var fileInfo = info[file.path];
|
| - if (file.isStyleSheet) {
|
| - for (var styleSheet in fileInfo.styleSheets) {
|
| - css.write(
|
| - '/* Auto-generated from style sheet href = ${file.path} */\n'
|
| - '/* DO NOT EDIT. */\n\n');
|
| - css.write(emitStyleSheet(styleSheet, fileInfo));
|
| - css.write('\n\n');
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Emit all CSS for each component (style scoped).
|
| - for (var file in files) {
|
| - if (file.isHtml) {
|
| - var fileInfo = info[file.path];
|
| - for (var component in fileInfo.declaredComponents) {
|
| - for (var styleSheet in component.styleSheets) {
|
| - // Translate any URIs in CSS.
|
| - if (buff.isEmpty) {
|
| - buff.write(
|
| - '/* Auto-generated from components style tags. */\n'
|
| - '/* DO NOT EDIT. */\n\n');
|
| - }
|
| - buff.write(
|
| - '/* ==================================================== \n'
|
| - ' Component ${component.tagName} stylesheet \n'
|
| - ' ==================================================== */\n');
|
| -
|
| - var tagName = component.tagName;
|
| - if (!component.hasAuthorStyles) {
|
| - if (_cssResetStyleSheet != null) {
|
| - // If component doesn't have apply-author-styles then we need to
|
| - // reset the CSS the styles for the component (if css-reset file
|
| - // option was passed).
|
| - buff.write('\n/* Start CSS Reset */\n');
|
| - var style;
|
| - if (options.emulateScopedCss) {
|
| - style = emitComponentStyleSheet(_cssResetStyleSheet, tagName);
|
| - } else {
|
| - style = emitOriginalCss(_cssResetStyleSheet);
|
| - }
|
| - buff.write(style);
|
| - buff.write('/* End CSS Reset */\n\n');
|
| - }
|
| - }
|
| - if (options.emulateScopedCss) {
|
| - buff.write(emitComponentStyleSheet(styleSheet, tagName));
|
| - } else {
|
| - buff.write(emitOriginalCss(styleSheet));
|
| - }
|
| - buff.write('\n\n');
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (buff.isEmpty) return false;
|
| - return true;
|
| - }
|
| -
|
| - _time(String logMessage, String filePath, callback(),
|
| - {bool printTime: false}) {
|
| - var message = new StringBuffer();
|
| - message.write(logMessage);
|
| - var filename = path.basename(filePath);
|
| - for (int i = (60 - logMessage.length - filename.length); i > 0 ; i--) {
|
| - message.write(' ');
|
| - }
|
| - message.write(filename);
|
| - return time(message.toString(), callback,
|
| - printTime: options.verbose || printTime);
|
| - }
|
| -}
|
|
|