static void CheckLine(Mono.TextEditor.Document doc, Mono.TextEditor.LineSegment line, out bool isBlank, out bool isBracket) { isBlank = true; isBracket = false; if (line == null) { return; } for (int i = 0; i < line.Length; i++) { char c = doc.GetCharAt(line.Offset + i); if (c == '{') { isBracket = true; isBlank = false; } else if (!Char.IsWhiteSpace(c)) { isBlank = false; if (isBracket) { isBracket = false; break; } } } }
public override List <Change> PerformChanges(RefactoringOptions options, object properties) { List <Change> result = new List <Change> (); ICSharpCode.NRefactory.CSharp.CompilationUnit unit = options.GetASTProvider().ParseFile(options.Document.Editor.Text); FindTypeReferencesVisitor visitor = new FindTypeReferencesVisitor(options.GetTextEditorData(), options.GetResolver()); visitor.VisitCompilationUnit(unit, null); ProjectDom dom = options.Dom; ICompilationUnit compilationUnit = options.ParseDocument().CompilationUnit; HashSet <string> usedUsings = new HashSet <string> (); foreach (var r in visitor.PossibleTypeReferences) { if (r is PrimitiveType) { continue; } IType type = dom.SearchType(compilationUnit, options.ResolveResult != null ? options.ResolveResult.CallingType : null, new DomLocation(options.Document.Editor.Caret.Line, options.Document.Editor.Caret.Column), r.ConvertToReturnType()); if (type != null) { usedUsings.Add(type.Namespace); } } Mono.TextEditor.TextEditorData textEditorData = options.GetTextEditorData(); HashSet <string> currentUsings = new HashSet <string> (); foreach (IUsing u in compilationUnit.Usings) { if (u.IsFromNamespace) { continue; } if (!u.Aliases.Any() && u.Namespaces.All(name => currentUsings.Contains(name) || !usedUsings.Contains(name))) { TextReplaceChange change = new TextReplaceChange(); change.FileName = options.Document.FileName; change.Offset = textEditorData.Document.LocationToOffset(u.Region.Start.Line, u.Region.Start.Column); change.RemovedChars = textEditorData.Document.LocationToOffset(u.Region.End.Line, u.Region.End.Column) - change.Offset; Mono.TextEditor.LineSegment line = textEditorData.Document.GetLineByOffset(change.Offset); if (line != null && line.EditableLength == change.RemovedChars) { change.RemovedChars += line.DelimiterLength; } result.Add(change); } foreach (string nspace in u.Namespaces) { currentUsings.Add(nspace); } } return(result); }
static bool IsBlankLine(Mono.TextEditor.Document doc, Mono.TextEditor.LineSegment line) { for (int i = 0; i < line.EditableLength; i++) { if (!Char.IsWhiteSpace(doc.GetCharAt(line.Offset + i))) { return(false); } } return(true); }
public static void MoveBlockDown(TextEditorData data) { int lineStart = data.Caret.Line; int lineEnd = data.Caret.Line; bool setSelection = lineStart != lineEnd; if (data.IsSomethingSelected) { setSelection = true; lineStart = data.MainSelection.MinLine; lineEnd = data.MainSelection.MaxLine; } if (lineStart <= 0) { return; } data.Document.BeginAtomicUndo(); //Mono.TextEditor.LineSegment startLine = data.Document.GetLine (lineStart); //int relCaretOffset = data.Caret.Offset - startLine.Offset; Mono.TextEditor.LineSegment nextLine = data.Document.GetLine(lineEnd + 1); if (nextLine == null) { return; } string text = data.Document.GetTextAt(nextLine.Offset, nextLine.EditableLength); List <TextMarker> prevLineMarkers = new List <TextMarker> (nextLine.Markers); nextLine.ClearMarker(); for (int i = lineEnd + 1; i >= lineStart; i--) { LineSegment cur = data.Document.GetLine(i); LineSegment prev = data.Document.GetLine(i - 1); data.Replace(cur.Offset, cur.EditableLength, i != lineStart ? data.Document.GetTextAt(prev.Offset, prev.EditableLength) : text); data.Document.GetLine(i).ClearMarker(); foreach (TextMarker marker in (i != lineStart ? data.Document.GetLine(i - 1).Markers : prevLineMarkers)) { data.Document.GetLine(i).AddMarker(marker); } } data.Caret.Line++; if (setSelection) { data.SetSelection(data.Document.GetLine(lineStart + 1).Offset, data.Document.GetLine(lineEnd + 1).Offset + data.Document.GetLine(lineEnd + 1).EditableLength); } data.Document.EndAtomicUndo(); }
public static void MoveBlockUp(TextEditorData data) { int lineStart = data.Caret.Line; int lineEnd = data.Caret.Line; bool setSelection = lineStart != lineEnd; if (data.IsSomethingSelected) { setSelection = true; lineStart = data.MainSelection.MinLine; lineEnd = data.MainSelection.MaxLine; } if (lineStart <= 0) { return; } using (var undo = data.OpenUndoGroup()) { //Mono.TextEditor.LineSegment startLine = data.Document.GetLine (lineStart); //int relCaretOffset = data.Caret.Offset - startLine.Offset; Mono.TextEditor.LineSegment prevLine = data.Document.GetLine(lineStart - 1); string text = data.Document.GetTextAt(prevLine.Offset, prevLine.EditableLength); List <TextMarker> prevLineMarkers = new List <TextMarker> (prevLine.Markers); prevLine.ClearMarker(); for (int i = lineStart - 1; i <= lineEnd; i++) { LineSegment cur = data.Document.GetLine(i); LineSegment next = data.Document.GetLine(i + 1); data.Replace(cur.Offset, cur.EditableLength, i != lineEnd ? data.Document.GetTextAt(next.Offset, next.EditableLength) : text); data.Document.GetLine(i).ClearMarker(); foreach (TextMarker marker in (i != lineEnd ? data.Document.GetLine(i + 1).Markers : prevLineMarkers)) { data.Document.GetLine(i).AddMarker(marker); } } data.Caret.Line--; if (setSelection) { data.SetSelection(data.Document.GetLine(lineStart - 1).Offset, data.Document.GetLine(lineEnd - 1).Offset + data.Document.GetLine(lineEnd - 1).EditableLength); } } }
static string StripHeaderAndBlankLines(string text, CodeDomProvider provider) { Mono.TextEditor.Document doc = new Mono.TextEditor.Document(); doc.Text = text; int realStartLine = 0; for (int i = 0; i < doc.LineCount; i++) { var lineSegment = doc.GetLine(i); if (lineSegment == null) { continue; } string lineText = doc.GetTextAt(lineSegment); // Microsoft.NET generates "auto-generated" tags where Mono generates "autogenerated" tags. if (lineText.Contains("</autofgenerated>") || lineText.Contains("</auto-generated>")) { realStartLine = i + 2; break; } } // The Mono provider inserts additional blank lines, so strip them out // But blank lines might actually be significant in other languages. // We reformat the C# generated output to the user's coding style anyway, but the reformatter preserves blank lines if (provider is Microsoft.CSharp.CSharpCodeProvider) { bool previousWasBlank = false; for (int i = 0; i < doc.LineCount; i++) { Mono.TextEditor.LineSegment line = doc.GetLine(i); bool isBlank, isBracket; CheckLine(doc, line, out isBlank, out isBracket); if (isBlank && previousWasBlank && line.Length > 0) { ((Mono.TextEditor.IBuffer)doc).Remove(line.Offset, line.Length); i--; } previousWasBlank = isBlank || isBracket; } } int offset = doc.GetLine(realStartLine).Offset; return(doc.GetTextAt(offset, doc.Length - offset)); }
public override List <Change> PerformChanges(RefactoringOptions options, object properties) { List <Change> result = new List <Change> (); ICompilationUnit compilationUnit = options.ParseDocument().CompilationUnit; Mono.TextEditor.TextEditorData textEditorData = options.GetTextEditorData(); int minOffset = int.MaxValue; foreach (IUsing u in compilationUnit.Usings) { if (u.IsFromNamespace) { continue; } int offset = textEditorData.Document.LocationToOffset(u.Region.Start.Line, u.Region.Start.Column); TextReplaceChange change = new TextReplaceChange() { FileName = options.Document.FileName, Offset = offset, RemovedChars = textEditorData.Document.LocationToOffset(u.Region.End.Line, u.Region.End.Column) - offset }; Mono.TextEditor.LineSegment line = textEditorData.Document.GetLineByOffset(change.Offset); if (line != null && line.EditableLength == change.RemovedChars) { change.RemovedChars += line.DelimiterLength; } result.Add(change); minOffset = Math.Min(minOffset, offset); } StringBuilder output = new StringBuilder(); List <IUsing> usings = new List <IUsing> (compilationUnit.Usings); usings.Sort(UsingComparer); INRefactoryASTProvider astProvider = options.GetASTProvider(); foreach (IUsing u in usings) { AstNode declaration; if (u.IsFromNamespace) { continue; } if (u.Aliases.Any()) { KeyValuePair <string, IReturnType> alias = u.Aliases.First(); declaration = new UsingAliasDeclaration(alias.Key, alias.Value.ConvertToTypeReference()); } else { declaration = new UsingDeclaration(u.Namespaces.First()); } output.Append(astProvider.OutputNode(options.Dom, declaration)); } TextReplaceChange insertSortedUsings = new TextReplaceChange() { FileName = options.Document.FileName, Offset = minOffset, InsertedText = output.ToString() }; result.Add(insertSortedUsings); return(result); }