[clang-tidy] Suggestion for new rule 'readability-simplify-namespaces'
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
Suggestion for new rule `readability-simplify-namespaces` that removes redundant namespaces.
1. Same namespaces: remove all prefixes.
```cpp
namespace ns1 {
namespace ns2 {
namespace ns3 {
struct A {
static void foo() {}
};
struct B {
static void bar() {
ns1::ns2::ns3::A::foo(); // becomes A::foo();
ns2::ns3::A::foo(); // becomes A::foo();
ns3::A::foo(); // becomes A::foo();
};
}
}
}
```
2. Common namespaces: remove common prefixes.
```cpp
namespace ns1 {
namespace ns2 {
namespace ns3 {
struct A {
static void foo() {}
};
}
namespace ns4 {
struct B {
static void bar() {
ns1::ns2::ns3::A::foo(); // becomes ns3::A::foo();
ns2::ns3::A::foo(); // becomes ns3::A::foo();
ns3::A::foo(); // becomes ns3::A::foo();
};
}
}
}
```
3. Same class name for different namespaces: keep least exclusive prefixes.
```cpp
namespace ns1 {
namespace ns2 {
namespace ns3 {
struct A {
static void foo() {}
};
}
struct A {
static void foo() {}
};
}
}
namespace ns1 {
namespace ns2 {
namespace ns3 {
struct B {
static void bar() {
ns1::ns2::ns3::A::foo(); // becomes A::foo();
ns2::ns3::A::foo(); // becomes A::foo();
ns3::A::foo(); // becomes A::foo();
ns1::ns2::A::foo(); // becomes ns2::A::foo();
ns2::A::foo(); // becomes ns2::A::foo();
}
};
}
struct B {
static void foo() {
ns1::ns2::ns3::A::foo(); // becomes ns3::A::foo();
ns2::ns3::A::foo(); // becomes ns3::A::foo();
ns3::A::foo(); // becomes ns3::A::foo();
ns1::ns2::A::foo(); // becomes A::foo();
ns2::A::foo(); // becomes A::foo();
}
};
}
}
```
Consider namespaces for each types use:
- Variables declarations.
- Methods parameters.
- Methods return values.
- Static methods calls.
- Templates arguments.
- Nested types.
Contributor guide
Assessment
This issue has not been assessed yet.