// public IType ImplementInterface (ICompilationUnit pinfo, IType klass, IType iface, bool explicitly, IType declaringClass, IReturnType hintReturnType) // { // if (klass == null) // throw new ArgumentNullException ("klass"); // if (iface == null) // throw new ArgumentNullException ("iface"); // RefactorerContext gctx = GetGeneratorContext (klass); // klass = GetUpdatedClass (gctx, klass); // // bool alreadyImplemented; // IReturnType prefix = null; // // List<KeyValuePair<IMember,IReturnType>> toImplement = new List<KeyValuePair<IMember,IReturnType>> (); // // prefix = new DomReturnType (iface); // // // Stub out non-implemented events defined by @iface // foreach (IEvent ev in iface.Events) { // if (ev.IsSpecialName) // continue; // bool needsExplicitly = explicitly; // // alreadyImplemented = gctx.ParserContext.GetInheritanceTree (klass).Any (x => x.ClassType != ClassType.Interface && x.Events.Any (y => y.Name == ev.Name)); // // if (!alreadyImplemented) // toImplement.Add (new KeyValuePair<IMember,IReturnType> (ev, needsExplicitly ? prefix : null)); // } // // // Stub out non-implemented methods defined by @iface // foreach (IMethod method in iface.Methods) { // if (method.IsSpecialName) // continue; // bool needsExplicitly = explicitly; // alreadyImplemented = false; // foreach (IType t in gctx.ParserContext.GetInheritanceTree (klass)) { // if (t.ClassType == ClassType.Interface) // continue; // foreach (IMethod cmet in t.Methods) { // if (cmet.Name == method.Name && Equals (cmet.Parameters, method.Parameters)) { // if (!needsExplicitly && !cmet.ReturnType.Equals (method.ReturnType)) // needsExplicitly = true; // else // alreadyImplemented |= !needsExplicitly || (iface.FullName == GetExplicitPrefix (cmet.ExplicitInterfaces)); // } // } // } // // if (!alreadyImplemented) // toImplement.Add (new KeyValuePair<IMember,IReturnType> (method, needsExplicitly ? prefix : null)); // } // // // Stub out non-implemented properties defined by @iface // foreach (IProperty prop in iface.Properties) { // if (prop.IsSpecialName) // continue; // bool needsExplicitly = explicitly; // alreadyImplemented = false; // foreach (IType t in gctx.ParserContext.GetInheritanceTree (klass)) { // if (t.ClassType == ClassType.Interface) // continue; // foreach (IProperty cprop in t.Properties) { // if (cprop.Name == prop.Name) { // if (!needsExplicitly && !cprop.ReturnType.Equals (prop.ReturnType)) // needsExplicitly = true; // else // alreadyImplemented |= !needsExplicitly || (iface.FullName == GetExplicitPrefix (cprop.ExplicitInterfaces)); // } // } // } // if (!alreadyImplemented) // toImplement.Add (new KeyValuePair<IMember,IReturnType> (prop, needsExplicitly ? prefix : null)); } // // Ambience ambience = AmbienceService.GetAmbienceForFile (klass.CompilationUnit.FileName); // //implement members // ImplementMembers (klass, toImplement, ambience.GetString (iface, OutputFlags.ClassBrowserEntries | OutputFlags.IncludeGenerics | OutputFlags.IncludeParameters) + " implementation"); // gctx.Save (); // // klass = GetUpdatedClass (gctx, klass); // foreach (IType baseClass in iface.SourceProjectDom.GetInheritanceTree (iface)) { // if (baseClass.Equals (iface) || baseClass.FullName == "System.Object") // continue; // klass = ImplementInterface (pinfo, klass, baseClass, explicitly, declaringClass, hintReturnType); // } // // // return klass; // } IType GetUpdatedClass(RefactorerContext gctx, IType klass) { IEditableTextFile file = gctx.GetFile(klass.CompilationUnit.FileName); ParsedDocument doc = ProjectDomService.Parse(gctx.ParserContext.Project, file.Name, delegate() { return(file.Text); }); IType result = gctx.ParserContext.GetType(klass.FullName, klass.TypeParameters.Count, true); if (result is CompoundType) { IType hintType = doc.CompilationUnit.GetType(klass.FullName, klass.TypeParameters.Count); if (hintType != null) { ((CompoundType)result).SetMainPart(file.Name, hintType.Location); } } return(result); }
public virtual void Rename(string newName) { if (rctx == null) { throw new InvalidOperationException("Refactory context not available."); } IEditableTextFile file = rctx.GetFile(fileName); if (file != null) { Console.WriteLine("Replacing text \"{0}\" with \"{1}\" @ {2},{3}", name, newName, line, column); file.DeleteText(position, name.Length); file.InsertText(position, newName); rctx.Save(); } }
public override IClass RenameClass (RefactorerContext ctx, IClass cls, string newName) { IEditableTextFile file = ctx.GetFile (cls.Region.FileName); if (file == null) return null; int pos1 = file.GetPositionFromLineColumn (cls.Region.BeginLine, cls.Region.BeginColumn); int pos2 = file.GetPositionFromLineColumn (cls.Region.EndLine, cls.Region.EndColumn); string txt = file.GetText (pos1, pos2); Regex targetExp = new Regex(@"\sclass\s*(" + cls.Name + @")\s", RegexOptions.Multiline); Match match = targetExp.Match (" " + txt + " "); if (!match.Success) return null; int pos = pos1 + match.Groups [1].Index - 1; file.DeleteText (pos, cls.Name.Length); file.InsertText (pos, newName); return GetGeneratedClass (ctx, file, cls); }
public virtual void AddAttribute (RefactorerContext ctx, IType cls, CodeAttributeDeclaration attr) { IEditableTextFile buffer = ctx.GetFile (cls.CompilationUnit.FileName); CodeTypeDeclaration type = new CodeTypeDeclaration ("temp"); type.CustomAttributes.Add (attr); CodeDomProvider provider = GetCodeDomProvider (); StringWriter sw = new StringWriter (); provider.GenerateCodeFromType (type, sw, GetOptions (false)); string code = sw.ToString (); int start = code.IndexOf ('['); int end = code.LastIndexOf (']'); code = code.Substring (start, end-start+1) + Environment.NewLine; int line = cls.Location.Line; int col = cls.Location.Column; int pos = buffer.GetPositionFromLineColumn (line, col); code = Indent (code, GetLineIndent (buffer, line), false); buffer.InsertText (pos, code); }
public override IEnumerable<MemberReference> FindMemberReferences (RefactorerContext ctx, string fileName, IType cls, IMember member, bool includeXmlComment) { var editor = ((Mono.TextEditor.ITextEditorDataProvider)ctx.GetFile (fileName)).GetTextEditorData (); var doc = ProjectDomService.GetParsedDocument (ctx.ParserContext, fileName); if (doc == null || doc.CompilationUnit == null) return null; NRefactoryResolver resolver = new NRefactoryResolver (ctx.ParserContext, doc.CompilationUnit, ICSharpCode.NRefactory.SupportedLanguage.CSharp, editor, fileName); resolver.CallingMember = member; FindMemberAstVisitor visitor = new FindMemberAstVisitor (editor.Document, resolver, member); visitor.IncludeXmlDocumentation = includeXmlComment; visitor.RunVisitor (); SetContext (visitor.FoundReferences, ctx); return visitor.FoundReferences; }
public override void PerformChange (IProgressMonitor monitor, RefactorerContext rctx) { if (rctx == null) throw new InvalidOperationException ("Refactory context not available."); TextEditorData textEditorData = this.TextEditorData; if (textEditorData == null) { IEditableTextFile file = rctx.GetFile (FileName); if (file != null) { if (RemovedChars > 0) file.DeleteText (Offset, RemovedChars); if (!string.IsNullOrEmpty (InsertedText)) file.InsertText (Offset, InsertedText); rctx.Save (); } } else if (textEditorData != null) { int charsInserted = textEditorData.Replace (Offset, RemovedChars, InsertedText); if (MoveCaretToReplace) textEditorData.Caret.Offset = Offset + charsInserted; } }
// public IType ImplementInterface (ICompilationUnit pinfo, IType klass, IType iface, bool explicitly, IType declaringClass, IReturnType hintReturnType) // { // if (klass == null) // throw new ArgumentNullException ("klass"); // if (iface == null) // throw new ArgumentNullException ("iface"); // RefactorerContext gctx = GetGeneratorContext (klass); // klass = GetUpdatedClass (gctx, klass); // // bool alreadyImplemented; // IReturnType prefix = null; // // List<KeyValuePair<IMember,IReturnType>> toImplement = new List<KeyValuePair<IMember,IReturnType>> (); // // prefix = new DomReturnType (iface); // // // Stub out non-implemented events defined by @iface // foreach (IEvent ev in iface.Events) { // if (ev.IsSpecialName) // continue; // bool needsExplicitly = explicitly; // // alreadyImplemented = gctx.ParserContext.GetInheritanceTree (klass).Any (x => x.ClassType != ClassType.Interface && x.Events.Any (y => y.Name == ev.Name)); // // if (!alreadyImplemented) // toImplement.Add (new KeyValuePair<IMember,IReturnType> (ev, needsExplicitly ? prefix : null)); // } // // // Stub out non-implemented methods defined by @iface // foreach (IMethod method in iface.Methods) { // if (method.IsSpecialName) // continue; // bool needsExplicitly = explicitly; // alreadyImplemented = false; // foreach (IType t in gctx.ParserContext.GetInheritanceTree (klass)) { // if (t.ClassType == ClassType.Interface) // continue; // foreach (IMethod cmet in t.Methods) { // if (cmet.Name == method.Name && Equals (cmet.Parameters, method.Parameters)) { // if (!needsExplicitly && !cmet.ReturnType.Equals (method.ReturnType)) // needsExplicitly = true; // else // alreadyImplemented |= !needsExplicitly || (iface.FullName == GetExplicitPrefix (cmet.ExplicitInterfaces)); // } // } // } // // if (!alreadyImplemented) // toImplement.Add (new KeyValuePair<IMember,IReturnType> (method, needsExplicitly ? prefix : null)); // } // // // Stub out non-implemented properties defined by @iface // foreach (IProperty prop in iface.Properties) { // if (prop.IsSpecialName) // continue; // bool needsExplicitly = explicitly; // alreadyImplemented = false; // foreach (IType t in gctx.ParserContext.GetInheritanceTree (klass)) { // if (t.ClassType == ClassType.Interface) // continue; // foreach (IProperty cprop in t.Properties) { // if (cprop.Name == prop.Name) { // if (!needsExplicitly && !cprop.ReturnType.Equals (prop.ReturnType)) // needsExplicitly = true; // else // alreadyImplemented |= !needsExplicitly || (iface.FullName == GetExplicitPrefix (cprop.ExplicitInterfaces)); // } // } // } // if (!alreadyImplemented) // toImplement.Add (new KeyValuePair<IMember,IReturnType> (prop, needsExplicitly ? prefix : null)); } // // Ambience ambience = AmbienceService.GetAmbienceForFile (klass.CompilationUnit.FileName); // //implement members // ImplementMembers (klass, toImplement, ambience.GetString (iface, OutputFlags.ClassBrowserEntries | OutputFlags.IncludeGenerics | OutputFlags.IncludeParameters) + " implementation"); // gctx.Save (); // // klass = GetUpdatedClass (gctx, klass); // foreach (IType baseClass in iface.SourceProjectDom.GetInheritanceTree (iface)) { // if (baseClass.Equals (iface) || baseClass.FullName == "System.Object") // continue; // klass = ImplementInterface (pinfo, klass, baseClass, explicitly, declaringClass, hintReturnType); // } // // // return klass; // } IType GetUpdatedClass (RefactorerContext gctx, IType klass) { IEditableTextFile file = gctx.GetFile (klass.CompilationUnit.FileName); ParsedDocument doc = ProjectDomService.Parse (gctx.ParserContext.Project, file.Name, delegate () { return file.Text; }); IType result = gctx.ParserContext.GetType (klass.FullName, klass.TypeParameters.Count, true); if (result is CompoundType) { IType hintType = doc.CompilationUnit.GetType (klass.FullName, klass.TypeParameters.Count); if (hintType != null) ((CompoundType)result).SetMainPart (file.Name, hintType.Location); } return result; }
public virtual void AddMembers (RefactorerContext ctx, IType cls, IEnumerable<CodeTypeMember> members, string foldingRegionName) { //no region name, so distribute them with like members if (string.IsNullOrEmpty (foldingRegionName)) { AddMembers (ctx, cls, members); return; } if (!members.Any ()) return; IEditableTextFile buffer = ctx.GetFile (cls.CompilationUnit.FileName); int pos; // create/find the folding region, or if creation of regions isn't supported, put all the added // members in one place anyway if ((SupportedOperations & RefactorOperations.AddFoldingRegion) == 0) { pos = GetNewMethodPosition (buffer, cls); } else { pos = AddFoldingRegion (ctx, cls, foldingRegionName); } AddMembersAtPosition (ctx, cls, members, buffer, pos); }
public override IEnumerable<MemberReference> FindMemberReferences (RefactorerContext ctx, string fileName, IType cls, IMember member, bool includeXmlComment) { ParsedDocument parsedDocument = parser.Parse (cls.SourceProjectDom, fileName, ctx.GetFile (fileName).Text); NRefactoryResolver resolver = new NRefactoryResolver (ctx.ParserContext, parsedDocument.CompilationUnit, ICSharpCode.NRefactory.SupportedLanguage.CSharp, null, fileName); resolver.SetupParsedCompilationUnit (parser.LastUnit); resolver.CallingMember = member; FindMemberAstVisitor visitor = new FindMemberAstVisitor (resolver, ctx.GetFile (fileName), member); visitor.IncludeXmlDocumentation = includeXmlComment; visitor.RunVisitor (); SetContext (visitor.FoundReferences, ctx); return visitor.FoundReferences; }
public override void AddLocalNamespaceImport (RefactorerContext ctx, string fileName, string nsName, DomLocation caretLocation) { IEditableTextFile file = ctx.GetFile (fileName); int pos = 0; ParsedDocument parsedDocument = parser.Parse (ctx.ParserContext, fileName, file.Text); StringBuilder text = new StringBuilder (); string indent = ""; if (parsedDocument.CompilationUnit != null) { IUsing containingUsing = null; foreach (IUsing u in parsedDocument.CompilationUnit.Usings) { if (u.IsFromNamespace && u.Region.Contains (caretLocation)) { containingUsing = u; } } if (containingUsing != null) { indent = GetLineIndent (file, containingUsing.Region.Start.Line); IUsing lastUsing = null; foreach (IUsing u in parsedDocument.CompilationUnit.Usings) { if (u == containingUsing) continue; if (containingUsing.Region.Contains (u.Region)) { if (u.IsFromNamespace) break; lastUsing = u; } } if (lastUsing != null) { pos = file.GetPositionFromLineColumn (lastUsing.Region.End.Line, lastUsing.Region.End.Column); } else { pos = file.GetPositionFromLineColumn (containingUsing.ValidRegion.Start.Line, containingUsing.ValidRegion.Start.Column); // search line end while (pos < file.Length) { char ch = file.GetCharAt (pos); if (ch == '\n') { if (file.GetCharAt (pos + 1) == '\r') pos++; break; } else if (ch == '\r') { break; } pos++; } } } else { AddGlobalNamespaceImport (ctx, fileName, nsName); return; } } if (pos != 0) text.AppendLine (); text.Append (indent); text.Append ("\t"); text.Append ("using "); text.Append (nsName); text.Append (";"); if (pos == 0) text.AppendLine (); if (file is Mono.TextEditor.ITextEditorDataProvider) { Mono.TextEditor.TextEditorData data = ((Mono.TextEditor.ITextEditorDataProvider)file).GetTextEditorData (); int caretOffset = data.Caret.Offset; int insertedChars = data.Insert (pos, text.ToString ()); if (pos < caretOffset) { data.Caret.Offset = caretOffset + insertedChars; } } else { file.InsertText (pos, text.ToString ()); } }
public override DomLocation CompleteStatement (RefactorerContext ctx, string fileName, DomLocation caretLocation) { IEditableTextFile file = ctx.GetFile (fileName); int pos = file.GetPositionFromLineColumn (caretLocation.Line + 1, 1); StringBuilder line = new StringBuilder (); int lineNr = caretLocation.Line + 1, column = 1, maxColumn = 1, lastPos = pos; while (lineNr == caretLocation.Line + 1) { maxColumn = column; lastPos = pos; line.Append (file.GetCharAt (pos)); pos++; file.GetLineColumnFromPosition (pos, out lineNr, out column); } string trimmedline = line.ToString ().Trim (); string indent = line.ToString ().Substring (0, line.Length - line.ToString ().TrimStart (' ', '\t').Length); if (trimmedline.EndsWith (";") || trimmedline.EndsWith ("{")) return caretLocation; if (trimmedline.StartsWith ("if") || trimmedline.StartsWith ("while") || trimmedline.StartsWith ("switch") || trimmedline.StartsWith ("for") || trimmedline.StartsWith ("foreach")) { if (!trimmedline.EndsWith (")")) { file.InsertText (lastPos, " () {" + Environment.NewLine + indent + TextEditorProperties.IndentString + Environment.NewLine + indent + "}"); caretLocation.Column = maxColumn + 1; } else { file.InsertText (lastPos, " {" + Environment.NewLine + indent + TextEditorProperties.IndentString + Environment.NewLine + indent + "}"); caretLocation.Column = indent.Length + 1; caretLocation.Line++; } } else if (trimmedline.StartsWith ("do")) { file.InsertText (lastPos, " {" + Environment.NewLine + indent + TextEditorProperties.IndentString + Environment.NewLine + indent + "} while ();"); caretLocation.Column = indent.Length + 1; caretLocation.Line++; } else { file.InsertText (lastPos, ";" + Environment.NewLine + indent); caretLocation.Column = indent.Length; caretLocation.Line++; } return caretLocation; }
/// LocalVariable overridables ///////////////////// public virtual bool RenameVariable (RefactorerContext ctx, LocalVariable var, string newName) { IEditableTextFile file = ctx.GetFile (var.FileName); if (file == null) return false; int pos = GetVariableNamePosition (file, var); if (pos == -1) return false; string txt = file.GetText (pos, pos + var.Name.Length); if (txt != var.Name) return false; file.DeleteText (pos, txt.Length); file.InsertText (pos, newName); ProjectDomService.Parse (ctx.ParserContext.Project, file.Name, delegate () { return file.Text; }); return true; }
public virtual IMember EncapsulateField (RefactorerContext ctx, IType cls, IField field, string propName, MemberAttributes attr, bool generateSetter) { // If the field isn't already private/protected/internal, we'll need to fix it to be if (field.IsPublic || (!field.IsPrivate && !field.IsProtectedOrInternal) || true) { IEditableTextFile file = null; int pos = -1; // Find the file the field is contained in foreach (IType part in cls.Parts) { if ((file = ctx.GetFile (part.CompilationUnit.FileName)) == null) continue; if ((pos = GetMemberNamePosition (file, field)) != -1) break; } if (pos != -1) { // FIXME: need a way to get the CodeMemberField fieldInfo as a parsed object // (so we don't lose initialization state nor custom attributes, etc). // CodeMemberField fieldInfo = new CodeMemberField (); // // fieldInfo.Attributes = fieldInfo.Attributes & ~MemberAttributes.Public; // fieldInfo.Attributes |= MemberAttributes.Private; // // RemoveMember (ctx, cls, field); // AddMember (ctx, cls, fieldInfo); //int begin = file.GetPositionFromLineColumn (field.Region.Start.Line, field.Region.Start.Column); //int end = file.GetPositionFromLineColumn (field.Region.End.Line, field.Region.End.Column); // //string snippet = file.GetText (begin, end); // //Console.WriteLine ("field declaration: {0}", snippet); // //DomRegion region = GetMemberBounds (file, field); // //begin = file.GetPositionFromLineColumn (region.Start.Line, region.Start.Column); //end = file.GetPositionFromLineColumn (region.End.Line, region.End.Column); // //snippet = file.GetText (begin, end); // //Console.WriteLine ("delete '{0}'", snippet); } } CodeMemberProperty prop = new CodeMemberProperty (); prop.Name = propName; prop.Type = ReturnTypeToDom (ctx, cls.CompilationUnit, field.ReturnType); prop.Attributes = attr | MemberAttributes.Final; if (field.IsStatic) prop.Attributes |= MemberAttributes.Static; prop.HasGet = true; prop.HasSet = generateSetter; EncapsulateFieldImpGetSet (ctx, cls, field, prop); return AddMember (ctx, cls, prop); }
public virtual IMember RenameMember (RefactorerContext ctx, IType cls, IMember member, string newName) { IEditableTextFile file = null; int pos = -1; foreach (IType part in cls.Parts) { if ((file = ctx.GetFile (part.CompilationUnit.FileName)) == null) continue; if ((pos = GetMemberNamePosition (file, member)) != -1) break; } if (pos == -1) return null; string name; if (member is IMethod && ((IMethod) member).IsConstructor) name = cls.Name; else name = member.Name; string txt = file.GetText (pos, pos + name.Length); if (txt != name) return null; // Rename is done in CodeRefactorer.RenameMember. A simple text search & replace is NOT the way to rename things // in source code. // file.DeleteText (pos, txt.Length); // file.InsertText (pos, newName); CodeTypeMember memberInfo; if (member is IField) memberInfo = new CodeMemberField (); else if (member is IMethod) memberInfo = new CodeMemberMethod (); else if (member is IProperty) memberInfo = new CodeMemberProperty (); else if (member is IEvent) memberInfo = new CodeMemberEvent (); else return null; memberInfo.Name = newName; return FindGeneratedMember (ctx, file, cls, memberInfo, member.Location.Line); }
public virtual IMember ReplaceMember (RefactorerContext ctx, IType cls, IMember oldMember, CodeTypeMember memberInfo) { IEditableTextFile buffer = null; int pos = -1; foreach (IType part in cls.Parts) { if ((buffer = ctx.GetFile (part.CompilationUnit.FileName)) == null) continue; if ((pos = GetMemberNamePosition (buffer, oldMember)) != -1) break; } if (pos == -1) return null; DomRegion reg = GetMemberBounds (buffer, oldMember); int sp = buffer.GetPositionFromLineColumn (reg.Start.Line, reg.Start.Column); int ep = buffer.GetPositionFromLineColumn (reg.End.Line, reg.End.Column); buffer.DeleteText (sp, ep - sp); string code = GenerateCodeFromMember (memberInfo); string indent = GetLineIndent (buffer, reg.Start.Line); code = Indent (code, indent, false); buffer.InsertText (sp, code); return FindGeneratedMember (ctx, buffer, cls, memberInfo, reg.Start.Line); }
public virtual void RemoveMember (RefactorerContext ctx, IType cls, IMember member) { IEditableTextFile buffer = null; int pos = -1; foreach (IType part in cls.Parts) { if ((buffer = ctx.GetFile (part.CompilationUnit.FileName)) == null) continue; if ((pos = GetMemberNamePosition (buffer, member)) != -1) break; } if (pos == -1) return; DomRegion reg = GetMemberBounds (buffer, member); int sp = buffer.GetPositionFromLineColumn (reg.Start.Line, reg.Start.Column); int ep = buffer.GetPositionFromLineColumn (reg.End.Line, reg.End.Column); buffer.DeleteText (sp, ep - sp); }
public virtual int AddFoldingRegion (RefactorerContext ctx, IType cls, string regionName) { IEditableTextFile buffer = ctx.GetFile (cls.CompilationUnit.FileName); return GetNewMethodPosition (buffer, cls); }
public override IEnumerable<MemberReference> FindVariableReferences (RefactorerContext ctx, string fileName, LocalVariable var) { var editor = ((Mono.TextEditor.ITextEditorDataProvider)ctx.GetFile (fileName)).GetTextEditorData (); NRefactoryResolver resolver = new NRefactoryResolver (ctx.ParserContext, var.CompilationUnit, ICSharpCode.NRefactory.SupportedLanguage.CSharp, editor, fileName); resolver.CallingMember = var.DeclaringMember; FindMemberAstVisitor visitor = new FindMemberAstVisitor (editor.Document, resolver, var); visitor.RunVisitor (); SetContext (visitor.FoundReferences, ctx); return visitor.FoundReferences; }
public override IType RenameClass (RefactorerContext ctx, IType cls, string newName) { IEditableTextFile file; int pos, begin, end; Match match; Regex expr; string txt; foreach (IType pclass in cls.Parts) { if (pclass.BodyRegion.IsEmpty || (file = ctx.GetFile (pclass.CompilationUnit.FileName)) == null) continue; begin = file.GetPositionFromLineColumn (pclass.BodyRegion.Start.Line, pclass.BodyRegion.Start.Column); end = file.GetPositionFromLineColumn (pclass.BodyRegion.End.Line, pclass.BodyRegion.End.Column); if (begin == -1 || end == -1) continue; txt = file.GetText (begin, end); switch (cls.ClassType) { case ClassType.Interface: expr = new Regex (@"\sinterface\s*(" + cls.Name + @")(\s|:)", RegexOptions.Multiline); break; case ClassType.Struct: expr = new Regex (@"\sstruct\s*(" + cls.Name + @")(\s|:)", RegexOptions.Multiline); break; case ClassType.Enum: expr = new Regex (@"\senum\s*(" + cls.Name + @")(\s|:)", RegexOptions.Multiline); break; default: expr = new Regex (@"\sclass\s*(" + cls.Name + @")(\s|:)", RegexOptions.Multiline); break; } match = expr.Match (" " + txt + " "); if (!match.Success) continue; pos = begin + match.Groups [1].Index - 1; file.DeleteText (pos, cls.Name.Length); file.InsertText (pos, newName); } file = ctx.GetFile (cls.CompilationUnit.FileName); return GetGeneratedClass (ctx, file, cls); }
/// Parameter overridables ///////////////////// public virtual bool RenameParameter (RefactorerContext ctx, IParameter param, string newName) { IMember member = param.DeclaringMember; IEditableTextFile file = null; int pos = -1; // It'd be nice if we didn't have to worry about this being null if (!member.DeclaringType.CompilationUnit.FileName.IsNull) { if ((file = ctx.GetFile (member.DeclaringType.CompilationUnit.FileName)) != null) pos = GetParameterNamePosition (file, param); } // Plan B. - fallback to searching all partial class files for this parameter's parent member if (pos == -1) { IType cls = member.DeclaringType; foreach (IType part in cls.Parts) { if ((file = ctx.GetFile (part.CompilationUnit.FileName)) == null) continue; // sanity check, if the parent member isn't here then neither is the param //if ((pos = GetMemberNamePosition (file, member)) == -1) // continue; if ((pos = GetParameterNamePosition (file, param)) != -1) break; } if (pos == -1) return false; } string txt = file.GetText (pos, pos + param.Name.Length); if (txt != param.Name) return false; file.DeleteText (pos, txt.Length); file.InsertText (pos, newName); ProjectDomService.Parse (ctx.ParserContext.Project, file.Name, delegate () { return file.Text; }); return true; }
public override void AddGlobalNamespaceImport (RefactorerContext ctx, string fileName, string nsName) { IEditableTextFile file = ctx.GetFile (fileName); int pos = 0; ParsedDocument parsedDocument = parser.Parse (ctx.ParserContext, fileName, file.Text); StringBuilder text = new StringBuilder (); if (parsedDocument.CompilationUnit != null) { IUsing lastUsing = null; foreach (IUsing u in parsedDocument.CompilationUnit.Usings) { if (u.IsFromNamespace) break; lastUsing = u; } if (lastUsing != null) pos = file.GetPositionFromLineColumn (lastUsing.Region.End.Line, lastUsing.Region.End.Column); } if (pos != 0) text.AppendLine (); text.Append ("using "); text.Append (nsName); text.Append (";"); if (pos == 0) text.AppendLine (); if (file is Mono.TextEditor.ITextEditorDataProvider) { Mono.TextEditor.TextEditorData data = ((Mono.TextEditor.ITextEditorDataProvider)file).GetTextEditorData (); int caretOffset = data.Caret.Offset; int insertedChars = data.Insert (pos, text.ToString ()); if (pos < caretOffset) { data.Caret.Offset = caretOffset + insertedChars; } } else { file.InsertText (pos, text.ToString ()); } }
public override IEnumerable<MemberReference> FindParameterReferences (RefactorerContext ctx, string fileName, IParameter param, bool includeXmlComment) { NRefactoryResolver resolver = new NRefactoryResolver (ctx.ParserContext, param.DeclaringMember.DeclaringType.CompilationUnit, ICSharpCode.NRefactory.SupportedLanguage.CSharp, null, fileName); resolver.CallingMember = param.DeclaringMember; FindMemberAstVisitor visitor = new FindMemberAstVisitor (resolver, ctx.GetFile (fileName), param); visitor.IncludeXmlDocumentation = includeXmlComment; visitor.RunVisitor (); SetContext (visitor.FoundReferences, ctx); return visitor.FoundReferences; }
public override IEnumerable<MemberReference> FindClassReferences (RefactorerContext ctx, string fileName, IType cls, bool includeXmlComment) { IEditableTextFile file = ctx.GetFile (fileName); NRefactoryResolver resolver = new NRefactoryResolver (ctx.ParserContext, cls.CompilationUnit, ICSharpCode.NRefactory.SupportedLanguage.CSharp, null, fileName); FindMemberAstVisitor visitor = new FindMemberAstVisitor (resolver, file, cls); visitor.IncludeXmlDocumentation = includeXmlComment; visitor.RunVisitor (); SetContext (visitor.FoundReferences, ctx); return visitor.FoundReferences; }
public virtual IMember AddMember (RefactorerContext ctx, IType cls, CodeTypeMember member) { IEditableTextFile buffer = ctx.GetFile (cls.CompilationUnit.FileName); int pos = GetNewMemberPosition (buffer, cls, member); string code = GenerateCodeFromMember (member).Trim (); int line, col; buffer.GetLineColumnFromPosition (pos, out line, out col); string indent = GetLineIndent (buffer, cls.Location.Line) + "\t"; code = Indent (code, indent, false); buffer.InsertText (pos, code); return FindGeneratedMember (ctx, buffer, cls, member, line); }
public override IEnumerable<MemberReference> FindVariableReferences (RefactorerContext ctx, string fileName, LocalVariable var) { //System.Console.WriteLine("Find variable references !!!"); // ParsedDocument parsedDocument = ProjectDomService.ParseFile (fileName); NRefactoryResolver resolver = new NRefactoryResolver (ctx.ParserContext, var.CompilationUnit, ICSharpCode.NRefactory.SupportedLanguage.CSharp, null, fileName); resolver.CallingMember = var.DeclaringMember; FindMemberAstVisitor visitor = new FindMemberAstVisitor (resolver, ctx.GetFile (fileName), var); visitor.RunVisitor (); SetContext (visitor.FoundReferences, ctx); return visitor.FoundReferences; }
public virtual void AddMembers (RefactorerContext ctx, IType cls, IEnumerable<CodeTypeMember> members) { foreach (CodeTypeMember member in members) { cls = GetMainPart (cls); AddMember (ctx, cls, member); IEditableTextFile buffer = ctx.GetFile (cls.CompilationUnit.FileName); cls = GetGeneratedClass (ctx, buffer, cls); } }
public override int AddFoldingRegion (RefactorerContext ctx, IType cls, string regionName) { IEditableTextFile buffer = ctx.GetFile (cls.CompilationUnit.FileName); int pos = GetNewMethodPosition (buffer, cls); string eolMarker = Environment.NewLine; if (cls.SourceProject != null) { TextStylePolicy policy = cls.SourceProject.Policies.Get<TextStylePolicy> (); if (policy != null) eolMarker = policy.GetEolMarker (); } int line, col; buffer.GetLineColumnFromPosition (pos, out line, out col); string indent = buffer.GetText (buffer.GetPositionFromLineColumn (line, 1), pos); string pre = "#region " + regionName + eolMarker; string post = indent + "#endregion" + eolMarker; buffer.InsertText (pos, pre + post); return pos + pre.Length; }
public override DomLocation CompleteStatement (RefactorerContext ctx, string fileName, DomLocation caretLocation) { var provider = ctx.GetFile (fileName) as ITextEditorDataProvider; if (provider == null) return caretLocation; var file = provider.GetTextEditorData (); var line = file.GetLine (caretLocation.Line); var maxColumn = line.EditableLength; var lastPos = line.Offset + line.EditableLength; string trimmedline = file.GetLineText (caretLocation.Line, false).Trim (); string indent = file.GetLineIndent (line); if (trimmedline.EndsWith (";") || trimmedline.EndsWith ("{")) return caretLocation; if (trimmedline.StartsWith ("if") || trimmedline.StartsWith ("while") || trimmedline.StartsWith ("switch") || trimmedline.StartsWith ("for") || trimmedline.StartsWith ("foreach")) { if (!trimmedline.EndsWith (")")) { file.Insert (lastPos, " () {" + file.EolMarker + indent + TextEditorProperties.IndentString + file.EolMarker + indent + "}"); caretLocation.Column = maxColumn + 1; } else { file.Insert (lastPos, " {" + file.EolMarker + indent + TextEditorProperties.IndentString + file.EolMarker + indent + "}"); caretLocation.Column = maxColumn + 1; caretLocation.Line++; } } else if (trimmedline.StartsWith ("do")) { file.Insert (lastPos, " {" + file.EolMarker + indent + TextEditorProperties.IndentString + file.EolMarker + indent + "} while ();"); caretLocation.Column = indent.Length + 1; caretLocation.Line++; } else { file.Insert (lastPos, ";" + file.EolMarker + indent); caretLocation.Column = indent.Length; caretLocation.Line++; } return caretLocation; }