llvm / llvm/llvm-project

[clang-tidy] Suggestion for new rule 'readability-simplify-namespaces'

Open
#187,022 3 comments 0 reactions 0 assignees View on GitHub
check-request clang-tidy
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.