ioeric added inline comments.

================
Comment at: lib/Format/Format.cpp:1691
   // 0. Otherwise, returns the priority of the matching category or INT_MAX.
-  int getIncludePriority(StringRef IncludeName, bool CheckMainHeader) {
+  int getIncludePriority(StringRef IncludeName, bool CheckMainHeader) const {
     int Ret = INT_MAX;
----------------
ilya-biryukov wrote:
> ioeric wrote:
> > ilya-biryukov wrote:
> > > I would personally keep the function non-const and not use mutable fields 
> > > here.
> > > Even though it's logically const, I would strive towards keeping the 
> > > things `const` only if there are actually immutable
> > > One particular problem that could be avoided is accidentally calling the 
> > > const methods concurrently on different threads.
> > > 
> > > But up to you if you actually want to make this change.
> > Making this non-const would prevent us from making `HeaderIncludes::insert` 
> > const, which I do want to keep. Added a mutex to prevent race-condition... 
> Actually keeping things const and mentioning in the class comments that the 
> class is not thread-safe because it uses regexes seems like a better choice.
> Most of the clients shouldn't pay for the mutex operations for the sake of 
> the rare multi-threaded clients.
> WDYT?
Honestly, I'm a bit torn on this. Either approach is not perfect but either 
seems acceptable. Rolled back to const+mutable and added the comment.


================
Comment at: lib/Format/Format.cpp:1995
+  /// Inserts an #include directive of \p IncludeName into the code. If \p
+  /// IncludeName is quoted e.g. <...> or "...", it will be #included as is;
+  /// by default,  it is quoted with "".
----------------
ilya-biryukov wrote:
> ioeric wrote:
> > ilya-biryukov wrote:
> > > Maybe make an API more explicit about the style of includes that should 
> > > be used?
> > > Make it literally impossible to misuse the API:
> > > ```
> > > enum class IncludeStyle { Quoted, Angle };
> > > /// \p IncludeName is the include path to be inserted, \p Style specifies 
> > > whether the included path should use quotes or angle brackets.
> > > Optional<Replacement> insert(StringRef IncludeName, IncludeStyle Style = 
> > > IncludeStyle::Quoted) const;
> > > ```
> > > 
> > I think the risk is pretty low, so I'm not sure if it'd be worth spending 
> > another variable. From experience, the current callers would likely need to 
> > either carry another variable for each include or use the following pattern 
> > (as the IncludeName is often already quoted):
> > ```
> >  ... = insert(Include.trime("\"<>"), QuoteStyle);
> > ```
> I still don't feel encoding things in the strings is the right approach here.
> It raises some questions that we should handle/assert: what if users don't 
> quote the strings at all? what is the leading and trailing quotes don't 
> match? and so on and so forth.
> Being explicit about such things seems like a better choice.
> 
> > From experience, the current callers would likely need to either carry 
> > another variable
> It's not surprising, since the class is literally extracted from the middle 
> of the include insertion implementation in clang-format.
Ok, I am convinced ;)


================
Comment at: lib/Format/Format.cpp:2016
+  /// be removed.
+  tooling::Replacements remove(llvm::StringRef Header) const;
 
----------------
ilya-biryukov wrote:
> ioeric wrote:
> > ilya-biryukov wrote:
> > > Maybe also add a param of type `Optional<IncludeStyle>` and 
> > >   - only remove includes with the specified style, if specified the value 
> > > is specified
> > >   - remove both styles the value is `llvm::None`.
> > Again, I'm not quite sure if it's worth another parameter for this.
> The parameter in this case seems to be even more useful, since we have two 
> different behaviors for quoted vs unquoted strings.
> So it's really easy to misuse the API and make a mistake, thinking it does 
> the right thing for you.
After offline discussion, I was also convinced here :)


================
Comment at: lib/Format/Format.cpp:2031
 
-  llvm::Regex IncludeRegex(IncludeRegexPattern);
-  llvm::Regex DefineRegex(R"(^[\t\ ]*#[\t\ ]*define[\t\ ]*[^\\]*$)");
-  SmallVector<StringRef, 4> Matches;
+  StringRef FileName;
+  StringRef Code;
----------------
ilya-biryukov wrote:
> ioeric wrote:
> > ilya-biryukov wrote:
> > > What do we use the `FileName` for?
> > > On a higher level, it seems we shouldn't need it to implement what 
> > > `HeaderIncludes` does.
> > `FileName` is needed to decide whether a header is a main header.
> Can we pass `bool IsMainHeader` instead? Can we not store it as a field? It 
> seems to be only needed in the constructor, right?
This can be only calculated at `insert` time when `IncludeName` is provided - 
we can only tell if a new include is main header when both `FileName` and name 
of the new header are provided.


Repository:
  rC Clang

https://reviews.llvm.org/D46180



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

Reply via email to