private static string ModifyFunctionInClass(string code, MethodModificationData data) { var root = CodeReaderUtility.GetCompilationUnitSyntaxFromCode(code); // this code should be compatible with cases of a class inside another class var classes = root.DescendantNodes().Where(x => x is ClassDeclarationSyntax) .Cast <ClassDeclarationSyntax>().ToList(); for (int i = 0, classCount = classes.Count; i < classCount; i++) { var newClassSyntax = classes[i]; var methods = classes[i].DescendantNodes().Where(x => x is MethodDeclarationSyntax) .Cast <MethodDeclarationSyntax>().ToList(); Debug.Assert(methods != null, "No method to modify in class " + classes[i].Identifier.Value); var method = GetOriginalMethodDeclarationSyntax(methods, data); if (method == null) { Debug.LogWarningFormat("No method of name {0} found in class {1}", data.m_MethodNameToModify, classes[i].Identifier.ValueText); continue; } var newMethod = GetModifiedMethodDeclarationSyntax(method, data); newClassSyntax = newClassSyntax.ReplaceNode(method, newMethod).NormalizeWhitespace(); root = root.ReplaceNode(classes[i], newClassSyntax).NormalizeWhitespace(); } return(root.ToFullString()); }
public static ClassGenerationData ExtractClassGenerationData(string code) { var data = new ClassGenerationData(); var root = CodeReaderUtility.GetCompilationUnitSyntaxFromCode(code); var @namespace = root.DescendantNodes().FirstOrDefault(x => x is NamespaceDeclarationSyntax) as NamespaceDeclarationSyntax; if (@namespace != null) { data.m_Namespace = @namespace.Name.ToString(); } var @class = CodeReaderUtility.GetFirstOrDefaultFromRoot <ClassDeclarationSyntax>(root); data.m_ClassName = @class.Identifier.ToString(); data.m_ClassAttributes = ExtractAttributes(@class.AttributeLists.ToArray()); // TODO: Extract constraints data.m_BaseClasses = @class.BaseList.Types.Select(x => x.ToString()).ToArray(); // this takes in specifically EITHER the namespace's OR the root's usings. data.m_Usings = ExtractUsings(@namespace != null ? @namespace.Usings.ToArray() : root.Usings.ToArray()).ToArray(); var fields = CodeReaderUtility.GetArrayFromRoot <FieldDeclarationSyntax>(root); data.m_FieldGenerationDatas = ExtractFields(fields); var methods = CodeReaderUtility.GetArrayFromRoot <MethodDeclarationSyntax>(root); data.m_MethodGenerationDatas = ExtractMethods(methods); return(data); }
public static string ModifyNamespaceInClass(string code, string newNamespace) { // Parse the code into a SyntaxTree. var root = CodeReaderUtility.GetCompilationUnitSyntaxFromCode(code); // this code should be compatible with cases of a class inside another class var namespaceSyntax = root.DescendantNodes().FirstOrDefault(x => x is NamespaceDeclarationSyntax) as NamespaceDeclarationSyntax; if (namespaceSyntax == null) { Debug.LogWarning("No namespace found in script to modify"); return(code); } var newNamespaceSyntax = namespaceSyntax; newNamespaceSyntax = newNamespaceSyntax.WithName(SyntaxFactory.ParseName(newNamespace)).NormalizeWhitespace(); root = root.ReplaceNode(namespaceSyntax, newNamespaceSyntax).NormalizeWhitespace(); return(root.ToFullString()); }