fix sourcemaps

pull/3945/head
Rich Harris 6 years ago
parent 7963b4b404
commit 4338d2e64d

@ -213,15 +213,8 @@ export default class Expression {
component.add_reference(name); // TODO is this redundant/misplaced? component.add_reference(name); // TODO is this redundant/misplaced?
} }
} else if (is_contextual(component, template_scope, name)) { } else if (is_contextual(component, template_scope, name)) {
const reference = block.renderer.reference(name); const reference = block.renderer.reference(node);
if (node.type === 'Identifier') { this.replace(reference);
this.replace(reference);
} else {
while (node.object.type === 'MemberExpression') {
node = node.object;
}
node.object = reference;
}
} }
this.skip(); this.skip();
@ -269,7 +262,7 @@ export default class Expression {
component.partly_hoisted.push(declaration); component.partly_hoisted.push(declaration);
block.renderer.add_to_context(id.name); block.renderer.add_to_context(id.name);
this.replace(block.renderer.reference(id.name)); this.replace(block.renderer.reference(id));
} }
else { else {
@ -286,7 +279,7 @@ export default class Expression {
component.partly_hoisted.push(declaration); component.partly_hoisted.push(declaration);
block.renderer.add_to_context(id.name); block.renderer.add_to_context(id.name);
const callee = block.renderer.reference(id.name); const callee = block.renderer.reference(id);
this.replace(id as any); this.replace(id as any);

@ -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;
} }
} }

@ -26,7 +26,7 @@ export default class EventHandlerWrapper {
} }
get_snippet(block) { get_snippet(block) {
const snippet = this.node.expression ? this.node.expression.manipulate(block) : block.renderer.reference(this.node.handler_name.name); const snippet = this.node.expression ? this.node.expression.manipulate(block) : block.renderer.reference(this.node.handler_name);
if (this.node.reassigned) { if (this.node.reassigned) {
block.maintain_context = true; block.maintain_context = true;

@ -488,7 +488,7 @@ export default class ElementWrapper extends Wrapper {
const has_local_function = contextual_dependencies.size > 0 || needs_lock || animation_frame; const has_local_function = contextual_dependencies.size > 0 || needs_lock || animation_frame;
let callee = renderer.reference(handler.name); let callee = renderer.reference(handler);
// TODO dry this out — similar code for event handlers and component bindings // TODO dry this out — similar code for event handlers and component bindings
if (has_local_function) { if (has_local_function) {

@ -281,7 +281,7 @@ export default class InlineComponentWrapper extends Wrapper {
const id = component.get_unique_name(`${this.var.name}_${binding.name}_binding`); const id = component.get_unique_name(`${this.var.name}_${binding.name}_binding`);
renderer.add_to_context(id.name); renderer.add_to_context(id.name);
const callee = renderer.reference(id.name); const callee = renderer.reference(id);
const updating = block.get_unique_name(`updating_${binding.name}`); const updating = block.get_unique_name(`updating_${binding.name}`);
block.add_variable(updating); block.add_variable(updating);

Loading…
Cancel
Save