public CompiledTextSearchData Create(SearchParams searchParams, Func<FileName, bool> fileNamePathMatcher) {
      ParsedSearchString parsedSearchString;
      if (searchParams.Regex) {
        parsedSearchString = new ParsedSearchString(
          new ParsedSearchString.Entry { Text = searchParams.SearchString },
          Enumerable.Empty<ParsedSearchString.Entry>(),
          Enumerable.Empty<ParsedSearchString.Entry>());
      } else {
        var str = searchParams.SearchString ?? "";
        if (str.Length < MinimumSearchPatternLength) {
          throw new RecoverableErrorException(
            string.Format(
              "Search pattern must contain at least {0} characters",
              MinimumSearchPatternLength));
        }
        parsedSearchString = _searchStringParser.Parse(searchParams.SearchString ?? "");
      }

      var searchContentsAlgorithms = CreateSearchAlgorithms(
        parsedSearchString,
        new SearchProviderOptions {
          MatchCase = searchParams.MatchCase,
          MatchWholeWord = searchParams.MatchWholeWord,
          UseRegex = searchParams.Regex,
          UseRe2Engine = searchParams.UseRe2Engine
        });

      return new CompiledTextSearchData(
        parsedSearchString,
        searchContentsAlgorithms,
        fileNamePathMatcher);
    }
예제 #2
0
 private IList<TextRange> PerformSearch(
   Func<FileContents> fileContentsFactory,
   string searchPattern) {
   var searchParams = new SearchParams {
     SearchString = searchPattern,
     MatchCase = true,
     MaxResults = 1000,
     Regex = false,
     UseRe2Engine = false,
   };
   using (var searchData = _factory.Create(searchParams, x => true)) {
     var contents = fileContentsFactory();
     var result = contents.FindAll(searchData,
       contents.TextRange, OperationProgressTracker.None);
     return result;
   }
 }
예제 #3
0
    private static void VerifySearchCodeResponse(
      string searchPattern,
      Options options,
      int occurrenceCount,
      params int[] positionsAndLengths) {
      if (!_serverReadyEvent.WaitOne(TimeSpan.FromSeconds(5.0))) {
        Assert.Fail("Search engine did not load files within timeout. This is due to an error or a (very) slow file system.");
      }
      var searchParams = new SearchParams {
        SearchString = searchPattern,
        MaxResults = 2000,
        MatchCase = options.HasFlag(Options.MatchCase),
        Regex = options.HasFlag(Options.Regex),
        IncludeSymLinks = false,
        MatchWholeWord = options.HasFlag(Options.MatchWholeWord),
        UseRe2Engine = true,
      };

      var searchResult = _searchEngine.SearchCode(searchParams);
      Assert.IsNotNull(searchResult);

      searchResult.Entries.ForAll((index, entry) => {
        Debug.WriteLine(string.Format("File name: \"{0}\"", entry.FileName));
        entry.Spans.ForAll(span => {
          Assert.IsNotNull(span);
          Debug.WriteLine(string.Format("   Text position: offset={0}, length={1}, text=\"{2}\"",
              span.Position,
              span.Length,
              ExtractFileText(entry.FileName.FullPath, span)));
          if (positionsAndLengths != null && positionsAndLengths.Length > 0) {
            Assert.AreEqual(positionsAndLengths[index * 2], span.Position);
            Assert.AreEqual(positionsAndLengths[(index * 2) + 1], span.Length);
          }
        });
      });
      var hitCount = searchResult.Entries.Aggregate(0, (c, entry) => c += entry.Spans.Count);
      Assert.AreEqual(occurrenceCount, hitCount);
    }