public static LineOfCode Parse(Codebase owner, string line) { line = line.Trim(); var result = new LineOfCode(); result.Owner = owner; result.ID = line; result.CalledFrom = new List <LineOfCode>(); result.CallsTo = new List <LineOfCode>(); result.Leaks = new List <Backtrace>(); var match = Regex.Match(line, "(?<moduleName>.*)\\!(?<symbolName>.*)\\+(?<rest>(.*))?$|(?<moduleName>.*)$"); var moduleName = match.Groups["moduleName"].Value; var symbolName = match.Groups["symbolName"].Value; if (String.IsNullOrEmpty(symbolName)) { symbolName = moduleName; } var rest = match.Groups["rest"].Success ? match.Groups["rest"].Value : ""; result.Module = owner.Modules.FirstOrDefault(x => x.Name == moduleName); result.Scope = owner.GetScope(symbolName); result.Function = owner.GetFunction(symbolName); result.Scope.Lines.Add(result); // Add line to scope result.Function.Lines.AddOrGet(result); // Add line to function result.Module.Scopes.AddOrGet(result.Scope); // Add scope to module result.Module.Functions.AddOrGet(result.Function); // Add function to module result.Module.Lines.AddOrGet(result); // Add line to module match = Regex.Match(rest, ".* \\((?<fileName>.*), (?<lineNum>\\d*)\\)"); if (match.Success) // Is file,line present? { var filename = match.Groups["fileName"].Value; var lineNum = Convert.ToInt32(match.Groups["lineNum"].Value); result.LineNumber = lineNum; result.SourceFile = owner.GetFile(filename, result.Module); result.SourceFile.Lines.AddOrGet(result); // Add line to file result.Module.Files.AddOrGet(result.SourceFile); // Add file to module result.GeneratePreview(filename, lineNum); } return(result); }
public static Function ParseSymbol(Codebase owner, string symbol) { var match = Regex.Match(symbol, "((.+::)*)(?<functionName>.*)"); var name = match.Groups["functionName"].Value; var scope = owner.GetScope(symbol); var result = new Function { Owner = owner, SymbolName = symbol, Name = name, DeclaringScope = scope, Lines = new List <LineOfCode>(), CalledFrom = new List <Function>(), CallsTo = new List <Function>(), Leaks = new List <Backtrace>() }; scope.Functions.AddOrGet(result); return(result); }