Browse Source

Implement EnvDTE.CodeClass.AddVariable.

pull/28/head
Matt Ward 14 years ago
parent
commit
6e460e179f
  1. 4
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 91
      src/AddIns/Misc/PackageManagement/Project/Src/ClassCodeGenerator.cs
  3. 15
      src/AddIns/Misc/PackageManagement/Project/Src/DocumentLoader.cs
  4. 3
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs
  5. 6
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/EditPoint.cs
  6. 4
      src/AddIns/Misc/PackageManagement/Project/Src/IDocumentLoader.cs
  7. 15
      src/AddIns/Misc/PackageManagement/Project/Src/IRefactoringDocumentView.cs
  8. 39
      src/AddIns/Misc/PackageManagement/Project/Src/RefactoringDocumentView.cs
  9. 30
      src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafeDocument.cs
  10. 70
      src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafeDocumentLine.cs
  11. 8
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  12. 179
      src/AddIns/Misc/PackageManagement/Test/Src/ClassCodeGeneratorTests.cs
  13. 38
      src/AddIns/Misc/PackageManagement/Test/Src/CodeGeneratorTests.cs
  14. 8
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/EditPointTests.cs
  15. 18
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs
  16. 36
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CompilationUnitHelper.cs
  17. 34
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeCodeGenerator.cs
  18. 6
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FieldHelper.cs

4
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -70,6 +70,7 @@ @@ -70,6 +70,7 @@
</Compile>
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\AcceptLicensesEventArgs.cs" />
<Compile Include="Src\ClassCodeGenerator.cs" />
<Compile Include="Src\ConfigSettingsFileSystem.cs" />
<Compile Include="Src\Design\DesignTimeSelectProjectsViewModel.cs" />
<Compile Include="Src\Design\FakePackageOperation.cs" />
@ -124,6 +125,7 @@ @@ -124,6 +125,7 @@
<Compile Include="Src\EnvDTE\vsCMInfoLocation.cs" />
<Compile Include="Src\EnvDTE\vsCMPropertyKind.cs" />
<Compile Include="Src\EnvDTE\vsEPReplaceTextOptions.cs" />
<Compile Include="Src\IRefactoringDocumentView.cs" />
<Compile Include="Src\IFieldExtensions.cs" />
<Compile Include="Src\IDocumentLoader.cs" />
<Compile Include="Src\IMethodOrPropertyExtensions.cs" />
@ -220,6 +222,7 @@ @@ -220,6 +222,7 @@
<Compile Include="Src\ProjectBrowserRefresher.cs" />
<Compile Include="Src\ProjectTemplatePackageRepositoryCache.cs" />
<Compile Include="Src\ProjectTemplatePackagesSettingsFileName.cs" />
<Compile Include="Src\RefactoringDocumentView.cs" />
<Compile Include="Src\RegisteredPackageRepositories.cs" />
<Compile Include="Src\ManagePackagesView.cs">
<DependentUpon>ManagePackagesView.xaml</DependentUpon>
@ -370,6 +373,7 @@ @@ -370,6 +373,7 @@
<Compile Include="Src\Scripting\RunPackageScriptsAction.cs" />
<Compile Include="Src\SolutionPackageRepository.cs" />
<Compile Include="Src\ThreadSafeDocument.cs" />
<Compile Include="Src\ThreadSafeDocumentLine.cs" />
<Compile Include="Src\ThreadSafePackageManagementEvents.cs" />
<Compile Include="Src\UninstallPackageAction.cs" />
<Compile Include="Src\UpdateAllPackagesInProject.cs" />

91
src/AddIns/Misc/PackageManagement/Project/Src/ClassCodeGenerator.cs

@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
namespace ICSharpCode.PackageManagement
{
public class ClassCodeGenerator
{
public ClassCodeGenerator(IClass c)
: this(c, new DocumentLoader())
{
}
public ClassCodeGenerator(IClass c, IDocumentLoader documentLoader)
{
this.Class = c;
this.DocumentLoader = documentLoader;
}
IClass Class { get; set; }
IDocumentLoader DocumentLoader { get; set; }
ICompilationUnit CompilationUnit {
get { return Class.CompilationUnit; }
}
public CodeVariable AddPublicVariable(string name, string type)
{
CodeGenerator codeGenerator = GetCodeGenerator();
IRefactoringDocumentView view = LoadClassDocumentView();
codeGenerator.InsertCodeAtEnd(Class.Region, view.RefactoringDocument, CreateField(name, type));
return GetVariableInserted(view);
}
CodeGenerator GetCodeGenerator()
{
return CompilationUnit.Language.CodeGenerator;
}
IRefactoringDocumentView LoadClassDocumentView()
{
return DocumentLoader.LoadRefactoringDocumentView(CompilationUnit.FileName);
}
FieldDeclaration CreateField(string name, string type)
{
return new FieldDeclaration(new List<AttributeSection>()) {
TypeReference = new TypeReference(type),
Modifier = Modifiers.Public,
Fields = CreateVariableDeclarations(name)
};
}
List<VariableDeclaration> CreateVariableDeclarations(string name)
{
var variables = new List<VariableDeclaration>();
variables.Add(new VariableDeclaration(name));
return variables;
}
CodeVariable GetVariableInserted(IRefactoringDocumentView view)
{
IField field = FindField(view);
return new CodeVariable(field);
}
IField FindField(IRefactoringDocumentView view)
{
ICompilationUnit unit = view.Parse();
IClass matchedClass = FindMatchingClass(unit);
return matchedClass.Fields.Last();
}
IClass FindMatchingClass(ICompilationUnit unit)
{
foreach (IClass c in unit.Classes) {
if (c.FullyQualifiedName == Class.FullyQualifiedName) {
return c;
}
}
return null;
}
}
}

15
src/AddIns/Misc/PackageManagement/Project/Src/DocumentLoader.cs

@ -2,21 +2,24 @@ @@ -2,21 +2,24 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.PackageManagement
{
public class DocumentLoader : IDocumentLoader
{
public IDocument LoadDocument(string fileName)
public IRefactoringDocument LoadRefactoringDocument(string fileName)
{
return LoadRefactoringDocumentView(fileName).RefactoringDocument;
}
public IRefactoringDocumentView LoadRefactoringDocumentView(string fileName)
{
if (WorkbenchSingleton.InvokeRequired) {
return WorkbenchSingleton.SafeThreadFunction(() => LoadDocument(fileName));
return WorkbenchSingleton.SafeThreadFunction(() => LoadRefactoringDocumentView(fileName));
} else {
var textEditorProvider = FileService.OpenFile(fileName) as ITextEditorProvider;
return new ThreadSafeDocument(textEditorProvider.TextEditor.Document);
return new RefactoringDocumentView(fileName);
}
}
}

3
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs

@ -27,7 +27,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -27,7 +27,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public virtual CodeVariable AddVariable(string name, object type, object Position = null, vsCMAccess Access = vsCMAccess.vsCMAccessPublic, object Location = null)
{
throw new NotImplementedException();
var codeGenerator = new ClassCodeGenerator(Class);
return codeGenerator.AddPublicVariable(name, (string)type);
}
}
}

6
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/EditPoint.cs

@ -3,13 +3,13 @@ @@ -3,13 +3,13 @@
using System;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class EditPoint : TextPoint
{
IDocument document;
IRefactoringDocument document;
internal EditPoint(FilePosition filePosition, IDocumentLoader documentLoader)
: base(filePosition, documentLoader)
@ -31,7 +31,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -31,7 +31,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
void OpenDocument()
{
document = DocumentLoader.LoadDocument(FilePosition.FileName);
document = DocumentLoader.LoadRefactoringDocument(FilePosition.FileName);
}
int GetStartOffset()

4
src/AddIns/Misc/PackageManagement/Project/Src/IDocumentLoader.cs

@ -2,12 +2,14 @@ @@ -2,12 +2,14 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
using ICSharpCode.SharpDevelop.Editor;
namespace ICSharpCode.PackageManagement
{
public interface IDocumentLoader
{
IDocument LoadDocument(string fileName);
IRefactoringDocument LoadRefactoringDocument(string fileName);
IRefactoringDocumentView LoadRefactoringDocumentView(string fileName);
}
}

15
src/AddIns/Misc/PackageManagement/Project/Src/IRefactoringDocumentView.cs

@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
namespace ICSharpCode.PackageManagement
{
public interface IRefactoringDocumentView
{
IRefactoringDocument RefactoringDocument { get; }
ICompilationUnit Parse();
}
}

39
src/AddIns/Misc/PackageManagement/Project/Src/RefactoringDocumentView.cs

@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.PackageManagement
{
public class RefactoringDocumentView : IRefactoringDocumentView
{
IViewContent view;
public RefactoringDocumentView(string fileName)
{
view = FileService.OpenFile(fileName);
RefactoringDocument = LoadDocument();
}
IRefactoringDocument LoadDocument()
{
var textEditorProvider = view as ITextEditorProvider;
return new RefactoringDocumentAdapter(new ThreadSafeDocument(textEditorProvider.TextEditor.Document));
}
public IRefactoringDocument RefactoringDocument { get; private set; }
public ICompilationUnit Parse()
{
if (WorkbenchSingleton.InvokeRequired) {
return WorkbenchSingleton.SafeThreadFunction(() => Parse());
}
return ParserService.ParseViewContent(view).CompilationUnit;
}
}
}

30
src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafeDocument.cs

@ -36,7 +36,10 @@ namespace ICSharpCode.PackageManagement @@ -36,7 +36,10 @@ namespace ICSharpCode.PackageManagement
public int TotalNumberOfLines {
get {
throw new NotImplementedException();
if (WorkbenchSingleton.InvokeRequired) {
return WorkbenchSingleton.SafeThreadFunction(() => TotalNumberOfLines);
}
return document.TotalNumberOfLines;
}
}
@ -48,13 +51,19 @@ namespace ICSharpCode.PackageManagement @@ -48,13 +51,19 @@ namespace ICSharpCode.PackageManagement
public int TextLength {
get {
throw new NotImplementedException();
if (WorkbenchSingleton.InvokeRequired) {
return WorkbenchSingleton.SafeThreadFunction(() => TextLength);
}
return document.TextLength;
}
}
public IDocumentLine GetLine(int lineNumber)
{
throw new NotImplementedException();
if (WorkbenchSingleton.InvokeRequired) {
return WorkbenchSingleton.SafeThreadFunction(() => GetLine(lineNumber));
}
return new ThreadSafeDocumentLine(document.GetLine(lineNumber));
}
public IDocumentLine GetLineForOffset(int offset)
@ -66,9 +75,8 @@ namespace ICSharpCode.PackageManagement @@ -66,9 +75,8 @@ namespace ICSharpCode.PackageManagement
{
if (WorkbenchSingleton.InvokeRequired) {
return WorkbenchSingleton.SafeThreadFunction(() => PositionToOffset(line, column));
} else {
return document.PositionToOffset(line, column);
}
return document.PositionToOffset(line, column);
}
public Location OffsetToPosition(int offset)
@ -78,7 +86,11 @@ namespace ICSharpCode.PackageManagement @@ -78,7 +86,11 @@ namespace ICSharpCode.PackageManagement
public void Insert(int offset, string text)
{
throw new NotImplementedException();
if (WorkbenchSingleton.InvokeRequired) {
WorkbenchSingleton.SafeThreadAsyncCall(() => Insert(offset, text));
} else {
document.Insert(offset, text);
}
}
public void Insert(int offset, string text, AnchorMovementType defaultAnchorMovementType)
@ -88,7 +100,11 @@ namespace ICSharpCode.PackageManagement @@ -88,7 +100,11 @@ namespace ICSharpCode.PackageManagement
public void Remove(int offset, int length)
{
throw new NotImplementedException();
if (WorkbenchSingleton.InvokeRequired) {
WorkbenchSingleton.SafeThreadAsyncCall(() => Remove(offset, length));
} else {
document.Remove(offset, length);
}
}
public void Replace(int offset, int length, string newText)

70
src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafeDocumentLine.cs

@ -0,0 +1,70 @@ @@ -0,0 +1,70 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.PackageManagement
{
public class ThreadSafeDocumentLine : IDocumentLine
{
IDocumentLine line;
public ThreadSafeDocumentLine(IDocumentLine line)
{
this.line = line;
}
public int Offset {
get {
if (WorkbenchSingleton.InvokeRequired) {
return WorkbenchSingleton.SafeThreadFunction(() => Offset);
}
return line.Offset;
}
}
public int Length {
get {
if (WorkbenchSingleton.InvokeRequired) {
return WorkbenchSingleton.SafeThreadFunction(() => Length);
}
return line.Length;
}
}
public int EndOffset {
get {
throw new NotImplementedException();
}
}
public int TotalLength {
get {
throw new NotImplementedException();
}
}
public int DelimiterLength {
get {
throw new NotImplementedException();
}
}
public int LineNumber {
get {
throw new NotImplementedException();
}
}
public string Text {
get {
if (WorkbenchSingleton.InvokeRequired) {
return WorkbenchSingleton.SafeThreadFunction(() => Text);
}
return line.Text;
}
}
}
}

8
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -72,6 +72,8 @@ @@ -72,6 +72,8 @@
<Compile Include="..\..\..\..\Main\GlobalAssemblyInfo.cs">
<Link>Properties\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Src\ClassCodeGeneratorTests.cs" />
<Compile Include="Src\CodeGeneratorTests.cs" />
<Compile Include="Src\EnvDTE\CodeAttribute2Tests.cs" />
<Compile Include="Src\EnvDTE\CodeAttributesTests.cs" />
<Compile Include="Src\EnvDTE\CodeClass2Tests.cs" />
@ -93,6 +95,8 @@ @@ -93,6 +95,8 @@
<Compile Include="Src\Helpers\AttributeHelper.cs" />
<Compile Include="Src\Helpers\ClassHelper.cs" />
<Compile Include="Src\Helpers\CodeElementsExtensions.cs" />
<Compile Include="Src\Helpers\CompilationUnitHelper.cs" />
<Compile Include="Src\Helpers\FakeCodeGenerator.cs" />
<Compile Include="Src\Helpers\FieldHelper.cs" />
<Compile Include="Src\Helpers\FakeSelectProjectsService.cs" />
<Compile Include="Src\Helpers\FakeSolutionPackageRepositoryFactory.cs" />
@ -306,6 +310,10 @@ @@ -306,6 +310,10 @@
<Project>{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}</Project>
<Name>ICSharpCode.AvalonEdit</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Libraries\NRefactory\Project\NRefactory.csproj">
<Project>{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}</Project>
<Name>NRefactory</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name>

179
src/AddIns/Misc/PackageManagement/Test/Src/ClassCodeGeneratorTests.cs

@ -0,0 +1,179 @@ @@ -0,0 +1,179 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
using Rhino.Mocks;
namespace PackageManagement.Tests
{
[TestFixture]
public class ClassCodeGeneratorTests
{
ClassHelper helper;
ClassCodeGenerator codeGenerator;
CodeVariable codeVariable;
IDocumentLoader documentLoader;
IRefactoringDocument document;
FakeCodeGenerator fakeCodeGenerator;
IRefactoringDocumentView documentView;
[SetUp]
public void Init()
{
helper = new ClassHelper();
document = MockRepository.GenerateStub<IRefactoringDocument>();
documentView = MockRepository.GenerateStub<IRefactoringDocumentView>();
documentLoader = MockRepository.GenerateStub<IDocumentLoader>();
fakeCodeGenerator = helper.CompilationUnitHelper.FakeCodeGenerator;
}
void CreateClass(string name)
{
helper.CreatePublicClass(name);
}
void CreateCodeGenerator()
{
codeGenerator = new ClassCodeGenerator(helper.Class, documentLoader);
}
void SetClassFileName(string fileName)
{
helper.SetClassFileName(fileName);
}
void SetDocumentFileName(string fileName)
{
documentView.Stub(view => view.RefactoringDocument).Return(document);
documentLoader.Stub(loader => loader.LoadRefactoringDocumentView(fileName)).Return(documentView);
}
void AddFieldToClassForReparse(string name)
{
AddFieldToClassForReparse(name, DomRegion.Empty);
}
void AddFieldToClassForReparse(string name, DomRegion region)
{
ClassHelper helper = CreateClassHelper("MyClass");
helper.AddFieldToClass(name, region);
AddClassesToReparsedCompilationUnit(helper);
}
void AddFieldsToClassForReparse(params string[] names)
{
ClassHelper helper = CreateClassHelper("MyClass");
foreach (string name in names) {
helper.AddFieldToClass(name);
}
AddClassesToReparsedCompilationUnit(helper);
}
void AddClassesToReparsedCompilationUnit(params ClassHelper[] classHelpers)
{
var compilationUnitHelper = new CompilationUnitHelper();
foreach (ClassHelper helper in classHelpers) {
compilationUnitHelper.AddClass(helper.Class);
}
documentView.Stub(d => d.Parse()).Return(compilationUnitHelper.CompilationUnit);
}
ClassHelper CreateClassHelper(string name)
{
var helper = new ClassHelper();
helper.CreateClass(name);
return helper;
}
void AddPublicVariable(string name, string type)
{
codeVariable = codeGenerator.AddPublicVariable(name, type);
}
[Test]
public void AddPublicVariable_VariableNameAndTypeIsString_ReturnsCodeVariable()
{
CreateClass("MyClass");
CreateCodeGenerator();
string fileName = @"d:\projects\myproject\MyClass.cs";
SetClassFileName(fileName);
SetDocumentFileName(fileName);
AddFieldToClassForReparse("MyClass.MyVariable", new DomRegion(1, 2, 1, 5));
AddPublicVariable("MyVariable", "System.String");
TextPoint start = codeVariable.GetStartPoint();
TextPoint end = codeVariable.GetEndPoint();
Assert.AreEqual("MyVariable", codeVariable.Name);
Assert.AreEqual(1, start.Line);
Assert.AreEqual(2, start.LineCharOffset);
Assert.AreEqual(1, end.Line);
Assert.AreEqual(5, end.LineCharOffset);
}
[Test]
public void AddPublicVariable_VariableNameAndTypeIsCustomType_CodeForFieldAddedAtEndOfClass()
{
CreateClass("MyClass");
CreateCodeGenerator();
var classRegion = new DomRegion(1, 2, 3, 4);
helper.SetClassRegion(classRegion);
string fileName = @"d:\projects\myproject\MyClass.cs";
SetClassFileName(fileName);
SetDocumentFileName(fileName);
AddFieldToClassForReparse("MyClass.MyVariable");
AddPublicVariable("MyVar", "MyType");
FieldDeclaration field = fakeCodeGenerator.NodePassedToInsertCodeAtEnd as FieldDeclaration;
Assert.AreEqual(classRegion, fakeCodeGenerator.RegionPassedToInsertCodeAtEnd);
Assert.AreEqual(document, fakeCodeGenerator.DocumentPassedToInsertCodeAtEnd);
Assert.AreEqual(Modifiers.Public, field.Modifier);
Assert.AreEqual("MyType", field.TypeReference.Type);
Assert.AreEqual("MyVar", field.Fields[0].Name);
}
[Test]
public void AddPublicVariable_ReparsedClassHasTwoFields_LastFieldReturned()
{
CreateClass("MyClass");
CreateCodeGenerator();
string fileName = @"d:\projects\myproject\MyClass.cs";
SetClassFileName(fileName);
SetDocumentFileName(fileName);
AddFieldsToClassForReparse("MyClass.First", "MyClass.MyVariable");
AddPublicVariable("MyVariable", "System.String");
Assert.AreEqual("MyVariable", codeVariable.Name);
}
[Test]
public void AddPublicVariable_ReparsedCompilationUnitHasThreeClasses_VariableReturnedFromCorrectClass()
{
CreateClass("MyClass2");
CreateCodeGenerator();
string fileName = @"d:\projects\myproject\MyClass2.cs";
SetClassFileName(fileName);
SetDocumentFileName(fileName);
ClassHelper class1 = CreateClassHelper("MyClass1");
ClassHelper class2 = CreateClassHelper("MyClass2");
ClassHelper class3 = CreateClassHelper("MyClass3");
class2.AddFieldToClass("MyClass2.MyVariable");
AddClassesToReparsedCompilationUnit(class1, class2, class3);
AddPublicVariable("MyVariable", "System.String");
Assert.AreEqual("MyVariable", codeVariable.Name);
}
}
}

38
src/AddIns/Misc/PackageManagement/Test/Src/CodeGeneratorTests.cs

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
using NUnit.Framework;
namespace PackageManagement.Tests
{
[TestFixture]
public class CodeGeneratorTests
{
CSharpCodeGenerator codeGenerator;
void CreateCodeGenerator()
{
codeGenerator = new CSharpCodeGenerator();
}
[Test]
public void GenerateCode_Field_CreatesField()
{
CreateCodeGenerator();
var field = new FieldDeclaration(new List<AttributeSection>());
field.TypeReference = new TypeReference("MyClass");
field.Modifier = Modifiers.Public;
field.Fields.Add(new VariableDeclaration("myField"));
string code = codeGenerator.GenerateCode(field, String.Empty);
string expectedCode = "public MyClass myField;\r\n";
Assert.AreEqual(expectedCode, code);
}
}
}

8
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/EditPointTests.cs

@ -5,7 +5,7 @@ using System; @@ -5,7 +5,7 @@ using System;
using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
using Rhino.Mocks;
@ -19,7 +19,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -19,7 +19,7 @@ namespace PackageManagement.Tests.EnvDTE
MethodHelper methodHelper;
TextPoint endPoint;
EditPoint editPoint;
IDocument document;
IRefactoringDocument document;
IDocumentLoader documentLoader;
[SetUp]
@ -32,7 +32,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -32,7 +32,7 @@ namespace PackageManagement.Tests.EnvDTE
void CreateDocumentLoader()
{
document = MockRepository.GenerateStub<IDocument>();
document = MockRepository.GenerateStub<IRefactoringDocument>();
documentLoader = MockRepository.GenerateStub<IDocumentLoader>();
}
@ -79,7 +79,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -79,7 +79,7 @@ namespace PackageManagement.Tests.EnvDTE
void DocumentFileName(string fileName)
{
documentLoader.Stub(loader => loader.LoadDocument(fileName)).Return(document);
documentLoader.Stub(loader => loader.LoadRefactoringDocument(fileName)).Return(document);
}
[Test]

18
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs

@ -12,6 +12,7 @@ namespace PackageManagement.Tests.Helpers @@ -12,6 +12,7 @@ namespace PackageManagement.Tests.Helpers
{
public IClass Class;
public ProjectContentHelper ProjectContentHelper = new ProjectContentHelper();
public CompilationUnitHelper CompilationUnitHelper = new CompilationUnitHelper();
List<IMethod> methods = new List<IMethod>();
List<IProperty> properties = new List<IProperty>();
@ -28,6 +29,7 @@ namespace PackageManagement.Tests.Helpers @@ -28,6 +29,7 @@ namespace PackageManagement.Tests.Helpers
Class.Stub(c => c.Methods).Return(methods);
Class.Stub(c => c.Properties).Return(properties);
Class.Stub(c => c.Fields).Return(fields);
Class.Stub(c => c.CompilationUnit).Return(CompilationUnitHelper.CompilationUnit);
}
public void AddAttributeToClass(string name)
@ -114,10 +116,16 @@ namespace PackageManagement.Tests.Helpers @@ -114,10 +116,16 @@ namespace PackageManagement.Tests.Helpers
/// Name should include the class prefix (e.g. "Class1.MyField");
/// </summary>
public void AddFieldToClass(string fullyQualifiedName)
{
AddFieldToClass(fullyQualifiedName, DomRegion.Empty);
}
public void AddFieldToClass(string fullyQualifiedName, DomRegion region)
{
var helper = new FieldHelper();
helper.ProjectContentHelper = ProjectContentHelper;
helper.CreateField(fullyQualifiedName);
helper.SetRegion(region);
fields.Add(helper.Field);
}
@ -126,5 +134,15 @@ namespace PackageManagement.Tests.Helpers @@ -126,5 +134,15 @@ namespace PackageManagement.Tests.Helpers
{
Class.Stub(c => c.Namespace).Return(name);
}
public void SetClassRegion(DomRegion classRegion)
{
Class.Stub(c => c.Region).Return(classRegion);
}
public void SetClassFileName(string fileName)
{
CompilationUnitHelper.SetFileName(fileName);
}
}
}

36
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CompilationUnitHelper.cs

@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Dom;
using Rhino.Mocks;
namespace PackageManagement.Tests.Helpers
{
public class CompilationUnitHelper
{
public ICompilationUnit CompilationUnit;
public FakeCodeGenerator FakeCodeGenerator = new FakeCodeGenerator();
public List<IClass> Classes = new List<IClass>();
public CompilationUnitHelper()
{
CompilationUnit = MockRepository.GenerateStub<ICompilationUnit>();
LanguageProperties language = MockRepository.GenerateStub<LanguageProperties>(StringComparer.InvariantCultureIgnoreCase);
language.Stub(lang => lang.CodeGenerator).Return(FakeCodeGenerator);
CompilationUnit.Stub(unit => unit.Language).Return(language);
CompilationUnit.Stub(unit => unit.Classes).Return(Classes);
}
public void SetFileName(string fileName)
{
CompilationUnit.FileName = fileName;
}
public void AddClass(IClass c)
{
Classes.Add(c);
}
}
}

34
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeCodeGenerator.cs

@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Linq;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
namespace PackageManagement.Tests.Helpers
{
public class FakeCodeGenerator : CodeGenerator
{
public FakeCodeGenerator()
{
}
public override string GenerateCode(AbstractNode node, string indentation)
{
throw new NotImplementedException();
}
public DomRegion RegionPassedToInsertCodeAtEnd;
public IRefactoringDocument DocumentPassedToInsertCodeAtEnd;
public AbstractNode NodePassedToInsertCodeAtEnd;
public override void InsertCodeAtEnd(DomRegion region, IRefactoringDocument document, params AbstractNode[] nodes)
{
RegionPassedToInsertCodeAtEnd = region;
DocumentPassedToInsertCodeAtEnd = document;
NodePassedToInsertCodeAtEnd = nodes.FirstOrDefault();
}
}
}

6
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FieldHelper.cs

@ -67,9 +67,9 @@ namespace PackageManagement.Tests.Helpers @@ -67,9 +67,9 @@ namespace PackageManagement.Tests.Helpers
public void SetCompilationUnitFileName(string fileName)
{
ICompilationUnit unit = MockRepository.GenerateStub<ICompilationUnit>();
unit.FileName = fileName;
Field.Stub(f => f.CompilationUnit).Return(unit);
var helper = new CompilationUnitHelper();
helper.SetFileName(fileName);
Field.Stub(f => f.CompilationUnit).Return(helper.CompilationUnit);
}
}
}

Loading…
Cancel
Save