コード例 #1
0
        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());
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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());
        }