Skip to content

Commit c3ebf25

Browse files
authored
Merge pull request #307 from sveltejs/gh-222-b
Deconflict each-blocks contexts with reserved words
2 parents e486ed0 + 2165f08 commit c3ebf25

File tree

8 files changed

+43
-10
lines changed

8 files changed

+43
-10
lines changed

src/generators/Generator.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,13 @@ export default class Generator {
5858
// noop
5959
}
6060

61-
else if ( contexts[ name ] ) {
61+
else if ( name in contexts ) {
62+
const context = contexts[ name ];
63+
if ( context !== name ) {
64+
// this is true for 'reserved' names like `root` and `component`
65+
code.overwrite( node.start, node.start + name.length, context, true );
66+
}
67+
6268
dependencies.push( ...contextDependencies[ name ] );
6369
if ( !~usedContexts.indexOf( name ) ) usedContexts.push( name );
6470
}

src/generators/dom/index.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class DomGenerator extends Generator {
7171
properties.addBlock( `update: ${this.helper( 'noop' )},` );
7272
} else {
7373
properties.addBlock( deindent`
74-
update: function ( changed, ${fragment.params} ) {
74+
update: function ( changed, ${fragment.params.join( ', ' )} ) {
7575
var __tmp;
7676
7777
${fragment.builders.update}
@@ -90,7 +90,7 @@ class DomGenerator extends Generator {
9090
}
9191

9292
this.renderers.push( deindent`
93-
function ${fragment.name} ( ${fragment.params}, component${fragment.key ? `, key` : ''} ) {
93+
function ${fragment.name} ( ${fragment.params.join( ', ' )}, component${fragment.key ? `, key` : ''} ) {
9494
${fragment.builders.init}
9595
9696
return {
@@ -180,7 +180,7 @@ export default function dom ( parsed, source, options, names ) {
180180
contexts: {},
181181
indexes: {},
182182

183-
params: 'root',
183+
params: [ 'root' ],
184184
indexNames: {},
185185
listNames: {},
186186

@@ -364,7 +364,7 @@ export default function dom ( parsed, source, options, names ) {
364364
}
365365

366366
const names = [ 'get', 'fire', 'observe', 'on', 'set', '_flush', 'dispatchObservers' ].concat( Object.keys( generator.uses ) )
367-
.map( name => name in generator.aliases ? `${name} as ${generator.aliases[ name ]}` : name );
367+
.map( name => name in generator.aliases && name !== generator.aliases[ name ] ? `${name} as ${generator.aliases[ name ]}` : name );
368368

369369
builders.main.addLineAtStart(
370370
`import { ${names.join( ', ' )} } from ${JSON.stringify( sharedPath )}`

src/generators/dom/visitors/Component.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export default {
6262
// Component has children, put them in a separate {{yield}} block
6363
if ( hasChildren ) {
6464
const yieldName = generator.getUniqueName( `render${name}YieldFragment` );
65-
const { params } = generator.current;
65+
const params = generator.current.params.join( ', ' );
6666

6767
generator.generateBlock( node, yieldName );
6868

src/generators/dom/visitors/EachBlock.js

+15-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ import CodeBuilder from '../../../utils/CodeBuilder.js';
22
import deindent from '../../../utils/deindent.js';
33
import getBuilders from '../utils/getBuilders.js';
44

5+
const reserved = {
6+
component: true,
7+
root: true
8+
};
9+
510
export default {
611
enter ( generator, node ) {
712
const name = generator.getUniqueName( `eachBlock` );
@@ -172,16 +177,24 @@ export default {
172177
const listNames = Object.assign( {}, generator.current.listNames );
173178
listNames[ node.context ] = listName;
174179

180+
// ensure that contexts like `root` or `component` don't blow up the whole show
181+
let context = node.context;
182+
let c = 1;
183+
184+
while ( context in reserved || ~generator.current.params.indexOf( context ) ) {
185+
context = `${node.context}$${c++}`;
186+
}
187+
175188
const contexts = Object.assign( {}, generator.current.contexts );
176-
contexts[ node.context ] = true;
189+
contexts[ node.context ] = context;
177190

178191
const indexes = Object.assign( {}, generator.current.indexes );
179192
if ( node.index ) indexes[ indexName ] = node.context;
180193

181194
const contextDependencies = Object.assign( {}, generator.current.contextDependencies );
182195
contextDependencies[ node.context ] = dependencies;
183196

184-
const blockParams = generator.current.params + `, ${listName}, ${node.context}, ${indexName}`;
197+
const blockParams = generator.current.params.concat( listName, context, indexName );
185198

186199
generator.push({
187200
name: renderer,

src/generators/dom/visitors/IfBlock.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ function getConditionsAndBlocks ( generator, node, _name, i = 0 ) {
3232

3333
export default {
3434
enter ( generator, node ) {
35-
const { params } = generator.current;
35+
const params = generator.current.params.join( ', ' );
3636
const name = generator.getUniqueName( `ifBlock` );
3737
const getBlock = generator.getUniqueName( `getBlock` );
3838
const currentBlock = generator.getUniqueName( `currentBlock` );

src/generators/server-side-rendering/visitors/EachBlock.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export default {
88
// TODO should this be the generator's job? It's duplicated between
99
// here and the equivalent DOM compiler visitor
1010
const contexts = Object.assign( {}, generator.current.contexts );
11-
contexts[ node.context ] = true;
11+
contexts[ node.context ] = node.context;
1212

1313
const indexes = Object.assign( {}, generator.current.indexes );
1414
if ( node.index ) indexes[ node.index ] = node.context;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export default {
2+
html: `
3+
<ul><li>foo</li><li>bar</li><li>baz</li></ul>
4+
`,
5+
6+
data: {
7+
components: [ 'foo', 'bar', 'baz' ]
8+
}
9+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<ul>
2+
{{#each components as component}}
3+
<li>{{component}}</li>
4+
{{/each}}
5+
</ul>

0 commit comments

Comments
 (0)