コード例 #1
0
        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);
        }