From c3b136b15649dcbf20b1d6427c6b50800580a5b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Fri, 17 Feb 2012 09:41:42 +0100 Subject: [PATCH] Fixed attribute context cases. --- .../Completion/CSharpCompletionEngine.cs | 20 +++++---- .../Completion/CSharpCompletionEngineBase.cs | 11 +++-- .../CodeCompletionAccessibleTests.cs | 45 +++++++++++++++++-- .../ParameterCompletionTests.cs | 4 +- 4 files changed, 64 insertions(+), 16 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 67eb1ca400..98a1381af2 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -165,6 +165,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (IsInsideCommentOrString ()) return Enumerable.Empty (); var expr = GetExpressionBeforeCursor (); + Console.WriteLine ("bef:" + expr); if (expr == null) return null; // do not complete . (but ..) @@ -432,7 +433,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var contextList = new CompletionDataWrapper (this); var identifierStart = GetExpressionAtCursor (); - + Console.WriteLine ("is:" + identifierStart); if (identifierStart != null && identifierStart.Item2 is TypeParameterDeclaration) return null; @@ -505,7 +506,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } foreach (var method in mgr.Methods) { - if (idx < method.Parameters.Count && method.Parameters[idx].Type.Kind == TypeKind.Delegate) { + if (idx < method.Parameters.Count && method.Parameters [idx].Type.Kind == TypeKind.Delegate) { AutoSelect = false; AutoCompleteEmptyMatch = false; } @@ -516,7 +517,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion idx++; foreach (var list in mgr.GetExtensionMethods ()) { foreach (var method in list) { - if (idx < method.Parameters.Count && method.Parameters[idx].Type.Kind == TypeKind.Delegate) { + if (idx < method.Parameters.Count && method.Parameters [idx].Type.Kind == TypeKind.Delegate) { AutoSelect = false; AutoCompleteEmptyMatch = false; } @@ -1955,7 +1956,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion baseUnit = ParseStub ("A a;", false); type = baseUnit.GetNodeAt (location); } - if (type != null) { if (currentType == null) { var tsvisitor2 = new TypeSystemConvertVisitor (this.CSharpParsedFile.FileName); @@ -1970,8 +1970,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return Tuple.Create (CSharpParsedFile, (AstNode)target, Unit); } } - if (currentMember == null && currentType == null) - return null; baseUnit = ParseStub ("a()", false); var curNode = baseUnit.GetNodeAt (location); @@ -1986,8 +1984,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (curNode is AttributedNode || baseUnit.GetNodeAt (location) == null) { baseUnit = ParseStub ("a()};"); } - var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; var mref = baseUnit.GetNodeAt (location); + if (currentMember == null && currentType == null) { + if (mref != null) + return Tuple.Create (CSharpParsedFile, (AstNode)mref.Target, baseUnit); + return null; + } + var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; if (mref == null) { var invoke = baseUnit.GetNodeAt (location); if (invoke != null) @@ -2120,8 +2123,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = baseUnit.GetNodeAt (location.Line, location.Column); if (expr != null) expr = baseUnit.GetNodeAt (location.Line, location.Column) ?? expr; + if (expr == null) + expr = baseUnit.GetNodeAt (location.Line, location.Column); } - if (expr == null) return null; var member = Unit.GetNodeAt (memberLocation); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 267fdb4b7e..d063a847e2 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -317,17 +317,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion switch (t.Item1) { case '(': wrapper.Append (')'); - didAppendSemicolon = false; + if (appendSemicolon) + didAppendSemicolon = false; lastBracket = ')'; break; case '[': wrapper.Append (']'); - didAppendSemicolon = false; + if (appendSemicolon) + didAppendSemicolon = false; lastBracket = ']'; break; case '<': wrapper.Append ('>'); - didAppendSemicolon = false; + if (appendSemicolon) + didAppendSemicolon = false; lastBracket = '>'; break; case '{': @@ -505,7 +508,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // var newContent = ProjectContent.UpdateProjectContent (CSharpParsedFile, file); - var csResolver = new CSharpAstResolver(new CSharpResolver (ctx), unit, CSharpParsedFile); + var csResolver = new CSharpAstResolver(GetState (), unit, CSharpParsedFile); var result = csResolver.Resolve (resolveNode); var state = csResolver.GetResolverStateBefore (resolveNode); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs index 614bb6941a..12d6b681aa 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs @@ -30,7 +30,6 @@ using System; using NUnit.Framework; using System.Diagnostics; - namespace ICSharpCode.NRefactory.CSharp.CodeCompletion { [TestFixture] @@ -1125,9 +1124,8 @@ public static void Query(MySqlConnection conn, string database, string table) Assert.IsNotNull (provider, "provider == null"); Assert.IsNotNull (provider.Find ("WriteLine"), "method 'WriteLine' not found."); } - [Test()] - public void TestAttributeContext () + public void TestAttributeContextClass () { var provider = CodeCompletionBugTests.CreateProvider (@" using System; @@ -1137,6 +1135,38 @@ class Test { }"); Assert.IsNotNull (provider, "provider == null"); Assert.IsNotNull (provider.Find ("Obsolete"), "attribute 'Obsolete' not found."); + Assert.IsNotNull (provider.Find ("Serializable"), "attribute 'Serializable' not found."); + } + + [Test()] + public void TestAttributeContextInNamespace () + { + var provider = CodeCompletionBugTests.CreateProvider (@" +using System; + +namespace Test { + $[O$ + class Test { + } +} +"); + Assert.IsNotNull (provider, "provider == null"); + Assert.IsNotNull (provider.Find ("Obsolete"), "attribute 'Obsolete' not found."); + Assert.IsNotNull (provider.Find ("Serializable"), "attribute 'Serializable' not found."); + } + + [Test()] + public void TestAttributeContextMember () + { + var provider = CodeCompletionBugTests.CreateProvider (@" +using System; + +class Test { + $[O$ +}"); + Assert.IsNotNull (provider, "provider == null"); + Assert.IsNotNull (provider.Find ("Obsolete"), "attribute 'Obsolete' not found."); + Assert.IsNotNull (provider.Find ("Serializable"), "attribute 'Serializable' not found."); } [Test()] @@ -1166,6 +1196,15 @@ $$ Assert.IsNotNull (provider.Find ("Test"), "class 'Test' not found."); } + [Test()] + public void TestAttributeContextParameterCompletion () + { + var provider = CodeCompletionBugTests.CreateProvider (@"$[Obsolete(System.$"); + Assert.IsNotNull (provider, "provider == null"); + Assert.IsNotNull (provider.Find ("Console"), "'Console' not found."); + } + + /// /// Bug 3320 - Constants accessed by class name do not show in completion list /// diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs index adda3743ee..9859f17d27 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs @@ -407,7 +407,8 @@ class TestClass public void TestBug434701 () { IParameterDataProvider provider = CreateProvider ( -@"class TestAttribute : System.Attribute +@"namespace Test { +class TestAttribute : System.Attribute { public Test (int a) { @@ -417,6 +418,7 @@ class TestClass $[Test ($ class AClass { +} }"); Assert.IsNotNull (provider, "provider was not created."); Assert.AreEqual (1, provider.OverloadCount);