private DfmTagNameResolveResult ResolveTagNamesFromPath(string fencesPath, string[] fencesCodeLines, string tagName, Regex regexToExtractCode) { var lazyResolveResults = _dfmTagNameLineRangeCache.GetOrAdd(fencesPath, path => new Lazy <ConcurrentDictionary <string, DfmTagNameResolveResult> >( () => { var linesOfSnippetComment = new Dictionary <long, string>(); for (long i = 0; i < fencesCodeLines.Length; i++) { var match = regexToExtractCode.Match(fencesCodeLines[i]); if (match.Success) { linesOfSnippetComment.Add(i + 1, match.Groups[1].Value); } } var excludedLines = new HashSet <long>(linesOfSnippetComment.Keys); var dictionary = new ConcurrentDictionary <string, DfmTagNameResolveResult>(StringComparer.OrdinalIgnoreCase); foreach (var snippetCommentsInPair in linesOfSnippetComment.GroupBy(kvp => kvp.Value)) { DfmTagNameResolveResult tagResolveResult; var lineNumbers = snippetCommentsInPair.Select(line => line.Key).OrderBy(line => line).ToList(); if (lineNumbers.Count == 2) { tagResolveResult = new DfmTagNameResolveResult { IsSuccessful = true, StartLine = lineNumbers[0] + 1, EndLine = lineNumbers[1] - 1, ExcludesLines = excludedLines }; } else { tagResolveResult = new DfmTagNameResolveResult { IsSuccessful = false, ErrorMessage = lineNumbers.Count == 1 ? $"Tag name {snippetCommentsInPair.Key} is not closed" : $"Tag name {snippetCommentsInPair.Key} occurs {lineNumbers.Count} times" }; } dictionary.TryAdd(snippetCommentsInPair.Key, tagResolveResult); } return(dictionary); })); DfmTagNameResolveResult resolveResult; var tagNamesDictionary = lazyResolveResults.Value; return((tagNamesDictionary.TryGetValue(tagName, out resolveResult) || tagNamesDictionary.TryGetValue($"snippet{tagName}", out resolveResult)) ? resolveResult : new DfmTagNameResolveResult { IsSuccessful = false, ErrorMessage = $"Tag name {tagName} is not found" }); }
private DfmTagNameResolveResult ResolveTagNamesFromPath(string fencesPath, string[] fencesCodeLines, string tagName, Regex regexToExtractCode) { var lazyResolveResults = _dfmTagNameLineRangeCache.GetOrAdd(fencesPath, path => new Lazy<ConcurrentDictionary<string, DfmTagNameResolveResult>>( () => { var linesOfSnippetComment = new Dictionary<long, string>(); for (long i = 0; i < fencesCodeLines.Length; i++) { var match = regexToExtractCode.Match(fencesCodeLines[i]); if (match.Success) { linesOfSnippetComment.Add(i + 1, match.Groups[1].Value); } } var excludedLines = new HashSet<long>(linesOfSnippetComment.Keys); var dictionary = new ConcurrentDictionary<string, DfmTagNameResolveResult>(StringComparer.OrdinalIgnoreCase); foreach (var snippetCommentsInPair in linesOfSnippetComment.GroupBy(kvp => kvp.Value)) { DfmTagNameResolveResult tagResolveResult; var lineNumbers = snippetCommentsInPair.Select(line => line.Key).OrderBy(line => line).ToList(); if (lineNumbers.Count == 2) { tagResolveResult = new DfmTagNameResolveResult { IsSuccessful = true, StartLine = lineNumbers[0] + 1, EndLine = lineNumbers[1] - 1, ExcludesLines = excludedLines }; } else { tagResolveResult = new DfmTagNameResolveResult { IsSuccessful = false, ErrorMessage = lineNumbers.Count == 1 ? $"Tag name {snippetCommentsInPair.Key} is not closed" : $"Tag name {snippetCommentsInPair.Key} occurs {lineNumbers.Count} times" }; } dictionary.TryAdd(snippetCommentsInPair.Key, tagResolveResult); } return dictionary; })); DfmTagNameResolveResult resolveResult; var tagNamesDictionary = lazyResolveResults.Value; return (tagNamesDictionary.TryGetValue(tagName, out resolveResult) || tagNamesDictionary.TryGetValue($"snippet{tagName}", out resolveResult)) ? resolveResult : new DfmTagNameResolveResult { IsSuccessful = false, ErrorMessage = $"Tag name {tagName} is not found" }; }