================
@@ -159,6 +172,45 @@ SymbolTags toSymbolTagBitmask(const SymbolTag ST) {
   return (1 << static_cast<unsigned>(ST));
 }
 
+bool isOverrides(const NamedDecl *ND) {
+  if (const auto *MD = llvm::dyn_cast<CXXMethodDecl>(ND)) {
+    // A method "overrides" if:
+    // 1. It overrides at least one method
+    // 2. At least one of the overridden methods is virtual (but NOT pure
+    // virtual)
+
+    if (MD->size_overridden_methods() == 0)
+      return false;
+
+    for (const auto Overridden : MD->overridden_methods()) {
+      // Check if the overridden method is virtual but not pure virtual
+      if (Overridden->isVirtual() && !Overridden->isPureVirtual())
+        return true;
+    }
+    return false;
+  }
+  return false;
+}
+
+bool isImplements(const NamedDecl *ND) {
+  if (const auto *MD = llvm::dyn_cast<CXXMethodDecl>(ND)) {
+    // A method "implements" pure virtual methods from base classes if:
+    // 1. It overrides at least one method
+    // 2. It is NOT itself pure virtual (i.e., it has a concrete 
implementation)
+    // 3. ALL overridden methods are pure virtual
----------------
ratzdi wrote:

```
A
virtual void foo() = 0;
virtual void boo() {}

B -> A
void foo() override{}
void boo() override{}

```

A::foo abstract
A:boo virtual

B::foo implements
B::boo overrides

`overrides` overrides an existing definition (B::boo). Implements means, it 
(B::foo) implements a pure virtual function (A::foo) 

https://github.com/llvm/llvm-project/pull/170103
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to