|
31 | 31 | #include "tsar/Frontend/Clang/TransformationContext.h" |
32 | 32 | #include "tsar/Support/Clang/Diagnostic.h" |
33 | 33 | #include "tsar/Support/Clang/Utils.h" |
| 34 | +#include <clang/AST/TypeLoc.h> |
34 | 35 | #include <clang/AST/Decl.h> |
| 36 | +#include <clang/AST/Type.h> |
35 | 37 | #include <clang/AST/RecursiveASTVisitor.h> |
36 | 38 | #include <clang/AST/Stmt.h> |
37 | | -#include "clang/Rewrite/Core/Rewriter.h" |
| 39 | +#include <clang/Rewrite/Core/Rewriter.h> |
38 | 40 | #include <llvm/ADT/DenseMap.h> |
39 | 41 | #include <llvm/ADT/SmallString.h> |
40 | 42 | #include <clang/Basic/SourceLocation.h> |
@@ -129,7 +131,15 @@ class ClangSplitter : public RecursiveASTVisitor<ClangSplitter> { |
129 | 131 | if (isNotSingleFlag) { |
130 | 132 | SourceRange toInsert(notSingleDeclStart, notSingleDeclEnd); |
131 | 133 | mRewriter.RemoveText(toInsert, RemoveEmptyLine); |
132 | | - |
| 134 | + bool isFirstVar = true; |
| 135 | + while (varDeclsNames.size()) { |
| 136 | + if (isFirstVar) { |
| 137 | + mRewriter.InsertTextAfterToken(notSingleDeclEnd, varDeclsNames.back()); |
| 138 | + isFirstVar = false; |
| 139 | + } |
| 140 | + mRewriter.InsertTextAfterToken(notSingleDeclEnd, varDeclType + varDeclsNames.back()); |
| 141 | + varDeclsNames.pop_back(); |
| 142 | + } |
133 | 143 | } |
134 | 144 | if (mClauses.empty() || !isa<CompoundStmt>(S) && |
135 | 145 | !isa<ForStmt>(S) && !isa<DoStmt>(S) && !isa<WhileStmt>(S)) |
@@ -181,50 +191,43 @@ class ClangSplitter : public RecursiveASTVisitor<ClangSplitter> { |
181 | 191 | } |
182 | 192 | } |
183 | 193 |
|
184 | | - // bool VisitVarDecl(VarDecl *S) { // to traverse the parse tree and visit each statement |
185 | | - // if (isNotSingleFlag) { |
186 | | - // std::string varType = S->getType().getAsString(); |
187 | | - // SourceLocation locat = S->getLocation(); |
188 | | - // CharSourceRange txtToInsert(locat, true); |
189 | | - // std::string varName = S->getName().str(); |
190 | | - // int n = varType.length(); |
191 | | - // char char_array[n + 1]; |
192 | | - // strcpy(char_array, varType.c_str()); |
193 | | - // if (strchr(char_array, '[')) { |
194 | | - // buildTxtStr(varType, varName); |
195 | | - // } else { |
196 | | - // txtStr = varType + " " + varName + ";\n"; |
197 | | - // } |
198 | | - // mRewriter.InsertTextAfterToken(notSingleDeclEnd, txtStr); |
199 | | - // } |
200 | | - // return true; |
201 | | - // } |
| 194 | +bool TraverseTypeLoc(TypeLoc Loc) { |
| 195 | + if (isNotSingleFlag && varDeclsNum == 1) { |
| 196 | + TypeRange = Loc.getSourceRange(); |
| 197 | + std::string type = mRewriter.getRewrittenText(TypeRange); |
| 198 | + std::cout << "type = " << type << std::endl; |
| 199 | + varDeclType = type; |
| 200 | + return RecursiveASTVisitor::TraverseTypeLoc(Loc); |
| 201 | + } |
| 202 | + return true; |
| 203 | +} |
202 | 204 |
|
203 | | - bool VisitVarDecl(VarDecl *S) { // to traverse the parse tree and visit each statement |
| 205 | +bool VisitVarDecl(VarDecl *S) { // to traverse the parse tree and visit each statement |
204 | 206 | if (isNotSingleFlag) { |
205 | 207 | varDeclsNum++; |
206 | 208 | SourceRange toInsert(notSingleDeclStart, notSingleDeclEnd); |
207 | 209 | ExternalRewriter Canvas(toInsert, mSrcMgr, mLangOpts); |
| 210 | + |
208 | 211 | SourceRange Range(S->getLocation()); |
209 | 212 | varDeclsStarts.push_front(S->getBeginLoc()); |
210 | 213 | varDeclsEnds.push_front(S->getEndLoc()); |
211 | 214 | SourceRange varDeclRange(S->getBeginLoc(), S->getEndLoc()); |
212 | 215 | if (varDeclsNum == 1) { |
213 | 216 | SourceRange toInsert2(Range.getBegin(), S->getEndLoc()); |
| 217 | + std::cout << "toInsert2" << Canvas.getRewrittenText(toInsert2).str() << std::endl; |
| 218 | + std::cout << "varDeclRange" << Canvas.getRewrittenText(varDeclRange).str() << std::endl; |
214 | 219 | txtStr = Canvas.getRewrittenText(varDeclRange).str(); |
215 | | - Canvas.RemoveText(toInsert2); |
216 | | - varDeclType = Canvas.getRewrittenText(varDeclRange); |
217 | 220 | } |
218 | 221 | if (varDeclsNum > 1) { |
219 | 222 | SourceRange prevVarDeclRange(varDeclsStarts.back(), varDeclsEnds.back()); |
220 | 223 | varDeclsStarts.pop_back(); |
221 | 224 | varDeclsEnds.pop_back(); |
222 | | - Canvas.ReplaceText(prevVarDeclRange, varDeclType); |
| 225 | + Canvas.ReplaceText(prevVarDeclRange, ""); |
223 | 226 | txtStr = Canvas.getRewrittenText(varDeclRange).str(); |
224 | 227 | auto it = std::remove(txtStr.begin(), txtStr.end(), ','); |
225 | 228 | txtStr.erase(it, txtStr.end()); |
226 | 229 | } |
227 | | - mRewriter.InsertTextAfterToken(notSingleDeclEnd, txtStr + ";\n"); |
| 230 | + varDeclsNames.push_front(txtStr + ";\n"); |
228 | 231 | } |
229 | 232 | return true; |
230 | 233 | } |
@@ -273,9 +276,12 @@ class ClangSplitter : public RecursiveASTVisitor<ClangSplitter> { |
273 | 276 | DenseSet<DeclStmt*> mMultipleDecls; |
274 | 277 | std::deque<SourceLocation> varDeclsStarts; |
275 | 278 | std::deque<SourceLocation> varDeclsEnds; |
| 279 | + std::deque<std::string> varDeclsNames; |
276 | 280 | int varDeclsNum = 0; |
277 | 281 | SourceLocation notSingleDeclStart; |
278 | 282 | SourceLocation notSingleDeclEnd; |
| 283 | + SourceRange TypeRange; |
| 284 | + bool isArrayTypeFlag = false; |
279 | 285 | std::string txtStr; |
280 | 286 | std::string varDeclType; |
281 | 287 | }; |
|
0 commit comments