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

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

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

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

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

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

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

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

Loading…
Cancel
Save