Feature #10463 ยป tilde-bang-at-symbols.patch
| parse.y | ||
|---|---|---|
|
c = nextc(p);
|
||
|
if (IS_AFTER_OPERATOR()) {
|
||
|
SET_LEX_STATE(EXPR_ARG);
|
||
|
if (c == '@') {
|
||
|
if (c == '@' && !IS_lex_state_for(last_state, EXPR_FITEM)) {
|
||
|
return '!';
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
case '"':
|
||
|
p->lex.strterm = NEW_STRTERM(str_dsym, c, 0);
|
||
|
break;
|
||
|
case '!':
|
||
|
case '~':
|
||
|
pushback(p, c);
|
||
|
SET_LEX_STATE(EXPR_FNAME|EXPR_FITEM);
|
||
|
return tSYMBEG;
|
||
|
default:
|
||
|
pushback(p, c);
|
||
|
break;
|
||
| ... | ... | |
|
case '~':
|
||
|
if (IS_AFTER_OPERATOR()) {
|
||
|
if ((c = nextc(p)) != '@') {
|
||
|
if ((c = nextc(p)) != '@' || IS_lex_state_for(last_state, EXPR_FITEM)) {
|
||
|
pushback(p, c);
|
||
|
}
|
||
|
SET_LEX_STATE(EXPR_ARG);
|
||
| test/ruby/test_syntax.rb | ||
|---|---|---|
|
end
|
||
|
end
|
||
|
def test_bang_tilde_atmark
|
||
|
assert_raise(SyntaxError) { eval ':!@' }
|
||
|
assert_raise(SyntaxError) { eval ':~@' }
|
||
|
bang, tilde = nil
|
||
|
klass = Class.new do
|
||
|
bang = def !@; 1 end
|
||
|
tilde = def ~@; 2 end
|
||
|
end
|
||
|
assert_equal(:!, bang)
|
||
|
assert_equal(:~, tilde)
|
||
|
assert_equal(1, !klass.new)
|
||
|
assert_equal(2, ~klass.new)
|
||
|
end
|
||
|
def test_cmd_symbol_after_keyword
|
||
|
bug6347 = '[ruby-dev:45563]'
|
||
|
assert_not_label(:foo, 'if true then not_label:foo end', bug6347)
|
||