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