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}"); }