Fixes according to code review comments
[lldb.git] / clang-tools-extra / loop-convert / VariableNaming.cpp
1 #include "VariableNaming.h"
2
3 namespace clang {
4 namespace loop_migrate {
5
6 std::string VariableNamer::createIndexName() {
7   // FIXME: Add in naming conventions to handle:
8   //  - Uppercase/lowercase indices
9   //  - How to handle conflicts
10   //  - An interactive process for naming
11   std::string IteratorName;
12   std::string ContainerName;
13   if (TheContainer)
14     ContainerName = TheContainer->getName().str();
15
16   size_t Len = ContainerName.length();
17   if (Len > 1 && ContainerName[Len - 1] == 's')
18     IteratorName = ContainerName.substr(0, Len - 1);
19   else
20     IteratorName = "elem";
21
22   if (!declarationExists(IteratorName))
23     return IteratorName;
24
25   IteratorName = ContainerName + "_" + OldIndex->getName().str();
26   if (!declarationExists(IteratorName))
27     return IteratorName;
28
29   IteratorName = ContainerName + "_elem";
30   if (!declarationExists(IteratorName))
31     return IteratorName;
32
33   IteratorName += "_elem";
34   if (!declarationExists(IteratorName))
35     return IteratorName;
36
37   IteratorName = "_elem_";
38
39   // Someone defeated my naming scheme...
40   while (declarationExists(IteratorName))
41     IteratorName += "i";
42   return IteratorName;
43 }
44
45 /// \brief Determines whether or not the the name Symbol exists in LoopContext,
46 /// any of its parent contexts, or any of its child statements.
47 ///
48 /// We also check to see if the same identifier was generated by this loop
49 /// converter in a loop nested within SourceStmt.
50 bool VariableNamer::declarationExists(const StringRef Symbol) {
51   // Determine if the symbol was generated in a parent context.
52   for (const Stmt *S = SourceStmt; S != NULL; S = ReverseAST->lookup(S)) {
53     StmtGeneratedVarNameMap::const_iterator I = GeneratedDecls->find(S);
54     if (I != GeneratedDecls->end() && I->second == Symbol)
55       return true;
56   }
57
58   // FIXME: Rather than detecting conflicts at their usages, we should check the
59   // parent context.
60   // For some reason, lookup() always returns the pair (NULL, NULL) because its
61   // StoredDeclsMap is not initialized (i.e. LookupPtr.getInt() is false inside
62   // of DeclContext::lookup()). Why is this?
63
64   // Finally, determine if the symbol was used in the loop or a child context.
65   DeclFinderASTVisitor DeclFinder(Symbol, GeneratedDecls);
66   return DeclFinder.findUsages(SourceStmt);
67 }
68
69 } // namespace loop_migrate
70 } // namespace clang