/// <summary> /// Возвращает местоположение заданной строки из заданной точки в исходном тексте /// </summary> /// <param name="point"></param> /// <param name="Source"></param> /// <returns></returns> public static LexLocation FindTextPosition(PointOfInterest point, string Source) { TextSearch ts = new TextSearch(Source); Pair<int, int> p = ts.Similarity(point.Location, point.Text); int Line = p.First; int Col; if (Line == point.Location.StartLine) Col = point.Location.StartColumn; else Col = ts.GetFirstCharPosAtLine(Line); return new LexLocation(Line, Col, Line, Col); }
/// <summary> /// Заполняет компонент похожести всех узлов из Result на текстовую строку из заданной точки. /// Если по четверке (Имя, внешний контекст, внутренний контекст, текстовая строка) /// найден ровно один совпадающий узел - устанавливает флаг Singular, удаляет несовпадающие узлы из результата. /// </summary> /// <param name="Result"></param> /// <param name="Point"></param> /// <param name="Source"></param> private static void ProcessText(TreeSearchResult Result, PointOfInterest Point, string Source, bool Full = false) { List<TreeSearchResultNode> ExactMatch = new List<TreeSearchResultNode>(); TextSearch ts = new TextSearch(Source); foreach (TreeSearchResultNode node in Result._result) { Pair<int, int> Sim = ts.Similarity(node.TreeNode.Location, Point.Text); node.TextStringMatch = Sim.Second; if (Sim.First == TreeSearchOptions.Equility && node.NameMatch == TreeSearchOptions.Equility && node.OuterContextMatch == TreeSearchOptions.Equility && node.InnerContextMatch == TreeSearchOptions.Equility) ExactMatch.Add(node); } if (ExactMatch.Count == 1 && !Full) { Result.Singular = true; Result._result = ExactMatch; } }