Browse Source

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
shortcuts
Daniel Grunwald 20 years ago
parent
commit
332dd9f511
  1. 20
      src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs
  2. 99
      src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs
  3. 31
      src/Main/Base/Test/GenericResolverTests.cs
  4. 6
      src/Main/StartUp/Project/Dialogs/ExceptionBox.cs
  5. 23
      src/SharpDevelop.Tests.sln

20
src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs

@ -336,14 +336,24 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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();
}
}

99
src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs

@ -43,23 +43,40 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -43,23 +43,40 @@ namespace ICSharpCode.SharpDevelop.Dom
return c;
}
bool getMembersBusy;
public override List<IMethod> GetMethods()
{
if (getMembersBusy) return new List<IMethod>();
getMembersBusy = true;
List<IMethod> l = new List<IMethod>();
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<IMethod> 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 @@ -74,22 +91,33 @@ namespace ICSharpCode.SharpDevelop.Dom
l.Add(m);
}
}
return l;
}
public override List<IProperty> GetProperties()
{
if (getMembersBusy) return new List<IProperty>();
getMembersBusy = true;
List<IProperty> l = new List<IProperty>();
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<IProperty> 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 @@ -104,28 +132,43 @@ namespace ICSharpCode.SharpDevelop.Dom
l.Add(p);
}
}
return l;
}
public override List<IField> GetFields()
{
List<IField> l = new List<IField>();
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<IField>();
getMembersBusy = true;
List<IField> l;
if (c.ClassType == ClassType.Interface) {
l = new List<IField>();
foreach (IReturnType baseType in c.BaseTypes) {
l.AddRange(baseType.GetFields());
}
} else {
IReturnType baseType = c.BaseType;
l = baseType != null ? c.BaseType.GetFields() : new List<IField>();
}
l.AddRange(c.Fields);
getMembersBusy = false;
return l;
}
public override List<IEvent> GetEvents()
{
List<IEvent> l = new List<IEvent>();
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<IEvent>();
getMembersBusy = true;
List<IEvent> l;
if (c.ClassType == ClassType.Interface) {
l = new List<IEvent>();
foreach (IReturnType baseType in c.BaseTypes) {
l.AddRange(baseType.GetEvents());
}
} else {
IReturnType baseType = c.BaseType;
l = baseType != null ? c.BaseType.GetEvents() : new List<IEvent>();
}
l.AddRange(c.Events);
getMembersBusy = false;
return l;
}

31
src/Main/Base/Test/GenericResolverTests.cs

@ -156,6 +156,37 @@ class TestClass { @@ -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<T> {
public T value;
}
class DerivedClass : BaseClass<string> {
}";
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<A,B> {
public A a;
public B b;
}
class DerivedClass<A,B> : BaseClass<B,A> {
}";
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

6
src/Main/StartUp/Project/Dialogs/ExceptionBox.cs

@ -110,10 +110,8 @@ namespace ICSharpCode.SharpDevelop @@ -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, " +

23
src/SharpDevelop.Tests.sln

@ -1,9 +1,15 @@ @@ -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 @@ -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 @@ -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}

Loading…
Cancel
Save