From 0ed59b7d74298a9da7358fe1932536ce28c2a1b3 Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Wed, 4 Apr 2018 08:19:59 -0400 Subject: [PATCH] deconflict against inherited contexts - fixes #1275 --- src/generators/Generator.ts | 3 ++- src/generators/dom/Block.ts | 2 +- src/generators/dom/index.ts | 27 ------------------- .../component-name-deconflicted/Nested.html | 1 + .../component-name-deconflicted/_config.js | 17 ++++++++++++ .../component-name-deconflicted/main.html | 18 +++++++++++++ 6 files changed, 39 insertions(+), 29 deletions(-) create mode 100644 test/runtime/samples/component-name-deconflicted/Nested.html create mode 100644 test/runtime/samples/component-name-deconflicted/_config.js create mode 100644 test/runtime/samples/component-name-deconflicted/main.html diff --git a/src/generators/Generator.ts b/src/generators/Generator.ts index 641baf81a1..1fed4dbeb4 100644 --- a/src/generators/Generator.ts +++ b/src/generators/Generator.ts @@ -398,7 +398,7 @@ export default class Generator { return alias; } - getUniqueNameMaker() { + getUniqueNameMaker(names: string[]) { const localUsedNames = new Set(); function add(name: string) { @@ -407,6 +407,7 @@ export default class Generator { reservedNames.forEach(add); this.userVars.forEach(add); + names.forEach(add); return (name: string) => { if (test) name = `${name}$`; diff --git a/src/generators/dom/Block.ts b/src/generators/dom/Block.ts index 2e03c45e75..edf505c7b3 100644 --- a/src/generators/dom/Block.ts +++ b/src/generators/dom/Block.ts @@ -105,7 +105,7 @@ export default class Block { this.hasOutroMethod = false; this.outros = 0; - this.getUniqueName = this.generator.getUniqueNameMaker(); + this.getUniqueName = this.generator.getUniqueNameMaker([...this.contexts.values()]); this.variables = new Map(); this.aliases = new Map() diff --git a/src/generators/dom/index.ts b/src/generators/dom/index.ts index c3358f31d3..b01117a055 100644 --- a/src/generators/dom/index.ts +++ b/src/generators/dom/index.ts @@ -48,33 +48,6 @@ export class DomGenerator extends Generator { // initial values for e.g. window.innerWidth, if there's a <:Window> meta tag this.metaBindings = []; } - - getUniqueNameMaker() { - const localUsedNames = new Set(); - - function add(name: string) { - localUsedNames.add(name); - } - - reservedNames.forEach(add); - this.userVars.forEach(add); - for (const name in shared) { - localUsedNames.add(test ? `${name}$` : name); - } - - return (name: string) => { - if (test) name = `${name}$`; - let alias = name; - for ( - let i = 1; - this.usedNames.has(alias) || - localUsedNames.has(alias); - alias = `${name}_${i++}` - ); - localUsedNames.add(alias); - return alias; - }; - } } export default function dom( diff --git a/test/runtime/samples/component-name-deconflicted/Nested.html b/test/runtime/samples/component-name-deconflicted/Nested.html new file mode 100644 index 0000000000..c39d49c248 --- /dev/null +++ b/test/runtime/samples/component-name-deconflicted/Nested.html @@ -0,0 +1 @@ +{{nested}} \ No newline at end of file diff --git a/test/runtime/samples/component-name-deconflicted/_config.js b/test/runtime/samples/component-name-deconflicted/_config.js new file mode 100644 index 0000000000..853bbdd87c --- /dev/null +++ b/test/runtime/samples/component-name-deconflicted/_config.js @@ -0,0 +1,17 @@ +export default { + html: ` + 1 + 2 + `, + + test(assert, component, target) { + component.set({ + list: [3, 4] + }); + + assert.htmlEqual(target.innerHTML, ` + 3 + 4 + `); + } +}; \ No newline at end of file diff --git a/test/runtime/samples/component-name-deconflicted/main.html b/test/runtime/samples/component-name-deconflicted/main.html new file mode 100644 index 0000000000..6018c378f0 --- /dev/null +++ b/test/runtime/samples/component-name-deconflicted/main.html @@ -0,0 +1,18 @@ +{{#each list as nested}} + {{#if true}} + + {{/if}} +{{/each}} + + \ No newline at end of file