2
// AstFormattingVisitor_TypeMembers.cs
5
// Mike KrĆ¼ger <mkrueger@xamarin.com>
7
// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com)
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
10
// of this software and associated documentation files (the "Software"), to deal
11
// in the Software without restriction, including without limitation the rights
12
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
// copies of the Software, and to permit persons to whom the Software is
14
// furnished to do so, subject to the following conditions:
16
// The above copyright notice and this permission notice shall be included in
17
// all copies or substantial portions of the Software.
19
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29
namespace ICSharpCode.NRefactory.CSharp
31
partial class FormattingVisitor : DepthFirstAstVisitor
33
public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration)
35
FixAttributes(propertyDeclaration);
37
bool fixClosingBrace = false;
38
switch (policy.PropertyFormatting) {
39
case PropertyFormatting.AllowOneLine:
40
bool isSimple = IsSimpleAccessor(propertyDeclaration.Getter) && IsSimpleAccessor(propertyDeclaration.Setter);
41
int accessorLine = propertyDeclaration.RBraceToken.StartLocation.Line;
42
if (!propertyDeclaration.Getter.IsNull && propertyDeclaration.Setter.IsNull) {
43
accessorLine = propertyDeclaration.Getter.StartLocation.Line;
44
} else if (propertyDeclaration.Getter.IsNull && !propertyDeclaration.Setter.IsNull) {
45
accessorLine = propertyDeclaration.Setter.StartLocation.Line;
47
var acc = propertyDeclaration.Getter.StartLocation < propertyDeclaration.Setter.StartLocation ?
48
propertyDeclaration.Getter : propertyDeclaration.Setter;
49
accessorLine = acc.StartLocation.Line;
51
if (!isSimple || propertyDeclaration.LBraceToken.StartLocation.Line != accessorLine) {
52
fixClosingBrace = true;
53
FixOpenBrace(policy.PropertyBraceStyle, propertyDeclaration.LBraceToken);
55
ForceSpacesBefore(propertyDeclaration.Getter, true);
56
ForceSpacesBefore(propertyDeclaration.Setter, true);
57
ForceSpacesBeforeRemoveNewLines(propertyDeclaration.RBraceToken, true);
61
case PropertyFormatting.ForceNewLine:
62
fixClosingBrace = true;
63
FixOpenBrace(policy.PropertyBraceStyle, propertyDeclaration.LBraceToken);
65
case PropertyFormatting.ForceOneLine:
66
isSimple = IsSimpleAccessor(propertyDeclaration.Getter) && IsSimpleAccessor(propertyDeclaration.Setter);
68
int offset = this.document.GetOffset(propertyDeclaration.LBraceToken.StartLocation);
70
int start = SearchWhitespaceStart(offset);
71
int end = SearchWhitespaceEnd(offset);
72
AddChange(start, offset - start, " ");
73
AddChange(offset + 1, end - offset - 2, " ");
75
offset = this.document.GetOffset(propertyDeclaration.RBraceToken.StartLocation);
76
start = SearchWhitespaceStart(offset);
77
AddChange(start, offset - start, " ");
81
fixClosingBrace = true;
82
FixOpenBrace(policy.PropertyBraceStyle, propertyDeclaration.LBraceToken);
86
if (policy.IndentPropertyBody)
87
curIndent.Push(IndentType.Block);
89
///System.Console.WriteLine ("one line: " + oneLine);
90
if (!propertyDeclaration.Getter.IsNull) {
92
if (!IsLineIsEmptyUpToEol(propertyDeclaration.Getter.StartLocation)) {
93
int offset = this.document.GetOffset(propertyDeclaration.Getter.StartLocation);
94
int start = SearchWhitespaceStart(offset);
95
string indentString = this.curIndent.IndentString;
96
AddChange(start, offset - start, this.options.EolMarker + indentString);
98
FixIndentation(propertyDeclaration.Getter);
101
int offset = this.document.GetOffset(propertyDeclaration.Getter.StartLocation);
102
int start = SearchWhitespaceStart(offset);
103
AddChange(start, offset - start, " ");
105
ForceSpacesBefore(propertyDeclaration.Getter.Body.LBraceToken, true);
106
ForceSpacesBefore(propertyDeclaration.Getter.Body.RBraceToken, true);
108
if (!propertyDeclaration.Getter.Body.IsNull) {
109
if (!policy.AllowPropertyGetBlockInline || propertyDeclaration.Getter.Body.LBraceToken.StartLocation.Line != propertyDeclaration.Getter.Body.RBraceToken.StartLocation.Line) {
110
FixOpenBrace(policy.PropertyGetBraceStyle, propertyDeclaration.Getter.Body.LBraceToken);
111
VisitBlockWithoutFixingBraces(propertyDeclaration.Getter.Body, policy.IndentBlocks);
112
FixClosingBrace(policy.PropertyGetBraceStyle, propertyDeclaration.Getter.Body.RBraceToken);
114
nextStatementIndent = " ";
115
VisitBlockWithoutFixingBraces(propertyDeclaration.Getter.Body, policy.IndentBlocks);
121
if (!propertyDeclaration.Setter.IsNull) {
123
if (!IsLineIsEmptyUpToEol(propertyDeclaration.Setter.StartLocation)) {
124
int offset = document.GetOffset(propertyDeclaration.Setter.StartLocation);
125
int start = SearchWhitespaceStart(offset);
126
string indentString = curIndent.IndentString;
127
AddChange(start, offset - start, options.EolMarker + indentString);
129
FixIndentation(propertyDeclaration.Setter);
132
int offset = this.document.GetOffset(propertyDeclaration.Setter.StartLocation);
133
int start = SearchWhitespaceStart(offset);
134
AddChange(start, offset - start, " ");
136
ForceSpacesBefore(propertyDeclaration.Setter.Body.LBraceToken, true);
137
ForceSpacesBefore(propertyDeclaration.Setter.Body.RBraceToken, true);
139
if (!propertyDeclaration.Setter.Body.IsNull) {
140
if (!policy.AllowPropertySetBlockInline || propertyDeclaration.Setter.Body.LBraceToken.StartLocation.Line != propertyDeclaration.Setter.Body.RBraceToken.StartLocation.Line) {
141
FixOpenBrace(policy.PropertySetBraceStyle, propertyDeclaration.Setter.Body.LBraceToken);
142
VisitBlockWithoutFixingBraces(propertyDeclaration.Setter.Body, policy.IndentBlocks);
143
FixClosingBrace(policy.PropertySetBraceStyle, propertyDeclaration.Setter.Body.RBraceToken);
145
nextStatementIndent = " ";
146
VisitBlockWithoutFixingBraces(propertyDeclaration.Setter.Body, policy.IndentBlocks);
151
if (policy.IndentPropertyBody) {
155
FixClosingBrace(policy.PropertyBraceStyle, propertyDeclaration.RBraceToken);
159
public override void VisitAccessor(Accessor accessor)
161
FixAttributes(accessor);
163
base.VisitAccessor(accessor);
167
public override void VisitIndexerDeclaration(IndexerDeclaration indexerDeclaration)
169
FixAttributes(indexerDeclaration);
171
ForceSpacesBefore(indexerDeclaration.LBracketToken, policy.SpaceBeforeIndexerDeclarationBracket);
172
ForceSpacesAfter(indexerDeclaration.LBracketToken, policy.SpaceWithinIndexerDeclarationBracket);
174
FormatArguments(indexerDeclaration);
176
FixOpenBrace(policy.PropertyBraceStyle, indexerDeclaration.LBraceToken);
177
if (policy.IndentPropertyBody)
178
curIndent.Push(IndentType.Block);
180
if (!indexerDeclaration.Getter.IsNull) {
181
FixIndentation(indexerDeclaration.Getter);
182
if (!indexerDeclaration.Getter.Body.IsNull) {
183
if (!policy.AllowPropertyGetBlockInline || indexerDeclaration.Getter.Body.LBraceToken.StartLocation.Line != indexerDeclaration.Getter.Body.RBraceToken.StartLocation.Line) {
184
FixOpenBrace(policy.PropertyGetBraceStyle, indexerDeclaration.Getter.Body.LBraceToken);
185
VisitBlockWithoutFixingBraces(indexerDeclaration.Getter.Body, policy.IndentBlocks);
186
FixClosingBrace(policy.PropertyGetBraceStyle, indexerDeclaration.Getter.Body.RBraceToken);
188
nextStatementIndent = " ";
189
VisitBlockWithoutFixingBraces(indexerDeclaration.Getter.Body, policy.IndentBlocks);
194
if (!indexerDeclaration.Setter.IsNull) {
195
FixIndentation(indexerDeclaration.Setter);
196
if (!indexerDeclaration.Setter.Body.IsNull) {
197
if (!policy.AllowPropertySetBlockInline || indexerDeclaration.Setter.Body.LBraceToken.StartLocation.Line != indexerDeclaration.Setter.Body.RBraceToken.StartLocation.Line) {
198
FixOpenBrace(policy.PropertySetBraceStyle, indexerDeclaration.Setter.Body.LBraceToken);
199
VisitBlockWithoutFixingBraces(indexerDeclaration.Setter.Body, policy.IndentBlocks);
200
FixClosingBrace(policy.PropertySetBraceStyle, indexerDeclaration.Setter.Body.RBraceToken);
202
nextStatementIndent = " ";
203
VisitBlockWithoutFixingBraces(indexerDeclaration.Setter.Body, policy.IndentBlocks);
207
if (policy.IndentPropertyBody)
210
FixClosingBrace(policy.PropertyBraceStyle, indexerDeclaration.RBraceToken);
213
static bool IsSimpleEvent(AstNode node)
215
return node is EventDeclaration;
218
public override void VisitCustomEventDeclaration(CustomEventDeclaration eventDeclaration)
220
FixAttributes(eventDeclaration);
222
FixOpenBrace(policy.EventBraceStyle, eventDeclaration.LBraceToken);
223
if (policy.IndentEventBody)
224
curIndent.Push(IndentType.Block);
226
if (!eventDeclaration.AddAccessor.IsNull) {
227
FixIndentation(eventDeclaration.AddAccessor);
228
if (!eventDeclaration.AddAccessor.Body.IsNull) {
229
if (!policy.AllowEventAddBlockInline || eventDeclaration.AddAccessor.Body.LBraceToken.StartLocation.Line != eventDeclaration.AddAccessor.Body.RBraceToken.StartLocation.Line) {
230
FixOpenBrace(policy.EventAddBraceStyle, eventDeclaration.AddAccessor.Body.LBraceToken);
231
VisitBlockWithoutFixingBraces(eventDeclaration.AddAccessor.Body, policy.IndentBlocks);
232
FixClosingBrace(policy.EventAddBraceStyle, eventDeclaration.AddAccessor.Body.RBraceToken);
234
nextStatementIndent = " ";
235
VisitBlockWithoutFixingBraces(eventDeclaration.AddAccessor.Body, policy.IndentBlocks);
240
if (!eventDeclaration.RemoveAccessor.IsNull) {
241
FixIndentation(eventDeclaration.RemoveAccessor);
242
if (!eventDeclaration.RemoveAccessor.Body.IsNull) {
243
if (!policy.AllowEventRemoveBlockInline || eventDeclaration.RemoveAccessor.Body.LBraceToken.StartLocation.Line != eventDeclaration.RemoveAccessor.Body.RBraceToken.StartLocation.Line) {
244
FixOpenBrace(policy.EventRemoveBraceStyle, eventDeclaration.RemoveAccessor.Body.LBraceToken);
245
VisitBlockWithoutFixingBraces(eventDeclaration.RemoveAccessor.Body, policy.IndentBlocks);
246
FixClosingBrace(policy.EventRemoveBraceStyle, eventDeclaration.RemoveAccessor.Body.RBraceToken);
248
nextStatementIndent = " ";
249
VisitBlockWithoutFixingBraces(eventDeclaration.RemoveAccessor.Body, policy.IndentBlocks);
254
if (policy.IndentEventBody)
257
FixClosingBrace(policy.EventBraceStyle, eventDeclaration.RBraceToken);
260
public override void VisitEventDeclaration(EventDeclaration eventDeclaration)
262
FixAttributes(eventDeclaration);
264
var lastLoc = eventDeclaration.StartLocation;
265
curIndent.Push(IndentType.Block);
266
foreach (var initializer in eventDeclaration.Variables) {
267
if (lastLoc.Line != initializer.StartLocation.Line) {
268
FixStatementIndentation(initializer.StartLocation);
269
lastLoc = initializer.StartLocation;
271
initializer.AcceptVisitor(this);
277
public override void VisitFieldDeclaration(FieldDeclaration fieldDeclaration)
279
FixAttributes(fieldDeclaration);
281
fieldDeclaration.ReturnType.AcceptVisitor(this);
282
ForceSpacesAfter(fieldDeclaration.ReturnType, true);
284
FormatCommas(fieldDeclaration, policy.SpaceBeforeFieldDeclarationComma, policy.SpaceAfterFieldDeclarationComma);
286
var lastLoc = fieldDeclaration.StartLocation;
287
foreach (var initializer in fieldDeclaration.Variables) {
288
if (lastLoc.Line != initializer.StartLocation.Line) {
289
curIndent.Push(IndentType.Block);
290
FixStatementIndentation(initializer.StartLocation);
292
lastLoc = initializer.StartLocation;
294
initializer.AcceptVisitor(this);
298
public override void VisitFixedFieldDeclaration(FixedFieldDeclaration fixedFieldDeclaration)
300
FixAttributes(fixedFieldDeclaration);
302
FormatCommas(fixedFieldDeclaration, policy.SpaceBeforeFieldDeclarationComma, policy.SpaceAfterFieldDeclarationComma);
304
var lastLoc = fixedFieldDeclaration.StartLocation;
305
curIndent.Push(IndentType.Block);
306
foreach (var initializer in fixedFieldDeclaration.Variables) {
307
if (lastLoc.Line != initializer.StartLocation.Line) {
308
FixStatementIndentation(initializer.StartLocation);
309
lastLoc = initializer.StartLocation;
311
initializer.AcceptVisitor(this);
316
public override void VisitEnumMemberDeclaration(EnumMemberDeclaration enumMemberDeclaration)
318
FixAttributes(enumMemberDeclaration);
320
base.VisitEnumMemberDeclaration(enumMemberDeclaration);
323
public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration)
325
FixAttributes(methodDeclaration);
327
ForceSpacesBefore(methodDeclaration.LParToken, policy.SpaceBeforeMethodDeclarationParentheses);
328
if (methodDeclaration.Parameters.Any()) {
329
ForceSpacesAfter(methodDeclaration.LParToken, policy.SpaceWithinMethodDeclarationParentheses);
330
FormatArguments(methodDeclaration);
332
ForceSpacesAfter(methodDeclaration.LParToken, policy.SpaceBetweenEmptyMethodDeclarationParentheses);
333
ForceSpacesBefore(methodDeclaration.RParToken, policy.SpaceBetweenEmptyMethodDeclarationParentheses);
336
if (!methodDeclaration.Body.IsNull) {
337
FixOpenBrace(policy.MethodBraceStyle, methodDeclaration.Body.LBraceToken);
338
VisitBlockWithoutFixingBraces(methodDeclaration.Body, policy.IndentMethodBody);
339
FixClosingBrace(policy.MethodBraceStyle, methodDeclaration.Body.RBraceToken);
343
public override void VisitOperatorDeclaration(OperatorDeclaration operatorDeclaration)
345
FixAttributes(operatorDeclaration);
347
ForceSpacesBefore(operatorDeclaration.LParToken, policy.SpaceBeforeMethodDeclarationParentheses);
348
if (operatorDeclaration.Parameters.Any()) {
349
ForceSpacesAfter(operatorDeclaration.LParToken, policy.SpaceWithinMethodDeclarationParentheses);
350
FormatArguments(operatorDeclaration);
352
ForceSpacesAfter(operatorDeclaration.LParToken, policy.SpaceBetweenEmptyMethodDeclarationParentheses);
353
ForceSpacesBefore(operatorDeclaration.RParToken, policy.SpaceBetweenEmptyMethodDeclarationParentheses);
356
if (!operatorDeclaration.Body.IsNull) {
357
FixOpenBrace(policy.MethodBraceStyle, operatorDeclaration.Body.LBraceToken);
358
VisitBlockWithoutFixingBraces(operatorDeclaration.Body, policy.IndentMethodBody);
359
FixClosingBrace(policy.MethodBraceStyle, operatorDeclaration.Body.RBraceToken);
363
public override void VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration)
365
FixAttributes(constructorDeclaration);
367
ForceSpacesBefore(constructorDeclaration.LParToken, policy.SpaceBeforeConstructorDeclarationParentheses);
368
if (constructorDeclaration.Parameters.Any()) {
369
ForceSpacesAfter(constructorDeclaration.LParToken, policy.SpaceWithinConstructorDeclarationParentheses);
370
FormatArguments(constructorDeclaration);
372
ForceSpacesAfter(constructorDeclaration.LParToken, policy.SpaceBetweenEmptyConstructorDeclarationParentheses);
373
ForceSpacesBefore(constructorDeclaration.RParToken, policy.SpaceBetweenEmptyConstructorDeclarationParentheses);
376
if (!constructorDeclaration.Body.IsNull) {
377
FixOpenBrace(policy.ConstructorBraceStyle, constructorDeclaration.Body.LBraceToken);
378
VisitBlockWithoutFixingBraces(constructorDeclaration.Body, policy.IndentMethodBody);
379
FixClosingBrace(policy.ConstructorBraceStyle, constructorDeclaration.Body.RBraceToken);
383
public override void VisitDestructorDeclaration(DestructorDeclaration destructorDeclaration)
385
FixAttributes(destructorDeclaration);
387
CSharpTokenNode lParen = destructorDeclaration.LParToken;
388
ForceSpaceBefore(lParen, policy.SpaceBeforeConstructorDeclarationParentheses);
390
if (!destructorDeclaration.Body.IsNull) {
391
FixOpenBrace(policy.DestructorBraceStyle, destructorDeclaration.Body.LBraceToken);
392
VisitBlockWithoutFixingBraces(destructorDeclaration.Body, policy.IndentMethodBody);
393
FixClosingBrace(policy.DestructorBraceStyle, destructorDeclaration.Body.RBraceToken);