salman-javed-nz added a comment.

Hi, just giving a progress update. This is just a early heads-up - no action 
needed from you at this stage.

I have a rough prototype that seems promising. The big-O/time complexity is no 
longer dependent on the number of headers being included and the number of 
diagnostics being raised. I need to tidy up and refactor the code before 
sharing with you but to give an early indication of the path I'm taking, it's 
essentially:

  struct NolintBlock {
    SourceLocation BeginLoc;
    SourceLocation EndLoc;
    std::string Checks;
  };
  
  // Need to keep a cache of every NOLINT block seen, not only in the current 
file
  // but in any other file seen during this run of the program. We may be 
context
  // switching between files (if there is a check violation in a macro in an
  // #included file, for instance), and we don't want to be starting from 
scratch
  // each time.
  some_kind_of_map<FileID, SmallVector<NolintBlock>> NolintBlocks;
  // Performance of each type of map class is still to be evaluated...
  
  bool lineIsMarkedWithNOLINT(/* ... */) {
    // These two `if` statements will more or less be the same as they are now:
    //   If NOLINT statement found on this line, return true
    //   If NOLINTNEXTLINE statement found on previous line, return true
  
    // If no cache for the file exists, generate it (warning: heavy operation)
    
    // For NolintBlock in NolintBlocks[FileID]:
    //   if NolintBlock.StartLoc < Loc < NolintBlock.EndLoc:
    //      return true
    // Return false
  }


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D108560/new/

https://reviews.llvm.org/D108560

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to