static private GetTextWithoutCommentsAndStrings ( Mono doc, int start, int end ) : IEnumerable |
||
doc | Mono | |
start | int | |
end | int | |
Résultat | IEnumerable |
public override bool Handle(TextEditor editor, DocumentContext ctx, KeyDescriptor descriptor) { if (descriptor.KeyChar == '\'' && editor.MimeType == "text/fsharp") { return(false); } int braceIndex = openBrackets.IndexOf(descriptor.KeyChar); if (braceIndex < 0) { return(false); } var extEditor = ((SourceEditorView)editor.Implementation).SourceEditorWidget.TextEditor; var line = extEditor.Document.GetLine(extEditor.Caret.Line); if (line == null) { return(false); } bool inStringOrComment = false; var stack = extEditor.SyntaxHighlighting.GetScopeStackAsync(Math.Max(0, extEditor.Caret.Offset - 2), CancellationToken.None).WaitAndGetResult(CancellationToken.None); foreach (var span in stack) { if (string.IsNullOrEmpty(span)) { continue; } if (span.Contains("string") || span.Contains("comment")) { inStringOrComment = true; break; } } char insertionChar = '\0'; bool insertMatchingBracket = false; if (!inStringOrComment) { char closingBrace = closingBrackets [braceIndex]; char openingBrace = openBrackets [braceIndex]; int count = 0; foreach (char curCh in ExtensibleTextEditor.GetTextWithoutCommentsAndStrings(extEditor.Document, 0, extEditor.Document.Length)) { if (curCh == openingBrace) { count++; } else if (curCh == closingBrace) { count--; } } if (count >= 0) { insertMatchingBracket = true; insertionChar = closingBrace; } } if (insertMatchingBracket) { using (var undo = editor.OpenUndoGroup()) { editor.EnsureCaretIsNotVirtual(); editor.InsertAtCaret(insertionChar.ToString()); editor.CaretOffset--; editor.StartSession(new SkipCharSession(insertionChar)); } return(true); } return(false); }
public override bool Handle(TextEditor editor, DocumentContext ctx, KeyDescriptor descriptor) { int braceIndex = openBrackets.IndexOf(descriptor.KeyChar); if (braceIndex < 0) { return(false); } var extEditor = ((SourceEditorView)editor.Implementation).SourceEditorWidget.TextEditor; var line = extEditor.Document.GetLine(extEditor.Caret.Line); if (line == null) { return(false); } bool inStringOrComment = false; var stack = line.StartSpan.Clone(); var sm = extEditor.Document.SyntaxMode as SyntaxMode; if (sm != null) { // extEditor.Caret.Offset - 1 means we care if we were inside string // before typing current char Mono.TextEditor.Highlighting.SyntaxModeService.ScanSpans(extEditor.Document, sm, sm, stack, line.Offset, extEditor.Caret.Offset - 1); } foreach (var span in stack) { if (string.IsNullOrEmpty(span.Color)) { continue; } if (span.Color.StartsWith("String", StringComparison.Ordinal) || span.Color.StartsWith("Comment", StringComparison.Ordinal) || span.Color.StartsWith("Xml Attribute Value", StringComparison.Ordinal)) { inStringOrComment = true; break; } } char insertionChar = '\0'; bool insertMatchingBracket = false; if (!inStringOrComment) { char closingBrace = closingBrackets [braceIndex]; char openingBrace = openBrackets [braceIndex]; int count = 0; foreach (char curCh in ExtensibleTextEditor.GetTextWithoutCommentsAndStrings(extEditor.Document, 0, extEditor.Document.TextLength)) { if (curCh == openingBrace) { count++; } else if (curCh == closingBrace) { count--; } } if (count >= 0) { insertMatchingBracket = true; insertionChar = closingBrace; } } if (insertMatchingBracket) { using (var undo = editor.OpenUndoGroup()) { editor.EnsureCaretIsNotVirtual(); editor.InsertAtCaret(insertionChar.ToString()); editor.CaretOffset--; editor.StartSession(new SkipCharSession(insertionChar)); } return(true); } return(false); }