diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 156ab0bb61..0875495057 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -90,6 +90,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion protected bool IsInsideString (int offset) { + var loc = document.GetLocation (offset); var expr = Unit.GetNodeAt (loc.Line, loc.Column); return expr != null && expr.Value is string; @@ -99,7 +100,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion #region Basic parsing/resolving functions protected void AppendMissingClosingBrackets (StringBuilder wrapper, string memberText, bool appendSemicolon) { - var bracketStack = new Stack (); + var bracketStack = new Stack> (); bool isInString = false, isInChar = false; bool isInLineComment = false, isInBlockComment = false; @@ -111,7 +112,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion case '[': case '{': if (!isInString && !isInChar && !isInLineComment && !isInBlockComment) - bracketStack.Push (ch); + bracketStack.Push (Tuple.Create (ch, pos)); break; case ')': case ']': @@ -152,7 +153,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion char lastBracket = '\0'; while (bracketStack.Count > 0) { - switch (bracketStack.Pop ()) { + var t = bracketStack.Pop (); + switch (t.Item1) { case '(': wrapper.Append (')'); didAppendSemicolon = false; @@ -169,12 +171,28 @@ namespace ICSharpCode.NRefactory.CSharp.Completion lastBracket = '>'; break; case '{': + int o = t.Item2 - 1; if (!didAppendSemicolon) { didAppendSemicolon = true; wrapper.Append (';'); } - wrapper.Append ('}'); + bool didAppendCatch = false; + while (o >= "try".Length) { + char ch = memberText[o]; + Console.WriteLine (ch); + + if (!char.IsWhiteSpace (ch)) { + if (ch == 'y' && memberText[o - 1] == 'r' && memberText[o - 2] == 't') { + wrapper.Append ("} catch {}"); + didAppendCatch = true; + } + break; + } + o--; + } + if (!didAppendCatch) + wrapper.Append ('}'); break; } } @@ -185,6 +203,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (!didAppendSemicolon) wrapper.Append (';'); } + Console.WriteLine ("1111111111"); + Console.WriteLine (wrapper); } protected CompilationUnit ParseStub (string continuation, bool appendSemicolon = true) diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index 151c8bd379..c0142da470 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -3577,5 +3577,25 @@ public class Test Assert.IsNotNull (provider.Find ("B"), "class 'B' not found."); Assert.IsNotNull (provider.Find ("C"), "class 'C' not found."); } + + [Test()] + public void TestCompletionInTryCatch () + { + CompletionDataList provider = CreateProvider ( +@"class Test { public void TM1 () {} public void TM2 () {} public int TF1; } +class CCTest { +void TestMethod () +{ + Test t; + try { + $t.$ +} +} +"); + Assert.IsNotNull (provider); + Assert.IsNotNull (provider.Find ("TM1")); + Assert.IsNotNull (provider.Find ("TM2")); + Assert.IsNotNull (provider.Find ("TF1")); + } } }