Browse Source

Fixed failing unit test.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
93bea6d4d1
  1. 23
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 6
      ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs
  3. 11
      ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
  4. 125
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

23
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -307,12 +307,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
case "=": case "=":
case "==": case "==":
GetPreviousToken (ref tokenIndex, false); GetPreviousToken (ref tokenIndex, false);
var expressionOrVariableDeclaration = GetExpressionAt (tokenIndex); var expressionOrVariableDeclaration = GetExpressionAt (tokenIndex);
if (expressionOrVariableDeclaration == null) if (expressionOrVariableDeclaration == null)
return null; return null;
resolveResult = ResolveExpression (expressionOrVariableDeclaration.Item1, expressionOrVariableDeclaration.Item2, expressionOrVariableDeclaration.Item3); resolveResult = ResolveExpression (expressionOrVariableDeclaration.Item1, expressionOrVariableDeclaration.Item2, expressionOrVariableDeclaration.Item3);
if (resolveResult == null) if (resolveResult == null)
return null; return null;
if (resolveResult.Item1.Type.Kind == TypeKind.Enum) { 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 (n is Identifier && n.Parent is ForeachStatement) {
if (controlSpace) if (controlSpace)
return DefaultControlSpaceItems (); return DefaultControlSpaceItems ();

6
ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs

@ -195,11 +195,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
invoke = GetTypeBeforeCursor (); invoke = GetTypeBeforeCursor ();
if (invoke == null) if (invoke == null)
return null; return null;
var typeExpression = ResolveExpression (invoke.Item1, invoke.Item2, invoke.Item3); var tExpr = ResolveExpression (invoke.Item1, invoke.Item2, invoke.Item3);
if (typeExpression == null || typeExpression.Item1 == null || typeExpression.Item1.IsError) if (tExpr == null || tExpr.Item1 == null || tExpr.Item1.IsError)
return null; return null;
return factory.CreateTypeParameterDataProvider (CollectAllTypes (typeExpression.Item1.Type)); return factory.CreateTypeParameterDataProvider (CollectAllTypes (tExpr.Item1.Type));
case '[': case '[':
invoke = GetIndexerBeforeCursor (); invoke = GetIndexerBeforeCursor ();
if (invoke == null) if (invoke == null)

11
ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs

@ -190,6 +190,17 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
MemberType result = new MemberType(); MemberType result = new MemberType();
if (typeDef.DeclaringTypeDefinition != null) { 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 // Handle nested types
result.Target = ConvertTypeHelper(typeDef.DeclaringTypeDefinition, typeArguments); result.Target = ConvertTypeHelper(typeDef.DeclaringTypeDefinition, typeArguments);
} else { } else {

125
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

@ -25,7 +25,6 @@
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// //
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
@ -41,7 +40,6 @@ using System.Diagnostics;
using System.Text; using System.Text;
using ICSharpCode.NRefactory.CSharp.TypeSystem; using ICSharpCode.NRefactory.CSharp.TypeSystem;
namespace ICSharpCode.NRefactory.CSharp.CodeCompletion namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
{ {
[TestFixture()] [TestFixture()]
@ -70,9 +68,11 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
act (provider); act (provider);
} }
class TestFactory : ICompletionDataFactory class TestFactory
: ICompletionDataFactory
{ {
class CompletionData : ICompletionData class CompletionData
: ICompletionData
{ {
#region ICompletionData implementation #region ICompletionData implementation
public void AddOverload (ICompletionData data) 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."); Assert.IsNotNull (provider.Find ("ReferenceEquals"), "Method 'System.Object.ReferenceEquals' not found.");
} }
class TestLocVisitor : ICSharpCode.NRefactory.CSharp.DepthFirstAstVisitor<object, object> class TestLocVisitor
: ICSharpCode.NRefactory.CSharp.DepthFirstAstVisitor<object, object>
{ {
public List<Tuple<TextLocation, string>> output = new List<Tuple<TextLocation, string>> (); public List<Tuple<TextLocation, string>> output = new List<Tuple<TextLocation, string>> ();
@ -331,7 +332,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
int exceptions = 0; int exceptions = 0;
int i = 0; int i = 0;
foreach (var file in Directory.EnumerateFiles ("/Users/mike/work/mono/mcs/tests", "*.cs")) { foreach (var file in Directory.EnumerateFiles ("/Users/mike/work/mono/mcs/tests", "*.cs")) {
if (i++>2) if (i++ > 2)
break; break;
if (i <= 2) if (i <= 2)
continue; continue;
@ -352,7 +353,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
} }
} }
} catch (Exception e) { } catch (Exception e) {
Console.WriteLine ("Exception in:" +file); Console.WriteLine ("Exception in:" + file);
exceptions++; exceptions++;
} }
} }
@ -362,7 +363,6 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
if (missing > 0) if (missing > 0)
Assert.Fail (); Assert.Fail ();
} }
[Test()] [Test()]
public void TestSimpleCodeCompletion () public void TestSimpleCodeCompletion ()
@ -384,6 +384,7 @@ void TestMethod ()
Assert.IsNotNull (provider.Find ("TM2")); Assert.IsNotNull (provider.Find ("TM2"));
Assert.IsNotNull (provider.Find ("TF1")); Assert.IsNotNull (provider.Find ("TF1"));
} }
[Test()] [Test()]
public void TestSimpleInterfaceCodeCompletion () public void TestSimpleInterfaceCodeCompletion ()
{ {
@ -1680,7 +1681,6 @@ class A
}); });
} }
[Test()] [Test()]
public void TestBug2800B () public void TestBug2800B ()
{ {
@ -1717,6 +1717,48 @@ class A
}); });
} }
/// <summary>
/// Bug 2798 - Unnecessary namespace qualification being prepended
/// </summary>
[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.");
});
}
/// <summary> /// <summary>
/// Bug 2799 - No completion offered when declaring fields in a class /// Bug 2799 - No completion offered when declaring fields in a class
/// </summary> /// </summary>
@ -1747,8 +1789,6 @@ class A
}); });
} }
[Test()] [Test()]
public void TestNewInConstructor () public void TestNewInConstructor ()
{ {
@ -1920,7 +1960,7 @@ class Test
"); ");
Assert.IsNotNull (provider, "provider not found."); Assert.IsNotNull (provider, "provider not found.");
Assert.AreEqual (1, provider.OverloadCount, "There should be one overload"); 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");
} }
/// <summary> /// <summary>
@ -2374,7 +2414,7 @@ class MyClass2
[Test()] [Test()]
public void TestBug542976 () public void TestBug542976 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
class KeyValuePair<S, T> class KeyValuePair<S, T>
{ {
@ -2424,7 +2464,7 @@ namespace TestMe
[Test()] [Test()]
public void TestBug545189A () public void TestBug545189A ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
public class A<T> public class A<T>
{ {
@ -2453,7 +2493,7 @@ public class Foo
[Test()] [Test()]
public void TestBug549864 () public void TestBug549864 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
delegate T MyFunc<S, T> (S t); delegate T MyFunc<S, T> (S t);
@ -2482,7 +2522,7 @@ class TestClass
[Test()] [Test()]
public void TestBug550185 () public void TestBug550185 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
public interface IMyinterface<T> { public interface IMyinterface<T> {
T Foo (); T Foo ();
@ -2516,7 +2556,7 @@ class TestClass
[Test()] [Test()]
public void TestBug553101 () public void TestBug553101 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
namespace Some.Type namespace Some.Type
{ {
@ -2545,7 +2585,7 @@ namespace Test
[Test()] [Test()]
public void TestBug555523A () public void TestBug555523A ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
class A class A
{ {
@ -2592,7 +2632,7 @@ class MainClass
[Test()] [Test()]
public void TestBug555523B () public void TestBug555523B ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
class A class A
{ {
@ -2640,7 +2680,7 @@ class MainClass
[Test()] [Test()]
public void TestBug561964 () public void TestBug561964 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
interface A1 { interface A1 {
int A { get; } int A { get; }
@ -2675,7 +2715,7 @@ class Foo : IFoo
[Test()] [Test()]
public void TestBug568204 () public void TestBug568204 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
public class Style public class Style
{ {
@ -2710,7 +2750,7 @@ public class Foo
[Test()] [Test()]
public void TestBug577225 () public void TestBug577225 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
using Foo; using Foo;
@ -2752,7 +2792,7 @@ namespace Other
[Test()] [Test()]
public void TestBug582017 () public void TestBug582017 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
class Bar class Bar
{ {
@ -2779,7 +2819,7 @@ class Foo
[Test()] [Test()]
public void TestBug586304 () public void TestBug586304 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -2821,7 +2861,7 @@ public class Test
[Test()] [Test()]
public void TestBug586304B () public void TestBug586304B ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
public delegate S Func<T, S> (T t); public delegate S Func<T, S> (T t);
@ -2861,7 +2901,7 @@ class MyClass
[Test()] [Test()]
public void TestBug587543 () public void TestBug587543 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
interface ITest interface ITest
{ {
@ -2887,7 +2927,7 @@ class C
[Test()] [Test()]
public void TestBug587549 () public void TestBug587549 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
public interface ITest public interface ITest
{ {
@ -2925,7 +2965,7 @@ public class PrinterImpl : Printer
[Test()] [Test()]
public void TestBug588223 () public void TestBug588223 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
class Lazy<T> { public void Foo () {} } class Lazy<T> { public void Foo () {} }
class Lazy<T, S> { public void Bar () {} } class Lazy<T, S> { public void Bar () {} }
@ -2965,7 +3005,7 @@ class Test
[Test()] [Test()]
public void TestBug592120 () public void TestBug592120 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
interface IBar interface IBar
@ -2995,7 +3035,7 @@ class Foo
[Test()] [Test()]
public void TestBug576354 () public void TestBug576354 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
delegate T Func<S, T> (S s); delegate T Func<S, T> (S s);
@ -3038,7 +3078,7 @@ class MyTest
[Test()] [Test()]
public void TestBug534680 () public void TestBug534680 ()
{ {
CompletionDataList provider = CreateCtrlSpaceProvider ( CompletionDataList provider = CreateCtrlSpaceProvider (
@" @"
class Foo class Foo
{ {
@ -3058,7 +3098,7 @@ class Foo
[Test()] [Test()]
public void TestBug610006 () public void TestBug610006 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
class MainClass class MainClass
{ {
@ -3083,7 +3123,7 @@ class MainClass
[Test()] [Test()]
public void TestBug614045 () public void TestBug614045 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@" @"
namespace A namespace A
{ {
@ -3122,7 +3162,7 @@ namespace B
[Test()] [Test()]
public void TestBug615992 () public void TestBug615992 ()
{ {
CompletionDataList provider = CreateProvider ( CompletionDataList provider = CreateProvider (
@"public delegate void Act<T> (T t); @"public delegate void Act<T> (T t);
public class Foo public class Foo
@ -3772,7 +3812,7 @@ public class Test
"); ");
Assert.IsNotNull (provider, "provider not found."); Assert.IsNotNull (provider, "provider not found.");
Assert.IsNotNull (provider.Find ("SomeMethod"), "method 'SomeMethod' not found."); Assert.IsNotNull (provider.Find ("SomeMethod"), "method 'SomeMethod' not found.");
} }
/// <summary> /// <summary>
/// Bug 678340 - Cannot infer types from Dictionary<K,V>.Values /// Bug 678340 - Cannot infer types from Dictionary<K,V>.Values
/// </summary> /// </summary>
@ -4096,7 +4136,7 @@ namespace ConsoleProject
", provider => { ", provider => {
Assert.IsNotNull (provider.Find ("ArgsNum"), "property 'ArgsNum' not found."); Assert.IsNotNull (provider.Find ("ArgsNum"), "property 'ArgsNum' not found.");
}); });
} }
[Test()] [Test()]
public void TestParameterContext () public void TestParameterContext ()
@ -4126,7 +4166,6 @@ public class TestMe
Assert.IsTrue (provider == null || provider.Count == 0, "provider should be empty."); Assert.IsTrue (provider == null || provider.Count == 0, "provider should be empty.");
} }
[Test()] [Test()]
public void TestParameterContextNameProposal () public void TestParameterContextNameProposal ()
{ {
@ -4283,17 +4322,17 @@ class Test
var list = new List<CompletionCategory> (); var list = new List<CompletionCategory> ();
for (int i = 0; i < provider.Count; i++) { for (int i = 0; i < provider.Count; i++) {
if (list.Contains (provider[i].CompletionCategory)) if (list.Contains (provider [i].CompletionCategory))
continue; continue;
list.Add (provider[i].CompletionCategory); list.Add (provider [i].CompletionCategory);
} }
Assert.AreEqual (4, list.Count); Assert.AreEqual (4, list.Count);
list.Sort (); list.Sort ();
Assert.AreEqual ("CClass", list[0].DisplayText); Assert.AreEqual ("CClass", list [0].DisplayText);
Assert.AreEqual ("BClass", list[1].DisplayText); Assert.AreEqual ("BClass", list [1].DisplayText);
Assert.AreEqual ("AClass", list[2].DisplayText); Assert.AreEqual ("AClass", list [2].DisplayText);
Assert.AreEqual ("System.Object", list[3].DisplayText); Assert.AreEqual ("System.Object", list [3].DisplayText);
} }
[Test()] [Test()]

Loading…
Cancel
Save