private void ParserErrors1() {
LoggingErrorSink log = new LoggingErrorSink();
var tokens = GetRubyTokens(log, "def [");
Assert(tokens.ToArray().ValueEquals(new[] {
Tokens.Def,
Tokens.LeftIndexingBracket,
}));
Assert(log.Errors.Count == 1 &&
log.Errors[0].Severity == Severity.FatalError
);
log.Errors.Clear();
tokens = GetRubyTokens(log, "${");
Assert(tokens.ToArray().ValueEquals(new[] {
Tokens.Dollar,
}));
Assert(log.Errors.Count == 1 &&
log.Errors[0].Severity == Severity.FatalError
);
log.Errors.Clear();
// Error: block argument should not be given (yield as a command):
tokens = GetRubyTokens(log, "a[yield 1, &x]");
Assert(tokens.ToArray().ValueEquals(new[] {
Tokens.Identifier,
Tokens.LeftIndexingBracket,
Tokens.Yield,
Tokens.Integer,
Tokens.Comma,
Tokens.BlockReference,
Tokens.Identifier,
Tokens.RightBracket,
Tokens.EndOfFile,
}));
Assert(log.Errors.Count == 1 &&
log.Errors[0].Severity == Severity.Error
);
log.Errors.Clear();
// restrictions on jump statements:
foreach (var src in new[] {
"a[return 1, &x]",
"puts if return 1",
"1 && return 1",
"(a ? return 1 : 1) while true",
"a while return",
"1 + return",
"return / 1",
"a = return",
"return.foo = bar",
"a = 1 rescue return 2",
}) {
tokens = GetRubyTokens(log, src);
Assert(log.Errors.Count > 0 && log.Errors.Exists((e) => e.Severity == Severity.FatalError));
log.Errors.Clear();
}
// Error: Duplicate parameter name:
tokens = GetRubyTokens(log, "lambda { |x,x| }");
Assert(log.Errors.Count == 1 && log.Errors[0].Severity == Severity.Error);
log.Errors.Clear();
// Underscore may be duplicated:
tokens = GetRubyTokens(log, "lambda { |_,_| }");
Assert(log.Errors.Count == 0);
log.Errors.Clear();
}