diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs
index abcbfb0077..7033d5598e 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs
@@ -95,6 +95,7 @@ namespace CSharpBinding.Parser
ICompilationUnit Parse(ICSharpCode.NRefactory.Parser.IParser p, string fileName, IProjectContent projectContent)
{
p.Lexer.SpecialCommentTags = lexerTags;
+ ((ICSharpCode.NRefactory.Parser.AbstractParser)p).ParseMethodContents = false;
p.Parse();
NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(projectContent);
diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs b/src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs
index deb5907532..961cc7cdd9 100644
--- a/src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs
+++ b/src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs
@@ -3,7 +3,7 @@
* User: Omnibrain
* Date: 08.09.2004
* Time: 23:13
- *
+ *
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
@@ -169,6 +169,14 @@ namespace ICSharpCode.NRefactory.Parser
protected abstract Token Next();
+ ///
+ /// Skips to the end of the current code block.
+ ///
+ public virtual void SkipCurrentBlock()
+ {
+ throw new NotSupportedException();
+ }
+
protected bool IsIdentifierPart(char ch)
{
return Char.IsLetterOrDigit(ch) || ch == '_';
@@ -224,7 +232,7 @@ namespace ICSharpCode.NRefactory.Parser
int nextChar;
while ((nextChar = reader.Read()) != -1) {
char ch = (char)nextChar;
-
+
// Return read string, if EOL is reached
if (HandleLineEnd(ch)) {
return sb.ToString();;
diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs b/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs
index e5ec559302..68adba8a15 100644
--- a/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs
+++ b/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs
@@ -16,7 +16,7 @@ using ICSharpCode.NRefactory.Parser;
namespace ICSharpCode.NRefactory.Parser.CSharp
{
- internal class Lexer : AbstractLexer
+ internal sealed class Lexer : AbstractLexer
{
public Lexer(TextReader reader) : base(reader)
{
@@ -802,5 +802,24 @@ namespace ICSharpCode.NRefactory.Parser.CSharp
// Reached EOF before end of multiline comment.
errors.Error(line, col, String.Format("Reached EOF before the end of a multiline comment"));
}
+
+ ///
+ /// Skips to the end of the current code block.
+ ///
+ public override void SkipCurrentBlock()
+ {
+ int braceCount = 0;
+ Token t;
+ StartPeek();
+ while ((t = Peek()).kind != Tokens.EOF) {
+ if (t.kind == Tokens.OpenCurlyBrace) {
+ ++braceCount;
+ } else if (t.kind == Tokens.CloseCurlyBrace) {
+ if (--braceCount < 0)
+ return;
+ }
+ NextToken();
+ }
+ }
}
}
diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/ILexer.cs b/src/Libraries/NRefactory/Project/Src/Lexer/ILexer.cs
index 3a38f0d396..e074842173 100644
--- a/src/Libraries/NRefactory/Project/Src/Lexer/ILexer.cs
+++ b/src/Libraries/NRefactory/Project/Src/Lexer/ILexer.cs
@@ -67,5 +67,10 @@ namespace ICSharpCode.NRefactory.Parser
///
/// An object.
Token NextToken();
+
+ ///
+ /// Skips to the end of the current code block.
+ ///
+ void SkipCurrentBlock();
}
}
diff --git a/src/Libraries/NRefactory/Project/Src/Parser/AbstractParser.cs b/src/Libraries/NRefactory/Project/Src/Parser/AbstractParser.cs
index 8742308af9..6fc4731072 100644
--- a/src/Libraries/NRefactory/Project/Src/Parser/AbstractParser.cs
+++ b/src/Libraries/NRefactory/Project/Src/Parser/AbstractParser.cs
@@ -27,6 +27,17 @@ namespace ICSharpCode.NRefactory.Parser
protected CompilationUnit compilationUnit;
+ protected bool parseMethodContents = true;
+
+ public bool ParseMethodContents {
+ get {
+ return parseMethodContents;
+ }
+ set {
+ parseMethodContents = value;
+ }
+ }
+
public ILexer Lexer {
get {
return lexer;
diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
index 02c3848842..329c34d61e 100644
--- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
+++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
@@ -663,43 +663,43 @@ out expr);
}
void Expr(
-#line 1791 "cs.ATG"
+#line 1793 "cs.ATG"
out Expression expr) {
-#line 1792 "cs.ATG"
+#line 1794 "cs.ATG"
expr = null; Expression expr1 = null, expr2 = null;
UnaryExpr(
-#line 1794 "cs.ATG"
+#line 1796 "cs.ATG"
out expr);
if (StartOf(5)) {
ConditionalOrExpr(
-#line 1797 "cs.ATG"
+#line 1799 "cs.ATG"
ref expr);
if (la.kind == 12) {
lexer.NextToken();
Expr(
-#line 1797 "cs.ATG"
+#line 1799 "cs.ATG"
out expr1);
Expect(9);
Expr(
-#line 1797 "cs.ATG"
+#line 1799 "cs.ATG"
out expr2);
-#line 1797 "cs.ATG"
+#line 1799 "cs.ATG"
expr = new ConditionalExpression(expr, expr1, expr2);
}
} else if (StartOf(6)) {
-#line 1799 "cs.ATG"
+#line 1801 "cs.ATG"
AssignmentOperatorType op; Expression val;
AssignmentOperator(
-#line 1799 "cs.ATG"
+#line 1801 "cs.ATG"
out op);
Expr(
-#line 1799 "cs.ATG"
+#line 1801 "cs.ATG"
out val);
-#line 1799 "cs.ATG"
+#line 1801 "cs.ATG"
expr = new AssignmentExpression(expr, op, val);
} else SynErr(127);
}
@@ -1091,39 +1091,39 @@ out p);
}
void TypeParameterList(
-#line 2110 "cs.ATG"
+#line 2112 "cs.ATG"
List templates) {
-#line 2112 "cs.ATG"
+#line 2114 "cs.ATG"
AttributeSection section;
ArrayList attributes = new ArrayList();
Expect(22);
while (la.kind == 17) {
AttributeSection(
-#line 2116 "cs.ATG"
+#line 2118 "cs.ATG"
out section);
-#line 2116 "cs.ATG"
+#line 2118 "cs.ATG"
attributes.Add(section);
}
Expect(1);
-#line 2117 "cs.ATG"
+#line 2119 "cs.ATG"
templates.Add(new TemplateDefinition(t.val, attributes));
while (la.kind == 13) {
lexer.NextToken();
while (la.kind == 17) {
AttributeSection(
-#line 2118 "cs.ATG"
+#line 2120 "cs.ATG"
out section);
-#line 2118 "cs.ATG"
+#line 2120 "cs.ATG"
attributes.Add(section);
}
Expect(1);
-#line 2119 "cs.ATG"
+#line 2121 "cs.ATG"
templates.Add(new TemplateDefinition(t.val, attributes));
}
Expect(21);
@@ -1157,25 +1157,25 @@ out qualident);
}
void TypeParameterConstraintsClause(
-#line 2123 "cs.ATG"
+#line 2125 "cs.ATG"
List templates) {
-#line 2124 "cs.ATG"
+#line 2126 "cs.ATG"
string name = ""; TypeReference type;
Expect(1);
-#line 2126 "cs.ATG"
+#line 2128 "cs.ATG"
if (t.val != "where") Error("where expected");
Expect(1);
-#line 2127 "cs.ATG"
+#line 2129 "cs.ATG"
name = t.val;
Expect(9);
TypeParameterConstraintsClauseBase(
-#line 2129 "cs.ATG"
+#line 2131 "cs.ATG"
out type);
-#line 2130 "cs.ATG"
+#line 2132 "cs.ATG"
TemplateDefinition td = null;
foreach (TemplateDefinition d in templates) {
if (d.Name == name) {
@@ -1188,10 +1188,10 @@ out type);
while (la.kind == 13) {
lexer.NextToken();
TypeParameterConstraintsClauseBase(
-#line 2139 "cs.ATG"
+#line 2141 "cs.ATG"
out type);
-#line 2140 "cs.ATG"
+#line 2142 "cs.ATG"
td = null;
foreach (TemplateDefinition d in templates) {
if (d.Name == name) {
@@ -2553,20 +2553,20 @@ out type);
}
void TypeName(
-#line 2092 "cs.ATG"
+#line 2094 "cs.ATG"
out string qualident, out List types) {
-#line 2093 "cs.ATG"
+#line 2095 "cs.ATG"
List t; types = new List();
Qualident(
-#line 2095 "cs.ATG"
+#line 2097 "cs.ATG"
out qualident);
if (la.kind == 22) {
TypeArgumentList(
-#line 2096 "cs.ATG"
+#line 2098 "cs.ATG"
out t);
-#line 2096 "cs.ATG"
+#line 2098 "cs.ATG"
types = t;
}
}
@@ -2580,13 +2580,14 @@ out Statement stmt) {
BlockStatement blockStmt = new BlockStatement();
blockStmt.StartLocation = t.EndLocation;
compilationUnit.BlockStart(blockStmt);
+ if (!parseMethodContents) lexer.SkipCurrentBlock();
while (StartOf(20)) {
Statement();
}
Expect(16);
-#line 1420 "cs.ATG"
+#line 1422 "cs.ATG"
stmt = blockStmt;
blockStmt.EndLocation = t.EndLocation;
compilationUnit.BlockEnd();
@@ -2694,38 +2695,38 @@ out stmt);
}
void ConstructorInitializer(
-#line 1442 "cs.ATG"
+#line 1444 "cs.ATG"
out ConstructorInitializer ci) {
-#line 1443 "cs.ATG"
+#line 1445 "cs.ATG"
Expression expr; ci = new ConstructorInitializer();
Expect(9);
if (la.kind == 49) {
lexer.NextToken();
-#line 1447 "cs.ATG"
+#line 1449 "cs.ATG"
ci.ConstructorInitializerType = ConstructorInitializerType.Base;
} else if (la.kind == 109) {
lexer.NextToken();
-#line 1448 "cs.ATG"
+#line 1450 "cs.ATG"
ci.ConstructorInitializerType = ConstructorInitializerType.This;
} else SynErr(156);
Expect(19);
if (StartOf(21)) {
Argument(
-#line 1451 "cs.ATG"
+#line 1453 "cs.ATG"
out expr);
-#line 1451 "cs.ATG"
+#line 1453 "cs.ATG"
if (expr != null) { ci.Arguments.Add(expr); }
while (la.kind == 13) {
lexer.NextToken();
Argument(
-#line 1451 "cs.ATG"
+#line 1453 "cs.ATG"
out expr);
-#line 1451 "cs.ATG"
+#line 1453 "cs.ATG"
if (expr != null) { ci.Arguments.Add(expr); }
}
}
@@ -2733,161 +2734,161 @@ out expr);
}
void OverloadableOperator(
-#line 1463 "cs.ATG"
+#line 1465 "cs.ATG"
out OverloadableOperatorType op) {
-#line 1464 "cs.ATG"
+#line 1466 "cs.ATG"
op = OverloadableOperatorType.None;
switch (la.kind) {
case 4: {
lexer.NextToken();
-#line 1466 "cs.ATG"
+#line 1468 "cs.ATG"
op = OverloadableOperatorType.Add;
break;
}
case 5: {
lexer.NextToken();
-#line 1467 "cs.ATG"
+#line 1469 "cs.ATG"
op = OverloadableOperatorType.Subtract;
break;
}
case 23: {
lexer.NextToken();
-#line 1469 "cs.ATG"
+#line 1471 "cs.ATG"
op = OverloadableOperatorType.Not;
break;
}
case 26: {
lexer.NextToken();
-#line 1470 "cs.ATG"
+#line 1472 "cs.ATG"
op = OverloadableOperatorType.BitNot;
break;
}
case 30: {
lexer.NextToken();
-#line 1472 "cs.ATG"
+#line 1474 "cs.ATG"
op = OverloadableOperatorType.Increment;
break;
}
case 31: {
lexer.NextToken();
-#line 1473 "cs.ATG"
+#line 1475 "cs.ATG"
op = OverloadableOperatorType.Decrement;
break;
}
case 111: {
lexer.NextToken();
-#line 1475 "cs.ATG"
+#line 1477 "cs.ATG"
op = OverloadableOperatorType.True;
break;
}
case 70: {
lexer.NextToken();
-#line 1476 "cs.ATG"
+#line 1478 "cs.ATG"
op = OverloadableOperatorType.False;
break;
}
case 6: {
lexer.NextToken();
-#line 1478 "cs.ATG"
+#line 1480 "cs.ATG"
op = OverloadableOperatorType.Multiply;
break;
}
case 7: {
lexer.NextToken();
-#line 1479 "cs.ATG"
+#line 1481 "cs.ATG"
op = OverloadableOperatorType.Divide;
break;
}
case 8: {
lexer.NextToken();
-#line 1480 "cs.ATG"
+#line 1482 "cs.ATG"
op = OverloadableOperatorType.Modulus;
break;
}
case 27: {
lexer.NextToken();
-#line 1482 "cs.ATG"
+#line 1484 "cs.ATG"
op = OverloadableOperatorType.BitwiseAnd;
break;
}
case 28: {
lexer.NextToken();
-#line 1483 "cs.ATG"
+#line 1485 "cs.ATG"
op = OverloadableOperatorType.BitwiseOr;
break;
}
case 29: {
lexer.NextToken();
-#line 1484 "cs.ATG"
+#line 1486 "cs.ATG"
op = OverloadableOperatorType.ExclusiveOr;
break;
}
case 36: {
lexer.NextToken();
-#line 1486 "cs.ATG"
+#line 1488 "cs.ATG"
op = OverloadableOperatorType.ShiftLeft;
break;
}
case 32: {
lexer.NextToken();
-#line 1487 "cs.ATG"
+#line 1489 "cs.ATG"
op = OverloadableOperatorType.Equality;
break;
}
case 33: {
lexer.NextToken();
-#line 1488 "cs.ATG"
+#line 1490 "cs.ATG"
op = OverloadableOperatorType.InEquality;
break;
}
case 22: {
lexer.NextToken();
-#line 1489 "cs.ATG"
+#line 1491 "cs.ATG"
op = OverloadableOperatorType.LessThan;
break;
}
case 34: {
lexer.NextToken();
-#line 1490 "cs.ATG"
+#line 1492 "cs.ATG"
op = OverloadableOperatorType.GreaterThanOrEqual;
break;
}
case 35: {
lexer.NextToken();
-#line 1491 "cs.ATG"
+#line 1493 "cs.ATG"
op = OverloadableOperatorType.LessThanOrEqual;
break;
}
case 21: {
lexer.NextToken();
-#line 1492 "cs.ATG"
+#line 1494 "cs.ATG"
op = OverloadableOperatorType.GreaterThan;
if (la.kind == 21) {
lexer.NextToken();
-#line 1492 "cs.ATG"
+#line 1494 "cs.ATG"
op = OverloadableOperatorType.ShiftRight;
}
break;
@@ -3089,143 +3090,143 @@ out stmt);
}
void AddAccessorDecl(
-#line 1426 "cs.ATG"
+#line 1428 "cs.ATG"
out Statement stmt) {
-#line 1427 "cs.ATG"
+#line 1429 "cs.ATG"
stmt = null;
Expect(1);
-#line 1430 "cs.ATG"
+#line 1432 "cs.ATG"
if (t.val != "add") Error("add expected");
Block(
-#line 1431 "cs.ATG"
+#line 1433 "cs.ATG"
out stmt);
}
void RemoveAccessorDecl(
-#line 1434 "cs.ATG"
+#line 1436 "cs.ATG"
out Statement stmt) {
-#line 1435 "cs.ATG"
+#line 1437 "cs.ATG"
stmt = null;
Expect(1);
-#line 1438 "cs.ATG"
+#line 1440 "cs.ATG"
if (t.val != "remove") Error("remove expected");
Block(
-#line 1439 "cs.ATG"
+#line 1441 "cs.ATG"
out stmt);
}
void VariableInitializer(
-#line 1455 "cs.ATG"
+#line 1457 "cs.ATG"
out Expression initializerExpression) {
-#line 1456 "cs.ATG"
+#line 1458 "cs.ATG"
TypeReference type = null; Expression expr = null; initializerExpression = null;
if (StartOf(4)) {
Expr(
-#line 1458 "cs.ATG"
+#line 1460 "cs.ATG"
out initializerExpression);
} else if (la.kind == 15) {
ArrayInitializer(
-#line 1459 "cs.ATG"
+#line 1461 "cs.ATG"
out initializerExpression);
} else if (la.kind == 104) {
lexer.NextToken();
Type(
-#line 1460 "cs.ATG"
+#line 1462 "cs.ATG"
out type);
Expect(17);
Expr(
-#line 1460 "cs.ATG"
+#line 1462 "cs.ATG"
out expr);
Expect(18);
-#line 1460 "cs.ATG"
+#line 1462 "cs.ATG"
initializerExpression = new StackAllocExpression(type, expr);
} else SynErr(163);
}
void Statement() {
-#line 1564 "cs.ATG"
+#line 1566 "cs.ATG"
TypeReference type;
Expression expr;
Statement stmt;
if (
-#line 1570 "cs.ATG"
+#line 1572 "cs.ATG"
IsLabel()) {
Expect(1);
-#line 1570 "cs.ATG"
+#line 1572 "cs.ATG"
compilationUnit.AddChild(new LabelStatement(t.val));
Expect(9);
Statement();
} else if (la.kind == 58) {
lexer.NextToken();
Type(
-#line 1573 "cs.ATG"
+#line 1575 "cs.ATG"
out type);
-#line 1573 "cs.ATG"
+#line 1575 "cs.ATG"
LocalVariableDeclaration var = new LocalVariableDeclaration(type, Modifier.Const); string ident = null; var.StartLocation = t.Location;
Expect(1);
-#line 1574 "cs.ATG"
+#line 1576 "cs.ATG"
ident = t.val;
Expect(3);
Expr(
-#line 1575 "cs.ATG"
+#line 1577 "cs.ATG"
out expr);
-#line 1575 "cs.ATG"
+#line 1577 "cs.ATG"
var.Variables.Add(new VariableDeclaration(ident, expr));
while (la.kind == 13) {
lexer.NextToken();
Expect(1);
-#line 1576 "cs.ATG"
+#line 1578 "cs.ATG"
ident = t.val;
Expect(3);
Expr(
-#line 1576 "cs.ATG"
+#line 1578 "cs.ATG"
out expr);
-#line 1576 "cs.ATG"
+#line 1578 "cs.ATG"
var.Variables.Add(new VariableDeclaration(ident, expr));
}
Expect(11);
-#line 1577 "cs.ATG"
+#line 1579 "cs.ATG"
compilationUnit.AddChild(var);
} else if (
-#line 1579 "cs.ATG"
+#line 1581 "cs.ATG"
IsLocalVarDecl()) {
LocalVariableDecl(
-#line 1579 "cs.ATG"
+#line 1581 "cs.ATG"
out stmt);
Expect(11);
-#line 1579 "cs.ATG"
+#line 1581 "cs.ATG"
compilationUnit.AddChild(stmt);
} else if (StartOf(22)) {
EmbeddedStatement(
-#line 1580 "cs.ATG"
+#line 1582 "cs.ATG"
out stmt);
-#line 1580 "cs.ATG"
+#line 1582 "cs.ATG"
compilationUnit.AddChild(stmt);
} else SynErr(164);
}
void Argument(
-#line 1495 "cs.ATG"
+#line 1497 "cs.ATG"
out Expression argumentexpr) {
-#line 1497 "cs.ATG"
+#line 1499 "cs.ATG"
Expression expr;
FieldDirection fd = FieldDirection.None;
@@ -3233,48 +3234,48 @@ out Expression argumentexpr) {
if (la.kind == 98) {
lexer.NextToken();
-#line 1502 "cs.ATG"
+#line 1504 "cs.ATG"
fd = FieldDirection.Ref;
} else {
lexer.NextToken();
-#line 1503 "cs.ATG"
+#line 1505 "cs.ATG"
fd = FieldDirection.Out;
}
}
Expr(
-#line 1505 "cs.ATG"
+#line 1507 "cs.ATG"
out expr);
-#line 1505 "cs.ATG"
+#line 1507 "cs.ATG"
argumentexpr = fd != FieldDirection.None ? argumentexpr = new DirectionExpression(fd, expr) : expr;
}
void ArrayInitializer(
-#line 1524 "cs.ATG"
+#line 1526 "cs.ATG"
out Expression outExpr) {
-#line 1526 "cs.ATG"
+#line 1528 "cs.ATG"
Expression expr = null;
ArrayInitializerExpression initializer = new ArrayInitializerExpression();
Expect(15);
if (StartOf(23)) {
VariableInitializer(
-#line 1531 "cs.ATG"
+#line 1533 "cs.ATG"
out expr);
-#line 1531 "cs.ATG"
+#line 1533 "cs.ATG"
if (expr != null) { initializer.CreateExpressions.Add(expr); }
while (
-#line 1531 "cs.ATG"
+#line 1533 "cs.ATG"
NotFinalComma()) {
Expect(13);
VariableInitializer(
-#line 1531 "cs.ATG"
+#line 1533 "cs.ATG"
out expr);
-#line 1531 "cs.ATG"
+#line 1533 "cs.ATG"
if (expr != null) { initializer.CreateExpressions.Add(expr); }
}
if (la.kind == 13) {
@@ -3283,84 +3284,84 @@ out expr);
}
Expect(16);
-#line 1532 "cs.ATG"
+#line 1534 "cs.ATG"
outExpr = initializer;
}
void AssignmentOperator(
-#line 1508 "cs.ATG"
+#line 1510 "cs.ATG"
out AssignmentOperatorType op) {
-#line 1509 "cs.ATG"
+#line 1511 "cs.ATG"
op = AssignmentOperatorType.None;
switch (la.kind) {
case 3: {
lexer.NextToken();
-#line 1511 "cs.ATG"
+#line 1513 "cs.ATG"
op = AssignmentOperatorType.Assign;
break;
}
case 37: {
lexer.NextToken();
-#line 1512 "cs.ATG"
+#line 1514 "cs.ATG"
op = AssignmentOperatorType.Add;
break;
}
case 38: {
lexer.NextToken();
-#line 1513 "cs.ATG"
+#line 1515 "cs.ATG"
op = AssignmentOperatorType.Subtract;
break;
}
case 39: {
lexer.NextToken();
-#line 1514 "cs.ATG"
+#line 1516 "cs.ATG"
op = AssignmentOperatorType.Multiply;
break;
}
case 40: {
lexer.NextToken();
-#line 1515 "cs.ATG"
+#line 1517 "cs.ATG"
op = AssignmentOperatorType.Divide;
break;
}
case 41: {
lexer.NextToken();
-#line 1516 "cs.ATG"
+#line 1518 "cs.ATG"
op = AssignmentOperatorType.Modulus;
break;
}
case 42: {
lexer.NextToken();
-#line 1517 "cs.ATG"
+#line 1519 "cs.ATG"
op = AssignmentOperatorType.BitwiseAnd;
break;
}
case 43: {
lexer.NextToken();
-#line 1518 "cs.ATG"
+#line 1520 "cs.ATG"
op = AssignmentOperatorType.BitwiseOr;
break;
}
case 44: {
lexer.NextToken();
-#line 1519 "cs.ATG"
+#line 1521 "cs.ATG"
op = AssignmentOperatorType.ExclusiveOr;
break;
}
case 45: {
lexer.NextToken();
-#line 1520 "cs.ATG"
+#line 1522 "cs.ATG"
op = AssignmentOperatorType.ShiftLeft;
break;
}
@@ -3368,7 +3369,7 @@ out AssignmentOperatorType op) {
lexer.NextToken();
Expect(34);
-#line 1521 "cs.ATG"
+#line 1523 "cs.ATG"
op = AssignmentOperatorType.ShiftRight;
break;
}
@@ -3377,66 +3378,66 @@ out AssignmentOperatorType op) {
}
void LocalVariableDecl(
-#line 1535 "cs.ATG"
+#line 1537 "cs.ATG"
out Statement stmt) {
-#line 1537 "cs.ATG"
+#line 1539 "cs.ATG"
TypeReference type;
VariableDeclaration var = null;
LocalVariableDeclaration localVariableDeclaration;
Type(
-#line 1542 "cs.ATG"
+#line 1544 "cs.ATG"
out type);
-#line 1542 "cs.ATG"
+#line 1544 "cs.ATG"
localVariableDeclaration = new LocalVariableDeclaration(type); localVariableDeclaration.StartLocation = t.Location;
LocalVariableDeclarator(
-#line 1543 "cs.ATG"
+#line 1545 "cs.ATG"
out var);
-#line 1543 "cs.ATG"
+#line 1545 "cs.ATG"
localVariableDeclaration.Variables.Add(var);
while (la.kind == 13) {
lexer.NextToken();
LocalVariableDeclarator(
-#line 1544 "cs.ATG"
+#line 1546 "cs.ATG"
out var);
-#line 1544 "cs.ATG"
+#line 1546 "cs.ATG"
localVariableDeclaration.Variables.Add(var);
}
-#line 1545 "cs.ATG"
+#line 1547 "cs.ATG"
stmt = localVariableDeclaration;
}
void LocalVariableDeclarator(
-#line 1548 "cs.ATG"
+#line 1550 "cs.ATG"
out VariableDeclaration var) {
-#line 1549 "cs.ATG"
+#line 1551 "cs.ATG"
Expression expr = null;
Expect(1);
-#line 1552 "cs.ATG"
+#line 1554 "cs.ATG"
var = new VariableDeclaration(t.val);
if (la.kind == 3) {
lexer.NextToken();
VariableInitializer(
-#line 1552 "cs.ATG"
+#line 1554 "cs.ATG"
out expr);
-#line 1552 "cs.ATG"
+#line 1554 "cs.ATG"
var.Initializer = expr;
}
}
void EmbeddedStatement(
-#line 1586 "cs.ATG"
+#line 1588 "cs.ATG"
out Statement statement) {
-#line 1588 "cs.ATG"
+#line 1590 "cs.ATG"
TypeReference type = null;
Expression expr = null;
Statement embeddedStatement = null;
@@ -3444,156 +3445,156 @@ out Statement statement) {
if (la.kind == 15) {
Block(
-#line 1594 "cs.ATG"
+#line 1596 "cs.ATG"
out statement);
} else if (la.kind == 11) {
lexer.NextToken();
-#line 1596 "cs.ATG"
+#line 1598 "cs.ATG"
statement = new EmptyStatement();
} else if (
-#line 1598 "cs.ATG"
+#line 1600 "cs.ATG"
UnCheckedAndLBrace()) {
-#line 1598 "cs.ATG"
+#line 1600 "cs.ATG"
Statement block; bool isChecked = true;
if (la.kind == 56) {
lexer.NextToken();
} else if (la.kind == 116) {
lexer.NextToken();
-#line 1599 "cs.ATG"
+#line 1601 "cs.ATG"
isChecked = false;
} else SynErr(166);
Block(
-#line 1600 "cs.ATG"
+#line 1602 "cs.ATG"
out block);
-#line 1600 "cs.ATG"
+#line 1602 "cs.ATG"
statement = isChecked ? (Statement)new CheckedStatement(block) : (Statement)new UncheckedStatement(block);
} else if (la.kind == 77) {
lexer.NextToken();
-#line 1602 "cs.ATG"
+#line 1604 "cs.ATG"
Statement elseStatement = null;
Expect(19);
Expr(
-#line 1603 "cs.ATG"
+#line 1605 "cs.ATG"
out expr);
Expect(20);
EmbeddedStatement(
-#line 1604 "cs.ATG"
+#line 1606 "cs.ATG"
out embeddedStatement);
if (la.kind == 65) {
lexer.NextToken();
EmbeddedStatement(
-#line 1605 "cs.ATG"
+#line 1607 "cs.ATG"
out elseStatement);
}
-#line 1606 "cs.ATG"
+#line 1608 "cs.ATG"
statement = elseStatement != null ? (Statement)new IfElseStatement(expr, embeddedStatement, elseStatement) : (Statement)new IfElseStatement(expr, embeddedStatement);
} else if (la.kind == 108) {
lexer.NextToken();
-#line 1607 "cs.ATG"
+#line 1609 "cs.ATG"
ArrayList switchSections = new ArrayList(); SwitchSection switchSection;
Expect(19);
Expr(
-#line 1608 "cs.ATG"
+#line 1610 "cs.ATG"
out expr);
Expect(20);
Expect(15);
while (la.kind == 53 || la.kind == 61) {
SwitchSection(
-#line 1609 "cs.ATG"
+#line 1611 "cs.ATG"
out switchSection);
-#line 1609 "cs.ATG"
+#line 1611 "cs.ATG"
switchSections.Add(switchSection);
}
Expect(16);
-#line 1610 "cs.ATG"
+#line 1612 "cs.ATG"
statement = new SwitchStatement(expr, switchSections);
} else if (la.kind == 123) {
lexer.NextToken();
Expect(19);
Expr(
-#line 1612 "cs.ATG"
+#line 1614 "cs.ATG"
out expr);
Expect(20);
EmbeddedStatement(
-#line 1614 "cs.ATG"
+#line 1616 "cs.ATG"
out embeddedStatement);
-#line 1614 "cs.ATG"
+#line 1616 "cs.ATG"
statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.Start);
} else if (la.kind == 63) {
lexer.NextToken();
EmbeddedStatement(
-#line 1615 "cs.ATG"
+#line 1617 "cs.ATG"
out embeddedStatement);
Expect(123);
Expect(19);
Expr(
-#line 1616 "cs.ATG"
+#line 1618 "cs.ATG"
out expr);
Expect(20);
Expect(11);
-#line 1616 "cs.ATG"
+#line 1618 "cs.ATG"
statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.End);
} else if (la.kind == 74) {
lexer.NextToken();
-#line 1617 "cs.ATG"
+#line 1619 "cs.ATG"
ArrayList initializer = null; ArrayList iterator = null;
Expect(19);
if (StartOf(4)) {
ForInitializer(
-#line 1618 "cs.ATG"
+#line 1620 "cs.ATG"
out initializer);
}
Expect(11);
if (StartOf(4)) {
Expr(
-#line 1619 "cs.ATG"
+#line 1621 "cs.ATG"
out expr);
}
Expect(11);
if (StartOf(4)) {
ForIterator(
-#line 1620 "cs.ATG"
+#line 1622 "cs.ATG"
out iterator);
}
Expect(20);
EmbeddedStatement(
-#line 1621 "cs.ATG"
+#line 1623 "cs.ATG"
out embeddedStatement);
-#line 1621 "cs.ATG"
+#line 1623 "cs.ATG"
statement = new ForStatement(initializer, expr, iterator, embeddedStatement);
} else if (la.kind == 75) {
lexer.NextToken();
Expect(19);
Type(
-#line 1622 "cs.ATG"
+#line 1624 "cs.ATG"
out type);
Expect(1);
-#line 1622 "cs.ATG"
+#line 1624 "cs.ATG"
string varName = t.val; Point start = t.Location;
Expect(79);
Expr(
-#line 1623 "cs.ATG"
+#line 1625 "cs.ATG"
out expr);
Expect(20);
EmbeddedStatement(
-#line 1624 "cs.ATG"
+#line 1626 "cs.ATG"
out embeddedStatement);
-#line 1624 "cs.ATG"
+#line 1626 "cs.ATG"
statement = new ForeachStatement(type, varName , expr, embeddedStatement);
statement.EndLocation = t.EndLocation;
@@ -3601,34 +3602,34 @@ out embeddedStatement);
lexer.NextToken();
Expect(11);
-#line 1628 "cs.ATG"
+#line 1630 "cs.ATG"
statement = new BreakStatement();
} else if (la.kind == 59) {
lexer.NextToken();
Expect(11);
-#line 1629 "cs.ATG"
+#line 1631 "cs.ATG"
statement = new ContinueStatement();
} else if (la.kind == 76) {
GotoStatement(
-#line 1630 "cs.ATG"
+#line 1632 "cs.ATG"
out statement);
} else if (
-#line 1631 "cs.ATG"
+#line 1633 "cs.ATG"
IsYieldStatement()) {
Expect(1);
if (la.kind == 99) {
lexer.NextToken();
Expr(
-#line 1631 "cs.ATG"
+#line 1633 "cs.ATG"
out expr);
-#line 1631 "cs.ATG"
+#line 1633 "cs.ATG"
statement = new YieldStatement(new ReturnStatement(expr));
} else if (la.kind == 51) {
lexer.NextToken();
-#line 1632 "cs.ATG"
+#line 1634 "cs.ATG"
statement = new YieldStatement(new BreakStatement());
} else SynErr(167);
Expect(11);
@@ -3636,375 +3637,375 @@ out expr);
lexer.NextToken();
if (StartOf(4)) {
Expr(
-#line 1633 "cs.ATG"
+#line 1635 "cs.ATG"
out expr);
}
Expect(11);
-#line 1633 "cs.ATG"
+#line 1635 "cs.ATG"
statement = new ReturnStatement(expr);
} else if (la.kind == 110) {
lexer.NextToken();
if (StartOf(4)) {
Expr(
-#line 1634 "cs.ATG"
+#line 1636 "cs.ATG"
out expr);
}
Expect(11);
-#line 1634 "cs.ATG"
+#line 1636 "cs.ATG"
statement = new ThrowStatement(expr);
} else if (StartOf(4)) {
StatementExpr(
-#line 1636 "cs.ATG"
+#line 1638 "cs.ATG"
out statement);
Expect(11);
} else if (la.kind == 112) {
TryStatement(
-#line 1638 "cs.ATG"
+#line 1640 "cs.ATG"
out statement);
} else if (la.kind == 84) {
lexer.NextToken();
Expect(19);
Expr(
-#line 1640 "cs.ATG"
+#line 1642 "cs.ATG"
out expr);
Expect(20);
EmbeddedStatement(
-#line 1641 "cs.ATG"
+#line 1643 "cs.ATG"
out embeddedStatement);
-#line 1641 "cs.ATG"
+#line 1643 "cs.ATG"
statement = new LockStatement(expr, embeddedStatement);
} else if (la.kind == 119) {
-#line 1643 "cs.ATG"
+#line 1645 "cs.ATG"
Statement resourceAcquisitionStmt = null;
lexer.NextToken();
Expect(19);
ResourceAcquisition(
-#line 1645 "cs.ATG"
+#line 1647 "cs.ATG"
out resourceAcquisitionStmt);
Expect(20);
EmbeddedStatement(
-#line 1646 "cs.ATG"
+#line 1648 "cs.ATG"
out embeddedStatement);
-#line 1646 "cs.ATG"
+#line 1648 "cs.ATG"
statement = new UsingStatement(resourceAcquisitionStmt, embeddedStatement);
} else if (la.kind == 117) {
lexer.NextToken();
Block(
-#line 1648 "cs.ATG"
+#line 1650 "cs.ATG"
out embeddedStatement);
-#line 1648 "cs.ATG"
+#line 1650 "cs.ATG"
statement = new UnsafeStatement(embeddedStatement);
} else if (la.kind == 72) {
lexer.NextToken();
Expect(19);
Type(
-#line 1651 "cs.ATG"
+#line 1653 "cs.ATG"
out type);
-#line 1651 "cs.ATG"
+#line 1653 "cs.ATG"
if (type.PointerNestingLevel == 0) Error("can only fix pointer types");
ArrayList pointerDeclarators = new ArrayList(1);
Expect(1);
-#line 1654 "cs.ATG"
+#line 1656 "cs.ATG"
string identifier = t.val;
Expect(3);
Expr(
-#line 1655 "cs.ATG"
+#line 1657 "cs.ATG"
out expr);
-#line 1655 "cs.ATG"
+#line 1657 "cs.ATG"
pointerDeclarators.Add(new VariableDeclaration(identifier, expr));
while (la.kind == 13) {
lexer.NextToken();
Expect(1);
-#line 1657 "cs.ATG"
+#line 1659 "cs.ATG"
identifier = t.val;
Expect(3);
Expr(
-#line 1658 "cs.ATG"
+#line 1660 "cs.ATG"
out expr);
-#line 1658 "cs.ATG"
+#line 1660 "cs.ATG"
pointerDeclarators.Add(new VariableDeclaration(identifier, expr));
}
Expect(20);
EmbeddedStatement(
-#line 1660 "cs.ATG"
+#line 1662 "cs.ATG"
out embeddedStatement);
-#line 1660 "cs.ATG"
+#line 1662 "cs.ATG"
statement = new FixedStatement(type, pointerDeclarators, embeddedStatement);
} else SynErr(168);
}
void SwitchSection(
-#line 1682 "cs.ATG"
+#line 1684 "cs.ATG"
out SwitchSection stmt) {
-#line 1684 "cs.ATG"
+#line 1686 "cs.ATG"
SwitchSection switchSection = new SwitchSection();
CaseLabel label;
SwitchLabel(
-#line 1688 "cs.ATG"
+#line 1690 "cs.ATG"
out label);
-#line 1688 "cs.ATG"
+#line 1690 "cs.ATG"
switchSection.SwitchLabels.Add(label);
while (la.kind == 53 || la.kind == 61) {
SwitchLabel(
-#line 1690 "cs.ATG"
+#line 1692 "cs.ATG"
out label);
-#line 1690 "cs.ATG"
+#line 1692 "cs.ATG"
switchSection.SwitchLabels.Add(label);
}
-#line 1692 "cs.ATG"
+#line 1694 "cs.ATG"
compilationUnit.BlockStart(switchSection);
Statement();
while (StartOf(20)) {
Statement();
}
-#line 1695 "cs.ATG"
+#line 1697 "cs.ATG"
compilationUnit.BlockEnd();
stmt = switchSection;
}
void ForInitializer(
-#line 1663 "cs.ATG"
+#line 1665 "cs.ATG"
out ArrayList initializer) {
-#line 1665 "cs.ATG"
+#line 1667 "cs.ATG"
Statement stmt;
initializer = new ArrayList();
if (
-#line 1669 "cs.ATG"
+#line 1671 "cs.ATG"
IsLocalVarDecl()) {
LocalVariableDecl(
-#line 1669 "cs.ATG"
+#line 1671 "cs.ATG"
out stmt);
-#line 1669 "cs.ATG"
+#line 1671 "cs.ATG"
initializer.Add(stmt);
} else if (StartOf(4)) {
StatementExpr(
-#line 1670 "cs.ATG"
+#line 1672 "cs.ATG"
out stmt);
-#line 1670 "cs.ATG"
+#line 1672 "cs.ATG"
initializer.Add(stmt);
while (la.kind == 13) {
lexer.NextToken();
StatementExpr(
-#line 1670 "cs.ATG"
+#line 1672 "cs.ATG"
out stmt);
-#line 1670 "cs.ATG"
+#line 1672 "cs.ATG"
initializer.Add(stmt);
}
-#line 1670 "cs.ATG"
+#line 1672 "cs.ATG"
initializer.Add(stmt);
} else SynErr(169);
}
void ForIterator(
-#line 1673 "cs.ATG"
+#line 1675 "cs.ATG"
out ArrayList iterator) {
-#line 1675 "cs.ATG"
+#line 1677 "cs.ATG"
Statement stmt;
iterator = new ArrayList();
StatementExpr(
-#line 1679 "cs.ATG"
+#line 1681 "cs.ATG"
out stmt);
-#line 1679 "cs.ATG"
+#line 1681 "cs.ATG"
iterator.Add(stmt);
while (la.kind == 13) {
lexer.NextToken();
StatementExpr(
-#line 1679 "cs.ATG"
+#line 1681 "cs.ATG"
out stmt);
-#line 1679 "cs.ATG"
+#line 1681 "cs.ATG"
iterator.Add(stmt);
}
}
void GotoStatement(
-#line 1745 "cs.ATG"
+#line 1747 "cs.ATG"
out Statement stmt) {
-#line 1746 "cs.ATG"
+#line 1748 "cs.ATG"
Expression expr; stmt = null;
Expect(76);
if (la.kind == 1) {
lexer.NextToken();
-#line 1750 "cs.ATG"
+#line 1752 "cs.ATG"
stmt = new GotoStatement(t.val);
Expect(11);
} else if (la.kind == 53) {
lexer.NextToken();
Expr(
-#line 1751 "cs.ATG"
+#line 1753 "cs.ATG"
out expr);
Expect(11);
-#line 1751 "cs.ATG"
+#line 1753 "cs.ATG"
stmt = new GotoCaseStatement(expr);
} else if (la.kind == 61) {
lexer.NextToken();
Expect(11);
-#line 1752 "cs.ATG"
+#line 1754 "cs.ATG"
stmt = new GotoCaseStatement(null);
} else SynErr(170);
}
void StatementExpr(
-#line 1772 "cs.ATG"
+#line 1774 "cs.ATG"
out Statement stmt) {
-#line 1777 "cs.ATG"
+#line 1779 "cs.ATG"
bool mustBeAssignment = la.kind == Tokens.Plus || la.kind == Tokens.Minus ||
la.kind == Tokens.Not || la.kind == Tokens.BitwiseComplement ||
la.kind == Tokens.Times || la.kind == Tokens.BitwiseAnd || IsTypeCast();
Expression expr = null;
UnaryExpr(
-#line 1783 "cs.ATG"
+#line 1785 "cs.ATG"
out expr);
if (StartOf(6)) {
-#line 1786 "cs.ATG"
+#line 1788 "cs.ATG"
AssignmentOperatorType op; Expression val;
AssignmentOperator(
-#line 1786 "cs.ATG"
+#line 1788 "cs.ATG"
out op);
Expr(
-#line 1786 "cs.ATG"
+#line 1788 "cs.ATG"
out val);
-#line 1786 "cs.ATG"
+#line 1788 "cs.ATG"
expr = new AssignmentExpression(expr, op, val);
} else if (la.kind == 11 || la.kind == 13 || la.kind == 20) {
-#line 1787 "cs.ATG"
+#line 1789 "cs.ATG"
if (mustBeAssignment) Error("error in assignment.");
} else SynErr(171);
-#line 1788 "cs.ATG"
+#line 1790 "cs.ATG"
stmt = new StatementExpression(expr);
}
void TryStatement(
-#line 1707 "cs.ATG"
+#line 1709 "cs.ATG"
out Statement tryStatement) {
-#line 1709 "cs.ATG"
+#line 1711 "cs.ATG"
Statement blockStmt = null, finallyStmt = null;
ArrayList catchClauses = null;
Expect(112);
Block(
-#line 1713 "cs.ATG"
+#line 1715 "cs.ATG"
out blockStmt);
if (la.kind == 54) {
CatchClauses(
-#line 1715 "cs.ATG"
+#line 1717 "cs.ATG"
out catchClauses);
if (la.kind == 71) {
lexer.NextToken();
Block(
-#line 1715 "cs.ATG"
+#line 1717 "cs.ATG"
out finallyStmt);
}
} else if (la.kind == 71) {
lexer.NextToken();
Block(
-#line 1716 "cs.ATG"
+#line 1718 "cs.ATG"
out finallyStmt);
} else SynErr(172);
-#line 1719 "cs.ATG"
+#line 1721 "cs.ATG"
tryStatement = new TryCatchStatement(blockStmt, catchClauses, finallyStmt);
}
void ResourceAcquisition(
-#line 1756 "cs.ATG"
+#line 1758 "cs.ATG"
out Statement stmt) {
-#line 1758 "cs.ATG"
+#line 1760 "cs.ATG"
stmt = null;
Expression expr;
if (
-#line 1763 "cs.ATG"
+#line 1765 "cs.ATG"
IsLocalVarDecl()) {
LocalVariableDecl(
-#line 1763 "cs.ATG"
+#line 1765 "cs.ATG"
out stmt);
} else if (StartOf(4)) {
Expr(
-#line 1764 "cs.ATG"
+#line 1766 "cs.ATG"
out expr);
-#line 1768 "cs.ATG"
+#line 1770 "cs.ATG"
stmt = new StatementExpression(expr);
} else SynErr(173);
}
void SwitchLabel(
-#line 1700 "cs.ATG"
+#line 1702 "cs.ATG"
out CaseLabel label) {
-#line 1701 "cs.ATG"
+#line 1703 "cs.ATG"
Expression expr = null; label = null;
if (la.kind == 53) {
lexer.NextToken();
Expr(
-#line 1703 "cs.ATG"
+#line 1705 "cs.ATG"
out expr);
Expect(9);
-#line 1703 "cs.ATG"
+#line 1705 "cs.ATG"
label = new CaseLabel(expr);
} else if (la.kind == 61) {
lexer.NextToken();
Expect(9);
-#line 1704 "cs.ATG"
+#line 1706 "cs.ATG"
label = new CaseLabel();
} else SynErr(174);
}
void CatchClauses(
-#line 1724 "cs.ATG"
+#line 1726 "cs.ATG"
out ArrayList catchClauses) {
-#line 1726 "cs.ATG"
+#line 1728 "cs.ATG"
catchClauses = new ArrayList();
Expect(54);
-#line 1729 "cs.ATG"
+#line 1731 "cs.ATG"
string name;
string identifier;
Statement stmt;
@@ -4012,138 +4013,138 @@ out ArrayList catchClauses) {
if (la.kind == 15) {
Block(
-#line 1736 "cs.ATG"
+#line 1738 "cs.ATG"
out stmt);
-#line 1736 "cs.ATG"
+#line 1738 "cs.ATG"
catchClauses.Add(new CatchClause(stmt));
} else if (la.kind == 19) {
lexer.NextToken();
ClassType(
-#line 1738 "cs.ATG"
+#line 1740 "cs.ATG"
out name, out types);
-#line 1738 "cs.ATG"
+#line 1740 "cs.ATG"
identifier = null;
if (la.kind == 1) {
lexer.NextToken();
-#line 1738 "cs.ATG"
+#line 1740 "cs.ATG"
identifier = t.val;
}
Expect(20);
Block(
-#line 1738 "cs.ATG"
+#line 1740 "cs.ATG"
out stmt);
-#line 1738 "cs.ATG"
+#line 1740 "cs.ATG"
catchClauses.Add(new CatchClause(new TypeReference(name, 0, null, types), identifier, stmt));
while (
-#line 1739 "cs.ATG"
+#line 1741 "cs.ATG"
IsTypedCatch()) {
Expect(54);
Expect(19);
ClassType(
-#line 1739 "cs.ATG"
+#line 1741 "cs.ATG"
out name, out types);
-#line 1739 "cs.ATG"
+#line 1741 "cs.ATG"
identifier = null;
if (la.kind == 1) {
lexer.NextToken();
-#line 1739 "cs.ATG"
+#line 1741 "cs.ATG"
identifier = t.val;
}
Expect(20);
Block(
-#line 1739 "cs.ATG"
+#line 1741 "cs.ATG"
out stmt);
-#line 1739 "cs.ATG"
+#line 1741 "cs.ATG"
catchClauses.Add(new CatchClause(new TypeReference(name, 0, null, types), identifier, stmt));
}
if (la.kind == 54) {
lexer.NextToken();
Block(
-#line 1741 "cs.ATG"
+#line 1743 "cs.ATG"
out stmt);
-#line 1741 "cs.ATG"
+#line 1743 "cs.ATG"
catchClauses.Add(new CatchClause(stmt));
}
} else SynErr(175);
}
void UnaryExpr(
-#line 1804 "cs.ATG"
+#line 1806 "cs.ATG"
out Expression uExpr) {
-#line 1806 "cs.ATG"
+#line 1808 "cs.ATG"
TypeReference type = null;
Expression expr;
ArrayList expressions = new ArrayList();
uExpr = null;
while (StartOf(24) ||
-#line 1830 "cs.ATG"
+#line 1832 "cs.ATG"
IsTypeCast()) {
if (la.kind == 4) {
lexer.NextToken();
-#line 1815 "cs.ATG"
+#line 1817 "cs.ATG"
expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Plus));
} else if (la.kind == 5) {
lexer.NextToken();
-#line 1816 "cs.ATG"
+#line 1818 "cs.ATG"
expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Minus));
} else if (la.kind == 23) {
lexer.NextToken();
-#line 1817 "cs.ATG"
+#line 1819 "cs.ATG"
expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Not));
} else if (la.kind == 26) {
lexer.NextToken();
-#line 1818 "cs.ATG"
+#line 1820 "cs.ATG"
expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.BitNot));
} else if (la.kind == 6) {
lexer.NextToken();
-#line 1819 "cs.ATG"
+#line 1821 "cs.ATG"
expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Star));
} else if (la.kind == 30) {
lexer.NextToken();
-#line 1820 "cs.ATG"
+#line 1822 "cs.ATG"
expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Increment));
} else if (la.kind == 31) {
lexer.NextToken();
-#line 1821 "cs.ATG"
+#line 1823 "cs.ATG"
expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Decrement));
} else if (la.kind == 27) {
lexer.NextToken();
-#line 1822 "cs.ATG"
+#line 1824 "cs.ATG"
expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.BitWiseAnd));
} else {
Expect(19);
Type(
-#line 1830 "cs.ATG"
+#line 1832 "cs.ATG"
out type);
Expect(20);
-#line 1830 "cs.ATG"
+#line 1832 "cs.ATG"
expressions.Add(new CastExpression(type));
}
}
PrimaryExpr(
-#line 1834 "cs.ATG"
+#line 1836 "cs.ATG"
out expr);
-#line 1834 "cs.ATG"
+#line 1836 "cs.ATG"
for (int i = 0; i < expressions.Count; ++i) {
Expression nextExpression = i + 1 < expressions.Count ? (Expression)expressions[i + 1] : expr;
if (expressions[i] is CastExpression) {
@@ -4161,33 +4162,33 @@ out expr);
}
void ConditionalOrExpr(
-#line 1970 "cs.ATG"
+#line 1972 "cs.ATG"
ref Expression outExpr) {
-#line 1971 "cs.ATG"
+#line 1973 "cs.ATG"
Expression expr;
ConditionalAndExpr(
-#line 1973 "cs.ATG"
+#line 1975 "cs.ATG"
ref outExpr);
while (la.kind == 25) {
lexer.NextToken();
UnaryExpr(
-#line 1973 "cs.ATG"
+#line 1975 "cs.ATG"
out expr);
ConditionalAndExpr(
-#line 1973 "cs.ATG"
+#line 1975 "cs.ATG"
ref expr);
-#line 1973 "cs.ATG"
+#line 1975 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.LogicalOr, expr);
}
}
void PrimaryExpr(
-#line 1851 "cs.ATG"
+#line 1853 "cs.ATG"
out Expression pexpr) {
-#line 1853 "cs.ATG"
+#line 1855 "cs.ATG"
TypeReference type = null;
bool isArrayCreation = false;
Expression expr;
@@ -4197,349 +4198,349 @@ out Expression pexpr) {
case 111: {
lexer.NextToken();
-#line 1860 "cs.ATG"
+#line 1862 "cs.ATG"
pexpr = new PrimitiveExpression(true, "true");
break;
}
case 70: {
lexer.NextToken();
-#line 1861 "cs.ATG"
+#line 1863 "cs.ATG"
pexpr = new PrimitiveExpression(false, "false");
break;
}
case 88: {
lexer.NextToken();
-#line 1862 "cs.ATG"
+#line 1864 "cs.ATG"
pexpr = new PrimitiveExpression(null, "null");
break;
}
case 2: {
lexer.NextToken();
-#line 1863 "cs.ATG"
+#line 1865 "cs.ATG"
pexpr = new PrimitiveExpression(t.literalValue, t.val);
break;
}
case 1: {
lexer.NextToken();
-#line 1865 "cs.ATG"
+#line 1867 "cs.ATG"
pexpr = new IdentifierExpression(t.val);
break;
}
case 19: {
lexer.NextToken();
Expr(
-#line 1867 "cs.ATG"
+#line 1869 "cs.ATG"
out expr);
Expect(20);
-#line 1867 "cs.ATG"
+#line 1869 "cs.ATG"
pexpr = new ParenthesizedExpression(expr);
break;
}
case 50: case 52: case 55: case 60: case 64: case 73: case 80: case 85: case 89: case 100: case 102: case 106: case 114: case 115: case 118: {
-#line 1869 "cs.ATG"
+#line 1871 "cs.ATG"
string val = null;
switch (la.kind) {
case 50: {
lexer.NextToken();
-#line 1871 "cs.ATG"
+#line 1873 "cs.ATG"
val = "bool";
break;
}
case 52: {
lexer.NextToken();
-#line 1872 "cs.ATG"
+#line 1874 "cs.ATG"
val = "byte";
break;
}
case 55: {
lexer.NextToken();
-#line 1873 "cs.ATG"
+#line 1875 "cs.ATG"
val = "char";
break;
}
case 60: {
lexer.NextToken();
-#line 1874 "cs.ATG"
+#line 1876 "cs.ATG"
val = "decimal";
break;
}
case 64: {
lexer.NextToken();
-#line 1875 "cs.ATG"
+#line 1877 "cs.ATG"
val = "double";
break;
}
case 73: {
lexer.NextToken();
-#line 1876 "cs.ATG"
+#line 1878 "cs.ATG"
val = "float";
break;
}
case 80: {
lexer.NextToken();
-#line 1877 "cs.ATG"
+#line 1879 "cs.ATG"
val = "int";
break;
}
case 85: {
lexer.NextToken();
-#line 1878 "cs.ATG"
+#line 1880 "cs.ATG"
val = "long";
break;
}
case 89: {
lexer.NextToken();
-#line 1879 "cs.ATG"
+#line 1881 "cs.ATG"
val = "object";
break;
}
case 100: {
lexer.NextToken();
-#line 1880 "cs.ATG"
+#line 1882 "cs.ATG"
val = "sbyte";
break;
}
case 102: {
lexer.NextToken();
-#line 1881 "cs.ATG"
+#line 1883 "cs.ATG"
val = "short";
break;
}
case 106: {
lexer.NextToken();
-#line 1882 "cs.ATG"
+#line 1884 "cs.ATG"
val = "string";
break;
}
case 114: {
lexer.NextToken();
-#line 1883 "cs.ATG"
+#line 1885 "cs.ATG"
val = "uint";
break;
}
case 115: {
lexer.NextToken();
-#line 1884 "cs.ATG"
+#line 1886 "cs.ATG"
val = "ulong";
break;
}
case 118: {
lexer.NextToken();
-#line 1885 "cs.ATG"
+#line 1887 "cs.ATG"
val = "ushort";
break;
}
}
-#line 1886 "cs.ATG"
+#line 1888 "cs.ATG"
t.val = "";
Expect(14);
Expect(1);
-#line 1886 "cs.ATG"
+#line 1888 "cs.ATG"
pexpr = new FieldReferenceExpression(new TypeReferenceExpression(val), t.val);
break;
}
case 109: {
lexer.NextToken();
-#line 1888 "cs.ATG"
+#line 1890 "cs.ATG"
pexpr = new ThisReferenceExpression();
break;
}
case 49: {
lexer.NextToken();
-#line 1890 "cs.ATG"
+#line 1892 "cs.ATG"
Expression retExpr = new BaseReferenceExpression();
if (la.kind == 14) {
lexer.NextToken();
Expect(1);
-#line 1892 "cs.ATG"
+#line 1894 "cs.ATG"
retExpr = new FieldReferenceExpression(retExpr, t.val);
} else if (la.kind == 17) {
lexer.NextToken();
Expr(
-#line 1893 "cs.ATG"
+#line 1895 "cs.ATG"
out expr);
-#line 1893 "cs.ATG"
+#line 1895 "cs.ATG"
ArrayList indices = new ArrayList(); if (expr != null) { indices.Add(expr); }
while (la.kind == 13) {
lexer.NextToken();
Expr(
-#line 1894 "cs.ATG"
+#line 1896 "cs.ATG"
out expr);
-#line 1894 "cs.ATG"
+#line 1896 "cs.ATG"
if (expr != null) { indices.Add(expr); }
}
Expect(18);
-#line 1895 "cs.ATG"
+#line 1897 "cs.ATG"
retExpr = new IndexerExpression(retExpr, indices);
} else SynErr(176);
-#line 1896 "cs.ATG"
+#line 1898 "cs.ATG"
pexpr = retExpr;
break;
}
case 87: {
lexer.NextToken();
NonArrayType(
-#line 1897 "cs.ATG"
+#line 1899 "cs.ATG"
out type);
-#line 1897 "cs.ATG"
+#line 1899 "cs.ATG"
ArrayList parameters = new ArrayList();
if (la.kind == 19) {
lexer.NextToken();
-#line 1902 "cs.ATG"
+#line 1904 "cs.ATG"
ObjectCreateExpression oce = new ObjectCreateExpression(type, parameters);
if (StartOf(21)) {
Argument(
-#line 1903 "cs.ATG"
+#line 1905 "cs.ATG"
out expr);
-#line 1903 "cs.ATG"
+#line 1905 "cs.ATG"
if (expr != null) { parameters.Add(expr); }
while (la.kind == 13) {
lexer.NextToken();
Argument(
-#line 1904 "cs.ATG"
+#line 1906 "cs.ATG"
out expr);
-#line 1904 "cs.ATG"
+#line 1906 "cs.ATG"
if (expr != null) { parameters.Add(expr); }
}
}
Expect(20);
-#line 1906 "cs.ATG"
+#line 1908 "cs.ATG"
pexpr = oce;
} else if (la.kind == 17) {
-#line 1908 "cs.ATG"
+#line 1910 "cs.ATG"
isArrayCreation = true; ArrayCreateExpression ace = new ArrayCreateExpression(type); pexpr = ace;
lexer.NextToken();
-#line 1909 "cs.ATG"
+#line 1911 "cs.ATG"
int dims = 0;
ArrayList rank = new ArrayList();
ArrayList parameterExpression = new ArrayList();
if (StartOf(4)) {
Expr(
-#line 1913 "cs.ATG"
+#line 1915 "cs.ATG"
out expr);
-#line 1913 "cs.ATG"
+#line 1915 "cs.ATG"
if (expr != null) { parameterExpression.Add(expr); }
while (la.kind == 13) {
lexer.NextToken();
Expr(
-#line 1915 "cs.ATG"
+#line 1917 "cs.ATG"
out expr);
-#line 1915 "cs.ATG"
+#line 1917 "cs.ATG"
if (expr != null) { parameterExpression.Add(expr); }
}
Expect(18);
-#line 1917 "cs.ATG"
+#line 1919 "cs.ATG"
parameters.Add(new ArrayCreationParameter(parameterExpression));
ace.Parameters = parameters;
while (
-#line 1920 "cs.ATG"
+#line 1922 "cs.ATG"
IsDims()) {
Expect(17);
-#line 1920 "cs.ATG"
+#line 1922 "cs.ATG"
dims =0;
while (la.kind == 13) {
lexer.NextToken();
-#line 1921 "cs.ATG"
+#line 1923 "cs.ATG"
dims++;
}
-#line 1921 "cs.ATG"
+#line 1923 "cs.ATG"
rank.Add(dims);
parameters.Add(new ArrayCreationParameter(dims));
Expect(18);
}
-#line 1925 "cs.ATG"
+#line 1927 "cs.ATG"
if (rank.Count > 0) {
ace.Rank = (int[])rank.ToArray(typeof (int));
}
if (la.kind == 15) {
ArrayInitializer(
-#line 1929 "cs.ATG"
+#line 1931 "cs.ATG"
out expr);
-#line 1929 "cs.ATG"
+#line 1931 "cs.ATG"
ace.ArrayInitializer = (ArrayInitializerExpression)expr;
}
} else if (la.kind == 13 || la.kind == 18) {
while (la.kind == 13) {
lexer.NextToken();
-#line 1931 "cs.ATG"
+#line 1933 "cs.ATG"
dims++;
}
-#line 1932 "cs.ATG"
+#line 1934 "cs.ATG"
parameters.Add(new ArrayCreationParameter(dims));
Expect(18);
while (
-#line 1934 "cs.ATG"
+#line 1936 "cs.ATG"
IsDims()) {
Expect(17);
-#line 1934 "cs.ATG"
+#line 1936 "cs.ATG"
dims =0;
while (la.kind == 13) {
lexer.NextToken();
-#line 1934 "cs.ATG"
+#line 1936 "cs.ATG"
dims++;
}
-#line 1934 "cs.ATG"
+#line 1936 "cs.ATG"
parameters.Add(new ArrayCreationParameter(dims));
Expect(18);
}
ArrayInitializer(
-#line 1934 "cs.ATG"
+#line 1936 "cs.ATG"
out expr);
-#line 1934 "cs.ATG"
+#line 1936 "cs.ATG"
ace.ArrayInitializer = (ArrayInitializerExpression)expr; ace.Parameters = parameters;
} else SynErr(177);
} else SynErr(178);
@@ -4549,20 +4550,20 @@ out expr);
lexer.NextToken();
Expect(19);
if (
-#line 1940 "cs.ATG"
+#line 1942 "cs.ATG"
NotVoidPointer()) {
Expect(121);
-#line 1940 "cs.ATG"
+#line 1942 "cs.ATG"
type = new TypeReference("void");
} else if (StartOf(8)) {
Type(
-#line 1941 "cs.ATG"
+#line 1943 "cs.ATG"
out type);
} else SynErr(179);
Expect(20);
-#line 1942 "cs.ATG"
+#line 1944 "cs.ATG"
pexpr = new TypeOfExpression(type);
break;
}
@@ -4570,11 +4571,11 @@ out type);
lexer.NextToken();
Expect(19);
Type(
-#line 1943 "cs.ATG"
+#line 1945 "cs.ATG"
out type);
Expect(20);
-#line 1943 "cs.ATG"
+#line 1945 "cs.ATG"
pexpr = new SizeOfExpression(type);
break;
}
@@ -4582,11 +4583,11 @@ out type);
lexer.NextToken();
Expect(19);
Expr(
-#line 1944 "cs.ATG"
+#line 1946 "cs.ATG"
out expr);
Expect(20);
-#line 1944 "cs.ATG"
+#line 1946 "cs.ATG"
pexpr = new CheckedExpression(expr);
break;
}
@@ -4594,11 +4595,11 @@ out expr);
lexer.NextToken();
Expect(19);
Expr(
-#line 1945 "cs.ATG"
+#line 1947 "cs.ATG"
out expr);
Expect(20);
-#line 1945 "cs.ATG"
+#line 1947 "cs.ATG"
pexpr = new UncheckedExpression(expr);
break;
}
@@ -4609,353 +4610,353 @@ out expr);
if (la.kind == 30) {
lexer.NextToken();
-#line 1949 "cs.ATG"
+#line 1951 "cs.ATG"
pexpr = new UnaryOperatorExpression(pexpr, UnaryOperatorType.PostIncrement);
} else if (la.kind == 31) {
lexer.NextToken();
-#line 1950 "cs.ATG"
+#line 1952 "cs.ATG"
pexpr = new UnaryOperatorExpression(pexpr, UnaryOperatorType.PostDecrement);
} else SynErr(181);
} else if (la.kind == 46) {
lexer.NextToken();
Expect(1);
-#line 1953 "cs.ATG"
+#line 1955 "cs.ATG"
pexpr = new PointerReferenceExpression(pexpr, t.val);
} else if (la.kind == 14) {
lexer.NextToken();
Expect(1);
-#line 1954 "cs.ATG"
+#line 1956 "cs.ATG"
pexpr = new FieldReferenceExpression(pexpr, t.val);
} else if (la.kind == 19) {
lexer.NextToken();
-#line 1956 "cs.ATG"
+#line 1958 "cs.ATG"
ArrayList parameters = new ArrayList();
if (StartOf(21)) {
Argument(
-#line 1957 "cs.ATG"
+#line 1959 "cs.ATG"
out expr);
-#line 1957 "cs.ATG"
+#line 1959 "cs.ATG"
if (expr != null) {parameters.Add(expr);}
while (la.kind == 13) {
lexer.NextToken();
Argument(
-#line 1958 "cs.ATG"
+#line 1960 "cs.ATG"
out expr);
-#line 1958 "cs.ATG"
+#line 1960 "cs.ATG"
if (expr != null) {parameters.Add(expr);}
}
}
Expect(20);
-#line 1959 "cs.ATG"
+#line 1961 "cs.ATG"
pexpr = new InvocationExpression(pexpr, parameters);
} else {
-#line 1961 "cs.ATG"
+#line 1963 "cs.ATG"
if (isArrayCreation) Error("element access not allow on array creation");
ArrayList indices = new ArrayList();
lexer.NextToken();
Expr(
-#line 1964 "cs.ATG"
+#line 1966 "cs.ATG"
out expr);
-#line 1964 "cs.ATG"
+#line 1966 "cs.ATG"
if (expr != null) { indices.Add(expr); }
while (la.kind == 13) {
lexer.NextToken();
Expr(
-#line 1965 "cs.ATG"
+#line 1967 "cs.ATG"
out expr);
-#line 1965 "cs.ATG"
+#line 1967 "cs.ATG"
if (expr != null) { indices.Add(expr); }
}
Expect(18);
-#line 1966 "cs.ATG"
+#line 1968 "cs.ATG"
pexpr = new IndexerExpression(pexpr, indices);
}
}
}
void ConditionalAndExpr(
-#line 1976 "cs.ATG"
+#line 1978 "cs.ATG"
ref Expression outExpr) {
-#line 1977 "cs.ATG"
+#line 1979 "cs.ATG"
Expression expr;
InclusiveOrExpr(
-#line 1979 "cs.ATG"
+#line 1981 "cs.ATG"
ref outExpr);
while (la.kind == 24) {
lexer.NextToken();
UnaryExpr(
-#line 1979 "cs.ATG"
+#line 1981 "cs.ATG"
out expr);
InclusiveOrExpr(
-#line 1979 "cs.ATG"
+#line 1981 "cs.ATG"
ref expr);
-#line 1979 "cs.ATG"
+#line 1981 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.LogicalAnd, expr);
}
}
void InclusiveOrExpr(
-#line 1982 "cs.ATG"
+#line 1984 "cs.ATG"
ref Expression outExpr) {
-#line 1983 "cs.ATG"
+#line 1985 "cs.ATG"
Expression expr;
ExclusiveOrExpr(
-#line 1985 "cs.ATG"
+#line 1987 "cs.ATG"
ref outExpr);
while (la.kind == 28) {
lexer.NextToken();
UnaryExpr(
-#line 1985 "cs.ATG"
+#line 1987 "cs.ATG"
out expr);
ExclusiveOrExpr(
-#line 1985 "cs.ATG"
+#line 1987 "cs.ATG"
ref expr);
-#line 1985 "cs.ATG"
+#line 1987 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.BitwiseOr, expr);
}
}
void ExclusiveOrExpr(
-#line 1988 "cs.ATG"
+#line 1990 "cs.ATG"
ref Expression outExpr) {
-#line 1989 "cs.ATG"
+#line 1991 "cs.ATG"
Expression expr;
AndExpr(
-#line 1991 "cs.ATG"
+#line 1993 "cs.ATG"
ref outExpr);
while (la.kind == 29) {
lexer.NextToken();
UnaryExpr(
-#line 1991 "cs.ATG"
+#line 1993 "cs.ATG"
out expr);
AndExpr(
-#line 1991 "cs.ATG"
+#line 1993 "cs.ATG"
ref expr);
-#line 1991 "cs.ATG"
+#line 1993 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.ExclusiveOr, expr);
}
}
void AndExpr(
-#line 1994 "cs.ATG"
+#line 1996 "cs.ATG"
ref Expression outExpr) {
-#line 1995 "cs.ATG"
+#line 1997 "cs.ATG"
Expression expr;
EqualityExpr(
-#line 1997 "cs.ATG"
+#line 1999 "cs.ATG"
ref outExpr);
while (la.kind == 27) {
lexer.NextToken();
UnaryExpr(
-#line 1997 "cs.ATG"
+#line 1999 "cs.ATG"
out expr);
EqualityExpr(
-#line 1997 "cs.ATG"
+#line 1999 "cs.ATG"
ref expr);
-#line 1997 "cs.ATG"
+#line 1999 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.BitwiseAnd, expr);
}
}
void EqualityExpr(
-#line 2000 "cs.ATG"
+#line 2002 "cs.ATG"
ref Expression outExpr) {
-#line 2002 "cs.ATG"
+#line 2004 "cs.ATG"
Expression expr;
BinaryOperatorType op = BinaryOperatorType.None;
RelationalExpr(
-#line 2006 "cs.ATG"
+#line 2008 "cs.ATG"
ref outExpr);
while (la.kind == 32 || la.kind == 33) {
if (la.kind == 33) {
lexer.NextToken();
-#line 2009 "cs.ATG"
+#line 2011 "cs.ATG"
op = BinaryOperatorType.InEquality;
} else {
lexer.NextToken();
-#line 2010 "cs.ATG"
+#line 2012 "cs.ATG"
op = BinaryOperatorType.Equality;
}
UnaryExpr(
-#line 2012 "cs.ATG"
+#line 2014 "cs.ATG"
out expr);
RelationalExpr(
-#line 2012 "cs.ATG"
+#line 2014 "cs.ATG"
ref expr);
-#line 2012 "cs.ATG"
+#line 2014 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, op, expr);
}
}
void RelationalExpr(
-#line 2016 "cs.ATG"
+#line 2018 "cs.ATG"
ref Expression outExpr) {
-#line 2018 "cs.ATG"
+#line 2020 "cs.ATG"
TypeReference type;
Expression expr;
BinaryOperatorType op = BinaryOperatorType.None;
ShiftExpr(
-#line 2023 "cs.ATG"
+#line 2025 "cs.ATG"
ref outExpr);
while (StartOf(26)) {
if (StartOf(27)) {
if (la.kind == 22) {
lexer.NextToken();
-#line 2026 "cs.ATG"
+#line 2028 "cs.ATG"
op = BinaryOperatorType.LessThan;
} else if (la.kind == 21) {
lexer.NextToken();
-#line 2027 "cs.ATG"
+#line 2029 "cs.ATG"
op = BinaryOperatorType.GreaterThan;
} else if (la.kind == 35) {
lexer.NextToken();
-#line 2028 "cs.ATG"
+#line 2030 "cs.ATG"
op = BinaryOperatorType.LessThanOrEqual;
} else if (la.kind == 34) {
lexer.NextToken();
-#line 2029 "cs.ATG"
+#line 2031 "cs.ATG"
op = BinaryOperatorType.GreaterThanOrEqual;
} else SynErr(182);
UnaryExpr(
-#line 2031 "cs.ATG"
+#line 2033 "cs.ATG"
out expr);
ShiftExpr(
-#line 2031 "cs.ATG"
+#line 2033 "cs.ATG"
ref expr);
-#line 2031 "cs.ATG"
+#line 2033 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, op, expr);
} else {
if (la.kind == 83) {
lexer.NextToken();
-#line 2034 "cs.ATG"
+#line 2036 "cs.ATG"
op = BinaryOperatorType.IS;
} else if (la.kind == 48) {
lexer.NextToken();
-#line 2035 "cs.ATG"
+#line 2037 "cs.ATG"
op = BinaryOperatorType.AS;
} else SynErr(183);
Type(
-#line 2037 "cs.ATG"
+#line 2039 "cs.ATG"
out type);
-#line 2037 "cs.ATG"
+#line 2039 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, op, new TypeReferenceExpression(type));
}
}
}
void ShiftExpr(
-#line 2041 "cs.ATG"
+#line 2043 "cs.ATG"
ref Expression outExpr) {
-#line 2043 "cs.ATG"
+#line 2045 "cs.ATG"
Expression expr;
BinaryOperatorType op = BinaryOperatorType.None;
AdditiveExpr(
-#line 2047 "cs.ATG"
+#line 2049 "cs.ATG"
ref outExpr);
while (la.kind == 36 ||
-#line 2050 "cs.ATG"
+#line 2052 "cs.ATG"
IsShiftRight()) {
if (la.kind == 36) {
lexer.NextToken();
-#line 2049 "cs.ATG"
+#line 2051 "cs.ATG"
op = BinaryOperatorType.ShiftLeft;
} else {
Expect(21);
Expect(21);
-#line 2051 "cs.ATG"
+#line 2053 "cs.ATG"
op = BinaryOperatorType.ShiftRight;
}
UnaryExpr(
-#line 2054 "cs.ATG"
+#line 2056 "cs.ATG"
out expr);
AdditiveExpr(
-#line 2054 "cs.ATG"
+#line 2056 "cs.ATG"
ref expr);
-#line 2054 "cs.ATG"
+#line 2056 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, op, expr);
}
}
void AdditiveExpr(
-#line 2058 "cs.ATG"
+#line 2060 "cs.ATG"
ref Expression outExpr) {
-#line 2060 "cs.ATG"
+#line 2062 "cs.ATG"
Expression expr;
BinaryOperatorType op = BinaryOperatorType.None;
MultiplicativeExpr(
-#line 2064 "cs.ATG"
+#line 2066 "cs.ATG"
ref outExpr);
while (la.kind == 4 || la.kind == 5) {
if (la.kind == 4) {
lexer.NextToken();
-#line 2067 "cs.ATG"
+#line 2069 "cs.ATG"
op = BinaryOperatorType.Add;
} else {
lexer.NextToken();
-#line 2068 "cs.ATG"
+#line 2070 "cs.ATG"
op = BinaryOperatorType.Subtract;
}
UnaryExpr(
-#line 2070 "cs.ATG"
+#line 2072 "cs.ATG"
out expr);
MultiplicativeExpr(
-#line 2070 "cs.ATG"
+#line 2072 "cs.ATG"
ref expr);
-#line 2070 "cs.ATG"
+#line 2072 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, op, expr);
}
}
void MultiplicativeExpr(
-#line 2074 "cs.ATG"
+#line 2076 "cs.ATG"
ref Expression outExpr) {
-#line 2076 "cs.ATG"
+#line 2078 "cs.ATG"
Expression expr;
BinaryOperatorType op = BinaryOperatorType.None;
@@ -4963,84 +4964,84 @@ ref Expression outExpr) {
if (la.kind == 6) {
lexer.NextToken();
-#line 2082 "cs.ATG"
+#line 2084 "cs.ATG"
op = BinaryOperatorType.Multiply;
} else if (la.kind == 7) {
lexer.NextToken();
-#line 2083 "cs.ATG"
+#line 2085 "cs.ATG"
op = BinaryOperatorType.Divide;
} else {
lexer.NextToken();
-#line 2084 "cs.ATG"
+#line 2086 "cs.ATG"
op = BinaryOperatorType.Modulus;
}
UnaryExpr(
-#line 2086 "cs.ATG"
+#line 2088 "cs.ATG"
out expr);
-#line 2086 "cs.ATG"
+#line 2088 "cs.ATG"
outExpr = new BinaryOperatorExpression(outExpr, op, expr);
}
}
void TypeArgumentList(
-#line 2099 "cs.ATG"
+#line 2101 "cs.ATG"
out List types) {
-#line 2101 "cs.ATG"
+#line 2103 "cs.ATG"
types = new List();
TypeReference type = null;
Expect(22);
Type(
-#line 2105 "cs.ATG"
+#line 2107 "cs.ATG"
out type);
-#line 2105 "cs.ATG"
+#line 2107 "cs.ATG"
types.Add(type);
while (la.kind == 13) {
lexer.NextToken();
Type(
-#line 2106 "cs.ATG"
+#line 2108 "cs.ATG"
out type);
-#line 2106 "cs.ATG"
+#line 2108 "cs.ATG"
types.Add(type);
}
Expect(21);
}
void TypeParameterConstraintsClauseBase(
-#line 2151 "cs.ATG"
+#line 2153 "cs.ATG"
out TypeReference type) {
-#line 2152 "cs.ATG"
+#line 2154 "cs.ATG"
TypeReference t; type = null;
if (la.kind == 107) {
lexer.NextToken();
-#line 2154 "cs.ATG"
+#line 2156 "cs.ATG"
type = new TypeReference("struct");
} else if (la.kind == 57) {
lexer.NextToken();
-#line 2155 "cs.ATG"
+#line 2157 "cs.ATG"
type = new TypeReference("struct");
} else if (la.kind == 87) {
lexer.NextToken();
Expect(19);
Expect(20);
-#line 2156 "cs.ATG"
+#line 2158 "cs.ATG"
type = new TypeReference("struct");
} else if (StartOf(8)) {
Type(
-#line 2157 "cs.ATG"
+#line 2159 "cs.ATG"
out t);
-#line 2157 "cs.ATG"
+#line 2159 "cs.ATG"
type = t;
} else SynErr(184);
}
diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
index 5c85a576cc..2f17701f37 100644
--- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
+++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
@@ -1415,9 +1415,11 @@ Block /* not BlockStatement because of EmbeddedStatement */
"{" (. BlockStatement blockStmt = new BlockStatement();
blockStmt.StartLocation = t.EndLocation;
compilationUnit.BlockStart(blockStmt);
+ if (!parseMethodContents) lexer.SkipCurrentBlock();
.)
{ Statement }
- "}" (. stmt = blockStmt;
+ "}" (.
+ stmt = blockStmt;
blockStmt.EndLocation = t.EndLocation;
compilationUnit.BlockEnd();
.)
diff --git a/src/Libraries/NRefactory/Test/Lexer/CSharp/LexerTest.cs b/src/Libraries/NRefactory/Test/Lexer/CSharp/LexerTest.cs
index 8e7c4bf4cc..5e02318e8c 100644
--- a/src/Libraries/NRefactory/Test/Lexer/CSharp/LexerTest.cs
+++ b/src/Libraries/NRefactory/Test/Lexer/CSharp/LexerTest.cs
@@ -112,6 +112,32 @@ namespace ICSharpCode.NRefactory.Tests.Lexer.CSharp
ILexer lexer = GenerateLexer(new StringReader("}"));
Assert.AreEqual(Tokens.CloseCurlyBrace, lexer.NextToken().kind);
}
+
+ [Test]
+ public void TestEmptyBlock()
+ {
+ ILexer lexer = GenerateLexer(new StringReader("{}"));
+ Assert.AreEqual(Tokens.OpenCurlyBrace, lexer.NextToken().kind);
+ Assert.AreEqual(Tokens.CloseCurlyBrace, lexer.NextToken().kind);
+ }
+
+ [Test]
+ public void TestSkippedEmptyBlock()
+ {
+ ILexer lexer = GenerateLexer(new StringReader("{}"));
+ Assert.AreEqual(Tokens.OpenCurlyBrace, lexer.NextToken().kind);
+ lexer.SkipCurrentBlock();
+ Assert.AreEqual(Tokens.CloseCurlyBrace, lexer.NextToken().kind);
+ }
+
+ [Test]
+ public void TestSkippedNonEmptyBlock()
+ {
+ ILexer lexer = GenerateLexer(new StringReader("{ TestMethod('}'); /* }}} */ break; }"));
+ Assert.AreEqual(Tokens.OpenCurlyBrace, lexer.NextToken().kind);
+ lexer.SkipCurrentBlock();
+ Assert.AreEqual(Tokens.CloseCurlyBrace, lexer.NextToken().kind);
+ }
[Test]
public void TestOpenSquareBracket()
diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs
index 8e15c484d5..969c322431 100644
--- a/src/Main/Base/Project/Src/Project/AbstractProject.cs
+++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs
@@ -101,13 +101,18 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
+ string directoryName;
+
[Browsable(false)]
public string Directory {
get {
- if (fileName == null) {
- return String.Empty;
+ if (directoryName == null) {
+ if (fileName == null) {
+ return String.Empty;
+ }
+ directoryName = Path.GetFullPath(Path.GetDirectoryName(fileName));
}
- return Path.GetFullPath(Path.GetDirectoryName(fileName));
+ return directoryName;
}
}
@@ -337,7 +342,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
#endregion
-
+
public virtual CompilerResults Build()
{
return null;
diff --git a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs
index d90511c560..47fabba040 100644
--- a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs
+++ b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs
@@ -41,6 +41,9 @@ namespace ICSharpCode.Core
///
public sealed class FileUtility
{
+ // TODO: GetFullPath is a **very** expensive method (performance-wise)!
+ // Call it only when necessary. (see IsEqualFile)
+
readonly static char[] separators = { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar, Path.VolumeSeparatorChar };
static string sharpDevelopRootPath;
const string fileNameRegEx = @"^(([a-zA-Z]:)|.)[^:]*$";
@@ -155,11 +158,28 @@ namespace ICSharpCode.Core
public static bool IsEqualFile(string fileName1, string fileName2)
{
+ // Optimized for performance:
+ //return Path.GetFullPath(fileName1.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)).ToLower() == Path.GetFullPath(fileName2.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)).ToLower();
+
+
+ if (fileName1.Length == 0 || fileName2.Length == 0) return false;
+ char lastChar;
+ lastChar = fileName1[fileName1.Length - 1];
+ if (lastChar == Path.DirectorySeparatorChar || lastChar == Path.AltDirectorySeparatorChar)
+ fileName1 = fileName1.Substring(0, fileName1.Length - 1);
+ lastChar = fileName2[fileName2.Length - 1];
+ if (lastChar == Path.DirectorySeparatorChar || lastChar == Path.AltDirectorySeparatorChar)
+ fileName2 = fileName2.Substring(0, fileName2.Length - 1);
+
try {
- return Path.GetFullPath(fileName1.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)).ToLower() == Path.GetFullPath(fileName2.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)).ToLower();
+ if (fileName1.Length < 2 || fileName1[1] != ':')
+ fileName1 = Path.GetFullPath(fileName1);
+ if (fileName2.Length < 2 || fileName2[1] != ':')
+ fileName2 = Path.GetFullPath(fileName2);
} catch (Exception) {
return false;
}
+ return string.Equals(fileName1, fileName2, StringComparison.OrdinalIgnoreCase);
}
public static bool IsBaseDirectory(string baseDirectory, string testDirectory)