if (parsing_block == 0)
res = -1;
+ break;
+ case Token.THROW:
+ switch (current_token) {
+ case Token.ARROW:
+ case Token.OP_COALESCING:
+ case Token.INTERR:
+ res = Token.THROW_EXPR;
+ break;
+ }
+
break;
}
}
//
- // Open parens micro parser. Detects both lambda and cast ambiguity.
+ // Open parens micro parser
//
int TokenizeOpenParens ()
{
int bracket_level = 0;
bool is_type = false;
bool can_be_type = false;
+ bool at_least_one_comma = false;
while (true) {
ptoken = current_token;
if (current_token == Token.ARROW)
return Token.OPEN_PARENS_LAMBDA;
+ //
+ // Expression inside parens is deconstruct expression, (a, x.y) = ...
+ //
+ if (current_token == Token.ASSIGN && at_least_one_comma)
+ return Token.OPEN_PARENS_DECONSTRUCT;
+
//
// Expression inside parens is single type, (int[])
//
if (bracket_level == 0) {
bracket_level = 100;
can_be_type = is_type = false;
+ at_least_one_comma = true;
}
continue;
}
return false;
+ case Token.OPEN_PARENS:
+ if (!parsing_generic_declaration)
+ return false;
+
+ while (true) {
+ switch (token ()) {
+ case Token.COMMA:
+ // tuple declaration after <
+ return true;
+ case Token.OP_GENERICS_GT:
+ case Token.EOF:
+ return false;
+ }
+ }
+
default:
return false;
}
else if (the_token == Token.INTERR_NULLABLE || the_token == Token.STAR)
goto again;
else if (the_token == Token.OP_GENERICS_LT) {
- if (!parse_less_than (ref genericDimension))
+ int unused = 0;
+ if (!parse_less_than (ref unused))
return false;
goto again;
} else if (the_token == Token.OPEN_BRACKET) {
}
if (d == '.') {
- return Token.INTERR_OPERATOR;
+ d = reader.Peek ();
+ return d >= '0' && d <= '9' ? Token.INTERR : Token.INTERR_OPERATOR;
}
if (d != ' ') {
case Token.THIS:
case Token.NEW:
case Token.INTERPOLATED_STRING:
+ case Token.THROW:
next_token = Token.INTERR;
break;
case '\"':
++str_quote;
break;
+ case '\\':
+ // Skip escaped " character
+ c = reader.Read ();
+ if (c == -1)
+ res = false;
+ break;
case -1:
res = false;
break;
id_builder [pos] = (char)c;
if (c >= '0' && c <= '9') {
- if (pos == 6 && id_builder [0] == 'C' && id_builder [1] == 'S') {
+ if (pos == 5 && id_builder [0] == 'C' && id_builder [1] == 'S') {
// Recognize CSXXXX as C# XXXX warning
number = 0;
int pow = 1000;
pow /= 10;
}
}
+ } else if (c == '\n' || c == UnicodeLS || c == UnicodePS) {
+ advance_line ();
+ break;
} else if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z') && c != '_') {
break;
}
while (c == ' ' || c == '\t')
c = get_char ();
- if (c == '\n' || c == UnicodeLS || c == UnicodePS)
- advance_line ();
-
return number;
}
case Token.DEFAULT:
case Token.DELEGATE:
case Token.OP_GENERICS_GT:
+ case Token.REFVALUE:
return Token.OPEN_PARENS;
}