|
|
@ -3,7 +3,8 @@ import { CompileOptions } from '../../interfaces';
|
|
|
|
import Component from '../Component';
|
|
|
|
import Component from '../Component';
|
|
|
|
import FragmentWrapper from './wrappers/Fragment';
|
|
|
|
import FragmentWrapper from './wrappers/Fragment';
|
|
|
|
import { x } from 'code-red';
|
|
|
|
import { x } from 'code-red';
|
|
|
|
import { Node, Identifier } from 'estree';
|
|
|
|
import { Node, Identifier, MemberExpression } from 'estree';
|
|
|
|
|
|
|
|
import flatten_reference from '../utils/flatten_reference';
|
|
|
|
|
|
|
|
|
|
|
|
export default class Renderer {
|
|
|
|
export default class Renderer {
|
|
|
|
component: Component; // TODO Maybe Renderer shouldn't know about Component?
|
|
|
|
component: Component; // TODO Maybe Renderer shouldn't know about Component?
|
|
|
@ -158,23 +159,28 @@ export default class Renderer {
|
|
|
|
: x`#changed & ${bitmask}`;
|
|
|
|
: x`#changed & ${bitmask}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
reference(name) {
|
|
|
|
reference(node: string | Identifier | MemberExpression) {
|
|
|
|
const i = this.context_lookup.get(name);
|
|
|
|
if (typeof node === 'string') {
|
|
|
|
|
|
|
|
node = { type: 'Identifier', name: node };
|
|
|
|
if (name === `$$props`) return x`#ctx[${i}]`;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let [head, ...tail] = name.split('.');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const variable = this.component.var_lookup.get(head);
|
|
|
|
const { name, nodes } = flatten_reference(node);
|
|
|
|
|
|
|
|
const i = this.context_lookup.get(name);
|
|
|
|
|
|
|
|
|
|
|
|
if (variable) {
|
|
|
|
// TODO is this correct?
|
|
|
|
this.component.add_reference(name); // TODO we can probably remove most other occurrences of this
|
|
|
|
if (this.component.var_lookup.get(name)) {
|
|
|
|
|
|
|
|
this.component.add_reference(name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (i !== undefined) {
|
|
|
|
if (i !== undefined) {
|
|
|
|
head = x`#ctx[${i}]`;
|
|
|
|
const replacement = x`#ctx[${i}]` as MemberExpression;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
replacement.object.loc = nodes[0].loc;
|
|
|
|
|
|
|
|
nodes[0] = replacement;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return nodes.reduce((lhs, rhs) => x`${lhs}.${rhs}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return [head, ...tail].reduce((lhs, rhs) => x`${lhs}.${rhs}`);
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|