vedgy marked an inline comment as not done. vedgy added inline comments.
================ Comment at: clang/include/clang-c/Index.h:329 + * CXIndexOptions Opts = { sizeof(CXIndexOptions), + * clang_getDefaultGlobalOptions() }; + * \endcode ---------------- vedgy wrote: > aaron.ballman wrote: > > vedgy wrote: > > > When I almost finished the requested changes, I remembered that the > > > return value of `clang_getDefaultGlobalOptions()` depends on environment > > > variables, and thus `0` is not necessarily the default. Adjusted the > > > changes and updated this revision. > > > > > > Does the extra requirement to non-zero initialize this second member sway > > > your opinion on the usefulness of the helper function `inline > > > CXIndexOptions clang_getDefaultIndexOptions()`? Note that there may be > > > same (environment) or other important reasons why future new options > > > couldn't be zeroes by default. > > Thinking out loud a bit... (potentially bad idea incoming) > > > > What if we dropped `clang_getDefaultGlobalOptions()` and instead made a > > change to `CXGlobalOptFlags`: > > ``` > > typedef enum { > > /** > > * Used to indicate that the default CXIndex options are used. By > > default, no > > * global options will be used. However, environment variables may change > > which > > * global options are in effect at runtime. > > */ > > CXGlobalOpt_Default = 0x0, > > > > /** > > * Used to indicate that threads that libclang creates for indexing > > * purposes should use background priority. > > * > > * Affects #clang_indexSourceFile, #clang_indexTranslationUnit, > > * #clang_parseTranslationUnit, #clang_saveTranslationUnit. > > */ > > CXGlobalOpt_ThreadBackgroundPriorityForIndexing = 0x1, > > > > /** > > * Used to indicate that threads that libclang creates for editing > > * purposes should use background priority. > > * > > * Affects #clang_reparseTranslationUnit, #clang_codeCompleteAt, > > * #clang_annotateTokens > > */ > > CXGlobalOpt_ThreadBackgroundPriorityForEditing = 0x2, > > > > /** > > * Used to indicate that all threads that libclang creates should use > > * background priority. > > */ > > CXGlobalOpt_ThreadBackgroundPriorityForAll = > > CXGlobalOpt_ThreadBackgroundPriorityForIndexing | > > CXGlobalOpt_ThreadBackgroundPriorityForEditing, > > > > /** > > * Used to indicate that no global options should be used, even > > * in the presence of environment variables. > > */ > > CXGlobalOpt_None = 0xFFFFFFFF > > } CXGlobalOptFlags; > > ``` > > so that when the user passes `0` they get the previous behavior. > > > > `clang_CXIndex_setGlobalOptions()` would remain deprecated. > > `clang_CXIndex_getGlobalOptions()` would be interesting though -- would it > > return `CXGlobalOpt_None` or `CXGlobalOpt_Default` in the event the index > > was created without any global options? Hmmm. > > > > Err, actually, I suppose this won't work too well because then code > > silently changes behavior if it does > > `clang_CXIndex_setGlobalOptions(CXGlobalOpt_None);` because that would > > change from "do what the environment says" to "ignore the environment". But > > I have to wonder whether anyone actually *does* that or not... my intuition > > is that folks would not call `clang_CXIndex_setGlobalOptions()` at all > > unless they were setting an option to a non-none value. We could rename > > `CXGlobalOpt_None` to `CXGlobalOpt_Nothing` (or something along those > > lines) to force a compilation error, but that's a bit of a nuclear option > > for what's supposed to be a stable API. > > > > So I'm on the fence, I guess. I'd still prefer for zero to give sensible > > defaults and I don't think there's enough use of the global options + > > environment variables to matter. But I also don't like silently breaking > > code, so my idea above may be a nonstarter. > > > > I suppose another possible idea is: deprecate the notion of global options > > enum and setter/getter entirely, add two new fields to `CXIndexOptions`: > > ``` > > typedef enum { > > CXChoice_Default = 0, > > CXChoice_Enabled = 1, > > CXChoice_Disabled = 2 > > } CXChoice; > > > > ... > > unsigned ThreadPriorityBackgroundForIndexing; > > unsigned ThreadPriorityBackgroundForEditing; > > ... > > ``` > > so that `0` gives the correct default behavior based on environment > > variable. There would be no global setter or getter for this information > > (and we'd eventually remove `clang_CXIndex_[gs]etGlobalOptions()`). > > I suppose this won't work too well because then code silently changes > > behavior if it does `clang_CXIndex_setGlobalOptions(CXGlobalOpt_None);` > > because that would change from "do what the environment says" to "ignore > > the environment". > No, the current consequence of such a call already is to ignore the > environment. What would change is the consequence of calling > `clang_CXIndex_setGlobalOptions(0);` - from "ignore the environment" to "do > what the environment says". > > > But I have to wonder whether anyone actually *does* that or not... my > > intuition is that folks would not call `clang_CXIndex_setGlobalOptions()` > > at all unless they were setting an option to a non-none value. > I agree. Possible unlikely reasons to call > `clang_CXIndex_setGlobalOptions(0)` are: > 1) in case the environment variables are set for some other program; > 2) in case setting the environment variables had been useful in the past but > not in the latest and greatest version of an IDE; > 3) if background priority is never useful for an IDE. > > > I suppose another possible idea is: deprecate the notion of global options > > enum and setter/getter entirely, add two new fields to CXIndexOptions > This appears to be a great idea to me. The notion of `CXGlobalOptFlags` > somewhat conflicts with the new `CXIndexOptions` struct, in which two other > boolean options are represented by bit-fields. > > I think we can forbid from the start calling > `clang_CXIndex_[gs]etGlobalOptions()` if the index is created via the new > function `clang_createIndexWithOptions`. > > If 3-state environment variables (unspecified/on/off) are introduced in the > future, `CXChoice` could be extended with `CXChoice_FromEnvironmentOrEnabled > = 3` to indicate that if the environment variable is present, its value > should be respected, otherwise the thread priority should be enabled. > > `CXChoice` cannot possibly have many valid values. So how about: > ``` > unsigned char ThreadPriorityBackgroundForIndexing; > unsigned char ThreadPriorityBackgroundForEditing; > ``` > Then `size_t Size` could become `unsigned Size` and all non-pointer options > would fit into 8 bytes on x86_64. > > Did you reorder the words in the variable names intentionally? > `CXGlobalOpt_ThreadBackgroundPriorityForIndexing` => > `ThreadPriorityBackgroundForIndexing` Perhaps `clang_CXIndex_getGlobalOptions()` should not be deprecated. It would allow the application to learn which priorities are actually used by libclang. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D143418/new/ https://reviews.llvm.org/D143418 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits