mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
Speed up updateLocationDataIfMissing
.
* Avoid excessive search for missing `locationData` * Fix `locationData` for `ELSE IF`.
This commit is contained in:
parent
7250fdd576
commit
25c6001a6c
5 changed files with 13 additions and 7 deletions
|
@ -514,9 +514,9 @@
|
|||
type: $1
|
||||
});
|
||||
}), o('IfBlock ELSE IF Expression Block', function() {
|
||||
return $1.addElse(new If($4, $5, {
|
||||
return $1.addElse(LOC(3, 5)(new If($4, $5, {
|
||||
type: $3
|
||||
}));
|
||||
})));
|
||||
})
|
||||
],
|
||||
If: [
|
||||
|
|
|
@ -229,7 +229,10 @@
|
|||
Base.prototype.assigns = NO;
|
||||
|
||||
Base.prototype.updateLocationDataIfMissing = function(locationData) {
|
||||
this.locationData || (this.locationData = locationData);
|
||||
if (this.locationData) {
|
||||
return this;
|
||||
}
|
||||
this.locationData = locationData;
|
||||
return this.eachChild(function(child) {
|
||||
return child.updateLocationDataIfMissing(locationData);
|
||||
});
|
||||
|
@ -2852,6 +2855,7 @@
|
|||
} else {
|
||||
this.isChain = elseBody instanceof If;
|
||||
this.elseBody = this.ensureBlock(elseBody);
|
||||
this.elseBody.updateLocationDataIfMissing(elseBody.locationData);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
|
|
@ -486,9 +486,9 @@ case 180:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[
|
|||
type: $$[$0-2]
|
||||
}));
|
||||
break;
|
||||
case 181:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])($$[$0-4].addElse(new yy.If($$[$0-1], $$[$0], {
|
||||
case 181:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])($$[$0-4].addElse(yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], {
|
||||
type: $$[$0-2]
|
||||
})));
|
||||
}))));
|
||||
break;
|
||||
case 182:this.$ = $$[$0];
|
||||
break;
|
||||
|
|
|
@ -511,7 +511,7 @@ grammar =
|
|||
# ambiguity.
|
||||
IfBlock: [
|
||||
o 'IF Expression Block', -> new If $2, $3, type: $1
|
||||
o 'IfBlock ELSE IF Expression Block', -> $1.addElse new If $4, $5, type: $3
|
||||
o 'IfBlock ELSE IF Expression Block', -> $1.addElse LOC(3,5) new If $4, $5, type: $3
|
||||
]
|
||||
|
||||
# The full complement of *if* expressions, including postfix one-liner
|
||||
|
|
|
@ -176,7 +176,8 @@ exports.Base = class Base
|
|||
# For this node and all descendents, set the location data to `locationData`
|
||||
# if the location data is not already set.
|
||||
updateLocationDataIfMissing: (locationData) ->
|
||||
@locationData or= locationData
|
||||
return this if @locationData
|
||||
@locationData = locationData
|
||||
|
||||
@eachChild (child) ->
|
||||
child.updateLocationDataIfMissing locationData
|
||||
|
@ -2006,6 +2007,7 @@ exports.If = class If extends Base
|
|||
else
|
||||
@isChain = elseBody instanceof If
|
||||
@elseBody = @ensureBlock elseBody
|
||||
@elseBody.updateLocationDataIfMissing elseBody.locationData
|
||||
this
|
||||
|
||||
# The **If** only compiles into a statement if either of its bodies needs
|
||||
|
|
Loading…
Reference in a new issue