@glimmer/compiler
Version:
130 lines (108 loc) • 15.2 kB
JavaScript
import { ASTv2 } from '@glimmer/syntax';
import { OptionalList } from '../../../shared/list';
import { Ok, Result, ResultArray } from '../../../shared/result';
import * as mir from '../../2-encoding/mir';
import { BLOCK_KEYWORDS } from '../keywords';
import { APPEND_KEYWORDS } from '../keywords/append';
import { ClassifiedElement, hasDynamicFeatures } from './element/classified';
import { ClassifiedComponent } from './element/component';
import { ClassifiedSimpleElement } from './element/simple-element';
import { VISIT_EXPRS } from './expressions';
class NormalizationStatements {
visitList(nodes, state) {
return new ResultArray(nodes.map(e => VISIT_STMTS.visit(e, state))).toOptionalList().mapOk(list => list.filter(s => s !== null));
}
visit(node, state) {
switch (node.type) {
case 'GlimmerComment':
return Ok(null);
case 'AppendContent':
return this.AppendContent(node, state);
case 'HtmlText':
return Ok(this.TextNode(node));
case 'HtmlComment':
return Ok(this.HtmlComment(node));
case 'InvokeBlock':
return this.InvokeBlock(node, state);
case 'InvokeComponent':
return this.Component(node, state);
case 'SimpleElement':
return this.SimpleElement(node, state);
}
}
InvokeBlock(node, state) {
let translated = BLOCK_KEYWORDS.translate(node, state);
if (translated !== null) {
return translated;
}
let head = VISIT_EXPRS.visit(node.callee, state);
let args = VISIT_EXPRS.Args(node.args, state);
return Result.all(head, args).andThen(([head, args]) => this.NamedBlocks(node.blocks, state).mapOk(blocks => new mir.InvokeBlock({
loc: node.loc,
head,
args,
blocks
})));
}
NamedBlocks(blocks, state) {
let list = new ResultArray(blocks.blocks.map(b => this.NamedBlock(b, state)));
return list.toArray().mapOk(list => new mir.NamedBlocks({
loc: blocks.loc,
blocks: OptionalList(list)
}));
}
NamedBlock(named, state) {
let body = state.visitBlock(named.block);
return body.mapOk(body => {
return new mir.NamedBlock({
loc: named.loc,
name: named.name,
body: body.toArray(),
scope: named.block.scope
});
});
}
SimpleElement(element, state) {
return new ClassifiedElement(element, new ClassifiedSimpleElement(element.tag, element, hasDynamicFeatures(element)), state).toStatement();
}
Component(component, state) {
return VISIT_EXPRS.visit(component.callee, state).andThen(callee => new ClassifiedElement(component, new ClassifiedComponent(callee, component), state).toStatement());
}
AppendContent(append, state) {
let translated = APPEND_KEYWORDS.translate(append, state);
if (translated !== null) {
return translated;
}
let value = VISIT_EXPRS.visit(append.value, state);
return value.mapOk(value => {
if (append.trusting) {
return new mir.AppendTrustedHTML({
loc: append.loc,
html: value
});
} else {
return new mir.AppendTextNode({
loc: append.loc,
text: value
});
}
});
}
TextNode(text) {
return new mir.AppendTextNode({
loc: text.loc,
text: new ASTv2.LiteralExpression({
loc: text.loc,
value: text.chars
})
});
}
HtmlComment(comment) {
return new mir.AppendComment({
loc: comment.loc,
value: comment.text
});
}
}
export const VISIT_STMTS = new NormalizationStatements();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL3Zpc2l0b3JzL3N0YXRlbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxLQUFULFFBQXNCLGlCQUF0QjtBQUVBLFNBQVMsWUFBVCxRQUE2QixzQkFBN0I7QUFDQSxTQUFTLEVBQVQsRUFBYSxNQUFiLEVBQXFCLFdBQXJCLFFBQXdDLHdCQUF4QztBQUNBLE9BQU8sS0FBSyxHQUFaLE1BQXFCLHNCQUFyQjtBQUVBLFNBQVMsY0FBVCxRQUErQixhQUEvQjtBQUNBLFNBQVMsZUFBVCxRQUFnQyxvQkFBaEM7QUFDQSxTQUFTLGlCQUFULEVBQTRCLGtCQUE1QixRQUFzRCxzQkFBdEQ7QUFDQSxTQUFTLG1CQUFULFFBQW9DLHFCQUFwQztBQUNBLFNBQVMsdUJBQVQsUUFBd0MsMEJBQXhDO0FBQ0EsU0FBUyxXQUFULFFBQTRCLGVBQTVCOztBQUVBLE1BQU0sdUJBQU4sQ0FBNkI7QUFDM0IsRUFBQSxTQUFTLENBQ1AsS0FETyxFQUVQLEtBRk8sRUFFa0I7QUFFekIsV0FBTyxJQUFJLFdBQUosQ0FBZ0IsS0FBSyxDQUFDLEdBQU4sQ0FBVyxDQUFELElBQU8sV0FBVyxDQUFDLEtBQVosQ0FBa0IsQ0FBbEIsRUFBcUIsS0FBckIsQ0FBakIsQ0FBaEIsRUFDSixjQURJLEdBRUosS0FGSSxDQUVHLElBQUQsSUFBVSxJQUFJLENBQUMsTUFBTCxDQUFhLENBQUQsSUFBaUQsQ0FBQyxLQUFLLElBQW5FLENBRlosQ0FBUDtBQUdEOztBQUVELEVBQUEsS0FBSyxDQUFDLElBQUQsRUFBMEIsS0FBMUIsRUFBbUQ7QUFDdEQsWUFBUSxJQUFJLENBQUMsSUFBYjtBQUNFLFdBQUssZ0JBQUw7QUFDRSxlQUFPLEVBQUUsQ0FBQyxJQUFELENBQVQ7O0FBQ0YsV0FBSyxlQUFMO0FBQ0UsZUFBTyxLQUFLLGFBQUwsQ0FBbUIsSUFB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QUFhRDs7QUFFRCxFQUFBLFFBQVEsQ0FBQyxJQUFELEVBQXFCO0FBQzNCLFdBQU8sSUFBSSxHQUFHLENBQUMsY0FBUixDQUF1QjtBQUM1QixNQUFBLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FEa0I7QUFFNUIsTUFBQSxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQUMsaUJBQVYsQ0FBNEI7QUFBRSxRQUFBLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBWjtBQUFpQixRQUFBLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBN0IsT0FBNUI7QUFGc0IsS0FBdkIsQ0FBUDtBQUlEOztBQUVELEVBQUEsV0FBVyxDQUFDLE9BQUQsRUFBMkI7QUFDcEMsV0FBTyxJQUFJLEdBQUcsQ0FBQyxhQUFSLENBQXNCO0FBQzNCLE1BQUEsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQURjO0FBRTNCLE1BQUEsS0FBSyxFQUFFLE9BQU8sQ0FBQztBQUZZLEtBQXRCLENBQVA7QUFJRDs7QUEvSDBCOztBQWtJN0IsT0FBTyxNQUFNLFdBQVcsR0FBRyxJQUFJLHVCQUFKLEVBQXBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVNUdjIgfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuXG5pbXBvcnQgeyBPcHRpb25hbExpc3QgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvbGlzdCc7XG5pbXBvcnQgeyBPaywgUmVzdWx0LCBSZXN1bHRBcnJheSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9yZXN1bHQnO1xuaW1wb3J0ICogYXMgbWlyIGZyb20gJy4uLy4uLzItZW5jb2RpbmcvbWlyJztcbmltcG9ydCB7IE5vcm1hbGl6YXRpb25TdGF0ZSB9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHsgQkxPQ0tfS0VZV09SRFMgfSBmcm9tICcuLi9rZXl3b3Jkcyc7XG5pbXBvcnQgeyBBUFBFTkRfS0VZV09SRFMgfSBmcm9tICcuLi9rZXl3b3Jkcy9hcHBlbmQnO1xuaW1wb3J0IHsgQ2xhc3NpZmllZEVsZW1lbnQsIGhhc0R5bmFtaWNGZWF0dXJlcyB9IGZyb20gJy4vZWxlbWVudC9jbGFzc2lmaWVkJztcbmltcG9ydCB7IENsYXNzaWZpZWRDb21wb25lbnQgfSBmcm9tICcuL2VsZW1lbnQvY29tcG9uZW50JztcbmltcG9ydCB7IENsYXNzaWZpZWRTaW1wbGVFbGVtZW50IH0gZnJvbSAnLi9lbGVtZW50L3NpbXBsZS1lbGVtZW50JztcbmltcG9ydCB7IFZJU0lUX0VYUFJTIH0gZnJvbSAnLi9leHByZXNzaW9ucyc7XG5cbmNsYXNzIE5vcm1hbGl6YXRpb25TdGF0ZW1lbnRzIHtcbiAgdmlzaXRMaXN0KFxuICAgIG5vZGVzOiByZWFkb25seSBBU1R2Mi5Db250ZW50Tm9kZVtdLFxuICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PE9wdGlvbmFsTGlzdDxtaXIuU3RhdGVtZW50Pj4ge1xuICAgIHJldHVybiBuZXcgUmVzdWx0QXJyYXkobm9kZXMubWFwKChlKSA9PiBWSVNJVF9TVE1UUy52aXNpdChlLCBzdGF0ZSkpKVxuICAgICAgLnRvT3B0aW9uYWxMaXN0KClcbiAgICAgIC5tYXBPaygobGlzdCkgPT4gbGlzdC5maWx0ZXIoKHM6IG1pci5TdGF0ZW1lbnQgfCBudWxsKTogcyBpcyBtaXIuU3RhdGVtZW50ID0+IHMgIT09IG51bGwpKTtcbiAgfVxuXG4gIHZpc2l0KG5vZGU6IEFTVHYyLkNvbnRlbnROb2RlLCBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlKTogUmVzdWx0PG1pci5TdGF0ZW1lbnQgfCBudWxsPiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0dsaW1tZXJDb21tZW50JzpcbiAgICAgICAgcmV0dXJuIE9rKG51bGwpO1xuICAgICAgY2FzZSAnQXBwZW5kQ29udGVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLkFwcGVuZENvbnRlbnQobm9kZSwgc3RhdGUpO1xuICAgICAgY2FzZSAnSHRtbFRleHQnOlxuICAgICAgICByZXR1cm4gT2sodGhpcy5UZXh0Tm9kZShub2RlKSk7XG4gICAgICBjYXNlICdIdG1sQ29tbWVudCc6XG4gICAgICAgIHJldHVybiBPayh0aGlzLkh0bWxDb21tZW50KG5vZGUpKTtcbiAgICAgIGNhc2UgJ0ludm9rZUJsb2NrJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuSW52b2tlQmxvY2sobm9kZSwgc3RhdGUpO1xuICAgICAgY2FzZSAnSW52b2tlQ29tcG9uZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQ29tcG9uZW50KG5vZGUsIHN0YXRlKTtcbiAgICAgIGNhc2UgJ1NpbXBsZUVsZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5TaW1wbGVFbGVtZW50KG5vZGUsIHN0YXRlKTtcbiAgICB9XG4gIH1cblxuICBJbnZva2VCbG9jayhub2RlOiBBU1R2Mi5JbnZva2VCbG9jaywgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSk6IFJlc3VsdDxtaXIuU3RhdGVtZW50PiB7XG4gICAgbGV0IHRyYW5zbGF0ZWQgPSBCTE9DS19LRVlXT1JEUy50cmFuc2xhdGUobm9kZSwgc3RhdGUpO1xuXG4gICAgaWYgKHRyYW5zbGF0ZWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGVkO1xuICAgIH1cblxuICAgIGxldCBoZWFkID0gVklTSVRfRVhQUlMudmlzaXQobm9kZS5jYWxsZWUsIHN0YXRlKTtcbiAgICBsZXQgYXJncyA9IFZJU0lUX0VYUFJTLkFyZ3Mobm9kZS5hcmdzLCBzdGF0ZSk7XG5cbiAgICByZXR1cm4gUmVzdWx0LmFsbChoZWFkLCBhcmdzKS5hbmRUaGVuKChbaGVhZCwgYXJnc10pID0+XG4gICAgICB0aGlzLk5hbWVkQmxvY2tzKG5vZGUuYmxvY2tzLCBzdGF0ZSkubWFwT2soXG4gICAgICAgIChibG9ja3MpID0+XG4gICAgICAgICAgbmV3IG1pci5JbnZva2VCbG9jayh7XG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBibG9ja3MsXG4gICAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgTmFtZWRCbG9ja3MoYmxvY2tzOiBBU1R2Mi5OYW1lZEJsb2Nrcywgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSk6IFJlc3VsdDxtaXIuTmFtZWRCbG9ja3M+IHtcbiAgICBsZXQgbGlzdCA9IG5ldyBSZXN1bHRBcnJheShibG9ja3MuYmxvY2tzLm1hcCgoYikgPT4gdGhpcy5OYW1lZEJsb2NrKGIsIHN0YXRlKSkpO1xuXG4gICAgcmV0dXJuIGxpc3RcbiAgICAgIC50b0FycmF5KClcbiAgICAgIC5tYXBPaygobGlzdCkgPT4gbmV3IG1pci5OYW1lZEJsb2Nrcyh7IGxvYzogYmxvY2tzLmxvYywgYmxvY2tzOiBPcHRpb25hbExpc3QobGlzdCkgfSkpO1xuICB9XG5cbiAgTmFtZWRCbG9jayhuYW1lZDogQVNUdjIuTmFtZWRCbG9jaywgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSk6IFJlc3VsdDxtaXIuTmFtZWRCbG9jaz4ge1xuICAgIGxldCBib2R5ID0gc3RhdGUudmlzaXRCbG9jayhuYW1lZC5ibG9jayk7XG5cbiAgICByZXR1cm4gYm9keS5tYXBPaygoYm9keSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBtaXIuTmFtZWRCbG9jayh7XG4gICAgICAgIGxvYzogbmFtZWQubG9jLFxuICAgICAgICBuYW1lOiBuYW1lZC5uYW1lLFxuICAgICAgICBib2R5OiBib2R5LnRvQXJyYXkoKSxcbiAgICAgICAgc2NvcGU6IG5hbWVkLmJsb2NrLnNjb3BlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBTaW1wbGVFbGVtZW50KGVsZW1lbnQ6IEFTVHYyLlNpbXBsZUVsZW1lbnQsIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUpOiBSZXN1bHQ8bWlyLlN0YXRlbWVudD4ge1xuICAgIHJldHVybiBuZXcgQ2xhc3NpZmllZEVsZW1lbnQoXG4gICAgICBlbGVtZW50LFxuICAgICAgbmV3IENsYXNzaWZpZWRTaW1wbGVFbGVtZW50KGVsZW1lbnQudGFnLCBlbGVtZW50LCBoYXNEeW5hbWljRmVhdHVyZXMoZWxlbWVudCkpLFxuICAgICAgc3RhdGVcbiAgICApLnRvU3RhdGVtZW50KCk7XG4gIH1cblxuICBDb21wb25lbnQoY29tcG9uZW50OiBBU1R2Mi5JbnZva2VDb21wb25lbnQsIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUpOiBSZXN1bHQ8bWlyLlN0YXRlbWVudD4ge1xuICAgIHJldHVybiBWSVNJVF9FWFBSUy52aXNpdChjb21wb25lbnQuY2FsbGVlLCBzdGF0ZSkuYW5kVGhlbigoY2FsbGVlKSA9PlxuICAgICAgbmV3IENsYXNzaWZpZWRFbGVtZW50KFxuICAgICAgICBjb21wb25lbnQsXG4gICAgICAgIG5ldyBDbGFzc2lmaWVkQ29tcG9uZW50KGNhbGxlZSwgY29tcG9uZW50KSxcbiAgICAgICAgc3RhdGVcbiAgICAgICkudG9TdGF0ZW1lbnQoKVxuICAgICk7XG4gIH1cblxuICBBcHBlbmRDb250ZW50KGFwcGVuZDogQVNUdjIuQXBwZW5kQ29udGVudCwgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSk6IFJlc3VsdDxtaXIuU3RhdGVtZW50PiB7XG4gICAgbGV0IHRyYW5zbGF0ZWQgPSBBUFBFTkRfS0VZV09SRFMudHJhbnNsYXRlKGFwcGVuZCwgc3RhdGUpO1xuXG4gICAgaWYgKHRyYW5zbGF0ZWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGVkO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IFZJU0lUX0VYUFJTLnZpc2l0KGFwcGVuZC52YWx1ZSwgc3RhdGUpO1xuXG4gICAgcmV0dXJuIHZhbHVlLm1hcE9rKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKGFwcGVuZC50cnVzdGluZykge1xuICAgICAgICByZXR1cm4gbmV3IG1pci5BcHBlbmRUcnVzdGVkSFRNTCh7XG4gICAgICAgICAgbG9jOiBhcHBlbmQubG9jLFxuICAgICAgICAgIGh0bWw6IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgbWlyLkFwcGVuZFRleHROb2RlKHtcbiAgICAgICAgICBsb2M6IGFwcGVuZC5sb2MsXG4gICAgICAgICAgdGV4dDogdmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgVGV4dE5vZGUodGV4dDogQVNUdjIuSHRtbFRleHQpOiBtaXIuU3RhdGVtZW50IHtcbiAgICByZXR1cm4gbmV3IG1pci5BcHBlbmRUZXh0Tm9kZSh7XG4gICAgICBsb2M6IHRleHQubG9jLFxuICAgICAgdGV4dDogbmV3IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uKHsgbG9jOiB0ZXh0LmxvYywgdmFsdWU6IHRleHQuY2hhcnMgfSksXG4gICAgfSk7XG4gIH1cblxuICBIdG1sQ29tbWVudChjb21tZW50OiBBU1R2Mi5IdG1sQ29tbWVudCk6IG1pci5TdGF0ZW1lbnQge1xuICAgIHJldHVybiBuZXcgbWlyLkFwcGVuZENvbW1lbnQoe1xuICAgICAgbG9jOiBjb21tZW50LmxvYyxcbiAgICAgIHZhbHVlOiBjb21tZW50LnRleHQsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZJU0lUX1NUTVRTID0gbmV3IE5vcm1hbGl6YXRpb25TdGF0ZW1lbnRzKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9