From 332dd9f511bb4ba3de504b2504b10a8d350a17d7 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 29 Apr 2006 15:55:39 +0000 Subject: [PATCH] Fixed SD2-671: Code generation doesn't substitute generic type git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1371 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Dom/Implementations/DefaultClass.cs | 20 +++- .../Dom/Implementations/DefaultReturnType.cs | 99 +++++++++++++------ src/Main/Base/Test/GenericResolverTests.cs | 31 ++++++ .../StartUp/Project/Dialogs/ExceptionBox.cs | 6 +- src/SharpDevelop.Tests.sln | 23 ++++- 5 files changed, 141 insertions(+), 38 deletions(-) diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs index af1eebbb05..38b9d245fd 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs @@ -336,14 +336,24 @@ namespace ICSharpCode.SharpDevelop.Dom return BaseTypes[index]; } + IReturnType cachedBaseType; + public IReturnType BaseType { get { - foreach (IReturnType baseType in this.BaseTypes) { - IClass baseClass = baseType.GetUnderlyingClass(); - if (baseClass != null && baseClass.ClassType == this.ClassType) - return baseType; + if (cachedBaseType == null) { + foreach (IReturnType baseType in this.BaseTypes) { + IClass baseClass = baseType.GetUnderlyingClass(); + if (baseClass != null && baseClass.ClassType == this.ClassType) { + cachedBaseType = baseType; + break; + } + } + } + if (cachedBaseType == null) { + return GetBaseTypeByClassType(); + } else { + return cachedBaseType; } - return GetBaseTypeByClassType(); } } diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs index f78dfd5fd9..ea33b9d93b 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs @@ -43,23 +43,40 @@ namespace ICSharpCode.SharpDevelop.Dom return c; } + bool getMembersBusy; + public override List GetMethods() { + if (getMembersBusy) return new List(); + getMembersBusy = true; List l = new List(); - foreach (IClass bc in c.ClassInheritanceTree) { - if (bc.ClassType == ClassType.Interface && c.ClassType != ClassType.Interface) - continue; // ignore explicit interface implementations - - foreach (IMethod m in bc.Methods) { - // do not add base class constructors - if (m.IsConstructor && c != bc) + l.AddRange(c.Methods); + if (c.ClassType == ClassType.Interface) { + if (c.BaseTypes.Count == 0) { + AddMethodsFromBaseType(l, ReflectionReturnType.Object); + } else { + foreach (IReturnType baseType in c.BaseTypes) { + AddMethodsFromBaseType(l, baseType); + } + } + } else { + AddMethodsFromBaseType(l, c.BaseType); + } + getMembersBusy = false; + return l; + } + + void AddMethodsFromBaseType(List l, IReturnType baseType) + { + if (baseType != null) { + foreach (IMethod m in baseType.GetMethods()) { + if (m.IsConstructor) continue; - // do not add methods that were overridden bool ok = true; if (m.IsOverridable) { StringComparer comparer = m.DeclaringType.ProjectContent.Language.NameComparer; - foreach (IMethod oldMethod in l) { + foreach (IMethod oldMethod in c.Methods) { if (comparer.Equals(oldMethod.Name, m.Name)) { if (m.IsStatic == oldMethod.IsStatic) { if (DiffUtility.Compare(oldMethod.Parameters, m.Parameters) == 0) { @@ -74,22 +91,33 @@ namespace ICSharpCode.SharpDevelop.Dom l.Add(m); } } - return l; } public override List GetProperties() { + if (getMembersBusy) return new List(); + getMembersBusy = true; List l = new List(); - foreach (IClass bc in c.ClassInheritanceTree) { - if (bc.ClassType == ClassType.Interface && c.ClassType != ClassType.Interface) - continue; // ignore explicit interface implementations - - foreach (IProperty p in bc.Properties) { - // do not add methods that were overridden + l.AddRange(c.Properties); + if (c.ClassType == ClassType.Interface) { + foreach (IReturnType baseType in c.BaseTypes) { + AddPropertiesFromBaseType(l, baseType); + } + } else { + AddPropertiesFromBaseType(l, c.BaseType); + } + getMembersBusy = false; + return l; + } + + void AddPropertiesFromBaseType(List l, IReturnType baseType) + { + if (baseType != null) { + foreach (IProperty p in baseType.GetProperties()) { bool ok = true; if (p.IsOverridable) { StringComparer comparer = p.DeclaringType.ProjectContent.Language.NameComparer; - foreach (IProperty oldProperty in l) { + foreach (IProperty oldProperty in c.Properties) { if (comparer.Equals(oldProperty.Name, p.Name)) { if (p.IsStatic == oldProperty.IsStatic) { if (DiffUtility.Compare(oldProperty.Parameters, p.Parameters) == 0) { @@ -104,28 +132,43 @@ namespace ICSharpCode.SharpDevelop.Dom l.Add(p); } } - return l; } public override List GetFields() { - List l = new List(); - foreach (IClass bc in c.ClassInheritanceTree) { - if (bc.ClassType == ClassType.Interface && c.ClassType != ClassType.Interface) - continue; // ignore explicit interface implementations - l.AddRange(bc.Fields); + if (getMembersBusy) return new List(); + getMembersBusy = true; + List l; + if (c.ClassType == ClassType.Interface) { + l = new List(); + foreach (IReturnType baseType in c.BaseTypes) { + l.AddRange(baseType.GetFields()); + } + } else { + IReturnType baseType = c.BaseType; + l = baseType != null ? c.BaseType.GetFields() : new List(); } + l.AddRange(c.Fields); + getMembersBusy = false; return l; } public override List GetEvents() { - List l = new List(); - foreach (IClass bc in c.ClassInheritanceTree) { - if (bc.ClassType == ClassType.Interface && c.ClassType != ClassType.Interface) - continue; // ignore explicit interface implementations - l.AddRange(bc.Events); + if (getMembersBusy) return new List(); + getMembersBusy = true; + List l; + if (c.ClassType == ClassType.Interface) { + l = new List(); + foreach (IReturnType baseType in c.BaseTypes) { + l.AddRange(baseType.GetEvents()); + } + } else { + IReturnType baseType = c.BaseType; + l = baseType != null ? c.BaseType.GetEvents() : new List(); } + l.AddRange(c.Events); + getMembersBusy = false; return l; } diff --git a/src/Main/Base/Test/GenericResolverTests.cs b/src/Main/Base/Test/GenericResolverTests.cs index 0fbd070815..06ea629f7f 100644 --- a/src/Main/Base/Test/GenericResolverTests.cs +++ b/src/Main/Base/Test/GenericResolverTests.cs @@ -156,6 +156,37 @@ class TestClass { LocalResolveResult lr = Resolve(program, "a", 5) as LocalResolveResult; Assert.AreEqual("System.Collections.Generic.List{System.String}", lr.ResolvedType.DotNetName, "a"); } + + [Test] + public void InheritFromGenericClass() + { + string program = @"using System; +class BaseClass { + public T value; +} +class DerivedClass : BaseClass { + +}"; + MemberResolveResult rr = Resolve(program, "value", 6) as MemberResolveResult; + Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName); + } + + [Test] + public void CrossTypeParametersInheritance() + { + string program = @"using System; +class BaseClass { + public A a; + public B b; +} +class DerivedClass : BaseClass { + +}"; + MemberResolveResult rr = Resolve(program, "a", 7) as MemberResolveResult; + Assert.AreEqual("B", rr.ResolvedType.Name); + rr = Resolve(program, "b", 7) as MemberResolveResult; + Assert.AreEqual("A", rr.ResolvedType.Name); + } #endregion #region CodeCompletion inside generic classes diff --git a/src/Main/StartUp/Project/Dialogs/ExceptionBox.cs b/src/Main/StartUp/Project/Dialogs/ExceptionBox.cs index 3a6afe41db..4d505182d2 100644 --- a/src/Main/StartUp/Project/Dialogs/ExceptionBox.cs +++ b/src/Main/StartUp/Project/Dialogs/ExceptionBox.cs @@ -110,10 +110,8 @@ namespace ICSharpCode.SharpDevelop { CopyInfoToClipboard(); - StartUrl("http://community.sharpdevelop.net/forums/23/ShowForum.aspx"); - - //Version v = Assembly.GetEntryAssembly().GetName().Version; - //StartUrl("http://www.icsharpcode.net/OpenSource/SD/BugReporting.aspx?version=" + v.Major + "." + v.Minor + "." + v.Revision + "." + v.Build); + Version v = Assembly.GetEntryAssembly().GetName().Version; + StartUrl("http://www.icsharpcode.net/OpenSource/SD/BugReporting.aspx?version=" + v.Major + "." + v.Minor + "." + v.Revision + "." + v.Build); /* string text = "This version of SharpDevelop is an internal build, " + diff --git a/src/SharpDevelop.Tests.sln b/src/SharpDevelop.Tests.sln index 714bb3111f..6df16f1a5f 100644 --- a/src/SharpDevelop.Tests.sln +++ b/src/SharpDevelop.Tests.sln @@ -1,9 +1,15 @@ Microsoft Visual Studio Solution File, Format Version 9.00 -# SharpDevelop 2.0.0.1084 +# SharpDevelop 2.1.0.1340 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{14A277EE-7DF1-4529-B639-7D1EF334C1C5}" ProjectSection(SolutionItems) = postProject EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "AddIns\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding.Tests", "AddIns\BackendBindings\Boo\BooBinding\Test\BooBinding.Tests.csproj", "{6FA16499-896F-4C02-BB43-1AF5C6C7C713}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "AddIns\BackendBindings\Boo\BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NAntAddIn.Tests", "AddIns\Misc\NAntAddIn\Test\NAntAddIn.Tests.csproj", "{13AB8351-39E5-4F9D-A59C-B30D60CF6B8C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NAntAddIn", "AddIns\Misc\NAntAddIn\Project\NAntAddIn.csproj", "{1DB3CAD2-38E8-4C5E-8E1B-0E37B1A5C006}" @@ -206,6 +212,18 @@ Global {1F261725-6318-4434-A1B1-6C70CE4CD324}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1F261725-6318-4434-A1B1-6C70CE4CD324}.Release|Any CPU.Build.0 = Release|Any CPU {1F261725-6318-4434-A1B1-6C70CE4CD324}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4AC2D5F1-F671-480C-A075-6BF62B3721B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4AC2D5F1-F671-480C-A075-6BF62B3721B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4AC2D5F1-F671-480C-A075-6BF62B3721B2}.Release|Any CPU.Build.0 = Release|Any CPU + {4AC2D5F1-F671-480C-A075-6BF62B3721B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Release|Any CPU.Build.0 = Release|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}.Release|Any CPU.Build.0 = Release|Any CPU + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -225,6 +243,9 @@ Global {1F261725-6318-4434-A1B1-6C70CE4CD324} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} {1DB3CAD2-38E8-4C5E-8E1B-0E37B1A5C006} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} {13AB8351-39E5-4F9D-A59C-B30D60CF6B8C} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} + {4AC2D5F1-F671-480C-A075-6BF62B3721B2} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} + {6FA16499-896F-4C02-BB43-1AF5C6C7C713} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} {B08385CD-F0CC-488C-B4F4-EEB34B6D2688} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D} {1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D} {EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}