mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
Cleanup and extend METHOD_DEF
* Fixes #2949: Detect reserved names (not only for instance methods) * Don't assign names which might result in incorrect `super` calls
This commit is contained in:
parent
e0195756dc
commit
138c25fe5f
3 changed files with 23 additions and 21 deletions
|
@ -1587,7 +1587,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
Assign.prototype.compileNode = function(o) {
|
Assign.prototype.compileNode = function(o) {
|
||||||
var answer, compiledName, isValue, match, name, val, varBase, _ref2, _ref3, _ref4, _ref5;
|
var answer, compiledName, isValue, match, name, val, varBase, _ref2, _ref3, _ref4;
|
||||||
if (isValue = this.variable instanceof Value) {
|
if (isValue = this.variable instanceof Value) {
|
||||||
if (this.variable.isArray() || this.variable.isObject()) {
|
if (this.variable.isArray() || this.variable.isObject()) {
|
||||||
return this.compilePatternMatch(o);
|
return this.compilePatternMatch(o);
|
||||||
|
@ -1615,10 +1615,10 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.value instanceof Code && (match = METHOD_DEF.exec(name))) {
|
if (this.value instanceof Code && (match = METHOD_DEF.exec(name))) {
|
||||||
if (match[1]) {
|
if (match[2]) {
|
||||||
this.value.klass = match[1];
|
this.value.klass = match[1];
|
||||||
}
|
}
|
||||||
this.value.name = (_ref3 = (_ref4 = (_ref5 = match[2]) != null ? _ref5 : match[3]) != null ? _ref4 : match[4]) != null ? _ref3 : match[5];
|
this.value.name = (_ref3 = (_ref4 = match[3]) != null ? _ref4 : match[4]) != null ? _ref3 : match[5];
|
||||||
}
|
}
|
||||||
val = this.value.compileToFragments(o, LEVEL_LIST);
|
val = this.value.compileToFragments(o, LEVEL_LIST);
|
||||||
if (this.context === 'object') {
|
if (this.context === 'object') {
|
||||||
|
@ -3025,7 +3025,7 @@
|
||||||
|
|
||||||
NUMBER = /^[+-]?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)$/i;
|
NUMBER = /^[+-]?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)$/i;
|
||||||
|
|
||||||
METHOD_DEF = RegExp("^(?:(" + IDENTIFIER_STR + ")\\.prototype(?:\\.(" + IDENTIFIER_STR + ")|\\[(\"(?:[^\\\\\"\\r\\n]|\\\\.)*\"|'(?:[^\\\\'\\r\\n]|\\\\.)*')\\]|\\[(0x[\\da-fA-F]+|\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\]))|(" + IDENTIFIER_STR + ")$");
|
METHOD_DEF = RegExp("^(" + IDENTIFIER_STR + ")(\\.prototype)?(?:\\.(" + IDENTIFIER_STR + ")|\\[(\"(?:[^\\\\\"\\r\\n]|\\\\.)*\"|'(?:[^\\\\'\\r\\n]|\\\\.)*')\\]|\\[(0x[\\da-fA-F]+|\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\])$");
|
||||||
|
|
||||||
IS_STRING = /^['"]/;
|
IS_STRING = /^['"]/;
|
||||||
|
|
||||||
|
|
|
@ -1164,8 +1164,8 @@ exports.Assign = class Assign extends Base
|
||||||
else
|
else
|
||||||
o.scope.find name
|
o.scope.find name
|
||||||
if @value instanceof Code and match = METHOD_DEF.exec name
|
if @value instanceof Code and match = METHOD_DEF.exec name
|
||||||
@value.klass = match[1] if match[1]
|
@value.klass = match[1] if match[2]
|
||||||
@value.name = match[2] ? match[3] ? match[4] ? match[5]
|
@value.name = match[3] ? match[4] ? match[5]
|
||||||
val = @value.compileToFragments o, LEVEL_LIST
|
val = @value.compileToFragments o, LEVEL_LIST
|
||||||
return (compiledName.concat @makeCode(": "), val) if @context is 'object'
|
return (compiledName.concat @makeCode(": "), val) if @context is 'object'
|
||||||
answer = compiledName.concat @makeCode(" #{ @context or '=' } "), val
|
answer = compiledName.concat @makeCode(" #{ @context or '=' } "), val
|
||||||
|
@ -2141,21 +2141,14 @@ NUMBER = ///^[+-]?(?:
|
||||||
\d*\.?\d+ (?:e[+-]?\d+)? # decimal
|
\d*\.?\d+ (?:e[+-]?\d+)? # decimal
|
||||||
)$///i
|
)$///i
|
||||||
|
|
||||||
METHOD_DEF = ///
|
METHOD_DEF = /// ^
|
||||||
^
|
(#{IDENTIFIER_STR})
|
||||||
(?:
|
(\.prototype)?
|
||||||
(#{IDENTIFIER_STR})
|
(?: \.(#{IDENTIFIER_STR})
|
||||||
\.prototype
|
| \[("(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*')\]
|
||||||
(?:
|
| \[(0x[\da-fA-F]+ | \d*\.?\d+ (?:[eE][+-]?\d+)?)\]
|
||||||
\.(#{IDENTIFIER_STR})
|
)
|
||||||
| \[("(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*')\]
|
$ ///
|
||||||
| \[(0x[\da-fA-F]+ | \d*\.?\d+ (?:[eE][+-]?\d+)?)\]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
|
||||||
(#{IDENTIFIER_STR})
|
|
||||||
$
|
|
||||||
///
|
|
||||||
|
|
||||||
# Is a literal value a string/regex?
|
# Is a literal value a string/regex?
|
||||||
IS_STRING = /^['"]/
|
IS_STRING = /^['"]/
|
||||||
|
|
|
@ -807,3 +807,12 @@ test "#3063: Class bodies cannot contain pure statements", ->
|
||||||
return if S.f
|
return if S.f
|
||||||
@f: => this
|
@f: => this
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
test "#2949: super in static method with reserved name", ->
|
||||||
|
class Foo
|
||||||
|
@static: -> 'baz'
|
||||||
|
|
||||||
|
class Bar extends Foo
|
||||||
|
@static: -> super
|
||||||
|
|
||||||
|
eq Bar.static(), 'baz'
|
||||||
|
|
Loading…
Reference in a new issue