Browse Source

Added a text editor options class that contains options for text

output.
newNRvisualizers
Mike Krüger 14 years ago
parent
commit
2ec03c26d7
  1. 58
      ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs
  2. 37
      ICSharpCode.NRefactory.CSharp/Formatter/Indent.cs
  3. 97
      ICSharpCode.NRefactory.CSharp/Formatter/TextEditorOptions.cs
  4. 1
      ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
  5. 9
      ICSharpCode.NRefactory.CSharp/Refactoring/DocumentScript.cs
  6. 6
      ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs

58
ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs

@ -80,7 +80,8 @@ namespace ICSharpCode.NRefactory.CSharp @@ -80,7 +80,8 @@ namespace ICSharpCode.NRefactory.CSharp
CSharpFormattingOptions policy;
IDocument document;
List<TextReplaceAction> changes = new List<TextReplaceAction> ();
Indent curIndent = new Indent ();
Indent curIndent;
readonly TextEditorOptions options;
public int IndentLevel {
get {
@ -106,21 +107,18 @@ namespace ICSharpCode.NRefactory.CSharp @@ -106,21 +107,18 @@ namespace ICSharpCode.NRefactory.CSharp
set;
}
public string EolMarker { get; set; }
public AstFormattingVisitor (CSharpFormattingOptions policy, IDocument document, bool tabsToSpaces = false, int indentationSize = 4)
public AstFormattingVisitor(CSharpFormattingOptions policy, IDocument document, TextEditorOptions options = null)
{
if (policy == null) {
throw new ArgumentNullException ("policy");
throw new ArgumentNullException("policy");
}
if (document == null) {
throw new ArgumentNullException ("document");
throw new ArgumentNullException("document");
}
this.policy = policy;
this.document = document;
this.curIndent.TabsToSpaces = tabsToSpaces;
this.curIndent.TabSize = indentationSize;
this.EolMarker = Environment.NewLine;
this.options = options ?? TextEditorOptions.Default;
curIndent = new Indent(this.options);
CorrectBlankLines = true;
}
@ -209,9 +207,9 @@ namespace ICSharpCode.NRefactory.CSharp @@ -209,9 +207,9 @@ namespace ICSharpCode.NRefactory.CSharp
int foundBlankLines = line - loc.Line - 1;
StringBuilder sb = new StringBuilder ();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < blankLines - foundBlankLines; i++) {
sb.Append(this.EolMarker);
sb.Append(this.options.EolMarker);
}
int ws = start;
@ -240,7 +238,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -240,7 +238,7 @@ namespace ICSharpCode.NRefactory.CSharp
int start = document.GetOffset(line + 1, 1);
StringBuilder sb = new StringBuilder ();
for (int i = 0; i < blankLines; i++) {
sb.Append(this.EolMarker);
sb.Append(this.options.EolMarker);
}
AddChange(start, end - start, sb.ToString());
}
@ -508,7 +506,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -508,7 +506,7 @@ namespace ICSharpCode.NRefactory.CSharp
int offset = this.document.GetOffset(propertyDeclaration.Getter.StartLocation);
int start = SearchWhitespaceStart(offset);
string indentString = this.curIndent.IndentString;
AddChange(start, offset - start, this.EolMarker + indentString);
AddChange(start, offset - start, this.options.EolMarker + indentString);
} else {
FixIndentation(propertyDeclaration.Getter.StartLocation);
}
@ -536,7 +534,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -536,7 +534,7 @@ namespace ICSharpCode.NRefactory.CSharp
int offset = this.document.GetOffset(propertyDeclaration.Setter.StartLocation);
int start = SearchWhitespaceStart(offset);
string indentString = this.curIndent.IndentString;
AddChange(start, offset - start, this.EolMarker + indentString);
AddChange(start, offset - start, this.options.EolMarker + indentString);
} else {
FixIndentation(propertyDeclaration.Setter.StartLocation);
}
@ -974,11 +972,11 @@ namespace ICSharpCode.NRefactory.CSharp @@ -974,11 +972,11 @@ namespace ICSharpCode.NRefactory.CSharp
startBrace = " {";
break;
case BraceStyle.NextLine:
startBrace = this.EolMarker + curIndent.IndentString + "{";
startBrace = this.options.EolMarker + curIndent.IndentString + "{";
break;
case BraceStyle.NextLineShifted2:
case BraceStyle.NextLineShifted:
startBrace = this.EolMarker + curIndent.IndentString + curIndent.SingleIndent + "{";
startBrace = this.options.EolMarker + curIndent.IndentString + curIndent.SingleIndent + "{";
break;
}
beginBraceAction = AddChange(start, 0, startBrace);
@ -1050,18 +1048,18 @@ namespace ICSharpCode.NRefactory.CSharp @@ -1050,18 +1048,18 @@ namespace ICSharpCode.NRefactory.CSharp
startBrace = null;
break;
case BraceStyle.EndOfLineWithoutSpace:
startBrace = this.EolMarker + curIndent.IndentString + "}";
startBrace = this.options.EolMarker + curIndent.IndentString + "}";
break;
case BraceStyle.EndOfLine:
startBrace = this.EolMarker + curIndent.IndentString + "}";
startBrace = this.options.EolMarker + curIndent.IndentString + "}";
break;
case BraceStyle.NextLine:
startBrace = this.EolMarker + curIndent.IndentString + "}";
startBrace = this.options.EolMarker + curIndent.IndentString + "}";
break;
case BraceStyle.BannerStyle:
case BraceStyle.NextLineShifted2:
case BraceStyle.NextLineShifted:
startBrace = this.EolMarker + curIndent.IndentString + curIndent.SingleIndent + "}";
startBrace = this.options.EolMarker + curIndent.IndentString + curIndent.SingleIndent + "}";
break;
}
if (startBrace != null) {
@ -1097,7 +1095,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -1097,7 +1095,7 @@ namespace ICSharpCode.NRefactory.CSharp
break;
case BraceStyle.EndOfLineWithoutSpace:
startIndent = "";
endIndent = IsLineIsEmptyUpToEol(rbraceOffset) ? curIndent.IndentString : this.EolMarker + curIndent.IndentString;
endIndent = IsLineIsEmptyUpToEol(rbraceOffset) ? curIndent.IndentString : this.options.EolMarker + curIndent.IndentString;
break;
case BraceStyle.BannerStyle:
var prevNode = lbrace.GetPrevNode();
@ -1114,7 +1112,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -1114,7 +1112,7 @@ namespace ICSharpCode.NRefactory.CSharp
} else {
startIndent = " ";
}
endIndent = IsLineIsEmptyUpToEol(rbraceOffset) ? curIndent.IndentString + curIndent.SingleIndent : this.EolMarker + curIndent.IndentString + curIndent.SingleIndent;
endIndent = IsLineIsEmptyUpToEol(rbraceOffset) ? curIndent.IndentString + curIndent.SingleIndent : this.options.EolMarker + curIndent.IndentString + curIndent.SingleIndent;
break;
case BraceStyle.EndOfLine:
prevNode = lbrace.GetPrevNode();
@ -1131,16 +1129,16 @@ namespace ICSharpCode.NRefactory.CSharp @@ -1131,16 +1129,16 @@ namespace ICSharpCode.NRefactory.CSharp
} else {
startIndent = " ";
}
endIndent = IsLineIsEmptyUpToEol(rbraceOffset) ? curIndent.IndentString : this.EolMarker + curIndent.IndentString;
endIndent = IsLineIsEmptyUpToEol(rbraceOffset) ? curIndent.IndentString : this.options.EolMarker + curIndent.IndentString;
break;
case BraceStyle.NextLine:
startIndent = this.EolMarker + curIndent.IndentString;
endIndent = IsLineIsEmptyUpToEol(rbraceOffset) ? curIndent.IndentString : this.EolMarker + curIndent.IndentString;
startIndent = this.options.EolMarker + curIndent.IndentString;
endIndent = IsLineIsEmptyUpToEol(rbraceOffset) ? curIndent.IndentString : this.options.EolMarker + curIndent.IndentString;
break;
case BraceStyle.NextLineShifted2:
case BraceStyle.NextLineShifted:
startIndent = this.EolMarker + curIndent.IndentString + curIndent.SingleIndent;
endIndent = IsLineIsEmptyUpToEol(rbraceOffset) ? curIndent.IndentString + curIndent.SingleIndent : this.EolMarker + curIndent.IndentString + curIndent.SingleIndent;
startIndent = this.options.EolMarker + curIndent.IndentString + curIndent.SingleIndent;
endIndent = IsLineIsEmptyUpToEol(rbraceOffset) ? curIndent.IndentString + curIndent.SingleIndent : this.options.EolMarker + curIndent.IndentString + curIndent.SingleIndent;
break;
}
@ -1771,7 +1769,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -1771,7 +1769,7 @@ namespace ICSharpCode.NRefactory.CSharp
int offset = document.GetOffset(keywordNode.StartLocation);
int whitespaceStart = SearchWhitespaceStart(offset);
string indentString = newLine ? this.EolMarker + this.curIndent.IndentString : " ";
string indentString = newLine ? this.options.EolMarker + this.curIndent.IndentString : " ";
AddChange(whitespaceStart, offset - whitespaceStart, indentString);
}
@ -1787,7 +1785,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -1787,7 +1785,7 @@ namespace ICSharpCode.NRefactory.CSharp
}
bool isEmpty = IsLineIsEmptyUpToEol(offset);
int lineStart = SearchWhitespaceLineStart(offset);
string indentString = nextStatementIndent == null ? (isEmpty ? "" : this.EolMarker) + this.curIndent.IndentString : nextStatementIndent;
string indentString = nextStatementIndent == null ? (isEmpty ? "" : this.options.EolMarker) + this.curIndent.IndentString : nextStatementIndent;
nextStatementIndent = null;
AddChange(lineStart, offset - lineStart, indentString);
}
@ -1831,7 +1829,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -1831,7 +1829,7 @@ namespace ICSharpCode.NRefactory.CSharp
} else if (ch == '\r') {
start--;
}
AddChange(start, offset - start, this.EolMarker + indentString);
AddChange(start, offset - start, this.options.EolMarker + indentString);
}
}
}

37
ICSharpCode.NRefactory.CSharp/Formatter/Indent.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//
//
// Indent.cs
//
// Author:
@ -29,6 +29,8 @@ namespace ICSharpCode.NRefactory.CSharp @@ -29,6 +29,8 @@ namespace ICSharpCode.NRefactory.CSharp
{
public class Indent
{
readonly TextEditorOptions options;
public int Level {
get;
set;
@ -39,45 +41,26 @@ namespace ICSharpCode.NRefactory.CSharp @@ -39,45 +41,26 @@ namespace ICSharpCode.NRefactory.CSharp
set;
}
public bool TabsToSpaces {
get;
set;
}
public int TabSize {
get;
set;
}
public Indent ()
{
}
public Indent (int level, int extraSpaces)
{
this.Level = level;
this.ExtraSpaces = extraSpaces;
}
public static Indent operator+ (Indent left, Indent right)
public Indent(TextEditorOptions options)
{
return new Indent (left.Level + right.Level, left.ExtraSpaces + right.ExtraSpaces);
this.options = options;
}
public static Indent operator- (Indent left, Indent right)
public Indent(TextEditorOptions options, int level, int extraSpaces)
{
return new Indent (left.Level - right.Level, left.ExtraSpaces - right.ExtraSpaces);
Level = level;
ExtraSpaces = extraSpaces;
}
public string IndentString {
get {
return (TabsToSpaces ? new string (' ', Level * TabSize) : new string ('\t', Level)) + new string (' ', ExtraSpaces);
return (options.TabsToSpaces ? new string(' ', Level * options.TabSize) : new string ('\t', Level)) + new string (' ', ExtraSpaces);
}
}
public string SingleIndent {
get {
return TabsToSpaces ? new string (' ', TabSize) : "\t";
return options.TabsToSpaces ? new string(' ', options.TabSize) : "\t";
}
}

97
ICSharpCode.NRefactory.CSharp/Formatter/TextEditorOptions.cs

@ -0,0 +1,97 @@ @@ -0,0 +1,97 @@
//
// TextEditorOptions.cs
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
//
// Copyright (c) 2012 Xamarin Inc. (http://xamarin.com)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
using System;
namespace ICSharpCode.NRefactory.CSharp
{
/// <summary>
/// The text editor options class holds basic information about the text editor settings that influences code generation and formatting beside
/// the CSharpFormattingOptions.
/// </summary>
public class TextEditorOptions
{
public static readonly TextEditorOptions Default = new TextEditorOptions ();
/// <summary>
/// Gets or sets a value indicating if tabs need to be replaced by spaces. If that is true, all indenting will be done with spaces only,
/// otherwise the indenting will start with tabs.
/// </summary>
public bool TabsToSpaces {
get;
set;
}
/// <summary>
/// Gets or sets the size of the tab chacter as spaces.
/// </summary>
public int TabSize {
get;
set;
}
/// <summary>
/// Gets or sets the size of a single indent as spaces.
/// </summary>
public int IndentSize {
get;
set;
}
/// <summary>
/// Gets or sets the continuation indent. A continuation indent is the indent that will be put after an embedded statement that is no block.
/// </summary>
public int ContinuationIndent {
get;
set;
}
/// <summary>
/// Gets or sets the eol marker.
/// </summary>
public string EolMarker {
get;
set;
}
/// <summary>
/// If true blank lines will be indented up to the indent level, otherwise blank lines will have the length 0.
/// </summary>
public bool IndentBlankLines {
get;
set;
}
public TextEditorOptions()
{
TabsToSpaces = false;
TabSize = 4;
IndentSize = 4;
ContinuationIndent = 4;
EolMarker = Environment.NewLine;
}
}
}

1
ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj

@ -357,6 +357,7 @@ @@ -357,6 +357,7 @@
<Compile Include="Refactoring\CodeActions\CreateConstructorDeclarationAction.cs" />
<Compile Include="Refactoring\CodeActions\CreateClassDeclarationAction.cs" />
<Compile Include="Refactoring\CodeActions\CreateDelegateAction.cs" />
<Compile Include="Formatter\TextEditorOptions.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">

9
ICSharpCode.NRefactory.CSharp/Refactoring/DocumentScript.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
@ -38,11 +38,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -38,11 +38,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
get { return originalDocument; }
}
readonly IDisposable undoGroup;
readonly TextEditorOptions options;
public DocumentScript(IDocument document, CSharpFormattingOptions formattingOptions) : base(formattingOptions)
public DocumentScript(IDocument document, CSharpFormattingOptions formattingOptions, TextEditorOptions options) : base(formattingOptions)
{
this.originalDocument = document.CreateDocumentSnapshot();
this.currentDocument = document;
this.options = options;
Debug.Assert(currentDocument.Version.CompareAge(originalDocument.Version) == 0);
this.undoGroup = document.OpenUndoGroup();
}
@ -98,7 +101,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -98,7 +101,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
{
var segment = GetSegment(node);
var cu = CompilationUnit.Parse(currentDocument, "dummy.cs");
var formatter = new AstFormattingVisitor(this.FormattingOptions, currentDocument);
var formatter = new AstFormattingVisitor(FormattingOptions, currentDocument, options);
cu.AcceptVisitor(formatter);
formatter.ApplyChanges(segment.Offset, segment.Length);
}

6
ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs

@ -89,8 +89,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -89,8 +89,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
}
#region Text stuff
public virtual string EolMarker {
get { return Environment.NewLine; }
public virtual TextEditorOptions TextEditorOptions {
get {
return TextEditorOptions.Default;
}
}
public virtual bool IsSomethingSelected {

Loading…
Cancel
Save