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(); }
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); }
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); }
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; }
/// <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); }
/// <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)); }
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; }
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 (); }
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; }