From 2ec03c26d75b0499096e9b73354172e09bff2155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Thu, 29 Mar 2012 18:31:06 +0200 Subject: [PATCH] Added a text editor options class that contains options for text output. --- .../Formatter/AstFormattingVisitor.cs | 58 ++++++----- .../Formatter/Indent.cs | 37 ++----- .../Formatter/TextEditorOptions.cs | 97 +++++++++++++++++++ .../ICSharpCode.NRefactory.CSharp.csproj | 1 + .../Refactoring/DocumentScript.cs | 9 +- .../Refactoring/RefactoringContext.cs | 6 +- 6 files changed, 146 insertions(+), 62 deletions(-) create mode 100644 ICSharpCode.NRefactory.CSharp/Formatter/TextEditorOptions.cs diff --git a/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs b/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs index e2f410ad7d..877990cc1d 100644 --- a/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs @@ -80,7 +80,8 @@ namespace ICSharpCode.NRefactory.CSharp CSharpFormattingOptions policy; IDocument document; List changes = new List (); - Indent curIndent = new Indent (); + Indent curIndent; + readonly TextEditorOptions options; public int IndentLevel { get { @@ -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 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 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 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 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 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 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 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 } 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 } 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 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 } 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 } else if (ch == '\r') { start--; } - AddChange(start, offset - start, this.EolMarker + indentString); + AddChange(start, offset - start, this.options.EolMarker + indentString); } } } diff --git a/ICSharpCode.NRefactory.CSharp/Formatter/Indent.cs b/ICSharpCode.NRefactory.CSharp/Formatter/Indent.cs index 017d8c9b49..32c8871d85 100644 --- a/ICSharpCode.NRefactory.CSharp/Formatter/Indent.cs +++ b/ICSharpCode.NRefactory.CSharp/Formatter/Indent.cs @@ -1,4 +1,4 @@ -// +// // Indent.cs // // Author: @@ -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 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"; } } diff --git a/ICSharpCode.NRefactory.CSharp/Formatter/TextEditorOptions.cs b/ICSharpCode.NRefactory.CSharp/Formatter/TextEditorOptions.cs new file mode 100644 index 0000000000..b4171bd1c0 --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Formatter/TextEditorOptions.cs @@ -0,0 +1,97 @@ +// +// TextEditorOptions.cs +// +// Author: +// Mike Krüger +// +// 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 +{ + /// + /// The text editor options class holds basic information about the text editor settings that influences code generation and formatting beside + /// the CSharpFormattingOptions. + /// + public class TextEditorOptions + { + public static readonly TextEditorOptions Default = new TextEditorOptions (); + + /// + /// 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. + /// + public bool TabsToSpaces { + get; + set; + } + + /// + /// Gets or sets the size of the tab chacter as spaces. + /// + public int TabSize { + get; + set; + } + + /// + /// Gets or sets the size of a single indent as spaces. + /// + public int IndentSize { + get; + set; + } + + /// + /// Gets or sets the continuation indent. A continuation indent is the indent that will be put after an embedded statement that is no block. + /// + public int ContinuationIndent { + get; + set; + } + + /// + /// Gets or sets the eol marker. + /// + public string EolMarker { + get; + set; + } + + /// + /// If true blank lines will be indented up to the indent level, otherwise blank lines will have the length 0. + /// + public bool IndentBlankLines { + get; + set; + } + + public TextEditorOptions() + { + TabsToSpaces = false; + TabSize = 4; + IndentSize = 4; + ContinuationIndent = 4; + EolMarker = Environment.NewLine; + } + } +} diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index 0ae984d6cc..711487e1fa 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -357,6 +357,7 @@ + diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/DocumentScript.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/DocumentScript.cs index 75495e2473..510bd8e229 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/DocumentScript.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/DocumentScript.cs @@ -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 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 { 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); } diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs index d149983b6b..23754bb6bf 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs @@ -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 {