[clang-tools-extra] 2bf960a - [clangd] Add "usedAsMutablePointer" highlighting modifier
Christian Kandeler via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 7 02:58:39 PST 2022
Author: Christian Kandeler
Date: 2022-11-07T11:58:33+01:00
New Revision: 2bf960aef08e93d687f21e6d636186561b56cbf3
URL: https://github.com/llvm/llvm-project/commit/2bf960aef08e93d687f21e6d636186561b56cbf3
DIFF: https://github.com/llvm/llvm-project/commit/2bf960aef08e93d687f21e6d636186561b56cbf3.diff
LOG: [clangd] Add "usedAsMutablePointer" highlighting modifier
Counterpart to "usedAsMutableReference". Just as for references, there
are const and non-const pointer parameters, and it's valuable to be able
to have different highlighting for the two cases at the call site.
We could have re-used the existing modifier, but having a dedicated one
maximizes client flexibility.
Reviewed By: nridge
Differential Revision: https://reviews.llvm.org/D130015
Added:
Modified:
clang-tools-extra/clangd/SemanticHighlighting.cpp
clang-tools-extra/clangd/SemanticHighlighting.h
clang-tools-extra/clangd/test/initialize-params.test
clang-tools-extra/clangd/test/semantic-tokens.test
clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp
index af3a3e6f8e941..dd9392b029df8 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -597,19 +597,27 @@ class CollectExtraHighlightings
if (!Arg)
return;
- // Is this parameter passed by non-const reference?
+ // Is this parameter passed by non-const pointer or reference?
// FIXME The condition T->idDependentType() could be relaxed a bit,
// e.g. std::vector<T>& is dependent but we would want to highlight it
- if (!T->isLValueReferenceType() ||
- T.getNonReferenceType().isConstQualified() || T->isDependentType()) {
+ bool IsRef = T->isLValueReferenceType();
+ bool IsPtr = T->isPointerType();
+ if ((!IsRef && !IsPtr) || T->getPointeeType().isConstQualified() ||
+ T->isDependentType()) {
return;
}
llvm::Optional<SourceLocation> Location;
- // FIXME Add "unwrapping" for ArraySubscriptExpr and UnaryOperator,
+ // FIXME Add "unwrapping" for ArraySubscriptExpr,
// e.g. highlight `a` in `a[i]`
// FIXME Handle dependent expression types
+ if (auto *IC = dyn_cast<ImplicitCastExpr>(Arg))
+ Arg = IC->getSubExprAsWritten();
+ if (auto *UO = dyn_cast<UnaryOperator>(Arg)) {
+ if (UO->getOpcode() == UO_AddrOf)
+ Arg = UO->getSubExpr();
+ }
if (auto *DR = dyn_cast<DeclRefExpr>(Arg))
Location = DR->getLocation();
else if (auto *M = dyn_cast<MemberExpr>(Arg))
@@ -617,7 +625,8 @@ class CollectExtraHighlightings
if (Location)
H.addExtraModifier(*Location,
- HighlightingModifier::UsedAsMutableReference);
+ IsRef ? HighlightingModifier::UsedAsMutableReference
+ : HighlightingModifier::UsedAsMutablePointer);
}
void
@@ -1140,6 +1149,8 @@ llvm::StringRef toSemanticTokenModifier(HighlightingModifier Modifier) {
return "defaultLibrary";
case HighlightingModifier::UsedAsMutableReference:
return "usedAsMutableReference"; // nonstandard
+ case HighlightingModifier::UsedAsMutablePointer:
+ return "usedAsMutablePointer"; // nonstandard
case HighlightingModifier::ConstructorOrDestructor:
return "constructorOrDestructor"; // nonstandard
case HighlightingModifier::FunctionScope:
diff --git a/clang-tools-extra/clangd/SemanticHighlighting.h b/clang-tools-extra/clangd/SemanticHighlighting.h
index 79ecb344275d1..64ad431909faa 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.h
+++ b/clang-tools-extra/clangd/SemanticHighlighting.h
@@ -71,6 +71,7 @@ enum class HighlightingModifier {
DependentName,
DefaultLibrary,
UsedAsMutableReference,
+ UsedAsMutablePointer,
ConstructorOrDestructor,
FunctionScope,
diff --git a/clang-tools-extra/clangd/test/initialize-params.test b/clang-tools-extra/clangd/test/initialize-params.test
index eb958cac20279..a2df61ca75235 100644
--- a/clang-tools-extra/clangd/test/initialize-params.test
+++ b/clang-tools-extra/clangd/test/initialize-params.test
@@ -68,6 +68,7 @@
# CHECK-NEXT: "dependentName",
# CHECK-NEXT: "defaultLibrary",
# CHECK-NEXT: "usedAsMutableReference",
+# CHECK-NEXT: "usedAsMutablePointer",
# CHECK-NEXT: "constructorOrDestructor",
# CHECK-NEXT: "functionScope",
# CHECK-NEXT: "classScope",
diff --git a/clang-tools-extra/clangd/test/semantic-tokens.test b/clang-tools-extra/clangd/test/semantic-tokens.test
index 5abe78e9a51e1..b3a92b7cc737b 100644
--- a/clang-tools-extra/clangd/test/semantic-tokens.test
+++ b/clang-tools-extra/clangd/test/semantic-tokens.test
@@ -23,7 +23,7 @@
# CHECK-NEXT: 4,
# CHECK-NEXT: 1,
# CHECK-NEXT: 0,
-# CHECK-NEXT: 32771
+# CHECK-NEXT: 65539
# CHECK-NEXT: ],
# CHECK-NEXT: "resultId": "1"
# CHECK-NEXT: }
@@ -49,7 +49,7 @@
# CHECK-NEXT: 4,
# CHECK-NEXT: 1,
# CHECK-NEXT: 0,
-# CHECK-NEXT: 32771
+# CHECK-NEXT: 65539
# CHECK-NEXT: ],
# Inserted at position 1
# CHECK-NEXT: "deleteCount": 0,
@@ -72,12 +72,12 @@
# CHECK-NEXT: 4,
# CHECK-NEXT: 1,
# CHECK-NEXT: 0,
-# CHECK-NEXT: 32771,
+# CHECK-NEXT: 65539,
# CHECK-NEXT: 1,
# CHECK-NEXT: 4,
# CHECK-NEXT: 1,
# CHECK-NEXT: 0,
-# CHECK-NEXT: 32771
+# CHECK-NEXT: 65539
# CHECK-NEXT: ],
# CHECK-NEXT: "resultId": "3"
# CHECK-NEXT: }
diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
index 9abc49bb06014..3ea4a58a83a70 100644
--- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -382,7 +382,7 @@ TEST(SemanticHighlighting, GetsCorrectTokens) {
void $Function_def[[foo]]() {
$Class[[F]] $LocalVariable_def[[FF]];
$Class[[G]]<$Class[[F]], &$Class[[F]]::$Method[[f]]> $LocalVariable_def[[GG]];
- $LocalVariable[[GG]].$Method[[foo]](&$LocalVariable[[FF]]);
+ $LocalVariable[[GG]].$Method[[foo]](&$LocalVariable_usedAsMutablePointer[[FF]]);
$Class[[A]]<$Function[[foo]]> $LocalVariable_def[[AA]];
}
)cpp",
@@ -781,14 +781,14 @@ sizeof...($TemplateParameter[[Elements]]);
const int* $LocalVariable_def_readonly[[constPtr]];
int** $LocalVariable_def[[array]];
$Function[[fun]]($LocalVariable[[val]], $LocalVariable[[val]],
- $LocalVariable[[ptr]], $LocalVariable_readonly[[constPtr]],
+ $LocalVariable_usedAsMutablePointer[[ptr]], $LocalVariable_readonly[[constPtr]],
$LocalVariable_usedAsMutableReference[[val]], $LocalVariable[[val]],
$LocalVariable_usedAsMutableReference[[ptr]],
$LocalVariable_readonly_usedAsMutableReference[[constPtr]],
$LocalVariable_readonly[[constPtr]],
- $LocalVariable[[array]], $LocalVariable_usedAsMutableReference[[array]],
+ $LocalVariable_usedAsMutablePointer[[array]], $LocalVariable_usedAsMutableReference[[array]],
$LocalVariable[[array]]
);
[](int){}($LocalVariable[[val]]);
More information about the cfe-commits
mailing list