Browse Source

Fix code indentation when scaffolding controller actions.

pull/28/head
Matt Ward 13 years ago
parent
commit
543d8e9d59
  1. 22
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/EditPoint.cs
  2. 1
      src/AddIns/Misc/PackageManagement/Project/Src/IRefactoringDocumentView.cs
  3. 36
      src/AddIns/Misc/PackageManagement/Project/Src/RefactoringDocumentView.cs
  4. 53
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/EditPointTests.cs

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

@ -10,6 +10,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public class EditPoint : TextPoint public class EditPoint : TextPoint
{ {
IRefactoringDocument document; IRefactoringDocument document;
IRefactoringDocumentView documentView;
internal EditPoint(FilePosition filePosition, IDocumentLoader documentLoader) internal EditPoint(FilePosition filePosition, IDocumentLoader documentLoader)
: base(filePosition, documentLoader) : base(filePosition, documentLoader)
@ -27,11 +28,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE
int offset = GetStartOffset(); int offset = GetStartOffset();
int endOffset = GetEndOffset(endPoint); int endOffset = GetEndOffset(endPoint);
document.Replace(offset, endOffset - offset, text); document.Replace(offset, endOffset - offset, text);
IndentReplacedText(text);
} }
void OpenDocument() void OpenDocument()
{ {
document = DocumentLoader.LoadRefactoringDocument(FilePosition.FileName); documentView = DocumentLoader.LoadRefactoringDocumentView(FilePosition.FileName);
document = documentView.RefactoringDocument;
} }
int GetStartOffset() int GetStartOffset()
@ -43,5 +46,22 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{ {
return document.PositionToOffset(endPoint.Line, endPoint.LineCharOffset); return document.PositionToOffset(endPoint.Line, endPoint.LineCharOffset);
} }
/// <summary>
/// Indents all lines apart from the first one since it is assumed
/// that the first line had the correct indentation.
/// </summary>
void IndentReplacedText(string text)
{
int lineCount = GetLineCount(text);
if (lineCount > 1) {
documentView.IndentLines(Line + 1, Line + lineCount);
}
}
int GetLineCount(string text)
{
return text.Split('\n').Length;
}
} }
} }

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

@ -11,5 +11,6 @@ namespace ICSharpCode.PackageManagement
{ {
IRefactoringDocument RefactoringDocument { get; } IRefactoringDocument RefactoringDocument { get; }
ICompilationUnit Parse(); ICompilationUnit Parse();
void IndentLines(int beginLine, int endLine);
} }
} }

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

@ -11,29 +11,49 @@ using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.PackageManagement namespace ICSharpCode.PackageManagement
{ {
public class RefactoringDocumentView : IRefactoringDocumentView public class RefactoringDocumentView : IRefactoringDocumentView
{ {
IViewContent view;
public RefactoringDocumentView(string fileName) public RefactoringDocumentView(string fileName)
{ {
view = FileService.OpenFile(fileName); View = FileService.OpenFile(fileName);
TextEditor = GetTextEditor();
FormattingStrategy = TextEditor.Language.FormattingStrategy;
RefactoringDocument = LoadDocument(); RefactoringDocument = LoadDocument();
} }
IRefactoringDocument LoadDocument() IViewContent View { get; set; }
ITextEditor TextEditor { get; set; }
IFormattingStrategy FormattingStrategy { get; set; }
ITextEditor GetTextEditor()
{ {
var textEditorProvider = view as ITextEditorProvider; var textEditorProvider = View as ITextEditorProvider;
return new RefactoringDocumentAdapter(new ThreadSafeDocument(textEditorProvider.TextEditor.Document)); return textEditorProvider.TextEditor;
} }
public IRefactoringDocument RefactoringDocument { get; private set; } public IRefactoringDocument RefactoringDocument { get; private set; }
IRefactoringDocument LoadDocument()
{
return new RefactoringDocumentAdapter(new ThreadSafeDocument(TextEditor.Document));
}
public ICompilationUnit Parse() public ICompilationUnit Parse()
{ {
if (WorkbenchSingleton.InvokeRequired) { if (WorkbenchSingleton.InvokeRequired) {
return WorkbenchSingleton.SafeThreadFunction(() => Parse()); return WorkbenchSingleton.SafeThreadFunction(() => Parse());
} }
return ParserService.ParseViewContent(view).CompilationUnit; return ParserService.ParseViewContent(View).CompilationUnit;
}
public void IndentLines(int beginLine, int endLine)
{
if (WorkbenchSingleton.InvokeRequired) {
WorkbenchSingleton.SafeThreadCall(() => IndentLines(beginLine, endLine));
} else {
using (IDisposable undoGroup = TextEditor.Document.OpenUndoGroup()) {
FormattingStrategy.IndentLines(TextEditor, beginLine, endLine);
}
}
} }
} }
} }

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

@ -20,6 +20,7 @@ namespace PackageManagement.Tests.EnvDTE
TextPoint endPoint; TextPoint endPoint;
EditPoint editPoint; EditPoint editPoint;
IRefactoringDocument document; IRefactoringDocument document;
IRefactoringDocumentView documentView;
IDocumentLoader documentLoader; IDocumentLoader documentLoader;
[SetUp] [SetUp]
@ -33,6 +34,8 @@ namespace PackageManagement.Tests.EnvDTE
void CreateDocumentLoader() void CreateDocumentLoader()
{ {
document = MockRepository.GenerateStub<IRefactoringDocument>(); document = MockRepository.GenerateStub<IRefactoringDocument>();
documentView = MockRepository.GenerateStub<IRefactoringDocumentView>();
documentView.Stub(view => view.RefactoringDocument).Return(document);
documentLoader = MockRepository.GenerateStub<IDocumentLoader>(); documentLoader = MockRepository.GenerateStub<IDocumentLoader>();
} }
@ -79,11 +82,16 @@ namespace PackageManagement.Tests.EnvDTE
void DocumentFileName(string fileName) void DocumentFileName(string fileName)
{ {
documentLoader.Stub(loader => loader.LoadRefactoringDocument(fileName)).Return(document); documentLoader.Stub(loader => loader.LoadRefactoringDocumentView(fileName)).Return(documentView);
}
void AssertDocumentViewIndentLinesWasNotCalled()
{
documentView.AssertWasNotCalled(view => view.IndentLines(Arg<int>.Is.Anything, Arg<int>.Is.Anything));
} }
[Test] [Test]
public void ReplaceText_FieldEndPointCreatedFromStartPoint_ReplacesTextBetweenStartAndEndPoint() public void ReplaceText_EditPointCreatedFromFieldStartPoint_ReplacesTextBetweenStartAndEndPoint()
{ {
string fileName = @"d:\projects\test.cs"; string fileName = @"d:\projects\test.cs";
var fieldRegion = new DomRegion(1, 5, 3, 12); var fieldRegion = new DomRegion(1, 5, 3, 12);
@ -99,7 +107,7 @@ namespace PackageManagement.Tests.EnvDTE
} }
[Test] [Test]
public void ReplaceText_MethodEndPointCreatedFromStartPoint_ReplacesTextBetweenStartAndEndPoint() public void ReplaceText_EditPointCreatedFromMethodStartPoint_ReplacesTextBetweenStartAndEndPoint()
{ {
string fileName = @"d:\projects\test.cs"; string fileName = @"d:\projects\test.cs";
var methodRegion = new DomRegion(1, 5, 1, 10); var methodRegion = new DomRegion(1, 5, 1, 10);
@ -115,5 +123,44 @@ namespace PackageManagement.Tests.EnvDTE
document.AssertWasCalled(d => d.Replace(5, 15, "Test")); document.AssertWasCalled(d => d.Replace(5, 15, "Test"));
} }
[Test]
public void ReplaceText_EditPointCreatedFromFieldStartPointAndTextIsFourLines_IndentsLinesTwoThreeFourFiveAndSix()
{
string fileName = @"d:\projects\test.cs";
var fieldRegion = new DomRegion(1, 5, 1, 10);
CreateField(fileName, fieldRegion);
DocumentOffsetToReturn(line: 1, column: 5, offset: 5);
DocumentOffsetToReturn(line: 1, column: 12, offset: 10);
DocumentFileName(fileName);
CreateFieldEditPoint();
string replacementText =
"First\r\n" +
"Second\r\n" +
"Third\r\n" +
"Fourth\r\n" +
"Five";
ReplaceText(replacementText);
documentView.AssertWasCalled(view => view.IndentLines(2, 6));
}
[Test]
public void ReplaceText_EditPointCreatedFromFieldStartPointAndTextIsSingleLine_TextIsNotIndented()
{
string fileName = @"d:\projects\test.cs";
var fieldRegion = new DomRegion(1, 5, 1, 10);
CreateField(fileName, fieldRegion);
DocumentOffsetToReturn(line: 1, column: 5, offset: 5);
DocumentOffsetToReturn(line: 1, column: 12, offset: 10);
DocumentFileName(fileName);
CreateFieldEditPoint();
ReplaceText("Test");
AssertDocumentViewIndentLinesWasNotCalled();
}
} }
} }

Loading…
Cancel
Save