diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2011-10-28 12:43:41 +0400 |
---|---|---|
committer | Mike Krüger <mkrueger@xamarin.com> | 2011-10-28 12:44:23 +0400 |
commit | ca68b36142c26b1899a9cbf6c3d4239830b05958 (patch) | |
tree | 3d9c6b1243f52570a2e7c2bfb854a55d7959e6fc /main/contrib | |
parent | fb06e3d2ae4ee01ff58ff52714757383dc26b314 (diff) |
Fixed "Bug 1746 - [New Resolver] Issues in switch statement".
Diffstat (limited to 'main/contrib')
-rw-r--r-- | main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs | 47 | ||||
-rw-r--r-- | main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs | 2 |
2 files changed, 40 insertions, 9 deletions
diff --git a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 7e4e792383..69548ed5bb 100644 --- a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/main/contrib/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<ITypeDefinition> 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<ITypeDefinition> typePred = null, Predicate<IMember> memberPred = null) { var currentType = state.CurrentTypeDefinition ?? this.currentType; @@ -1344,9 +1366,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // Console.WriteLine ("type:" + type +"/"+type.GetType ()); // Console.WriteLine ("IS PROT ALLOWED:" + isProtectedAllowed); // Console.WriteLine (resolveResult); -// Console.WriteLine (currentMember != null ? currentMember.IsStatic.ToString () : "currentMember == null"); +// Console.WriteLine (currentMember != null ? currentMember.IsStatic : "currentMember == null"); if (resolvedNode.Annotation<ObjectCreateExpression> () == null) { //tags the created expression as part of an object create expression. - foreach (var member in type.Resolve (ctx).GetMembers (ctx)) { + foreach (var member in type.GetMembers (ctx)) { if (!lookup.IsAccessible (member, isProtectedAllowed)) { // Console.WriteLine ("skip access: " + member.FullName); continue; @@ -1362,7 +1384,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // Console.WriteLine ("skip non static member: " + member.FullName); continue; } -// Console.WriteLine ("add : "+ member.FullName + " --- " + member.IsStatic + "---- returns:" + member.ReturnType.Resolve (ctx).FullName); + // Console.WriteLine ("add : "+ member.FullName + " --- " + member.IsStatic); result.AddMember (member); } } @@ -1531,6 +1553,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } var baseUnit = ParseStub (""); + var tmpUnit = baseUnit; AstNode expr = baseUnit.GetNodeAt<IdentifierExpression> (location.Line, location.Column - 1); if (expr == null) expr = baseUnit.GetNodeAt<Attribute> (location.Line, location.Column - 1); @@ -1545,6 +1568,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = baseUnit.GetNodeAt<ArrayInitializerExpression> (location.Line, location.Column - 1); } + // try statement + if (expr == null) { + expr = tmpUnit.GetNodeAt<Statement> (location.Line, location.Column - 1); + } + if (expr == null) return null; var member = Unit.GetNodeAt<AttributedNode> (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/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 9c80de254e..046d92fbd6 100644 --- a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/main/contrib/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 {}"); |