diff --git a/ICSharpCode.NRefactory.CSharp/Ast/Expressions/ErrorExpression.cs b/ICSharpCode.NRefactory.CSharp/Ast/Expressions/ErrorExpression.cs new file mode 100644 index 0000000000..93232961d4 --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Ast/Expressions/ErrorExpression.cs @@ -0,0 +1,42 @@ +// +// ErrorExpression.cs +// +// Author: +// Mike Krüger +// +// Copyright (c) 2011 Xamarin Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; + +namespace ICSharpCode.NRefactory.CSharp +{ + public class ErrorExpression : EmptyExpression + { + public ErrorExpression () + { + } + + public ErrorExpression (TextLocation location) : base (location) + { + } + + } +} + diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 8559dfc757..9cd1b17a3e 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -415,6 +415,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var contextList = new CompletionDataWrapper (this); var identifierStart = GetExpressionAtCursor (); + if (identifierStart != null && identifierStart.Item2 is VariableInitializer && location <= ((VariableInitializer)identifierStart.Item2).NameToken.EndLocation) { + return controlSpace ? HandleAccessorContext () ?? DefaultControlSpaceItems () : null; + } if (!(char.IsLetter (completionChar) || completionChar == '_') && (!controlSpace || identifierStart == null || !(identifierStart.Item2 is ArrayInitializerExpression))) { return controlSpace ? HandleAccessorContext () ?? DefaultControlSpaceItems () : null; } @@ -1738,8 +1741,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } var baseUnit = ParseStub (""); + var tmpUnit = baseUnit; - AstNode expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); + AstNode expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); if (expr == null) expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); @@ -1762,12 +1766,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (expr == null) { var forStmt = tmpUnit.GetNodeAt (location.Line, location.Column - 3); - expr = forStmt; - if (forStmt != null && forStmt.EmbeddedStatement.IsNull) { - var id = new IdentifierExpression ("stub"); - forStmt.EmbeddedStatement = new BlockStatement () { Statements = { new ExpressionStatement (id) }}; - expr = id; + if (forStmt != null && forStmt.Condition is ErrorExpression) { + expr = forStmt; + if (forStmt.EmbeddedStatement.IsNull) { + var id = new IdentifierExpression ("stub"); + forStmt.EmbeddedStatement = new BlockStatement () { Statements = { new ExpressionStatement (id) }}; + expr = id; + } + baseUnit = tmpUnit; } + } + + + if (expr == null) { + expr = tmpUnit.GetNodeAt (location.Line, location.Column - 1); baseUnit = tmpUnit; } diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index 03c3b67edc..89f5ede15f 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -308,6 +308,7 @@ + @@ -319,4 +320,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs index d825942ad7..20ce4485b9 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs @@ -1334,6 +1334,11 @@ namespace ICSharpCode.NRefactory.CSharp return new ICSharpCode.NRefactory.CSharp.EmptyExpression (Convert (emptyExpression.Location)); } + public override object Visit (Mono.CSharp.ErrorExpression emptyExpression) + { + return new ICSharpCode.NRefactory.CSharp.ErrorExpression (Convert (emptyExpression.Location)); + } + public override object Visit (EmptyExpressionStatement emptyExpressionStatement) { return new EmptyExpression (Convert (emptyExpressionStatement.Location)); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/VariableDeclarationStatementTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/VariableDeclarationStatementTests.cs index 75fac48074..d364096976 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/VariableDeclarationStatementTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/VariableDeclarationStatementTests.cs @@ -43,7 +43,7 @@ class MyTest } } "); - Assert.IsTrue (provider == null || provider.Count == 0, "provider not found."); + Assert.IsTrue (provider == null || provider.Count == 0, "provider should be empty."); } [Test()] @@ -80,6 +80,27 @@ class MyTest Assert.IsNotNull (provider.Find ("myTest"), "name proposal 'myTest' not found."); Assert.IsNotNull (provider.Find ("test"), "name proposal 'test' not found."); } + + /// + /// Bug 1799 - [New Resolver] Invalid code completion when typing name of variable + /// + [Test()] + public void TestBug1799 () + { + var provider = CodeCompletionBugTests.CreateProvider ( +@" +class MyTest +{ + public void Test () + { + for (int n=0;n<10;n++) { + $string d$ + } + } +} +"); + Assert.IsTrue (provider == null || provider.Count == 0, "provider should be empty."); + } } } diff --git a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj index 42a6ef9797..58e74ff430 100644 --- a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj +++ b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj @@ -1,4 +1,4 @@ - + {3B2A5653-EC97-4001-BB9B-D90F1AF2C371} @@ -17,7 +17,7 @@ False -Microsoft.Design#CA1026;-Microsoft.Security#CA2104 true - ..\ICSharpCode.NRefactory.snk + snk False File