diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index cb2c268071..69548ed5bb 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -422,7 +422,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var navigator = new NodeListResolveVisitorNavigator (nodes); var visitor = new ResolveVisitor (csResolver, identifierStart.Item1, navigator); visitor.Scan (identifierStart.Item3); - csResolver = visitor.GetResolverStateBefore (n); + try { + csResolver = visitor.GetResolverStateBefore (n); + } catch (Exception) { + csResolver = GetState (); + } // add attribute properties. if (n.Parent is ICSharpCode.NRefactory.CSharp.Attribute) { var resolved = visitor.GetResolveResult (n.Parent); @@ -556,7 +560,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion wrapper.AddTypeParameter (p); } } - Predicate typePred = null; if (node is Attribute) { var attribute = ctx.GetTypeDefinition ("System", "Attribute", 0, StringComparer.Ordinal); @@ -574,10 +577,29 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AddKeywords (wrapper, globalLevelKeywords); } + if (IsInSwitchContext(node)) { + wrapper.AddCustom ("case"); + wrapper.AddCustom ("default"); + } + AddKeywords (wrapper, primitiveTypesKeywords); wrapper.Result.AddRange (factory.CreateCodeTemplateCompletionData ()); } - + + static bool IsInSwitchContext(AstNode node) + { + var n = node; + while (n != null && !(n is MemberDeclaration)) { + Console.WriteLine (n.GetType ()); + if (n is SwitchStatement) + return true; + if (n is BlockStatement) + return false; + n = n.Parent; + } + return false; + } + void AddTypesAndNamespaces (CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Predicate typePred = null, Predicate memberPred = null) { var currentType = state.CurrentTypeDefinition ?? this.currentType; @@ -1531,6 +1553,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } var baseUnit = ParseStub (""); + var tmpUnit = baseUnit; AstNode expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); if (expr == null) expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); @@ -1545,6 +1568,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); } + // try statement + if (expr == null) { + expr = tmpUnit.GetNodeAt (location.Line, location.Column - 1); + } + if (expr == null) return null; var member = Unit.GetNodeAt (memberLocation); @@ -1740,7 +1768,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var navigator = new NodeListResolveVisitorNavigator (new[] { node }); var visitor = new ResolveVisitor (state, CSharpParsedFile, navigator); Unit.AcceptVisitor (visitor, null); - state = visitor.GetResolverStateBefore (node) ?? state; + try { + var newState = visitor.GetResolverStateBefore (node); + if (newState != null) + state = newState; + } catch (Exception) { + } } return state; diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 9c80de254e..046d92fbd6 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -180,8 +180,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion 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 {}"); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/KeywordTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/KeywordTests.cs new file mode 100644 index 0000000000..b041fc7cb4 --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/KeywordTests.cs @@ -0,0 +1,92 @@ +// +// KeywordTests.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; +using NUnit.Framework; + +namespace ICSharpCode.NRefactory.CSharp.CodeCompletion +{ + [TestFixture()] + public class KeywordTests : TestBase + { + [Test()] + public void CaseKeywordTest () + { + var provider = CodeCompletionBugTests.CreateProvider ( +@" +class Class +{ + void Test (string t) + { + switch (t) { + $c$ + } + } +} +"); + Assert.IsNotNull (provider, "provider == null"); + Assert.IsNotNull (provider.Find ("case"), "keyword 'case' not found."); + } + + [Test()] + public void CaseKeywordTestCase2 () + { + var provider = CodeCompletionBugTests.CreateProvider ( +@" +class Class +{ + void Test (string t) + { + $c$ + } +} +"); + } + + [Test()] + public void CaseKeywordTestCase3 () + { + var provider = CodeCompletionBugTests.CreateProvider ( +@" +class Class +{ +void Test (string t) +{ + switch (t) { + case ""test"": + $c$ + } +} +} +"); + Assert.IsNotNull (provider, "provider == null"); + Assert.IsNotNull (provider.Find ("case"), "keyword 'case' not found."); + } + + + } +} + diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index f6875d393a..e0be8199c8 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -195,15 +195,18 @@ + {53DCA265-3C3C-42F9-B647-F72BA678122B} ICSharpCode.NRefactory.CSharp + False {3B2A5653-EC97-4001-BB9B-D90F1AF2C371} ICSharpCode.NRefactory + False