From 780205ab9df9e499491895894beae72ac4dfac22 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 9 Oct 2010 15:48:55 +0200 Subject: [PATCH] Added more TypeSystemTests and fixed 2 bugs in CecilLoader. --- .../TypeSystem/TypeSystemTests.TestCase.cs | 2 + .../TypeSystem/TypeSystemTests.cs | 60 ++++++++++++++++--- .../TypeSystem/CecilLoader.cs | 3 +- 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.TestCase.cs b/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.TestCase.cs index 52078704c8..0aa4c60a51 100644 --- a/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.TestCase.cs +++ b/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.TestCase.cs @@ -28,6 +28,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.TestCase public void DynamicGenerics3(Action param) { } public void DynamicGenerics4(Action param) { } public void DynamicGenerics5(Action param) { } + public void DynamicGenerics6(ref Action param) { } + public void DynamicGenerics7(Action param) { } } public class GenericClass where A : B diff --git a/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs b/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs index 758af7e85e..93b60b804e 100644 --- a/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs +++ b/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs @@ -72,17 +72,31 @@ namespace ICSharpCode.NRefactory.TypeSystem } [Test] - [Ignore] public void DynamicTypeInGenerics() { ITypeDefinition testClass = testCasePC.GetClass(typeof(DynamicTest)); - /*CSharpAmbience a = new CSharpAmbience(); - a.ConversionFlags = ConversionFlags.ShowReturnType | ConversionFlags.ShowParameterList; - Assert.AreEqual("List DynamicGenerics1(Action)", a.Convert(testClass.Methods.Single(me => me.Name == "DynamicGenerics1"))); - Assert.AreEqual("void DynamicGenerics2(Action)", a.Convert(testClass.Methods.Single(me => me.Name == "DynamicGenerics2"))); - Assert.AreEqual("void DynamicGenerics3(Action)", a.Convert(testClass.Methods.Single(me => me.Name == "DynamicGenerics3"))); - Assert.AreEqual("void DynamicGenerics4(Action)", a.Convert(testClass.Methods.Single(me => me.Name == "DynamicGenerics4"))); - Assert.AreEqual("void DynamicGenerics5(Action)", a.Convert(testClass.Methods.Single(me => me.Name == "DynamicGenerics5")));*/ + + IMethod m1 = testClass.Methods.Single(me => me.Name == "DynamicGenerics1"); + Assert.AreEqual("System.Collections.Generic.List`1[[dynamic]]", m1.ReturnType.Resolve(ctx).DotNetName); + Assert.AreEqual("System.Action`3[[System.Object],[dynamic[]],[System.Object]]", m1.Parameters[0].Type.Resolve(ctx).DotNetName); + + IMethod m2 = testClass.Methods.Single(me => me.Name == "DynamicGenerics2"); + Assert.AreEqual("System.Action`3[[System.Object],[dynamic],[System.Object]]", m2.Parameters[0].Type.Resolve(ctx).DotNetName); + + IMethod m3 = testClass.Methods.Single(me => me.Name == "DynamicGenerics3"); + Assert.AreEqual("System.Action`3[[System.Int32],[dynamic],[System.Object]]", m3.Parameters[0].Type.Resolve(ctx).DotNetName); + + IMethod m4 = testClass.Methods.Single(me => me.Name == "DynamicGenerics4"); + Assert.AreEqual("System.Action`3[[System.Int32[]],[dynamic],[System.Object]]", m4.Parameters[0].Type.Resolve(ctx).DotNetName); + + IMethod m5 = testClass.Methods.Single(me => me.Name == "DynamicGenerics5"); + Assert.AreEqual("System.Action`3[[System.Int32*[]],[dynamic],[System.Object]]", m5.Parameters[0].Type.Resolve(ctx).DotNetName); + + IMethod m6 = testClass.Methods.Single(me => me.Name == "DynamicGenerics6"); + Assert.AreEqual("System.Action`3[[System.Object],[dynamic],[System.Object]]&", m6.Parameters[0].Type.Resolve(ctx).DotNetName); + + IMethod m7 = testClass.Methods.Single(me => me.Name == "DynamicGenerics7"); + Assert.AreEqual("System.Action`3[[System.Int32[][,]],[dynamic],[System.Object]]", m7.Parameters[0].Type.Resolve(ctx).DotNetName); } [Test] @@ -191,5 +205,35 @@ namespace ICSharpCode.NRefactory.TypeSystem Assert.AreEqual("System.Int16", e.BaseTypes[0].Resolve(ctx).DotNetName); Assert.AreEqual(new[] { "System.Enum" }, e.GetBaseTypes(ctx).Select(t => t.DotNetName).ToArray()); } + + [Test] + public void EnumFieldsTest() + { + var e = testCasePC.GetClass(typeof(MyEnum)); + Assert.AreEqual(5, e.Fields.Count); + + foreach (IField f in e.Fields) { + Assert.IsTrue(f.IsStatic); + Assert.IsTrue(f.IsConst); + Assert.AreSame(e, f.ConstantValue.GetValueType(ctx)); + Assert.AreEqual(typeof(short), f.ConstantValue.GetValue(ctx).GetType()); + } + + Assert.AreEqual("First", e.Fields[0].Name); + Assert.AreEqual(0, e.Fields[0].ConstantValue.GetValue(ctx)); + + Assert.AreEqual("Second", e.Fields[1].Name); + Assert.AreSame(e, e.Fields[1].ConstantValue.GetValueType(ctx)); + Assert.AreEqual(1, e.Fields[1].ConstantValue.GetValue(ctx)); + + Assert.AreEqual("Flag1", e.Fields[2].Name); + Assert.AreEqual(0x10, e.Fields[2].ConstantValue.GetValue(ctx)); + + Assert.AreEqual("Flag2", e.Fields[3].Name); + Assert.AreEqual(0x20, e.Fields[3].ConstantValue.GetValue(ctx)); + + Assert.AreEqual("CombinedFlags", e.Fields[4].Name); + Assert.AreEqual(0x30, e.Fields[4].ConstantValue.GetValue(ctx)); + } } } diff --git a/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs b/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs index 780c3f0b80..517b2b99df 100644 --- a/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs +++ b/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs @@ -186,6 +186,7 @@ namespace ICSharpCode.NRefactory.TypeSystem } if (type is Mono.Cecil.ByReferenceType) { + typeIndex++; return ByReferenceTypeReference.Create( CreateType( (type as Mono.Cecil.ByReferenceType).ElementType, @@ -652,7 +653,7 @@ namespace ICSharpCode.NRefactory.TypeSystem if (method.IsConstructor) m.ReturnType = parentType; else - m.ReturnType = ReadTypeReference(method.ReturnType, typeAttributes: method, entity: m); + m.ReturnType = ReadTypeReference(method.ReturnType, typeAttributes: method.MethodReturnType, entity: m); AddAttributes(method, m); TranslateModifiers(method, m);