Browse Source

Fixed SD2-1582: Code completion lists multiple entries for partial classes

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4672 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 16 years ago
parent
commit
54848a8515
  1. 4
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs
  2. 1
      src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/ICSharpCode.SharpDevelop.Dom.Tests.csproj
  3. 101
      src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/ProjectContentClassManagementTest.cs

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

@ -255,7 +255,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -255,7 +255,7 @@ namespace ICSharpCode.SharpDevelop.Dom
/// Container class that is used when multiple classes with different type parameter
/// count have the same class name.
/// </summary>
private class GenericClassContainer : DefaultClass
private sealed class GenericClassContainer : DefaultClass
{
public GenericClassContainer(string fullyQualifiedName) : base(DefaultCompilationUnit.DummyCompilationUnit, fullyQualifiedName) {}
@ -374,6 +374,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -374,6 +374,7 @@ namespace ICSharpCode.SharpDevelop.Dom
string fullyQualifiedName = addClass.FullyQualifiedName;
IClass oldDictionaryClass;
if (GetClasses(language).TryGetValue(fullyQualifiedName, out oldDictionaryClass)) {
isReplacingExistingClass = true;
GenericClassContainer gcc = oldDictionaryClass as GenericClassContainer;
if (gcc != null) {
gcc.Set(addClass);
@ -383,7 +384,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -383,7 +384,6 @@ namespace ICSharpCode.SharpDevelop.Dom
gcc.Set(addClass);
gcc.Set(oldDictionaryClass);
addClass = gcc;
isReplacingExistingClass = true;
}
}

1
src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/ICSharpCode.SharpDevelop.Dom.Tests.csproj

@ -50,6 +50,7 @@ @@ -50,6 +50,7 @@
<Compile Include="NRefactoryRefactoringProviderTests.cs" />
<Compile Include="NUnitHelpers\SyntaxHelpers.cs" />
<Compile Include="NUnitHelpers\Constraints.cs" />
<Compile Include="ProjectContentClassManagementTest.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\NRefactory\Project\NRefactory.csproj">

101
src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/ProjectContentClassManagementTest.cs

@ -0,0 +1,101 @@ @@ -0,0 +1,101 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections;
using System.IO;
using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver;
using NUnit.Framework;
namespace ICSharpCode.SharpDevelop.Dom.Tests
{
/// <summary>
/// Tests updates to the class and namespace list.
/// </summary>
[TestFixture]
public class ProjectContentClassManagementTest
{
DefaultProjectContent pc;
[SetUp]
public void SetUp()
{
pc = new DefaultProjectContent();
}
ICompilationUnit ParseCSharp(ICompilationUnit oldUnit, string fileContent)
{
ICSharpCode.NRefactory.IParser p = ICSharpCode.NRefactory.ParserFactory.CreateParser(ICSharpCode.NRefactory.SupportedLanguage.CSharp, new StringReader(fileContent));
p.ParseMethodBodies = false;
p.Parse();
NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(pc);
visitor.VisitCompilationUnit(p.CompilationUnit, null);
Assert.AreEqual(0, p.Errors.Count, String.Format("Parse error preparing compilation unit: {0}", p.Errors.ErrorOutput));
visitor.Cu.ErrorsDuringCompile = p.Errors.Count > 0;
pc.UpdateCompilationUnit(oldUnit, visitor.Cu, null);
return visitor.Cu;
}
[Test]
public void TestEmptyProjectContent()
{
Assert.AreEqual(0, pc.Classes.Count);
Assert.AreEqual(0, pc.NamespaceNames.Count);
}
void AssertSequenceSame(IEnumerable expected, IEnumerable actual)
{
// we cannot use NUnit's AreEqual because that uses value comparison for the elements
ArrayList list1 = new ArrayList();
foreach (object o in expected) list1.Add(o);
ArrayList list2 = new ArrayList();
foreach (object o in actual) list2.Add(o);
if (list1.Count != list2.Count)
Assert.AreEqual(list1, list2); // NUnit AreEqual gives nice error message
for (int i = 0; i < list1.Count; i++) {
Assert.AreSame(list1[i], list2[i], "At index " + i);
}
}
[Test]
public void InsertClass()
{
ICompilationUnit cu = ParseCSharp(null, "class TopLevelClass {}");
Assert.AreEqual(1, pc.Classes.Count);
Assert.AreEqual(1, pc.NamespaceNames.Count);
AssertSequenceSame(cu.Classes, pc.Classes);
AssertSequenceSame(cu.Classes, pc.GetNamespaceContents(""));
}
[Test]
public void ReplaceClass()
{
ICompilationUnit cu = ParseCSharp(null, "class TopLevelClass {}");
cu = ParseCSharp(cu, "class TopLevelClass { public int NewMember; }");
Assert.AreEqual(1, pc.Classes.Count);
Assert.AreEqual(1, pc.NamespaceNames.Count);
AssertSequenceSame(cu.Classes, pc.Classes);
AssertSequenceSame(cu.Classes, pc.GetNamespaceContents(""));
}
[Test]
public void ReplacePartOfPartialClass()
{
ICompilationUnit part1 = ParseCSharp(null, "partial class PartialClass { public int Part1; }");
ICompilationUnit part2 = ParseCSharp(null, "partial class PartialClass { public int Part2; }");
part1 = ParseCSharp(part1, "partial class PartialClass { public string Part1; }");
Assert.AreEqual(1, pc.Classes.Count);
Assert.AreEqual(1, pc.NamespaceNames.Count);
CompoundClass c = (CompoundClass)pc.GetClass("PartialClass", 0);
Assert.IsNotNull(c);
AssertSequenceSame(new[] { c }, pc.Classes);
AssertSequenceSame(new[] { c }, pc.GetNamespaceContents(""));
}
}
}
Loading…
Cancel
Save