[PATCH] D95701: [clangd] Add semanticTokens modifiers for function/class/file/global scope
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 9 09:10:43 PST 2021
sammccall added inline comments.
================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:379
+ // ExternalLinkage threshold could be tweaked, e.g. module-visible as global.
+ // Avoid caching linkage if it may change after enclosing code completion.
+ if (hasUnstableLinkage(D) || D->getLinkageInternal() < ExternalLinkage)
----------------
nridge wrote:
> code completion? I'm a bit lost :)
Whoops, fixed.
(This was copied from a utility function that's used in code completion ranking - I planned to share it, but it turns out we want slightly different semantics. Code completion happens inside callbacks that happen mid-parse, and if you call getLinkageInternal() at just the wrong time, you end up caching an intermediate state and crash. But I removed the check as it's not relevant here)
================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:466
case TemplateArgument::TemplateExpansion:
+ // FIXME: I don't understand why this is DependentType.
H.addToken(L.getTemplateNameLoc(), HighlightingKind::DependentType);
----------------
nridge wrote:
> nridge wrote:
> > The testcase which relies on this is this one:
> >
> > ```
> > // Dependent template name
> > R"cpp(
> > template <template <typename> class> struct $Class[[A]] {};
> > template <typename $TemplateParameter[[T]]>
> > using $Typedef[[W]] = $Class[[A]]<
> > $TemplateParameter[[T]]::template $DependentType[[Waldo]]
> > >;
> > ```
> >
> > However, it does appear that we get into here even for non-dependent template template arguments (but then also get a non-dependent highlighting kind via `findExplicitReferences()`, and end up discarding the `DependentType` via `resolveConflict()`).
> I see you've already figured this out in D95706 :)
Oops, yes. I've adjusted the comment here so the intermediate state makes sense :-)
(I'd rather not emit dubious tokens and then rely on conflicts to discard them, it seems hard to maintain)
================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.h:82
+ FileScope,
+ GlobalScope,
+
----------------
nridge wrote:
> Would it make sense to call this `NamespaceScope` instead?
>
> I understand it's "global" in the sense that it's visible to other translation units, but it's not "global" in the sense that it's not necessarily in the global namespace.
>
> (On the other hand, I can see how `FileScope` symbols are also "namespace scope", so... could go either way.)
Yeah, the file-scope thing. (Maybe it's not an important distinction, but it seems pretty interesting for functions at least)
The other consideration is that I harbor a little bit of hope we could get some convergence across implementations, so avoiding lang-specific terms is nice. In any case, client implementers are probably not C++ people!
(of course we can use different names internally than we use in the protocol, but it seems less confusing to align them)
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D95701/new/
https://reviews.llvm.org/D95701
More information about the cfe-commits
mailing list