public bool FixLineStart(Ide.Editor.TextEditor textEditorData, ICSharpCode.NRefactory6.CSharp.IStateMachineIndentEngine stateTracker, int lineNumber) { if (lineNumber > 1) { var line = textEditorData.GetLine(lineNumber); if (line == null) { return(false); } var prevLine = textEditorData.GetLine(lineNumber - 1); if (prevLine == null) { return(false); } string trimmedPreviousLine = textEditorData.GetTextAt(prevLine).TrimStart(); //xml doc comments //check previous line was a doc comment //check there's a following line? if (trimmedPreviousLine.StartsWith("///", StringComparison.Ordinal)) { if (textEditorData.GetTextAt(line.Offset, line.Length).TrimStart().StartsWith("///", StringComparison.Ordinal)) { return(false); } //check that the newline command actually inserted a newline textEditorData.EnsureCaretIsNotVirtual(); var nextLineSegment = textEditorData.GetLine(lineNumber + 1); string nextLine = nextLineSegment != null?textEditorData.GetTextAt(nextLineSegment).TrimStart() : ""; if (trimmedPreviousLine.Length > "///".Length || nextLine.StartsWith("///", StringComparison.Ordinal)) { var insertionPoint = textEditorData.CaretOffset; textEditorData.InsertText(insertionPoint, "/// "); textEditorData.CaretOffset = insertionPoint + "/// ".Length; return(true); } //multi-line comments } else if (stateTracker.IsInsideMultiLineComment) { if (textEditorData.GetTextAt(line.Offset, line.Length).TrimStart().StartsWith("*", StringComparison.Ordinal)) { return(false); } textEditorData.EnsureCaretIsNotVirtual(); string commentPrefix = string.Empty; if (trimmedPreviousLine.StartsWith("* ", StringComparison.Ordinal)) { commentPrefix = "* "; } else if (trimmedPreviousLine.StartsWith("/**", StringComparison.Ordinal) || trimmedPreviousLine.StartsWith("/*", StringComparison.Ordinal)) { commentPrefix = " * "; } else if (trimmedPreviousLine.StartsWith("*", StringComparison.Ordinal)) { commentPrefix = "*"; } int indentSize = line.GetIndentation(textEditorData).Length; var insertedText = prevLine.GetIndentation(textEditorData) + commentPrefix; textEditorData.ReplaceText(line.Offset, indentSize, insertedText); textEditorData.CaretOffset = line.Offset + insertedText.Length; return(true); } else if (wasInStringLiteral) { var lexer = new ICSharpCode.NRefactory.CSharp.Completion.CSharpCompletionEngineBase.MiniLexer(textEditorData.GetTextAt(0, prevLine.EndOffset).TrimEnd()); lexer.Parse(); if (!lexer.IsInString) { return(false); } textEditorData.EnsureCaretIsNotVirtual(); var insertedText = "\" +"; textEditorData.InsertText(prevLine.Offset + prevLine.Length, insertedText); var lineOffset = line.Offset + insertedText.Length; int indentSize = textEditorData.CaretOffset - lineOffset; insertedText = prevLine.GetIndentation(textEditorData) + (trimmedPreviousLine.StartsWith("\"", StringComparison.Ordinal) ? "" : "\t") + "\""; textEditorData.ReplaceText(lineOffset, indentSize, insertedText); return(true); } } return(false); }