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

Unified Diff: lib/src/emitters.dart

Issue 11275029: Support for specifying an output directory (issue #106) (Closed) Base URL: git@github.com:dart-lang/dart-web-components.git@master
Patch Set: Created 8 years, 2 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 | « lib/src/directive_parser.dart ('k') | lib/src/info.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/emitters.dart
diff --git a/lib/src/emitters.dart b/lib/src/emitters.dart
index 51e767d286e32d3af311d8b058e208b8607cf4df..a415a498bfabfbcf38e1fb70fed2cb15d843c447 100644
--- a/lib/src/emitters.dart
+++ b/lib/src/emitters.dart
@@ -13,9 +13,10 @@ import 'package:html5lib/dom_parsing.dart';
import 'code_printer.dart';
import 'codegen.dart' as codegen;
-import 'messages.dart';
+import 'file_system/path.dart';
import 'files.dart';
import 'info.dart';
+import 'messages.dart';
/**
* An emitter for a web component feature. It collects all the logic for
@@ -527,7 +528,7 @@ class RecursiveEmitter extends TreeVisitor {
class WebComponentEmitter extends RecursiveEmitter {
WebComponentEmitter(FileInfo info) : super(info);
- String run(ComponentInfo info) {
+ String run(ComponentInfo info, PathInfo pathInfo) {
// If this derives from another component, ensure the lifecycle methods are
// called in the superclass.
if (info.extendsComponent != null) {
@@ -561,45 +562,43 @@ class WebComponentEmitter extends RecursiveEmitter {
visit(info.element);
- var code = info.userCode;
- if (code == null) {
- if (info.extendsComponent != null) {
- var superclass = info.extendsComponent.constructor;
- // TODO(jmesserly): should we add this import even if you have your own
- // script tag?
- var relativePath = PathInfo.relativePath(info, info.extendsComponent);
- code = '''
- ${codegen.importList([relativePath])}
- class ${info.constructor} extends $superclass {\n}
- ''';
- } else {
- code = '''
- import 'package:web_components/web_component.dart' as autogenerated;
- class ${info.constructor} extends autogenerated.WebComponent {\n}
- ''';
- }
+ bool hasExtends = info.extendsComponent != null;
+ var codeInfo = info.userCode;
+ if (codeInfo == null) {
+ var superclass = hasExtends ? info.extendsComponent.constructor
+ : 'autogenerated.WebComponent';
+ var imports = hasExtends ? [] : [new DartDirectiveInfo('import',
+ 'package:web_components/web_component.dart', 'autogenerated')];
+ codeInfo = new DartCodeInfo(null, null, imports,
+ 'class ${info.constructor} extends $superclass {\n}');
}
+
+ var code = codeInfo.code;
var match = new RegExp('class ${info.constructor}[^{]*{').firstMatch(code);
if (match != null) {
- // TODO(sigmund): clean up and make this more robust. Issue #59.
var printer = new CodePrinter();
- var libMatch = const RegExp('^library .*;').firstMatch(code);
- int startPos = 0;
- if (libMatch == null) {
- var libraryName = info.tagName.replaceAll(const RegExp('[-./]'), '_');
- printer.add(codegen.header(info.declaringFile.path, libraryName));
- } else {
- printer.add('// Generated from ${info.inputPath.filename}\n'
- '// DO NOT EDIT.');
- printer.add(code.substring(0, libMatch.end()));
- printer.add(codegen.imports);
- startPos = libMatch.end();
+ var libraryName = (codeInfo.libraryName != null)
+ ? codeInfo.libraryName
+ : info.tagName.replaceAll(const RegExp('[-./]'), '_');
+ printer.add(codegen.header(info.declaringFile.path, libraryName));
+
+ // Add exisitng import, export, and part directives.
+ for (var directive in codeInfo.directives) {
+ printer.add(codegen.directiveText(directive, info, pathInfo));
}
- // Import only those components used by this component.
+
+ // Add imports only for those components used by this component.
var imports = info.usedComponents.getKeys().map(
(c) => PathInfo.relativePath(info, c));
+
+ if (hasExtends) {
+ // Inject an import to the base component.
+ printer.add(codegen.importList(
+ [PathInfo.relativePath(info, info.extendsComponent)]));
+ }
+
printer.add(codegen.importList(imports))
- .add(code.substring(startPos, match.end()))
+ .add(code.substring(0, match.end()))
.add('\n')
.add(codegen.componentCode(info.constructor,
_context.declarations.formatString(1),
@@ -612,7 +611,7 @@ class WebComponentEmitter extends RecursiveEmitter {
messages.error('please provide a class definition '
'for ${info.constructor}:\n $code', info.element.span,
file: info.inputPath);
- return code;
+ return '';
}
}
}
@@ -621,35 +620,46 @@ class WebComponentEmitter extends RecursiveEmitter {
class MainPageEmitter extends RecursiveEmitter {
MainPageEmitter(FileInfo info) : super(info);
- String run(Document document) {
+ String run(Document document, PathInfo pathInfo) {
// The body of an element tag will not be part of the main HTML page. Each
// element will be generated programatically as a dart web component by
// [WebComponentEmitter] above.
document.queryAll('element').forEach((tag) => tag.remove());
+
+ // fix up the URLs to content that is not modified by the compiler
+ document.queryAll('script').forEach((tag) {
+ var src = tag.attributes["src"];
+ if (tag.attributes['type'] != 'application/dart' && src != null) {
+ tag.attributes["src"] = pathInfo.transferDirectiveUrl(_info, src);
+ }
+ });
+ document.queryAll('link').forEach((tag) {
+ var href = tag.attributes['href'];
+ if (tag.attributes['rel'] != 'components' && href != null) {
+ tag.attributes['href'] = pathInfo.transferDirectiveUrl(_info, href);
+ }
+ });
+
visit(document);
var printer = new CodePrinter();
- var startPos = 0;
// Inject library name if not pressent.
- // TODO(sigmund): consider parsing the top-level syntax of a dart file
- // instead of this ad-hoc regex (issue #95).
- var code = _info.userCode;
- var match = const RegExp('^library .*;').firstMatch(code);
- if (match == null) {
- printer.add(codegen.header(_info.path, _info.libraryName));
- } else {
- printer.add('// Generated from ${_info.inputPath}\n// DO NOT EDIT.')
- .add(code.substring(0, match.end()))
- .add(codegen.imports);
- startPos = match.end();
+ var codeInfo = _info.userCode;
+ var libraryName = codeInfo.libraryName != null
+ ? codeInfo.libraryName : _info.libraryName;
+ printer.add(codegen.header(_info.path, libraryName));
+
+ // Add exisitng import, export, and part directives.
+ for (var directive in codeInfo.directives) {
+ printer.add(codegen.directiveText(directive, _info, pathInfo));
}
// Import only those components used by the page.
var imports = _info.usedComponents.getKeys().map(
(c) => PathInfo.relativePath(_info, c));
printer.add(codegen.importList(imports))
- .add(codegen.mainDartCode(code.substring(startPos),
+ .add(codegen.mainDartCode(codeInfo.code,
_context.declarations.formatString(0),
_context.createdMethod.formatString(1),
_context.insertedMethod.formatString(1),
« no previous file with comments | « lib/src/directive_parser.dart ('k') | lib/src/info.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698