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