Browse Source

Fixed forum-9381: GetClass could return class with incorrect type parameter count.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3997 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 17 years ago
parent
commit
56339d8148
  1. 2
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ExternalToolPanel.cs
  2. 62
      src/Main/Base/Test/InnerClassesResolverTests.cs
  3. 21
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs
  4. 6
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/IProjectContent.cs

2
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ExternalToolPanel.cs

@ -153,6 +153,8 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -153,6 +153,8 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
foreach (ExternalTool tool in ((ListBox)ControlDictionary["toolListBox"]).Items) {
if (!FileUtility.IsValidPath(StringParser.Parse(tool.Command))) {
if (!Regex.IsMatch(tool.Command, @"^\$\{SdkToolPath:[\w\d]+\.exe\}$")) {
// Always treat SdkToolPath entries as valid - this allows saving the tool options
// with the default entries even when the .NET SDK is not installed.
MessageService.ShowError(String.Format("The command of tool \"{0}\" is invalid.", tool.MenuCommand));
return false;
}

62
src/Main/Base/Test/InnerClassesResolverTests.cs

@ -399,6 +399,68 @@ class Outer { protected class Inner {} } @@ -399,6 +399,68 @@ class Outer { protected class Inner {} }
return false;
}
[Test]
public void GenericInnerClassOrNonGenericOuterClass()
{
string program = @"using System;
class Test {
class TheClass<T> {}
}
class TheClass { }
";
TypeResolveResult trr = Resolve<TypeResolveResult>(program, "TheClass<string>", 3);
Assert.AreEqual("Test.TheClass", trr.ResolvedClass.FullyQualifiedName);
}
[Test]
public void GenericInnerClassOrNonGenericOuterClass2()
{
string program = @"using System;
class Test {
TheClass<string> x;
class TheClass<T> {}
}
class TheClass { }
";
MemberResolveResult rr = Resolve<MemberResolveResult>(program, "x", 3);
Assert.AreEqual("Test.TheClass", rr.ResolvedType.FullyQualifiedName);
}
[Test]
public void GenericInnerClassOrNonGenericInnerClass()
{
string program = @"using System;
class Test {
TheClass<string> x1;
TheClass x2;
Test.TheClass<string> y1;
Test.TheClass y2;
global::Test.TheClass<string> z1;
global::Test.TheClass z2;
public class TheClass { }
public class TheClass<T> {}
}
";
MemberResolveResult rr = Resolve<MemberResolveResult>(program, "x1", 3);
Assert.AreEqual(1, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count);
rr = Resolve<MemberResolveResult>(program, "y1", 3);
Assert.AreEqual(1, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count);
rr = Resolve<MemberResolveResult>(program, "z1", 3);
Assert.AreEqual(1, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count);
rr = Resolve<MemberResolveResult>(program, "x2", 3);
Assert.AreEqual(0, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count);
rr = Resolve<MemberResolveResult>(program, "y2", 3);
Assert.AreEqual(0, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count);
rr = Resolve<MemberResolveResult>(program, "z2", 3);
Assert.AreEqual(0, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count);
}
}
}

21
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs

@ -593,7 +593,12 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -593,7 +593,12 @@ namespace ICSharpCode.SharpDevelop.Dom
if ((options & GetClassOptions.LookInReferences) != 0) {
lock (referencedContents) {
foreach (IProjectContent content in referencedContents) {
IClass contentClass = content.GetClass(typeName, typeParameterCount, language, GetClassOptions.None);
// Look for the class in the referenced content.
// Don't do a inner-class search in the recursive call - one search
// done by this GetClass call is sufficient.
IClass contentClass = content.GetClass(
typeName, typeParameterCount, language,
options & ~(GetClassOptions.LookInReferences | GetClassOptions.LookForInnerClass));
if (contentClass != null) {
if (contentClass.TypeParameters.Count == typeParameterCount
&& IsAccessibleClass(contentClass))
@ -607,7 +612,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -607,7 +612,7 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
if (c != null) {
if (c != null && c.TypeParameters.Count == typeParameterCount) {
return c;
}
@ -624,7 +629,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -624,7 +629,10 @@ namespace ICSharpCode.SharpDevelop.Dom
string innerName = typeName.Substring(lastIndex + 1);
foreach (IClass innerClass in innerClasses) {
if (language.NameComparer.Equals(innerClass.Name, innerName)) {
return innerClass;
c = innerClass;
if (innerClass.TypeParameters.Count == typeParameterCount) {
return innerClass;
}
}
}
}
@ -632,7 +640,12 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -632,7 +640,12 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
}
return null;
if ((options & GetClassOptions.ExactMatch) == GetClassOptions.ExactMatch) {
return null;
} else {
// no matching class found - we'll return a class with different type paramter count
return c;
}
}
public ArrayList GetNamespaceContents(string nameSpace)

6
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/IProjectContent.cs

@ -133,6 +133,12 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -133,6 +133,12 @@ namespace ICSharpCode.SharpDevelop.Dom
/// </summary>
LookForInnerClass = 2,
/// <summary>
/// Do not return a class with the wrong type parameter count.
/// If this flag is not set, GetClass will return a class with the same name but a different
/// type parameter count if no exact match is found.
/// </summary>
ExactMatch = 4,
/// <summary>
/// Default = LookInReferences + LookForInnerClass
/// </summary>
Default = LookInReferences | LookForInnerClass

Loading…
Cancel
Save