File tree Expand file tree Collapse file tree 5 files changed +20
-8
lines changed Expand file tree Collapse file tree 5 files changed +20
-8
lines changed Original file line number Diff line number Diff line change @@ -315,15 +315,15 @@ struct Fragment {
315315    // / AngledHeaders (i.e. a header matches a regex in both QuotedHeaders and
316316    // / AngledHeaders), system headers use <> and non-system headers use "".
317317    // / These can match any suffix of the header file in question.
318-     // / Matching is performed against the header text, not its absolute path 
318+     // / Matching is performed against the absolute path of the header 
319319    // / within the project.
320320    std::vector<Located<std::string>> QuotedHeaders;
321321    // / List of regexes for headers that should always be included with a
322322    // / <>-style include. By default, and in case of a conflict with
323323    // / AngledHeaders (i.e. a header matches a regex in both QuotedHeaders and
324324    // / AngledHeaders), system headers use <> and non-system headers use "".
325325    // / These can match any suffix of the header file in question.
326-     // / Matching is performed against the header text, not its absolute path 
326+     // / Matching is performed against the absolute path of the header 
327327    // / within the project.
328328    std::vector<Located<std::string>> AngledHeaders;
329329  };
Original file line number Diff line number Diff line change @@ -304,16 +304,17 @@ IncludeInserter::calculateIncludePath(const HeaderFile &InsertedHeader,
304304  //  FIXME: should we allow (some limited number of) "../header.h"?
305305  if  (llvm::sys::path::is_absolute (Suggested))
306306    return  std::nullopt ;
307+   auto  HeaderPath = llvm::sys::path::convert_to_slash (InsertedHeader.File );
307308  bool  IsAngled = false ;
308309  for  (auto  &Filter : AngledHeaders) {
309-     if  (Filter (Suggested )) {
310+     if  (Filter (HeaderPath )) {
310311      IsAngled = true ;
311312      break ;
312313    }
313314  }
314315  bool  IsQuoted = false ;
315316  for  (auto  &Filter : QuotedHeaders) {
316-     if  (Filter (Suggested )) {
317+     if  (Filter (HeaderPath )) {
317318      IsQuoted = true ;
318319      break ;
319320    }
@@ -324,7 +325,7 @@ IncludeInserter::calculateIncludePath(const HeaderFile &InsertedHeader,
324325    if  (IsAngled && IsQuoted) {
325326      elog (" Header '{0}' matches both quoted and angled regexes, default will " 
326327           " be used."  ,
327-            Suggested );
328+            HeaderPath );
328329    }
329330    IsAngled = IsAngledByDefault;
330331  }
Original file line number Diff line number Diff line change @@ -938,7 +938,7 @@ TEST(CompletionTest, IncludeInsertionRespectsQuotedAngledConfig) {
938938  {
939939    Config C;
940940    C.Style .AngledHeaders .push_back (
941-         [](auto  header) { return  header ==  " bar.h"  ; });
941+         [](auto  header) { return  header. contains ( " bar.h" ) ; });
942942    WithContextValue WithCfg (Config::Key, std::move (C));
943943    Results = completions (TU, Test.point (), {Sym});
944944    EXPECT_THAT (Results.Completions ,
@@ -947,7 +947,7 @@ TEST(CompletionTest, IncludeInsertionRespectsQuotedAngledConfig) {
947947  {
948948    Config C;
949949    C.Style .QuotedHeaders .push_back (
950-         [](auto  header) { return  header ==  " bar.h"  ; });
950+         [](auto  header) { return  header. contains ( " bar.h" ) ; });
951951    WithContextValue WithCfg (Config::Key, std::move (C));
952952    Results = completions (TU, Test.point (), {Sym});
953953    EXPECT_THAT (Results.Completions ,
Original file line number Diff line number Diff line change @@ -344,6 +344,17 @@ TEST_F(HeadersTest, ShortenIncludesInSearchPathBracketed) {
344344  EXPECT_EQ (calculate (BarHeader), " <sub/bar.h>"  );
345345}
346346
347+ TEST_F (HeadersTest, ShortenIncludesInSearchPathBracketedFilterByFullPath) {
348+   //  The filter receives the full path of the header, so it is able to filter by
349+   //  the parent directory, even if it is part of the include search path
350+   AngledHeaders.push_back ([](auto  Path) {
351+     llvm::Regex Pattern (" sub/.*"  );
352+     return  Pattern.match (Path);
353+   });
354+   std::string BarHeader = testPath (" sub/bar.h"  );
355+   EXPECT_EQ (calculate (BarHeader), " <bar.h>"  );
356+ }
357+ 
347358TEST_F (HeadersTest, ShortenedIncludeNotInSearchPath) {
348359  std::string BarHeader =
349360      llvm::sys::path::convert_to_slash (testPath (" sub-2/bar.h"  ));
Original file line number Diff line number Diff line change @@ -136,7 +136,7 @@ struct Header {
136136  }
137137  StringRef verbatim () const  { return  std::get<Verbatim>(Storage); }
138138
139-   // / For phiscal  files, either absolute path or path relative to the execution
139+   // / For physical  files, either absolute path or path relative to the execution
140140  // / root. Otherwise just the spelling without surrounding quotes/brackets.
141141  llvm::StringRef resolvedPath () const ;
142142
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments