/// <summary> /// 执行命令 /// </summary> /// <param name="para">自定义参数</param> /// <result></result> public override CommandResult Process(object para) { CommandResult result = new CommandResult(); result.ErrCode = CommandExecStatus.Succeed; result.ErrMsg = para.ToString(); if (vsWindowType.vsWindowTypeDocument == DteHelper.Dte2.ActiveWindow.Type) { _currentCodePoint = DteHelper.GetCurrentActivePoint(); _currentCodeDocument = DteHelper.Dte2.ActiveDocument; List <CodeDomCodeElement <CodeElement> > listElement = DteHelper.FetchCodeElementByPoint(_currentCodeDocument.ProjectItem.FileCodeModel, _currentCodePoint); this.CurrentCodeElement = DteHelper.FindPointElement(listElement, _currentCodePoint); } else if (vsWindowType.vsWindowTypeSolutionExplorer == DteHelper.Dte2.ActiveWindow.Type && CurrentCodeElement != null) { //取得所有选中文件 IList <ProjectItem> listItem = DteHelper.GetSelectedItem(Constant.CSharpFileExtension); List <CodeDomCodeElement <CodeElement> > listElement = DteHelper.FetchCodeElementByPoint(_currentCodeDocument.ProjectItem.FileCodeModel, _currentCodePoint); CodeDomCodeElement <CodeElement> codeElement = DteHelper.FindPointElement(listElement, _currentCodePoint); foreach (var projectItem in listItem) { foreach (var codeClass in DteHelper.GetClassFromFile(projectItem.FileCodeModel)) {//重构元素 DteHelper.RefactorElement(this.CurrentCodeElement, codeElement, codeClass); } } } return(result); }
/// <summary> /// 当前光标处是属性 /// </summary> /// <returns></returns> public bool IsPropertyOfCurrenActivePoint() { TextPoint textPoint = this.GetCurrentActivePoint(); List <CodeDomCodeElement <CodeElement> > listElement = FetchCodeElementByPoint(_dte.ActiveDocument.ProjectItem.FileCodeModel, textPoint); CodeDomCodeElement <CodeElement> codeElement = FindPointElement(listElement, textPoint); if (null != codeElement && codeElement.CodeElement is CodeProperty) { return(true); } return(false); }
/// <summary> /// 删除代码元素 /// </summary> /// <param name="codeElement">要删除的元素</param> /// <param name="codeClass">操作的类</param> public void DeleteCodeElement(CodeDomCodeElement <CodeElement> codeElement, CodeClass codeClass) { foreach (CodeElement ce in codeClass.Members) { if (ce.Kind == codeElement.Kind && ce.Name == codeElement.Name) {//仅比较类型,名称,不比较声明,修饰 try { codeClass.RemoveMember(ce); } catch { } } } }
/// <summary> /// 当前光标处是方法 /// </summary> /// <returns></returns> public bool IsMethodOfCurrenActivePoint() { TextPoint textPoint = this.GetCurrentActivePoint(); List <CodeDomCodeElement <CodeElement> > listElement = FetchCodeElementByPoint(_dte.ActiveDocument.ProjectItem.FileCodeModel, textPoint); CodeDomCodeElement <CodeElement> codeElement = FindPointElement(listElement, textPoint); if (null != codeElement && codeElement.CodeElement is CodeFunction) { if (textPoint.Line == codeElement.StartPoint.Line) { //在方法的定义行 return(true); } } return(false); }
/// <summary> /// 重构元素 /// </summary> /// <param name="oldElement">老元素</param> /// <param name="newElement">新元素</param> /// <param name="codeClass">操作的类</param> public void RefactorElement(CodeDomCodeElement <CodeElement> oldElement, CodeDomCodeElement <CodeElement> newElement, CodeClass codeClass) { if (newElement.Kind == oldElement.Kind) { foreach (CodeElement ce in codeClass.Members) { if (ce.Kind == oldElement.Kind && ce.Name == oldElement.Name) { switch (oldElement.Kind) { case vsCMElement.vsCMElementFunction: this.RefactorMethod((CodeFunction)ce, (CodeFunction)newElement.CodeElement); //重构方法 break; default: break; } } } } }
/// <summary> /// 重构元素 /// </summary> /// <param name="oldElement">老元素</param> /// <param name="newElement">新元素</param> /// <param name="codeClass">操作的类</param> public void RefactorElement(CodeDomCodeElement<CodeElement> oldElement, CodeDomCodeElement<CodeElement> newElement, CodeClass codeClass) { if (newElement.Kind == oldElement.Kind) { foreach (CodeElement ce in codeClass.Members) { if (ce.Kind == oldElement.Kind && ce.Name == oldElement.Name) { switch (oldElement.Kind) { case vsCMElement.vsCMElementFunction: this.RefactorMethod((CodeFunction)ce, (CodeFunction)newElement.CodeElement);//重构方法 break; default: break; } } } } }
/// <summary> /// 删除代码元素 /// </summary> /// <param name="codeElement">要删除的元素</param> /// <param name="codeClass">操作的类</param> public void DeleteCodeElement(CodeDomCodeElement<CodeElement> codeElement, CodeClass codeClass) { foreach (CodeElement ce in codeClass.Members) { if (ce.Kind == codeElement.Kind && ce.Name == codeElement.Name) {//仅比较类型,名称,不比较声明,修饰 try { codeClass.RemoveMember(ce); } catch { } } } }