ioeric added a comment.

Thanks a lot for the changes! Some more comments inlined.

Please mark addressed comments as done so that reviewers could know what to 
look :) Thanks!



================
Comment at: include/clang/Frontend/CompilerInstance.h:187
+  typedef std::function<std::unique_ptr<FrontendAction>(
+      const FrontendOptions &opts, std::unique_ptr<FrontendAction> action)>
+      ActionWrapperTy;
----------------
nit: LLVM variable names start with upper-case letters.


================
Comment at: include/clang/Index/IndexingAction.h:34
   class IndexDataConsumer;
+  class IndexUnitWriter;
 
----------------
This should be removed?

Some forward declarations above are not used as well.


================
Comment at: lib/Driver/Job.cpp:293
+    if (HaveCrashVFS) {
+      IndexStoreDir = llvm::sys::path::parent_path(
+          llvm::sys::path::parent_path(CrashInfo->VFSPath));
----------------
Could you share this code with line 278 above, which already has a nice 
comment? 


================
Comment at: lib/Index/FileIndexRecord.cpp:39
+  auto It = std::upper_bound(Decls.begin(), Decls.end(), NewInfo);
+  Decls.insert(It, std::move(NewInfo));
+}
----------------
nathawes wrote:
> ioeric wrote:
> > Why do we need `Decls` to be sorted by offset? If we want this for 
> > printing, it might make sense to just do a sort there.
> It's mostly for when we hash them, so that ordering doesn't change the hash, 
> but it's also for printing. The IndexASTConsumer doesn't always report symbol 
> occurrences in source order, due to the preprocessor and a few other cases.
> We can sort them when the IndexRecordDataConsumer's finish() is called rather 
> than as they're added to avoid the copying from repeated insert calls if 
> that's the concern.
I would leave the sorting to the point where records are hashed to avoid making 
the record stateful. Consider changing `getDeclOccurrences` to 
`getOccurrencesSortedByOffset`; this should make the behavior more explicit.


================
Comment at: lib/Index/FileIndexRecord.h:51
+public:
+  FileIndexRecord(FileID FID, bool isSystem) : FID(FID), IsSystem(isSystem) {}
+
----------------
s/isSystem/IsSystem/

Also, I wonder if we can filter out system decls proactively and avoid creating 
file index record for them. We could also avoid propogating `IsSystem` here.


================
Comment at: lib/Index/IndexingAction.cpp:504
+
+    CreatedASTConsumer = true;
+    std::vector<std::unique_ptr<ASTConsumer>> Consumers;
----------------
nathawes wrote:
> ioeric wrote:
> >  Can we get this state from the base class instead of maintaining a another 
> > state, which seems to be identical?
> I don't see this state in either base class (WrapperFrontendAction and 
> IndexRecordActionBase). WrappingIndexAction and WrappingIndexRecordAction 
> both have this, though. Were you thinking a new intermediate common base 
> class between them and WrapperFrontendAction?
I thought this could be a state in the `WrapperFrontendAction` since both 
derived classes maintain this state, but after a closer look, this seems to 
depend on both base classes. I'm not a big fun of maintaining states in 
multi-stage classes (e.g. `FrontendAction`), which could be confusing and hard 
to follow; I think `IndexRecordActionBase::finish(...)` should be able to 
handle the case where no index consumer is created (i.e. no 
record/dependency/... is collected).

Also, `IndexRecordActionBase` (and the existing `IndexActionBase `) should 
really be a component instead of a base class since none of its methods is 
`virtual`.


================
Comment at: lib/Index/IndexingAction.cpp:370
+public:
+  SourceFilesIndexDependencyCollector(IsSystemFileCache &SysrootPath,
+                                      RecordingOptions recordOpts)
----------------
`IsSystemFileCache &SysrootPath`? What is this parameter?


================
Comment at: lib/Index/IndexingAction.cpp:459
+
+class IndexRecordActionBase {
+protected:
----------------
Please document this class. This can be easily confused with `IndexActionBase` 
which has a similar name. Same for `IndexAction`/`IndexRecordAction` and 
`WrappingIndexRecordAction`/`WrappingIndexRecordAction`.  I think these pairs 
share (especially the wrapping actions) some common logics and could probably 
be merged. 


================
Comment at: lib/Index/IndexingAction.cpp:485
+
+  void finish(CompilerInstance &CI);
+};
----------------
This does a lot of stuff... please document the behavior!


================
Comment at: lib/Index/IndexingAction.cpp:577
+  if (!isModuleGeneration &&
+      CI.getFrontendOpts().ProgramAction != frontend::GeneratePCH) {
+    RootFile = SM.getFileEntryForID(SM.getMainFileID());
----------------
nit: no need for braces. Same below.


================
Comment at: lib/Index/IndexingAction.cpp:589
+
+static void writeUnitData(const CompilerInstance &CI,
+                          IndexDataRecorder &Recorder,
----------------
In the previous patch, `writeUnitData` does several things including handling 
modules, dependencies, includes and index records, as well as writing data. It 
might make sense to add an abstract class (`UnitDataCollector`?) that defines 
interfaces which make these behavior more explicit. We can then have users pass 
in an implementation via `createIndexDataRecordingAction` which would also 
decouple the data collection from data storage in the library.


================
Comment at: lib/Index/IndexingAction.cpp:624
+
+std::unique_ptr<FrontendAction> index::createIndexDataRecordingAction(
+    const FrontendOptions &FEOpts,
----------------
I'm a bit nervous about propagating the entire `FrontendOptions` into the index 
library. I would simply expose `getIndexOptionsFromFrontendOptions` and have 
callers parse `FrontendOptions` and pass in only index-related options.


================
Comment at: lib/Index/IndexingContext.h:41
+/// file is considered a system file or not
+class IsSystemFileCache {
+  std::string SysrootPath;
----------------
This name is really confusing... `Is*` is usually used for booleans. Simply 
call this `SystemFileCache`.


================
Comment at: lib/Index/IndexingContext.h:53
+
+  void setSysrootPath(StringRef path);
+  StringRef getSysrootPath() const { return SysrootPath; }
----------------
How does this affect the existing cached results? Do you need to invalidate 
them?


================
Comment at: lib/Index/IndexingContext.h:63
   IndexDataConsumer &DataConsumer;
+  IsSystemFileCache &IsSystemCache;
   ASTContext *Ctx = nullptr;
----------------
I think it would be more straightforward to have context own the cache. If 
`setSysrootPath` is the problem, it might make sense to propagate it via the 
context or, if necessary, create a new cache when a new `SysrootPath` is set.


https://reviews.llvm.org/D39050



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

Reply via email to