diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Resources/CSharp-Mode.xshd b/src/Libraries/ICSharpCode.TextEditor/Project/Resources/CSharp-Mode.xshd
index 683515d1f0..3d44b3c418 100644
--- a/src/Libraries/ICSharpCode.TextEditor/Project/Resources/CSharp-Mode.xshd
+++ b/src/Libraries/ICSharpCode.TextEditor/Project/Resources/CSharp-Mode.xshd
@@ -126,6 +126,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs
index cd3e5ecd06..87d81668ab 100644
--- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs
+++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs
@@ -567,7 +567,12 @@ namespace ICSharpCode.NRefactory.Parser.CSharp
bool StartOfQueryExpression()
{
- return la.kind == Tokens.From && IsIdentifierToken(Peek(1));
+ if (la.kind == Tokens.From) {
+ Token p = Peek(1);
+ if (IsIdentifierToken(p) || Tokens.TypeKW[p.kind])
+ return true;
+ }
+ return false;
}
static bool IsIdentifierToken(Token tk)
diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
index 0b5ee6a1e1..de873b2695 100644
--- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
+++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
@@ -5579,6 +5579,16 @@ QueryExpressionFromOrJoinClause fjc) {
#line 2306 "cs.ATG"
fjc.Type = null;
+ if (
+#line 2307 "cs.ATG"
+IsLocalVarDecl()) {
+ Type(
+#line 2307 "cs.ATG"
+out type);
+
+#line 2307 "cs.ATG"
+ fjc.Type = type;
+ }
Identifier();
#line 2308 "cs.ATG"
diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
index 61b3fc1fc4..409c35ad8f 100644
--- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
+++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
@@ -2304,7 +2304,7 @@ QueryExpressionFromOrJoinClause
(. TypeReference type; Expression expr; .)
=
(. fjc.Type = null; .)
- /*[ Type (. fjc.Type = type; .) ]*/
+ [ IF (IsLocalVarDecl()) Type (. fjc.Type = type; .) ]
Identifier (. fjc.Identifier = t.val; .)
"in"
Expr (. fjc.InExpression = expr; .)
diff --git a/src/Libraries/NRefactory/Test/Parser/Expressions/QueryExpressionTests.cs b/src/Libraries/NRefactory/Test/Parser/Expressions/QueryExpressionTests.cs
index 3d5a23e9cd..43adf69900 100644
--- a/src/Libraries/NRefactory/Test/Parser/Expressions/QueryExpressionTests.cs
+++ b/src/Libraries/NRefactory/Test/Parser/Expressions/QueryExpressionTests.cs
@@ -31,6 +31,43 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.IsInstanceOfType(typeof(QueryExpressionSelectClause), qe.SelectOrGroupClause);
}
+ [Test]
+ public void ExpressionWithType1()
+ {
+ QueryExpression qe = ParseUtilCSharp.ParseExpression(
+ "from Customer c in customers select c"
+ );
+ Assert.AreEqual("c", qe.FromClause.Identifier);
+ Assert.AreEqual("Customer", qe.FromClause.Type.ToString());
+ Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.InExpression).Identifier);
+ Assert.IsInstanceOfType(typeof(QueryExpressionSelectClause), qe.SelectOrGroupClause);
+ }
+
+ [Test]
+ public void ExpressionWithType2()
+ {
+ QueryExpression qe = ParseUtilCSharp.ParseExpression(
+ "from int c in customers select c"
+ );
+ Assert.AreEqual("c", qe.FromClause.Identifier);
+ Assert.AreEqual("System.Int32", qe.FromClause.Type.SystemType);
+ Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.InExpression).Identifier);
+ Assert.IsInstanceOfType(typeof(QueryExpressionSelectClause), qe.SelectOrGroupClause);
+ }
+
+
+ [Test]
+ public void ExpressionWithType3()
+ {
+ QueryExpression qe = ParseUtilCSharp.ParseExpression(
+ "from S? c in customers select c"
+ );
+ Assert.AreEqual("c", qe.FromClause.Identifier);
+ Assert.AreEqual("System.Nullable>", qe.FromClause.Type.ToString());
+ Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.InExpression).Identifier);
+ Assert.IsInstanceOfType(typeof(QueryExpressionSelectClause), qe.SelectOrGroupClause);
+ }
+
[Test]
public void MultipleGenerators()
{
diff --git a/src/Libraries/NRefactory/Test/Parser/TypeLevel/MethodDeclarationTests.cs b/src/Libraries/NRefactory/Test/Parser/TypeLevel/MethodDeclarationTests.cs
index c4ef1e87ba..922c33fa20 100644
--- a/src/Libraries/NRefactory/Test/Parser/TypeLevel/MethodDeclarationTests.cs
+++ b/src/Libraries/NRefactory/Test/Parser/TypeLevel/MethodDeclarationTests.cs
@@ -24,6 +24,40 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.IsFalse(md.IsExtensionMethod);
}
+ [Test]
+ public void CSharpAbstractMethodDeclarationTest()
+ {
+ MethodDeclaration md = ParseUtilCSharp.ParseTypeMember("abstract void MyMethod();");
+ Assert.AreEqual("void", md.TypeReference.Type);
+ Assert.AreEqual(0, md.Parameters.Count);
+ Assert.IsFalse(md.IsExtensionMethod);
+ Assert.IsTrue(md.Body.IsNull);
+ Assert.AreEqual(Modifiers.Abstract, md.Modifier);
+ }
+
+ [Test]
+ public void CSharpDefiningPartialMethodDeclarationTest()
+ {
+ MethodDeclaration md = ParseUtilCSharp.ParseTypeMember("partial void MyMethod();");
+ Assert.AreEqual("void", md.TypeReference.Type);
+ Assert.AreEqual(0, md.Parameters.Count);
+ Assert.IsFalse(md.IsExtensionMethod);
+ Assert.IsTrue(md.Body.IsNull);
+ Assert.AreEqual(Modifiers.Partial, md.Modifier);
+ }
+
+
+ [Test]
+ public void CSharpImplementingPartialMethodDeclarationTest()
+ {
+ MethodDeclaration md = ParseUtilCSharp.ParseTypeMember("partial void MyMethod() { }");
+ Assert.AreEqual("void", md.TypeReference.Type);
+ Assert.AreEqual(0, md.Parameters.Count);
+ Assert.IsFalse(md.IsExtensionMethod);
+ Assert.IsFalse(md.Body.IsNull);
+ Assert.AreEqual(Modifiers.Partial, md.Modifier);
+ }
+
[Test]
public void CSharpSimpleMethodRegionTest()
{
@@ -148,6 +182,20 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.AreEqual("ISomeInterface", md.Templates[0].Bases[0].Type);
}
+ [Test]
+ public void CSharpShadowingMethodInInterface()
+ {
+ const string program = @"interface MyInterface : IDisposable {
+ new void Dispose();
+}
+";
+ TypeDeclaration td = ParseUtilCSharp.ParseGlobal(program);
+ MethodDeclaration md = (MethodDeclaration)td.Children[0];
+ Assert.AreEqual("void", md.TypeReference.Type);
+ Assert.AreEqual(0, md.Parameters.Count);
+ Assert.AreEqual(Modifiers.New, md.Modifier);
+ }
+
[Test]
public void CSharpMethodImplementingInterfaceTest()
{
diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs
index a426899f36..b6b3eb0806 100644
--- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs
+++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs
@@ -36,7 +36,13 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
return;
}
if (node.Project.IsStartable) {
- node.Project.Start(true);
+ BuildProject build = new BuildProject(node.Project);
+ build.BuildComplete += delegate {
+ if (build.LastBuildResults.ErrorCount == 0) {
+ node.Project.Start(true);
+ }
+ };
+ build.Run();
} else {
MessageService.ShowError("${res:BackendBindings.ExecutionManager.CantExecuteDLLError}");
}