move dependencies into node.metadata object

pull/924/head
Rich Harris 8 years ago
parent 1e34cca54f
commit 9ff5e271ec

@ -213,12 +213,11 @@ export default class Generator {
context: string,
isEventHandler: boolean
): {
dependencies: string[],
contexts: Set<string>,
indexes: Set<string>,
snippet: string
} {
this.addSourcemapLocations(expression);
// this.addSourcemapLocations(expression);
const usedContexts: Set<string> = new Set();
const usedIndexes: Set<string> = new Set();
@ -298,10 +297,7 @@ export default class Generator {
},
});
const dependencies: Set<string> = new Set(expression._dependencies || []);
return {
dependencies: Array.from(dependencies),
contexts: usedContexts,
indexes: usedIndexes,
snippet: `[✂${expression.start}-${expression.end}✂]`,
@ -650,18 +646,23 @@ export default class Generator {
walkTemplate() {
const {
code,
expectedProperties,
helpers
} = this;
const { html } = this.parsed;
function findDependencies(node: Node, contextDependencies: Map<string, string[]>, indexes: Set<string>) {
const dependencies: Set<string> = new Set();
const contextualise = (node: Node, contextDependencies: Map<string, string[]>, indexes: Set<string>) => {
this.addSourcemapLocations(node); // TODO this involves an additional walk — can we roll it in somewhere else?
let scope = annotateWithScopes(node);
const dependencies: Set<string> = new Set();
walk(node, {
enter(node: Node, parent: Node) {
code.addSourcemapLocation(node.start);
code.addSourcemapLocation(node.end);
if (node._scope) {
scope = node._scope;
return;
@ -692,7 +693,9 @@ export default class Generator {
expectedProperties.add(dependency);
});
return Array.from(dependencies);
return {
dependencies: Array.from(dependencies)
};
}
const contextStack = [];
@ -708,10 +711,10 @@ export default class Generator {
walk(html, {
enter(node: Node, parent: Node) {
if (node.type === 'EachBlock') {
node.dependencies = findDependencies(node.expression, contextDependencies, indexes);
node.metadata = contextualise(node.expression, contextDependencies, indexes);
contextDependencies = new Map(contextDependencies);
contextDependencies.set(node.context, node.dependencies);
contextDependencies.set(node.context, node.metadata.dependencies);
if (node.destructuredContexts) {
for (let i = 0; i < node.destructuredContexts.length; i += 1) {
@ -719,7 +722,7 @@ export default class Generator {
const value = `${node.context}[${i}]`;
// contexts.set(node.destructuredContexts[i], `${context}[${i}]`);
contextDependencies.set(name, node.dependencies);
contextDependencies.set(name, node.metadata.dependencies);
}
}
@ -733,22 +736,22 @@ export default class Generator {
}
if (node.type === 'IfBlock') {
node.dependencies = findDependencies(node.expression, contextDependencies, indexes);
node.metadata = contextualise(node.expression, contextDependencies, indexes);
}
if (node.type === 'MustacheTag' || node.type === 'RawMustacheTag' || node.type === 'AttributeShorthand') {
node.dependencies = findDependencies(node.expression, contextDependencies, indexes);
node.metadata = contextualise(node.expression, contextDependencies, indexes);
this.skip();
}
if (node.type === 'Binding') {
node.dependencies = findDependencies(node.value, contextDependencies, indexes);
node.metadata = contextualise(node.value, contextDependencies, indexes);
this.skip();
}
if (node.type === 'EventHandler' && node.expression) {
node.expression.arguments.forEach((arg: Node) => {
arg.dependencies = findDependencies(arg, contextDependencies, indexes);
arg.metadata = contextualise(arg, contextDependencies, indexes);
});
this.skip();
}

@ -74,7 +74,7 @@ const preprocessors = {
) => {
cannotUseInnerHTML(node);
node.var = block.getUniqueName('text');
block.addDependencies(node.dependencies);
block.addDependencies(node.metadata.dependencies);
},
RawMustacheTag: (
@ -88,7 +88,7 @@ const preprocessors = {
) => {
cannotUseInnerHTML(node);
node.var = block.getUniqueName('raw');
block.addDependencies(node.dependencies);
block.addDependencies(node.metadata.dependencies);
},
Text: (
@ -129,7 +129,7 @@ const preprocessors = {
function attachBlocks(node: Node) {
node.var = block.getUniqueName(`if_block`);
block.addDependencies(node.dependencies);
block.addDependencies(node.metadata.dependencies);
node._block = block.child({
comment: createDebuggingComment(node, generator),
@ -204,7 +204,7 @@ const preprocessors = {
cannotUseInnerHTML(node);
node.var = block.getUniqueName(`each`);
const { dependencies } = node;
const { dependencies } = node.metadata;
block.addDependencies(dependencies);
const indexNames = new Map(block.indexNames);
@ -314,7 +314,7 @@ const preprocessors = {
if (chunk.type !== 'Text') {
if (node.parent) cannotUseInnerHTML(node.parent);
const dependencies = chunk.dependencies;
const dependencies = chunk.metadata.dependencies;
block.addDependencies(dependencies);
// special case — <option value='{{foo}}'> — see below
@ -336,10 +336,10 @@ const preprocessors = {
if (attribute.type === 'EventHandler' && attribute.expression) {
attribute.expression.arguments.forEach((arg: Node) => {
block.addDependencies(arg.dependencies);
block.addDependencies(arg.metadata.dependencies);
});
} else if (attribute.type === 'Binding') {
block.addDependencies(attribute.dependencies);
block.addDependencies(attribute.metadata.dependencies);
} else if (attribute.type === 'Transition') {
if (attribute.intro)
generator.hasIntroTransitions = block.hasIntroMethod = true;
@ -378,7 +378,7 @@ const preprocessors = {
const binding = node.attributes.find((node: Node) => node.type === 'Binding' && node.name === 'value');
if (binding) {
// TODO does this also apply to e.g. `<input type='checkbox' bind:group='foo'>`?
const dependencies = binding.dependencies;
const dependencies = binding.metadata.dependencies;
state.selectBindingDependencies = dependencies;
dependencies.forEach((prop: string) => {
generator.indirectDependencies.set(prop, new Set());

@ -353,7 +353,7 @@ function mungeAttribute(attribute: Node, block: Block): Attribute {
// simple dynamic attributes
const { snippet } = block.contextualise(value.expression);
const dependencies = value.dependencies;
const dependencies = value.metadata.dependencies;
// TODO only update attributes that have changed
return {
@ -377,7 +377,7 @@ function mungeAttribute(attribute: Node, block: Block): Attribute {
const { snippet } = block.contextualise(
chunk.expression
);
const dependencies = chunk.dependencies;
const dependencies = chunk.metadata.dependencies;
dependencies.forEach(dependency => {
allDependencies.add(dependency);
@ -401,7 +401,7 @@ function mungeBinding(binding: Node, block: Block): Binding {
const { snippet, contexts } = block.contextualise(
binding.value
);
const dependencies = binding.dependencies;
const dependencies = binding.metadata.dependencies;
const contextual = block.contexts.has(name);

@ -402,7 +402,7 @@ function unkeyed(
}
`);
const dependencies = node.dependencies;
const dependencies = node.metadata.dependencies;
const allDependencies = new Set(node._block.dependencies);
dependencies.forEach((dependency: string) => {
allDependencies.add(dependency);

@ -73,7 +73,7 @@ export default function visitAttribute(
// single {{tag}} — may be a non-string
const { expression } = attribute.value[0];
const { snippet, indexes } = block.contextualise(expression);
const dependencies = attribute.value[0].dependencies;
const dependencies = attribute.value[0].metadata.dependencies;
value = snippet;
dependencies.forEach(d => {
@ -97,7 +97,7 @@ export default function visitAttribute(
return stringify(chunk.data);
} else {
const { snippet, indexes } = block.contextualise(chunk.expression);
const dependencies = chunk.dependencies;
const dependencies = chunk.metadata.dependencies;
if (Array.from(indexes).some(index => block.changeableIndexes.get(index))) {
hasChangeableIndex = true;

@ -37,7 +37,7 @@ export default function visitStyleAttribute(
return stringify(chunk.data);
} else {
const { snippet, indexes } = block.contextualise(chunk.expression);
const dependencies = chunk.dependencies;
const dependencies = chunk.metadata.dependencies;
if (Array.from(indexes).some(index => block.changeableIndexes.get(index))) {
hasChangeableIndex = true;

@ -101,8 +101,8 @@ export default function addBindings(
// we need to tell the component to update all the values `selected` might be
// pointing to
// TODO should this happen in preprocess?
const dependencies = binding.dependencies.slice();
binding.dependencies.forEach((prop: string) => {
const dependencies = binding.metadata.dependencies.slice();
binding.metadata.dependencies.forEach((prop: string) => {
const indirectDependencies = generator.indirectDependencies.get(prop);
if (indirectDependencies) {
indirectDependencies.forEach(indirectDependency => {

@ -39,7 +39,7 @@ export default function visitWindow(
attribute.expression.arguments.forEach((arg: Node) => {
block.contextualise(arg, null, true);
const { dependencies } = arg;
const { dependencies } = arg.metadata;
if (dependencies.length) usesState = true;
});

@ -13,7 +13,7 @@ export default function visitTag(
update: (value: string) => string
) {
const { indexes, snippet } = block.contextualise(node.expression);
const dependencies = node.dependencies;
const dependencies = node.metadata.dependencies;
const hasChangeableIndex = Array.from(indexes).some(index => block.changeableIndexes.get(index));

Loading…
Cancel
Save