//从匹配的Type中找到 BaseMemberDeclaration_t FindMemberSyntaxNode(TypeDeclaration_t td) { if (ref_md != null) { for (int j = 0; j < td.Members.Count; ++j) { MemberDeclaration_t md = td.Members[j]; //如果是儿子?? if (md.Identifier == ref_md.Identifier && md.Field == ref_md.Field && !md.Identifier.StartsWith(PREFIX)) { newName = PREFIX + md.Identifier; // new string(md.Identifier.ToCharArray().Reverse().ToArray()); ref_md.NewName = newName; //保存新名字: m_ReplaceHis.AppendFormat("{0}==>{1};", md.Identifier, newName); return(md); } } return(null); } if (!td.Identifier.StartsWith(PREFIX)) { newName = PREFIX + td.Identifier; // new string(td.Identifier.ToCharArray().Reverse().ToArray()); ref_tdt.NewName = newName; //保存新名字: m_ReplaceHis.AppendFormat("{0}==>{1};", td.Identifier, newName); return(td); } return(null); }
//把TypeName保存一下: 格式..文档名{文件名...;文件名2....} public void SaveTypeList(string fn) { FileStream fp = new FileStream(fn, FileMode.Create); if (fp != null) { StringBuilder sb = new StringBuilder(); StreamWriter sw = new StreamWriter(fp); //逐个处理... for (int i = 0; i < doctypelist.Count; ++i) { DocTypeList_t doctype = doctypelist[i]; sb.Clear(); sb.AppendLine(doctype.Name + ";" + doctype.FilePath); for (int j = 0; j < doctype.typelist.Count; ++j) { TypeDeclaration_t tdt = doctype.typelist[j]; SaveTypeDeclaration(sb, tdt, "\t"); } sw.WriteLine(sb.ToString()); } sw.Close(); fp.Close(); } }
/// <param name="td"></param> /// <param name="ref_ls"></param> /// <param name="index"></param> /// <returns></returns> TypeDeclaration_t FindTypeDeclaration(TypeDeclaration_t td, List <TypeDeclaration_t> ref_ls, int index) { if (td == null) { return(null); } bool bLast = ref_ls.Count == index + 1; if (td.Identifier == ref_ls[index].Identifier) { if (bLast) { return(td); } for (int i = 0; i < td.Members.Count; ++i) { MemberDeclaration_t md = td.Members[i]; if (md.pType != null) { TypeDeclaration_t sub = FindTypeDeclaration(md.pType, ref_ls, index + 1); if (sub != null) { return(sub); } } } } return(null); }
static void HandleTypeMember(TypeDeclarationSyntax td, TypeDeclaration_t tdt) { for (int k = 0; k < td.Members.Count; ++k) { MemberDeclarationSyntax member = td.Members[k]; HandleMemberDeclarationSyntax(member, tdt); } }
static void HandleEnumMember(EnumDeclarationSyntax td, TypeDeclaration_t tdt) { for (int k = 0; k < td.Members.Count; ++k) { MemberDeclarationSyntax member = td.Members[k]; HandleMemberDeclarationSyntax(member, tdt); } // Console.WriteLine(td); }
// void SaveTypeDeclaration(StringBuilder sb, TypeDeclaration_t tdt, string prefix) { sb.AppendLine(prefix + tdt.Identifier + ";"); for (int k = 0; k < tdt.Members.Count; ++k) { MemberDeclaration_t md = tdt.Members[k]; sb.AppendLine(prefix + "\t" + md.Field + ";" + md.Identifier); if (md.pType != null) { SaveTypeDeclaration(sb, md.pType, prefix + "\t"); } } }
//查找对应的节点 BaseMemberDeclaration_t FindSyntaxNode() { List <TypeDeclaration_t> ref_ls = new List <TypeDeclaration_t>(); ref_tdt.declList(ref_ls); for (int i = 0; i < m_dtl.typelist.Count; ++i) { TypeDeclaration_t td = m_dtl.typelist[i]; TypeDeclaration_t dst = FindTypeDeclaration(td, ref_ls, 0); //类型也要符合... if (dst != null) { return(FindMemberSyntaxNode(dst)); } } return(null); }
////合成唯一的类名字... //public string GetUUID() //{ // string pp = parent != null ? parent.GetUUID()+"+":""; // return pp + identifierToken; //} /// <summary> /// 处理TypeDeclaration_t /// </summary> /// <param name="tdt"></param> public static void HandleDecl(TypeDeclaration_t parent, TypeDeclaration_t tdt) { BaseTypeDeclarationSyntax btd = tdt.Syntax as BaseTypeDeclarationSyntax; tdt.Identifier = btd.Identifier.Text; tdt.parent = parent; if (btd is TypeDeclarationSyntax) { HandleTypeMember(btd as TypeDeclarationSyntax, tdt); } else if (btd is EnumDeclarationSyntax) { HandleEnumMember(btd as EnumDeclarationSyntax, tdt); } //sb.AppendLine("\t" + td.Identifier.Text + ";"); }
//替换SolutionTypeMember public static async Task replaceAllSolutionTypeMemberID(CRenameTokenHandler rhandle, bool useInclude) { int limit = 0; CCLog.Info(string.Format("=== replaceAllSolutionTypeMemberID Count: {0} ", rhandle.m_solu.doctypelist.Count)); int StartSign = 0; string StartDoc = "ACTAnimConfig.cs"; string StartType = "ACTAnimConfig"; int types = 0; rhandle.pass_cmd = 1; for (int i = 0; i < rhandle.m_solu.doctypelist.Count; ++i) { DocTypeList_t dtt = rhandle.m_solu.doctypelist[i]; if (StartSign == 1 && StartDoc != dtt.Name) { continue; } for (int j = 0; j < dtt.typelist.Count; ++j) { TypeDeclaration_t tdt = dtt.typelist[j]; //判断开始类型.. if (StartSign == 1 && StartType != tdt.Identifier) { continue; } StartSign = 0; //CCLog.Debug(string.Format("=== replaceAllSolutionTypeMemberID Type: {0}/{1} ;Doc {2}/{3};{4}/{5}", j, dtt.typelist.Count,i, rhandle.m_solu.doctypelist.Count, tdt.Identifier, dtt.Name)); await replaceTypeMemberID(rhandle, dtt.FilePath, tdt, useInclude); types++; } //if((i%100) == 99) // rhandle.SaveNewSolution(); if ((i % 20) == 19) { rhandle.CheckCompileAndCommit(); } } rhandle.CheckCompileAndCommit(); CCLog.Info(string.Format("=== replaceAllSolutionTypeMemberID types: {0} ;compile_fails: {1}", types, rhandle.compile_fails)); }
public async Task beginReplace(TypeDeclaration_t tdt, MemberDeclaration_t md, string FilePath) { this.ref_tdt = tdt; this.ref_md = md; this.docName = FilePath; if (newSolution != null)// { m_solution = newSolution; newSolution = null; } if (m_solution == null) { m_solution = await m_workspace.OpenSolutionAsync(this.m_sln); //if(m_solution!= m_workspace.CurrentSolution) //{ // CCLog.Error("m_solution!= m_workspace.CurrentSolution"); //} if (m_solution == null) { CCLog.Error("!!!!!!!!!!!!!!!OpenSolutionAsync fail." + this.m_sln); } } }
//支持 ClassDeclarationSyntax EnumDeclarationSyntax public TypeDeclaration_t(TypeDeclaration_t parent, BaseTypeDeclarationSyntax node) { Syntax = node; HandleDecl(parent, this); }
static void HandleMemberDeclarationSyntax(MemberDeclarationSyntax member, TypeDeclaration_t tdt) { //MemberDeclarationSyntax // if (member is FieldDeclarationSyntax) { FieldDeclarationSyntax ed = member as FieldDeclarationSyntax; VariableDeclarationSyntax decl = ed.Declaration; if (decl.Variables.Count > 0) { VariableDeclaratorSyntax v = decl.Variables[0]; tdt.Members.Add(new MemberDeclaration_t("Field", v.Identifier.Text, ed)); } } else if (member is EnumMemberDeclarationSyntax) { EnumMemberDeclarationSyntax ed = member as EnumMemberDeclarationSyntax; tdt.Members.Add(new MemberDeclaration_t("EnumMember", ed.Identifier.Text, ed)); } else if (member is MethodDeclarationSyntax) { MethodDeclarationSyntax ed = member as MethodDeclarationSyntax; tdt.Members.Add(new MemberDeclaration_t("Method", ed.Identifier.Text, ed)); } else if (member is PropertyDeclarationSyntax) { PropertyDeclarationSyntax ed = member as PropertyDeclarationSyntax; tdt.Members.Add(new MemberDeclaration_t("Property", ed.Identifier.Text, ed)); } else if (member is EventFieldDeclarationSyntax) { EventFieldDeclarationSyntax ed = member as EventFieldDeclarationSyntax; VariableDeclarationSyntax decl = ed.Declaration; if (decl.Variables.Count > 0) { VariableDeclaratorSyntax v = decl.Variables[0]; tdt.Members.Add(new MemberDeclaration_t("EventField", v.Identifier.Text, ed)); } } else if (member is DelegateDeclarationSyntax) { DelegateDeclarationSyntax ed = member as DelegateDeclarationSyntax; tdt.Members.Add(new MemberDeclaration_t("Delegate", ed.Identifier.Text, ed)); } else if (member is InterfaceDeclarationSyntax) { InterfaceDeclarationSyntax ed = member as InterfaceDeclarationSyntax; //tdt.Members.Add(new MemberDeclaration_t("Interface", ed.Identifier.Text, ed)); MemberDeclaration_t t = new MemberDeclaration_t("Interface", ed.Identifier.Text, ed); tdt.Members.Add(t); //处理子节点... t.pType = new TypeDeclaration_t(tdt, member as BaseTypeDeclarationSyntax); } else if (member is EnumDeclarationSyntax) { EnumDeclarationSyntax ed = member as EnumDeclarationSyntax; MemberDeclaration_t t = new MemberDeclaration_t("Enum", ed.Identifier.Text, ed); tdt.Members.Add(t); //处理子节点... t.pType = new TypeDeclaration_t(tdt, member as BaseTypeDeclarationSyntax); } else if (member is ClassDeclarationSyntax) { ClassDeclarationSyntax ed = member as ClassDeclarationSyntax; MemberDeclaration_t t = new MemberDeclaration_t("Class", ed.Identifier.Text, ed); tdt.Members.Add(t); //处理子节点... t.pType = new TypeDeclaration_t(tdt, member as TypeDeclarationSyntax); } else if (member is StructDeclarationSyntax) { StructDeclarationSyntax ed = member as StructDeclarationSyntax; MemberDeclaration_t t = new MemberDeclaration_t("Struct", ed.Identifier.Text, ed); tdt.Members.Add(t); //处理子节点... t.pType = new TypeDeclaration_t(tdt, member as TypeDeclarationSyntax); } else if (member is ConstructorDeclarationSyntax) { member = member; } else if (member is DestructorDeclarationSyntax) { //忽略... member = member; } else if (member is OperatorDeclarationSyntax) { //忽略... } else if (member is IndexerDeclarationSyntax) { //忽略... member = member; } else if (member is ConversionOperatorDeclarationSyntax) { //忽略... member = member; } else { member = member; //sb.AppendLine("\t\tUnknow;" + member); } // sb.AppendLine("\t\t" + member + ";"); }
//替换一个类... static async Task replaceTypeMemberID(CRenameTokenHandler handle, string FilePath, TypeDeclaration_t tdt, bool useInclude) { for (int k = 0; k < tdt.Members.Count; ++k) { MemberDeclaration_t md = tdt.Members[k]; //替换并保存 if (md.pType != null) { await replaceTypeMemberID(handle, FilePath, md.pType, useInclude); return; } await handle.beginReplace(tdt, md, FilePath); await SolutionAsync(handle, useInclude); //if (limit++ > 1) // return; } { await handle.beginReplace(tdt, null, FilePath); await SolutionAsync(handle, useInclude); //if (limit++ > 1) // return; } }