Esempio n. 1
0
        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;
                    }
                }
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 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);
 }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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);
                }
            }
        }
Esempio n. 6
0
        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));
        }
Esempio n. 7
0
        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);
        }