From 93bea6d4d18b8a07bf16e8075ad22a441f396ef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Thu, 2 Feb 2012 12:35:20 +0100 Subject: [PATCH] Fixed failing unit test. --- .../Completion/CSharpCompletionEngine.cs | 23 +++- .../CSharpParameterCompletionEngine.cs | 6 +- .../Refactoring/TypeSystemAstBuilder.cs | 11 ++ .../CodeCompletion/CodeCompletionBugTests.cs | 125 ++++++++++++------ 4 files changed, 118 insertions(+), 47 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 9db7d897a2..92f579e812 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -307,12 +307,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion case "=": case "==": GetPreviousToken (ref tokenIndex, false); - var expressionOrVariableDeclaration = GetExpressionAt (tokenIndex); if (expressionOrVariableDeclaration == null) return null; resolveResult = ResolveExpression (expressionOrVariableDeclaration.Item1, expressionOrVariableDeclaration.Item2, expressionOrVariableDeclaration.Item3); + if (resolveResult == null) return null; if (resolveResult.Item1.Type.Kind == TypeKind.Enum) { @@ -510,6 +510,27 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } + if (n is IdentifierExpression) { + var bop = n.Parent as BinaryOperatorExpression; + Expression evaluationExpr = null; + + if (bop != null && bop.Right == n && (bop.Operator == BinaryOperatorType.Equality || bop.Operator == BinaryOperatorType.InEquality)) { + evaluationExpr = bop.Left; + } + // check for compare to enum case + if (evaluationExpr != null) { + resolveResult = ResolveExpression (identifierStart.Item1, evaluationExpr, identifierStart.Item3); + if (resolveResult != null && resolveResult.Item1.Type.Kind == TypeKind.Enum) { + var wrapper = new CompletionDataWrapper (this); + AddContextCompletion (wrapper, resolveResult.Item2, evaluationExpr); + AddEnumMembers (wrapper, resolveResult.Item1.Type, resolveResult.Item2); + AutoCompleteEmptyMatch = false; + return wrapper.Result; + } + } + } + + if (n is Identifier && n.Parent is ForeachStatement) { if (controlSpace) return DefaultControlSpaceItems (); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index dd8979fea8..ee20e50e60 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -195,11 +195,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion invoke = GetTypeBeforeCursor (); if (invoke == null) return null; - var typeExpression = ResolveExpression (invoke.Item1, invoke.Item2, invoke.Item3); - if (typeExpression == null || typeExpression.Item1 == null || typeExpression.Item1.IsError) + var tExpr = ResolveExpression (invoke.Item1, invoke.Item2, invoke.Item3); + if (tExpr == null || tExpr.Item1 == null || tExpr.Item1.IsError) return null; - return factory.CreateTypeParameterDataProvider (CollectAllTypes (typeExpression.Item1.Type)); + return factory.CreateTypeParameterDataProvider (CollectAllTypes (tExpr.Item1.Type)); case '[': invoke = GetIndexerBeforeCursor (); if (invoke == null) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs index c27c28cfd5..b514ee82b3 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs @@ -190,6 +190,17 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring MemberType result = new MemberType(); if (typeDef.DeclaringTypeDefinition != null) { + // check if the declaring type is a nested type in the nested type hierarchy + var declaringType = resolver.CurrentTypeDefinition; + while (declaringType != null) { + if (typeDef.DeclaringTypeDefinition.Equals (declaringType)) { + var innerType = new SimpleType(typeDef.Name); + AddTypeArguments(innerType, typeArguments, outerTypeParameterCount, typeDef.TypeParameterCount); + return innerType; + } + declaringType = declaringType.DeclaringTypeDefinition; + } + // Handle nested types result.Target = ConvertTypeHelper(typeDef.DeclaringTypeDefinition, typeArguments); } else { diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index 9cf9cc227d..9fd9885d80 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -25,7 +25,6 @@ // 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 System.Collections.Generic; using System.IO; @@ -41,7 +40,6 @@ using System.Diagnostics; using System.Text; using ICSharpCode.NRefactory.CSharp.TypeSystem; - namespace ICSharpCode.NRefactory.CSharp.CodeCompletion { [TestFixture()] @@ -70,9 +68,11 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion act (provider); } - class TestFactory : ICompletionDataFactory + class TestFactory + : ICompletionDataFactory { - class CompletionData : ICompletionData + class CompletionData + : ICompletionData { #region ICompletionData implementation public void AddOverload (ICompletionData data) @@ -305,7 +305,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion Assert.IsNotNull (provider.Find ("ReferenceEquals"), "Method 'System.Object.ReferenceEquals' not found."); } - class TestLocVisitor : ICSharpCode.NRefactory.CSharp.DepthFirstAstVisitor + class TestLocVisitor + : ICSharpCode.NRefactory.CSharp.DepthFirstAstVisitor { public List> output = new List> (); @@ -331,7 +332,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion int exceptions = 0; int i = 0; foreach (var file in Directory.EnumerateFiles ("/Users/mike/work/mono/mcs/tests", "*.cs")) { - if (i++>2) + if (i++ > 2) break; if (i <= 2) continue; @@ -352,7 +353,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion } } } catch (Exception e) { - Console.WriteLine ("Exception in:" +file); + Console.WriteLine ("Exception in:" + file); exceptions++; } } @@ -362,7 +363,6 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion if (missing > 0) Assert.Fail (); } - [Test()] public void TestSimpleCodeCompletion () @@ -384,6 +384,7 @@ void TestMethod () Assert.IsNotNull (provider.Find ("TM2")); Assert.IsNotNull (provider.Find ("TF1")); } + [Test()] public void TestSimpleInterfaceCodeCompletion () { @@ -1680,7 +1681,6 @@ class A }); } - [Test()] public void TestBug2800B () { @@ -1717,6 +1717,48 @@ class A }); } + /// + /// Bug 2798 - Unnecessary namespace qualification being prepended + /// + [Test()] + public void Test2798 () + { + CombinedProviderTest ( +@" +using System; + +namespace Foobar +{ + class MainClass + { + public enum Foo + { + Value1, + Value2 + } + + public class Test + { + Foo Foo { + get; set; + } + + public static void Method (Foo foo) + { + $if (foo == F$ + } + } + } +} +", provider => { + Assert.IsNull (provider.Find ("MainClass.Foo"), "'MainClass.Foo' found."); + Assert.IsNotNull (provider.Find ("Foo"), "'Foo' not found."); + Assert.IsNotNull (provider.Find ("Foo.Value1"), "'Foo.Value1' not found."); + Assert.IsNotNull (provider.Find ("Foo.Value2"), "'Foo.Value2' not found."); + }); + } + + /// /// Bug 2799 - No completion offered when declaring fields in a class /// @@ -1747,8 +1789,6 @@ class A }); } - - [Test()] public void TestNewInConstructor () { @@ -1920,7 +1960,7 @@ class Test "); Assert.IsNotNull (provider, "provider not found."); Assert.AreEqual (1, provider.OverloadCount, "There should be one overload"); - Assert.AreEqual (1, provider.GetParameterCount(0), "Parameter 'test' should exist"); + Assert.AreEqual (1, provider.GetParameterCount (0), "Parameter 'test' should exist"); } /// @@ -2374,7 +2414,7 @@ class MyClass2 [Test()] public void TestBug542976 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" class KeyValuePair { @@ -2424,7 +2464,7 @@ namespace TestMe [Test()] public void TestBug545189A () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" public class A { @@ -2453,7 +2493,7 @@ public class Foo [Test()] public void TestBug549864 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" delegate T MyFunc (S t); @@ -2482,7 +2522,7 @@ class TestClass [Test()] public void TestBug550185 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" public interface IMyinterface { T Foo (); @@ -2516,7 +2556,7 @@ class TestClass [Test()] public void TestBug553101 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" namespace Some.Type { @@ -2545,7 +2585,7 @@ namespace Test [Test()] public void TestBug555523A () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" class A { @@ -2592,7 +2632,7 @@ class MainClass [Test()] public void TestBug555523B () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" class A { @@ -2640,7 +2680,7 @@ class MainClass [Test()] public void TestBug561964 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" interface A1 { int A { get; } @@ -2675,7 +2715,7 @@ class Foo : IFoo [Test()] public void TestBug568204 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" public class Style { @@ -2710,7 +2750,7 @@ public class Foo [Test()] public void TestBug577225 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" using Foo; @@ -2752,7 +2792,7 @@ namespace Other [Test()] public void TestBug582017 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" class Bar { @@ -2779,7 +2819,7 @@ class Foo [Test()] public void TestBug586304 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" using System; using System.Collections.Generic; @@ -2821,7 +2861,7 @@ public class Test [Test()] public void TestBug586304B () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" public delegate S Func (T t); @@ -2861,7 +2901,7 @@ class MyClass [Test()] public void TestBug587543 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" interface ITest { @@ -2887,7 +2927,7 @@ class C [Test()] public void TestBug587549 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" public interface ITest { @@ -2925,7 +2965,7 @@ public class PrinterImpl : Printer [Test()] public void TestBug588223 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" class Lazy { public void Foo () {} } class Lazy { public void Bar () {} } @@ -2965,7 +3005,7 @@ class Test [Test()] public void TestBug592120 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" interface IBar @@ -2995,7 +3035,7 @@ class Foo [Test()] public void TestBug576354 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" delegate T Func (S s); @@ -3038,7 +3078,7 @@ class MyTest [Test()] public void TestBug534680 () { - CompletionDataList provider = CreateCtrlSpaceProvider ( + CompletionDataList provider = CreateCtrlSpaceProvider ( @" class Foo { @@ -3058,7 +3098,7 @@ class Foo [Test()] public void TestBug610006 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" class MainClass { @@ -3083,7 +3123,7 @@ class MainClass [Test()] public void TestBug614045 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @" namespace A { @@ -3122,7 +3162,7 @@ namespace B [Test()] public void TestBug615992 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateProvider ( @"public delegate void Act (T t); public class Foo @@ -3772,7 +3812,7 @@ public class Test "); Assert.IsNotNull (provider, "provider not found."); Assert.IsNotNull (provider.Find ("SomeMethod"), "method 'SomeMethod' not found."); - } + } /// /// Bug 678340 - Cannot infer types from Dictionary.Values /// @@ -4096,7 +4136,7 @@ namespace ConsoleProject ", provider => { Assert.IsNotNull (provider.Find ("ArgsNum"), "property 'ArgsNum' not found."); }); - } + } [Test()] public void TestParameterContext () @@ -4126,7 +4166,6 @@ public class TestMe Assert.IsTrue (provider == null || provider.Count == 0, "provider should be empty."); } - [Test()] public void TestParameterContextNameProposal () { @@ -4283,17 +4322,17 @@ class Test var list = new List (); for (int i = 0; i < provider.Count; i++) { - if (list.Contains (provider[i].CompletionCategory)) + if (list.Contains (provider [i].CompletionCategory)) continue; - list.Add (provider[i].CompletionCategory); + list.Add (provider [i].CompletionCategory); } Assert.AreEqual (4, list.Count); list.Sort (); - Assert.AreEqual ("CClass", list[0].DisplayText); - Assert.AreEqual ("BClass", list[1].DisplayText); - Assert.AreEqual ("AClass", list[2].DisplayText); - Assert.AreEqual ("System.Object", list[3].DisplayText); + Assert.AreEqual ("CClass", list [0].DisplayText); + Assert.AreEqual ("BClass", list [1].DisplayText); + Assert.AreEqual ("AClass", list [2].DisplayText); + Assert.AreEqual ("System.Object", list [3].DisplayText); } [Test()]