Skip to content

Commit

Permalink
Simplify BlockNode by removing intermediate MustacheNode
Browse files Browse the repository at this point in the history
  • Loading branch information
mmun committed Nov 2, 2014
1 parent 3e1840a commit 7ed6d22
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 26 deletions.
14 changes: 4 additions & 10 deletions lib/handlebars/compiler/ast.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,11 @@ var AST = {
this.strip.inlineStandalone = true;
},

BlockNode: function(mustache, program, inverse, strip, locInfo) {
BlockNode: function(sexpr, program, inverse, strip, locInfo) {
LocationInfo.call(this, locInfo);

this.type = 'block';
this.mustache = mustache;
this.sexpr = sexpr;
this.program = program;
this.inverse = inverse;
this.strip = strip;
Expand All @@ -93,17 +93,11 @@ var AST = {
}
},

RawBlockNode: function(mustache, content, close, locInfo) {
RawBlockNode: function(sexpr, content, locInfo) {
LocationInfo.call(this, locInfo);

if (mustache.sexpr.id.original !== close) {
throw new Exception(mustache.sexpr.id.original + " doesn't match " + close, this);
}

content = new AST.ContentNode(content, locInfo);

this.type = 'block';
this.mustache = mustache;
this.sexpr = sexpr;
this.program = new AST.ProgramNode([content], {}, locInfo);
},

Expand Down
3 changes: 1 addition & 2 deletions lib/handlebars/compiler/compiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ Compiler.prototype = {
},

block: function(block) {
var mustache = block.mustache,
var sexpr = block.sexpr,
program = block.program,
inverse = block.inverse;

Expand All @@ -120,7 +120,6 @@ Compiler.prototype = {
inverse = this.compileProgram(inverse);
}

var sexpr = mustache.sexpr;
var type = this.classifySexpr(sexpr);

if (type === "helper") {
Expand Down
31 changes: 24 additions & 7 deletions lib/handlebars/compiler/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,34 @@ export function stripFlags(open, close) {
};
}

export function prepareRawBlock(openRawBlock, content, close, locInfo) {
if (openRawBlock.sexpr.id.original !== close) {
var errorNode = {
firstLine: openRawBlock.sexpr.firstLine,
firstColumn: openRawBlock.sexpr.firstColumn
};

throw new Exception(openRawBlock.sexpr.id.original + " doesn't match " + close, errorNode);
}

return new this.RawBlockNode(openRawBlock.sexpr, content, locInfo);
}

export function prepareBlock(mustache, program, inverseAndProgram, close, inverted, locInfo) {
export function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {
/*jshint -W040 */
if (mustache.sexpr.id.original !== close.path.original) {
throw new Exception(mustache.sexpr.id.original + ' doesn\'t match ' + close.path.original, mustache);
if (openBlock.sexpr.id.original !== close.path.original) {
var errorNode = {
firstLine: openBlock.sexpr.firstLine,
firstColumn: openBlock.sexpr.firstColumn
};

throw new Exception(openBlock.sexpr.id.original + ' doesn\'t match ' + close.path.original, errorNode);
}

var inverse = inverseAndProgram && inverseAndProgram.program;

var strip = {
left: mustache.strip.left,
left: openBlock.strip.left,
right: close.strip.right,

// Determine the standalone candiacy. Basically flag our content as being possibly standalone
Expand All @@ -26,7 +43,7 @@ export function prepareBlock(mustache, program, inverseAndProgram, close, invert
closeStandalone: isPrevWhitespace((inverse || program).statements)
};

if (mustache.strip.right) {
if (openBlock.strip.right) {
omitRight(program.statements, null, true);
}

Expand Down Expand Up @@ -57,9 +74,9 @@ export function prepareBlock(mustache, program, inverseAndProgram, close, invert
}

if (inverted) {
return new this.BlockNode(mustache, inverse, program, strip, locInfo);
return new this.BlockNode(openBlock.sexpr, inverse, program, strip, locInfo);
} else {
return new this.BlockNode(mustache, program, inverse, strip, locInfo);
return new this.BlockNode(openBlock.sexpr, program, inverse, strip, locInfo);
}
}

Expand Down
2 changes: 1 addition & 1 deletion lib/handlebars/compiler/printer.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ PrintVisitor.prototype.block = function(block) {

out = out + this.pad("BLOCK:");
this.padding++;
out = out + this.accept(block.mustache);
out = out + this.accept(block.sexpr);
if (block.program) {
out = out + this.pad("PROGRAM:");
this.padding++;
Expand Down
2 changes: 1 addition & 1 deletion spec/ast.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ describe('ast', function() {
it('should throw on mustache mismatch', function() {
shouldThrow(function() {
handlebarsEnv.parse("\n {{#foo}}{{/bar}}");
}, Handlebars.Exception, "foo doesn't match bar - 2:2");
}, Handlebars.Exception, "foo doesn't match bar - 2:5");
});

it('stores location info', function(){
Expand Down
14 changes: 9 additions & 5 deletions src/handlebars.yy
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,20 @@ statement
| block -> $1
| rawBlock -> $1
| partial -> $1
| CONTENT -> new yy.ContentNode($1, @$)
| content -> $1
| COMMENT -> new yy.CommentNode($1, @$)
;

content
: CONTENT -> new yy.ContentNode($1, @$)
;

rawBlock
: openRawBlock CONTENT END_RAW_BLOCK -> new yy.RawBlockNode($1, $2, $3, @$)
: openRawBlock content END_RAW_BLOCK -> yy.prepareRawBlock($1, $2, $3, @$)
;

openRawBlock
: OPEN_RAW_BLOCK sexpr CLOSE_RAW_BLOCK -> new yy.MustacheNode($2, null, '', '', @$)
: OPEN_RAW_BLOCK sexpr CLOSE_RAW_BLOCK -> { sexpr: $2 }
;

block
Expand All @@ -35,11 +39,11 @@ block
;

openBlock
: OPEN_BLOCK sexpr CLOSE -> new yy.MustacheNode($2, null, $1, yy.stripFlags($1, $3), @$)
: OPEN_BLOCK sexpr CLOSE -> { sexpr: $2, strip: yy.stripFlags($1, $3) }
;

openInverse
: OPEN_INVERSE sexpr CLOSE -> new yy.MustacheNode($2, null, $1, yy.stripFlags($1, $3), @$)
: OPEN_INVERSE sexpr CLOSE -> { sexpr: $2, strip: yy.stripFlags($1, $3) }
;

inverseAndProgram
Expand Down

0 comments on commit 7ed6d22

Please sign in to comment.