.NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1053 lines
18 KiB

//
// CSharpFormattingOptions.cs
//
// Author:
// Mike Krüger <mkrueger@novell.com>
//
// Copyright (c) 2009 Novell, Inc (http://www.novell.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.ComponentModel;
namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
{
public enum BraceStyle
{
EndOfLine,
EndOfLineWithoutSpace,
NextLine,
NextLineShifted,
NextLineShifted2,
BannerStyle
}
public enum PropertyFormatting
{
SingleLine,
MultipleLines
}
public enum Wrapping
{
DoNotWrap,
WrapAlways,
WrapIfTooLong
}
public enum NewLinePlacement
{
DoNotCare,
NewLine,
SameLine
}
public enum UsingPlacement
{
TopOfFile,
InsideNamespace
}
public enum EmptyLineFormatting
{
DoNotChange,
Indent,
DoNotIndent
}
[TypeConverter(typeof(ExpandableObjectConverter))]
public class CSharpFormattingOptions
{
public string Name {
get;
set;
}
public bool IsBuiltIn {
get;
set;
}
public CSharpFormattingOptions Clone()
{
return (CSharpFormattingOptions)MemberwiseClone();
}
#region Indentation
public string IndentationString { get; set; } = "\t";
public bool IndentNamespaceBody { // tested
get;
set;
}
public bool IndentClassBody { // tested
get;
set;
}
public bool IndentInterfaceBody { // tested
get;
set;
}
public bool IndentStructBody { // tested
get;
set;
}
public bool IndentEnumBody { // tested
get;
set;
}
public bool IndentMethodBody { // tested
get;
set;
}
public bool IndentPropertyBody { // tested
get;
set;
}
public bool IndentEventBody { // tested
get;
set;
}
public bool IndentBlocks { // tested
get;
set;
}
public bool IndentSwitchBody { // tested
get;
set;
}
public bool IndentCaseBody { // tested
get;
set;
}
public bool IndentBreakStatements { // tested
get;
set;
}
public bool AlignEmbeddedStatements { // tested
get;
set;
}
public bool AlignElseInIfStatements {
get;
set;
}
public PropertyFormatting AutoPropertyFormatting { get; set; }
public PropertyFormatting SimplePropertyFormatting { // tested
get;
set;
}
public EmptyLineFormatting EmptyLineFormatting {
get;
set;
}
public bool IndentPreprocessorDirectives { // tested
get;
set;
}
public bool AlignToMemberReferenceDot { // TODO!
get;
set;
}
public bool IndentBlocksInsideExpressions {
get;
set;
}
#endregion
#region Braces
public BraceStyle NamespaceBraceStyle { // tested
get;
set;
}
public BraceStyle ClassBraceStyle { // tested
get;
set;
}
public BraceStyle InterfaceBraceStyle { // tested
get;
set;
}
public BraceStyle StructBraceStyle { // tested
get;
set;
}
public BraceStyle EnumBraceStyle { // tested
get;
set;
}
public BraceStyle MethodBraceStyle { // tested
get;
set;
}
public BraceStyle AnonymousMethodBraceStyle {
get;
set;
}
public BraceStyle ConstructorBraceStyle { // tested
get;
set;
}
public BraceStyle DestructorBraceStyle { // tested
get;
set;
}
public BraceStyle PropertyBraceStyle { // tested
get;
set;
}
public BraceStyle PropertyGetBraceStyle { // tested
get;
set;
}
public BraceStyle PropertySetBraceStyle { // tested
get;
set;
}
public PropertyFormatting SimpleGetBlockFormatting { // tested
get;
set;
}
public PropertyFormatting SimpleSetBlockFormatting { // tested
get;
set;
}
public BraceStyle EventBraceStyle { // tested
get;
set;
}
public BraceStyle EventAddBraceStyle { // tested
get;
set;
}
public BraceStyle EventRemoveBraceStyle { // tested
get;
set;
}
public bool AllowEventAddBlockInline { // tested
get;
set;
}
public bool AllowEventRemoveBlockInline { // tested
get;
set;
}
public BraceStyle StatementBraceStyle { // tested
get;
set;
}
public bool AllowIfBlockInline {
get;
set;
}
bool allowOneLinedArrayInitialziers = true;
public bool AllowOneLinedArrayInitialziers {
get {
return allowOneLinedArrayInitialziers;
}
set {
allowOneLinedArrayInitialziers = value;
}
}
#endregion
#region NewLines
public NewLinePlacement ElseNewLinePlacement { // tested
get;
set;
}
public NewLinePlacement ElseIfNewLinePlacement { // tested
get;
set;
}
public NewLinePlacement CatchNewLinePlacement { // tested
get;
set;
}
public NewLinePlacement FinallyNewLinePlacement { // tested
get;
set;
}
public NewLinePlacement WhileNewLinePlacement { // tested
get;
set;
}
NewLinePlacement embeddedStatementPlacement = NewLinePlacement.NewLine;
public NewLinePlacement EmbeddedStatementPlacement {
get {
return embeddedStatementPlacement;
}
set {
embeddedStatementPlacement = value;
}
}
#endregion
#region Spaces
public bool SpaceBetweenParameterAttributeSections {
get;
set;
}
// Methods
public bool SpaceBeforeMethodDeclarationParentheses { // tested
get;
set;
}
public bool SpaceBetweenEmptyMethodDeclarationParentheses {
get;
set;
}
public bool SpaceBeforeMethodDeclarationParameterComma { // tested
get;
set;
}
public bool SpaceAfterMethodDeclarationParameterComma { // tested
get;
set;
}
public bool SpaceWithinMethodDeclarationParentheses { // tested
get;
set;
}
// Method calls
public bool SpaceBeforeMethodCallParentheses { // tested
get;
set;
}
public bool SpaceBetweenEmptyMethodCallParentheses { // tested
get;
set;
}
public bool SpaceBeforeMethodCallParameterComma { // tested
get;
set;
}
public bool SpaceAfterMethodCallParameterComma { // tested
get;
set;
}
public bool SpaceWithinMethodCallParentheses { // tested
get;
set;
}
// fields
public bool SpaceBeforeFieldDeclarationComma { // tested
get;
set;
}
public bool SpaceAfterFieldDeclarationComma { // tested
get;
set;
}
// local variables
public bool SpaceBeforeLocalVariableDeclarationComma { // tested
get;
set;
}
public bool SpaceAfterLocalVariableDeclarationComma { // tested
get;
set;
}
// constructors
public bool SpaceBeforeConstructorDeclarationParentheses { // tested
get;
set;
}
public bool SpaceBetweenEmptyConstructorDeclarationParentheses { // tested
get;
set;
}
public bool SpaceBeforeConstructorDeclarationParameterComma { // tested
get;
set;
}
public bool SpaceAfterConstructorDeclarationParameterComma { // tested
get;
set;
}
public bool SpaceWithinConstructorDeclarationParentheses { // tested
get;
set;
}
public NewLinePlacement NewLineBeforeConstructorInitializerColon {
get;
set;
}
public NewLinePlacement NewLineAfterConstructorInitializerColon {
get;
set;
}
// indexer
public bool SpaceBeforeIndexerDeclarationBracket { // tested
get;
set;
}
public bool SpaceWithinIndexerDeclarationBracket { // tested
get;
set;
}
public bool SpaceBeforeIndexerDeclarationParameterComma {
get;
set;
}
public bool SpaceAfterIndexerDeclarationParameterComma {
get;
set;
}
// delegates
public bool SpaceBeforeDelegateDeclarationParentheses {
get;
set;
}
public bool SpaceBetweenEmptyDelegateDeclarationParentheses {
get;
set;
}
public bool SpaceBeforeDelegateDeclarationParameterComma {
get;
set;
}
public bool SpaceAfterDelegateDeclarationParameterComma {
get;
set;
}
public bool SpaceWithinDelegateDeclarationParentheses {
get;
set;
}
public bool SpaceBeforeNewParentheses { // tested
get;
set;
}
public bool SpaceBeforeIfParentheses { // tested
get;
set;
}
public bool SpaceBeforeWhileParentheses { // tested
get;
set;
}
public bool SpaceBeforeForParentheses { // tested
get;
set;
}
public bool SpaceBeforeForeachParentheses { // tested
get;
set;
}
public bool SpaceBeforeCatchParentheses { // tested
get;
set;
}
public bool SpaceBeforeSwitchParentheses { // tested
get;
set;
}
public bool SpaceBeforeLockParentheses { // tested
get;
set;
}
public bool SpaceBeforeUsingParentheses { // tested
get;
set;
}
public bool SpaceAroundAssignment { // tested
get;
set;
}
public bool SpaceAroundLogicalOperator { // tested
get;
set;
}
public bool SpaceAroundEqualityOperator { // tested
get;
set;
}
public bool SpaceAroundRelationalOperator { // tested
get;
set;
}
public bool SpaceAroundBitwiseOperator { // tested
get;
set;
}
public bool SpaceAroundAdditiveOperator { // tested
get;
set;
}
public bool SpaceAroundMultiplicativeOperator { // tested
get;
set;
}
public bool SpaceAroundShiftOperator { // tested
get;
set;
}
public bool SpaceAroundNullCoalescingOperator { // Tested
get;
set;
}
public bool SpaceAfterUnsafeAddressOfOperator { // Tested
get;
set;
}
public bool SpaceAfterUnsafeAsteriskOfOperator { // Tested
get;
set;
}
public bool SpaceAroundUnsafeArrowOperator { // Tested
get;
set;
}
public bool SpacesWithinParentheses { // tested
get;
set;
}
public bool SpacesWithinIfParentheses { // tested
get;
set;
}
public bool SpacesWithinWhileParentheses { // tested
get;
set;
}
public bool SpacesWithinForParentheses { // tested
get;
set;
}
public bool SpacesWithinForeachParentheses { // tested
get;
set;
}
public bool SpacesWithinCatchParentheses { // tested
get;
set;
}
public bool SpacesWithinSwitchParentheses { // tested
get;
set;
}
public bool SpacesWithinLockParentheses { // tested
get;
set;
}
public bool SpacesWithinUsingParentheses { // tested
get;
set;
}
public bool SpacesWithinCastParentheses { // tested
get;
set;
}
public bool SpacesWithinSizeOfParentheses { // tested
get;
set;
}
public bool SpaceBeforeSizeOfParentheses { // tested
get;
set;
}
public bool SpacesWithinTypeOfParentheses { // tested
get;
set;
}
public bool SpacesWithinNewParentheses { // tested
get;
set;
}
public bool SpacesBetweenEmptyNewParentheses { // tested
get;
set;
}
public bool SpaceBeforeNewParameterComma { // tested
get;
set;
}
public bool SpaceAfterNewParameterComma { // tested
get;
set;
}
public bool SpaceBeforeTypeOfParentheses { // tested
get;
set;
}
public bool SpacesWithinCheckedExpressionParantheses { // tested
get;
set;
}
public bool SpaceBeforeConditionalOperatorCondition { // tested
get;
set;
}
public bool SpaceAfterConditionalOperatorCondition { // tested
get;
set;
}
public bool SpaceBeforeConditionalOperatorSeparator { // tested
get;
set;
}
public bool SpaceAfterConditionalOperatorSeparator { // tested
get;
set;
}
public bool SpaceBeforeAnonymousMethodParentheses {
get;
set;
}
public bool SpaceWithinAnonymousMethodParentheses {
get;
set;
}
// brackets
public bool SpacesWithinBrackets { // tested
get;
set;
}
public bool SpacesBeforeBrackets { // tested
get;
set;
}
public bool SpaceBeforeBracketComma { // tested
get;
set;
}
public bool SpaceAfterBracketComma { // tested
get;
set;
}
public bool SpaceBeforeForSemicolon { // tested
get;
set;
}
public bool SpaceAfterForSemicolon { // tested
get;
set;
}
public bool SpaceAfterTypecast { // tested
get;
set;
}
public bool SpaceBeforeArrayDeclarationBrackets { // tested
get;
set;
}
public bool SpaceInNamedArgumentAfterDoubleColon {
get;
set;
}
public bool RemoveEndOfLineWhiteSpace {
get;
set;
}
public bool SpaceBeforeSemicolon {
get;
set;
}
#endregion
#region Blank Lines
public int MinimumBlankLinesBeforeUsings {
get;
set;
}
public int MinimumBlankLinesAfterUsings {
get;
set;
}
public int MinimumBlankLinesBeforeFirstDeclaration {
get;
set;
}
public int MinimumBlankLinesBetweenTypes {
get;
set;
}
public int MinimumBlankLinesBetweenFields {
get;
set;
}
public int MinimumBlankLinesBetweenEventFields {
get;
set;
}
public int MinimumBlankLinesBetweenMembers {
get;
set;
}
public int MinimumBlankLinesAroundRegion {
get;
set;
}
public int MinimumBlankLinesInsideRegion {
get;
set;
}
#endregion
#region Keep formatting
public bool KeepCommentsAtFirstColumn {
get;
set;
}
#endregion
#region Wrapping
public Wrapping ArrayInitializerWrapping {
get;
set;
}
public BraceStyle ArrayInitializerBraceStyle {
get;
set;
}
public Wrapping ChainedMethodCallWrapping {
get;
set;
}
public Wrapping MethodCallArgumentWrapping {
get;
set;
}
public NewLinePlacement NewLineAferMethodCallOpenParentheses {
get;
set;
}
public NewLinePlacement MethodCallClosingParenthesesOnNewLine {
get;
set;
}
public Wrapping IndexerArgumentWrapping {
get;
set;
}
public NewLinePlacement NewLineAferIndexerOpenBracket {
get;
set;
}
public NewLinePlacement IndexerClosingBracketOnNewLine {
get;
set;
}
public Wrapping MethodDeclarationParameterWrapping {
get;
set;
}
public NewLinePlacement NewLineAferMethodDeclarationOpenParentheses {
get;
set;
}
public NewLinePlacement MethodDeclarationClosingParenthesesOnNewLine {
get;
set;
}
public Wrapping IndexerDeclarationParameterWrapping {
get;
set;
}
public NewLinePlacement NewLineAferIndexerDeclarationOpenBracket {
get;
set;
}
public NewLinePlacement IndexerDeclarationClosingBracketOnNewLine {
get;
set;
}
public bool AlignToFirstIndexerArgument {
get;
set;
}
public bool AlignToFirstIndexerDeclarationParameter {
get;
set;
}
public bool AlignToFirstMethodCallArgument {
get;
set;
}
public bool AlignToFirstMethodDeclarationParameter {
get;
set;
}
public NewLinePlacement NewLineBeforeNewQueryClause {
get;
set;
}
#endregion
#region Using Declarations
public UsingPlacement UsingPlacement {
get;
set;
}
#endregion
internal CSharpFormattingOptions()
{
}
/*public static CSharpFormattingOptions Load (FilePath selectedFile)
{
using (var stream = System.IO.File.OpenRead (selectedFile)) {
return Load (stream);
}
}
public static CSharpFormattingOptions Load (System.IO.Stream input)
{
CSharpFormattingOptions result = FormattingOptionsFactory.CreateMonoOptions ();
result.Name = "noname";
using (XmlTextReader reader = new XmlTextReader (input)) {
while (reader.Read ()) {
if (reader.NodeType == XmlNodeType.Element) {
if (reader.LocalName == "Property") {
var info = typeof(CSharpFormattingOptions).GetProperty (reader.GetAttribute ("name"));
string valString = reader.GetAttribute ("value");
object value;
if (info.PropertyType == typeof(bool)) {
value = Boolean.Parse (valString);
} else if (info.PropertyType == typeof(int)) {
value = Int32.Parse (valString);
} else {
value = Enum.Parse (info.PropertyType, valString);
}
info.SetValue (result, value, null);
} else if (reader.LocalName == "FormattingProfile") {
result.Name = reader.GetAttribute ("name");
}
} else if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "FormattingProfile") {
//Console.WriteLine ("result:" + result.Name);
return result;
}
}
}
return result;
}
public void Save (string fileName)
{
using (var writer = new XmlTextWriter (fileName, Encoding.Default)) {
writer.Formatting = System.Xml.Formatting.Indented;
writer.Indentation = 1;
writer.IndentChar = '\t';
writer.WriteStartElement ("FormattingProfile");
writer.WriteAttributeString ("name", Name);
foreach (PropertyInfo info in typeof (CSharpFormattingOptions).GetProperties ()) {
if (info.GetCustomAttributes (false).Any (o => o.GetType () == typeof(ItemPropertyAttribute))) {
writer.WriteStartElement ("Property");
writer.WriteAttributeString ("name", info.Name);
writer.WriteAttributeString ("value", info.GetValue (this, null).ToString ());
writer.WriteEndElement ();
}
}
writer.WriteEndElement ();
}
}
public bool Equals (CSharpFormattingOptions other)
{
foreach (PropertyInfo info in typeof (CSharpFormattingOptions).GetProperties ()) {
if (info.GetCustomAttributes (false).Any (o => o.GetType () == typeof(ItemPropertyAttribute))) {
object val = info.GetValue (this, null);
object otherVal = info.GetValue (other, null);
if (val == null) {
if (otherVal == null)
continue;
return false;
}
if (!val.Equals (otherVal)) {
//Console.WriteLine ("!equal");
return false;
}
}
}
//Console.WriteLine ("== equal");
return true;
}*/
}
}