Beispiel #1
0
        public override object VisitFieldDeclaration(FieldDeclaration fieldDeclaration, CSharpAstResolver astResolver)
        {
            ResolveResult resolveResult = astResolver.Resolve(fieldDeclaration.ReturnType);

            if (resolveResult != null)
            {
                Tree.Tree t = SourceImporter.SourceImporter.Tree;

                //1) target node
                ClassNode targetNode = new ClassNode(resolveResult.Type.FullName, resolveResult);
                targetNode = t.AddOrGetClassNode(resolveResult.Type.Namespace, targetNode);//override if already in tree with that node

                if (targetNode != null)
                {
                    //2) caller node (can't be null)
                    //find out class in which the invocation statement is found
                    TypeDeclaration classDeclaration = fieldDeclaration.Ancestors.Where(a => a is TypeDeclaration).Cast <TypeDeclaration>().First();
                    //resolve the class declaration
                    TypeResolveResult resolvedClass = astResolver.Resolve(classDeclaration) as TypeResolveResult;
                    if (resolvedClass != null)
                    {
                        ClassNode callerNode = new ClassNode(resolvedClass.Type.FullName, resolvedClass);
                        callerNode = t.AddOrGetClassNode(resolvedClass.Type.Namespace, callerNode); //override if already in tree with that node

                        //3) edge (dependency) between caller and target
                        callerNode.AddDependency(targetNode);
                    }
                }
            }
            return(base.VisitFieldDeclaration(fieldDeclaration, astResolver));
        }
Beispiel #2
0
        public override object VisitTypeDeclaration(TypeDeclaration typeDeclaration, CSharpAstResolver astResolver)
        {
            foreach (AstType baseType in typeDeclaration.BaseTypes)
            {
                ResolveResult resolveResult = astResolver.Resolve(baseType);
                if (resolveResult != null)
                {
                    Tree.Tree t = SourceImporter.SourceImporter.Tree;

                    //1) target node
                    ClassNode targetNode = new ClassNode(resolveResult.Type.FullName, resolveResult);
                    targetNode = t.AddOrGetClassNode(resolveResult.Type.Namespace, targetNode);//override if already in tree with that node

                    if (targetNode != null)
                    {
                        //resolve the class declaration
                        TypeResolveResult resolvedClass = astResolver.Resolve(typeDeclaration) as TypeResolveResult;
                        if (resolvedClass != null)
                        {
                            ClassNode callerNode = new ClassNode(resolvedClass.Type.FullName, resolvedClass);
                            callerNode = t.AddOrGetClassNode(resolvedClass.Type.Namespace, callerNode); //override if already in tree with that node

                            //3) edge (dependency) between caller and target
                            callerNode.AddDependency(targetNode);
                        }
                    }
                }
            }

            return(base.VisitTypeDeclaration(typeDeclaration, astResolver));
        }