void PlaceOnNewLine(NewLinePlacement newLine, AstNode keywordNode) { if (keywordNode == null || keywordNode.StartLocation.IsEmpty) { return; } var prev = keywordNode.GetPrevNode(NoWhitespacePredicate); if (prev is Comment || prev is PreProcessorDirective || prev is InlineAsmNode) { return; } if (newLine == NewLinePlacement.DoNotCare) { newLine = prev.EndLocation.Line == keywordNode.StartLocation.Line ? NewLinePlacement.SameLine : NewLinePlacement.NewLine; } int offset = document.GetOffset(keywordNode.StartLocation); int whitespaceStart = SearchWhitespaceStart(offset); string indentString = newLine == NewLinePlacement.NewLine ? options.EolMarker + curIndent.IndentString : " "; AddChange(whitespaceStart, offset - whitespaceStart, indentString); }
void FixIndentationForceNewLine(AstNode node) { var directive = node as PreProcessorDirective; if (node.GetPrevNode() is NewLineNode) { if (directive != null && !policy.IndentPreprocessorDirectives) { var startNode = node.GetPrevNode(); var startOffset = document.GetOffset(startNode.EndLocation); int endOffset = document.GetOffset(node.StartLocation); AddChange(startOffset, endOffset - startOffset, ""); return; } else { FixIndentation(node); } } else { // if no new line preceeds an #endif directive it's excluded if (directive != null) { if (directive.Type == PreProcessorDirectiveType.Endif) { return; } } var startNode = node.GetPrevSibling(n => !(n is WhitespaceNode)) ?? node; var startOffset = document.GetOffset(startNode.EndLocation); int endOffset = document.GetOffset(node.StartLocation); if (startOffset >= endOffset) { return; } if (directive != null && !policy.IndentPreprocessorDirectives) { AddChange(startOffset, endOffset - startOffset, ""); return; } AddChange(startOffset, endOffset - startOffset, curIndent.IndentString); } }
void CorrectClosingBrace(AstNode rbrace) { if (rbrace.IsNull) { return; } int braceOffset = document.GetOffset(rbrace.StartLocation); var prevNode = rbrace.GetPrevNode(); int prevNodeOffset = prevNode != null?document.GetOffset(prevNode.EndLocation) : 0; if (prevNode is NewLineNode) { EnsureText(prevNodeOffset, braceOffset, curIndent.IndentString); } else { EnsureText(prevNodeOffset, braceOffset, options.EolMarker + curIndent.IndentString); } }
void FixOpenBrace(BraceStyle braceStyle, AstNode lbrace) { if (lbrace.IsNull) { return; } switch (braceStyle) { case BraceStyle.DoNotChange: return; case BraceStyle.BannerStyle: case BraceStyle.EndOfLine: var prev = lbrace.GetPrevNode(NoWhitespacePredicate); if (prev is PreProcessorDirective) { return; } int prevOffset = document.GetOffset(prev.EndLocation); if (prev is Comment || prev is PreProcessorDirective || prev is InlineAsmNode) { int next = document.GetOffset(lbrace.GetNextNode().StartLocation); EnsureText(prevOffset, next, ""); while (prev is Comment || prev is PreProcessorDirective || prev is InlineAsmNode) { prev = prev.GetPrevNode(); } prevOffset = document.GetOffset(prev.EndLocation); AddChange(prevOffset, 0, " {"); } else { int braceOffset2 = document.GetOffset(lbrace.StartLocation); EnsureText(prevOffset, braceOffset2, " "); } break; case BraceStyle.EndOfLineWithoutSpace: prev = lbrace.GetPrevNode(NoWhitespacePredicate); if (prev is PreProcessorDirective) { return; } prevOffset = document.GetOffset(prev.EndLocation); int braceOffset = document.GetOffset(lbrace.StartLocation); EnsureText(prevOffset, braceOffset, ""); break; case BraceStyle.NextLine: prev = lbrace.GetPrevNode(NoWhitespacePredicate); if (prev is PreProcessorDirective) { return; } prevOffset = document.GetOffset(prev.EndLocation); braceOffset = document.GetOffset(lbrace.StartLocation); EnsureText(prevOffset, braceOffset, options.EolMarker + curIndent.IndentString); break; case BraceStyle.NextLineShifted: prev = lbrace.GetPrevNode(NoWhitespacePredicate); if (prev is PreProcessorDirective) { return; } prevOffset = document.GetOffset(prev.EndLocation); braceOffset = document.GetOffset(lbrace.StartLocation); curIndent.Push(IndentType.Block); EnsureText(prevOffset, braceOffset, options.EolMarker + curIndent.IndentString); curIndent.Pop(); break; case BraceStyle.NextLineShifted2: prev = lbrace.GetPrevNode(NoWhitespacePredicate); if (prev is PreProcessorDirective) { return; } prevOffset = document.GetOffset(prev.EndLocation); braceOffset = document.GetOffset(lbrace.StartLocation); curIndent.Push(IndentType.Block); EnsureText(prevOffset, braceOffset, options.EolMarker + curIndent.IndentString); curIndent.Pop(); break; } }