Esempio n. 1
0
        private static void PrintResults(File file, MetricVisitor metricAnalyzer, TextWriter writer)
        {
            writer.WriteLine("File: " + file.FullPath);
            writer.WriteLine(" - Total AST nodes: " + metricAnalyzer.TotalNodes);
            writer.WriteLine(" - Echo statements: " + metricAnalyzer.EchoStatements);
            writer.WriteLine(" - Sql query strings: " + metricAnalyzer.PotentialSQLQueries);
            writer.WriteLine(" - Functions: " + file.Functions.Count);
            foreach (var function in file.Functions.Values)
            {
                writer.WriteLine("   - " + function);
            }
            writer.WriteLine(" - Classes: " + file.Classes.Count);
            foreach (var classDef in file.Classes.Values.SelectMany(classDefinition => classDefinition))
            {
                writer.WriteLine("   - {0} {1} {2}", classDef.Name, classDef.StartLine, classDef.EndLine);
                writer.WriteLine("     - Methods: " + classDef.Methods.Count);
            }
            writer.WriteLine(" - Interfaces: " + file.Interfaces.Count);
            foreach (var interfaceDef in file.Interfaces.Values.SelectMany(interfaceDef => interfaceDef))
            {
                writer.WriteLine("  - {0} {1} {2}", interfaceDef.Name, interfaceDef.StartLine, interfaceDef.EndLine);
                writer.WriteLine("    - Methods: " + interfaceDef.Methods.Count);
            }
            writer.WriteLine(" - Closures: " + file.Closures.Length);
            foreach (var closure in file.Closures)
            {
                writer.WriteLine("   - " + closure);
            }

            writer.WriteLine();
        }
Esempio n. 2
0
        private static File BuildFileCFGAndExtractFileInformation(KeyValuePair <string, XmlDocument> parsedFile)
        {
            var traverser      = new XmlTraverser();
            var metricAnalyzer = new MetricVisitor();
            var extractor      = new ClassAndFunctionExtractor();
            var printer        = new ASTPrinter(Console.Out);
            var cfgcreator     = new CFGCreator();

            traverser.AddVisitor(extractor);
            traverser.AddVisitor(metricAnalyzer);
            traverser.AddVisitor(cfgcreator);
            //traverser.AddVisitor(printer);
            traverser.AddVisitors(_components.AstVisitors.ToArray());

            traverser.Traverse(parsedFile.Value.FirstChild.NextSibling);

            foreach (var function in extractor.Functions)
            {
                function.File = parsedFile.Key;
            }
            foreach (var closure in extractor.Closures)
            {
                closure.File = parsedFile.Key;
            }

            _funcHandler.CustomFunctions.AddRange(extractor.Functions);

            foreach (var @class in extractor.Classes)
            {
                @class.File = parsedFile.Key;
                foreach (var method in @class.Methods)
                {
                    //HACK: This is not a good way to handle this! Should we add a new derived function class called method that includes the class name
                    //-||-: and make a special list for them in the function handler, or is this okay?
                    method.Name = @class.Name + "->" + method.Name;
                    method.File = parsedFile.Key;
                    _funcHandler.CustomFunctions.Add(method);
                }
            }

            //cfgcreator.Graph.VisualizeGraph("graph", Program.Configuration.GraphSettings);
            var cfgPruner = new CFGPruner();

            cfgPruner.Prune(cfgcreator.Graph);
            //cfgcreator.Graph.VisualizeGraph("graph-pruned", Configuration.GraphSettings);

            File file = new File(parsedFile.Value)
            {
                CFG        = cfgcreator.Graph,
                FullPath   = parsedFile.Key,
                Interfaces = extractor.Interfaces.GroupBy(i => i.Name, i => i).ToDictionary(i => i.Key, i => i.ToList()),
                Classes    = extractor.Classes.GroupBy(c => c.Name, c => c).ToDictionary(c => c.Key, c => c.ToList()),
                Closures   = extractor.Closures.ToArray(),
                Functions  = extractor.Functions.GroupBy(i => i.Name, i => i).ToDictionary(i => i.Key, i => i.ToList())
            };

            return(file);
        }
Esempio n. 3
0
        private bool TryGetFile(string fileName, out File file)
        {
            var matchingFiles = _projectFiles.Where(projectFile => projectFile.Name == fileName).ToList();

            if (!matchingFiles.Any() || matchingFiles.Count > 1)
            {
                file = null;
                return(false);
            }
            file = matchingFiles.Single();
            return(true);
        }
Esempio n. 4
0
        private bool TryGetFile(string fileName, out File file)
        {
            var matchingFiles = _projectFiles.Where(projectFile => projectFile.Name == fileName).ToList();

            if (!matchingFiles.Any() || matchingFiles.Count > 1)
            {
                file = null;
                return false;
            }
            file = matchingFiles.Single();
            return true;
        }
Esempio n. 5
0
        /// <summary>
        /// Matching last string in include expression against all files and select the first match. 
        /// This is incredibly basic and not necessarily correct. The path is ignored and there could be multiple files
        /// with the same name. 
        /// </summary>
        public bool TryResolveInclude(XmlNode node, out File path)
        {
            Preconditions.NotNull(node, "node");
            Preconditions.IsTrue(node.Name == AstConstants.Node + ":" + AstConstants.Nodes.Expr_Include, "Given node was not an include node. It was " + node.Name, "node");

            string includeString = "";

            node.IterateAllNodes(xmlNode =>
                                 {
                                     if (xmlNode.LocalName != AstConstants.Nodes.Scalar_String)
                                         return false;
                                     includeString = xmlNode.GetSubNode(AstConstants.Subnode + ":" + AstConstants.Subnodes.Value).InnerText;
                                     return true;
                                 });

            string fileName = Path.GetFileName(includeString);

            return TryGetFile(fileName, out path);
        }
Esempio n. 6
0
        /// <summary>
        /// Matching last string in include expression against all files and select the first match.
        /// This is incredibly basic and not necessarily correct. The path is ignored and there could be multiple files
        /// with the same name.
        /// </summary>
        public bool TryResolveInclude(XmlNode node, out File path)
        {
            Preconditions.NotNull(node, "node");
            Preconditions.IsTrue(node.Name == AstConstants.Node + ":" + AstConstants.Nodes.Expr_Include, "Given node was not an include node. It was " + node.Name, "node");

            string includeString = "";

            node.IterateAllNodes(xmlNode =>
            {
                if (xmlNode.LocalName != AstConstants.Nodes.Scalar_String)
                {
                    return(false);
                }
                includeString = xmlNode.GetSubNode(AstConstants.Subnode + ":" + AstConstants.Subnodes.Value).InnerText;
                return(true);
            });

            string fileName = Path.GetFileName(includeString);

            return(TryGetFile(fileName, out path));
        }
Esempio n. 7
0
        private static File BuildFileCFGAndExtractFileInformation(KeyValuePair<string, XmlDocument> parsedFile)
        {
            var traverser = new XmlTraverser ();
            var metricAnalyzer = new MetricVisitor ();
            var extractor = new ClassAndFunctionExtractor ();
            var printer = new ASTPrinter (Console.Out);
            var cfgcreator = new SuperCFGCreator ();

            traverser.AddVisitor (extractor);
            traverser.AddVisitor (metricAnalyzer);

            traverser.Traverse (parsedFile.Value.FirstChild.NextSibling);
            cfgcreator.Traverse (parsedFile.Value.FirstChild.NextSibling);

            var ctlPrep = new CFGCTLPreparation ();
            ctlPrep.AddSelfLoops (cfgcreator.Graph);

            File file = new File (parsedFile.Value) {
                CFG = cfgcreator.Graph,
                FullPath = parsedFile.Key,
                Interfaces = extractor.Interfaces.GroupBy (i => i.Name, i => i).ToDictionary (i => i.Key, i => i.ToList ()),
                Classes = extractor.Classes.GroupBy (c => c.Name, c => c).ToDictionary (c => c.Key, c => c.ToList ()),
                Closures = extractor.Closures.ToArray (),
                Functions = extractor.Functions.GroupBy (i => i.Name, i => i).ToDictionary (i => i.Key, i => i.ToList ())
            };
            return file;
        }
Esempio n. 8
0
        private static void PrintResults(File file, MetricVisitor metricAnalyzer, TextWriter writer)
        {
            writer.WriteLine ("File: " + file.FullPath);
            writer.WriteLine (" - Total AST nodes: " + metricAnalyzer.TotalNodes);
            writer.WriteLine (" - Echo statements: " + metricAnalyzer.EchoStatements);
            writer.WriteLine (" - Sql query strings: " + metricAnalyzer.PotentialSQLQueries);
            writer.WriteLine (" - Functions: " + file.Functions.Count);
            foreach (var function in file.Functions.Values) {
                writer.WriteLine ("   - " + function);
            }
            writer.WriteLine (" - Classes: " + file.Classes.Count);
            foreach (var classDef in file.Classes.Values.SelectMany(classDefinition => classDefinition)) {
                writer.WriteLine ("   - " + classDef.Name + " " + classDef.StartLine + " " + classDef.EndLine);
                writer.WriteLine ("     - Methods: " + classDef.Methods.Count);
            }
            writer.WriteLine (" - Interfaces: " + file.Interfaces.Count);
            foreach (var interfaceDef in file.Interfaces.Values.SelectMany(interfaceDef => interfaceDef)) {
                writer.WriteLine ("  - " + interfaceDef.Name + " " + interfaceDef.StartLine + " " + interfaceDef.EndLine);
                writer.WriteLine ("    - Methods: " + interfaceDef.Methods.Count);
            }
            writer.WriteLine (" - Closures: " + file.Closures.Length);
            foreach (var closure in file.Closures) {
                writer.WriteLine ("   - " + closure);
            }

            writer.WriteLine ();
        }
Esempio n. 9
0
        private static File BuildFileCFGAndExtractFileInformation(KeyValuePair<string, XmlDocument> parsedFile)
        {
            var traverser = new XmlTraverser();
            var metricAnalyzer = new MetricVisitor();
            var extractor = new ClassAndFunctionExtractor();
            var printer = new ASTPrinter(Console.Out);
            var cfgcreator = new CFGCreator();
            traverser.AddVisitor(extractor);
            traverser.AddVisitor(metricAnalyzer);
            traverser.AddVisitor(cfgcreator);
            //traverser.AddVisitor(printer);
            traverser.AddVisitors(_components.AstVisitors.ToArray());

            traverser.Traverse(parsedFile.Value.FirstChild.NextSibling);

            foreach (var function in extractor.Functions)
            {
                function.File = parsedFile.Key;
            }
            foreach (var closure in extractor.Closures)
            {
                closure.File = parsedFile.Key;
            }

            FunctionsHandler.Instance.CustomFunctions.AddRange(extractor.Functions);

            foreach (var @class in extractor.Classes)
            {
                @class.File = parsedFile.Key;
                foreach (var method in @class.Methods)
                {
                    //HACK: This is not a good way to handle this! Should we add a new derived function class called method that includes the class name
                    //-||-: and make a special list for them in the function handler, or is this okay?
                    method.Name = @class.Name + "->" + method.Name;
                    method.File = parsedFile.Key;
                    FunctionsHandler.Instance.CustomFunctions.Add(method);
                }
            }

            //cfgcreator.Graph.VisualizeGraph("graph", Program.Configuration.GraphSettings);
            var cfgPruner = new CFGPruner();
            cfgPruner.Prune(cfgcreator.Graph);
            //cfgcreator.Graph.VisualizeGraph("graph-pruned", Configuration.GraphSettings);

            File file = new File(parsedFile.Value) {
                                                       CFG = cfgcreator.Graph,
                                                       FullPath = parsedFile.Key,
                                                       Interfaces = extractor.Interfaces.GroupBy(i => i.Name, i => i).ToDictionary(i => i.Key, i => i.ToList()),
                                                       Classes = extractor.Classes.GroupBy(c => c.Name, c => c).ToDictionary(c => c.Key, c => c.ToList()),
                                                       Closures = extractor.Closures.ToArray(),
                                                       Functions = extractor.Functions.GroupBy(i => i.Name, i => i).ToDictionary(i => i.Key, i => i.ToList())
                                                   };
            return file;
        }