[PATCH] D10933: Add new IdentifierNaming check

Alexander Kornienko via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 17 07:55:53 PDT 2015


alexfh added a comment.

In http://reviews.llvm.org/D10933#225696, @berenm wrote:

> Indeed, I probably don't have rights on Clang/LLVM repositories.
>
> I have updated the patch with stricter tests - and found a missing break statement (`clang-tidy/readability/IdentifierNamingCheck.cpp:201`).


Behold the magic power of testing ;)

> I also realized that the DeclRefExpr matcher used to find references to declared identifiers is only matching references to values and not to classes.

> 

> For example, when referencing the class in the out-of-line class static member declaration (`test/clang-tidy/readability-identifier-naming.cpp:133` and `test/clang-tidy/readability-identifier-naming.cpp:136`), or  when using a class identifier as the type of a typedef, (`test/clang-tidy/readability-identifier-naming.cpp:243`). Or even when declaring a variable of a type whose name must be fixed.

> 

> Is there any matcher that could be used for finding references to a TypeDecl? Should I go through calls to `getDeclContext`, `getType`, or `getUnderlyingType` depending on the context? Any easier way I don't know about?


Yep, renaming classes is not as trivial as it might seem. You'll need to look for `TypeLoc`s (the `loc()` matcher) of `QualType`s and `NestedNameSpecifier`s referring to the old class name. You'd also need to match constructor declarations and `UsingDecl`s separately.

Here's a rough list of matchers that search for the name of a class:

  loc(qualType(hasDeclaration(namedDecl(hasName(old_class)))))
  loc(nestedNameSpecifier(specifiesType(
                hasDeclaration(recordDecl(hasName(old_class))))))
  usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(hasName(old_class))))
  recordDecl(hasName(old_class))
  constructorDecl(ofClass(hasName(old_class)))

I suggest that you add a bunch of FIXMEs in the test and we can iterate on the check in follow-up patches. Similar issues apply to namespace and function renaming.

What needs to be tested:

- for classes: forward declarations, definitions, constructors, destructors, using declarations, type aliases, use of the class name in `new`, casting, qualified names (Class::member) (also resulting from injected class name usage - `Class::Class::Class`), use of the class name in templates and macros (to ensure there are no duplicate or incorrect fixes), and probably something else that I forgot.
- for functions/methods: declarations, calls, using declarations, taking address of, with qualified names and without, probably something else.
- for namespaces: use in qualified names and using declarations and directives.


http://reviews.llvm.org/D10933





More information about the cfe-commits mailing list