Skip to content

Commit 04090b2

Browse files
committed
SplitDecls with TraverseTypeLoc (version 1)
1 parent c4ff0b0 commit 04090b2

File tree

1 file changed

+31
-25
lines changed

1 file changed

+31
-25
lines changed

lib/Transform/Clang/SplitDecls.cpp

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@
3131
#include "tsar/Frontend/Clang/TransformationContext.h"
3232
#include "tsar/Support/Clang/Diagnostic.h"
3333
#include "tsar/Support/Clang/Utils.h"
34+
#include <clang/AST/TypeLoc.h>
3435
#include <clang/AST/Decl.h>
36+
#include <clang/AST/Type.h>
3537
#include <clang/AST/RecursiveASTVisitor.h>
3638
#include <clang/AST/Stmt.h>
37-
#include "clang/Rewrite/Core/Rewriter.h"
39+
#include <clang/Rewrite/Core/Rewriter.h>
3840
#include <llvm/ADT/DenseMap.h>
3941
#include <llvm/ADT/SmallString.h>
4042
#include <clang/Basic/SourceLocation.h>
@@ -129,7 +131,15 @@ class ClangSplitter : public RecursiveASTVisitor<ClangSplitter> {
129131
if (isNotSingleFlag) {
130132
SourceRange toInsert(notSingleDeclStart, notSingleDeclEnd);
131133
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+
}
133143
}
134144
if (mClauses.empty() || !isa<CompoundStmt>(S) &&
135145
!isa<ForStmt>(S) && !isa<DoStmt>(S) && !isa<WhileStmt>(S))
@@ -181,50 +191,43 @@ class ClangSplitter : public RecursiveASTVisitor<ClangSplitter> {
181191
}
182192
}
183193

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+
}
202204

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
204206
if (isNotSingleFlag) {
205207
varDeclsNum++;
206208
SourceRange toInsert(notSingleDeclStart, notSingleDeclEnd);
207209
ExternalRewriter Canvas(toInsert, mSrcMgr, mLangOpts);
210+
208211
SourceRange Range(S->getLocation());
209212
varDeclsStarts.push_front(S->getBeginLoc());
210213
varDeclsEnds.push_front(S->getEndLoc());
211214
SourceRange varDeclRange(S->getBeginLoc(), S->getEndLoc());
212215
if (varDeclsNum == 1) {
213216
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;
214219
txtStr = Canvas.getRewrittenText(varDeclRange).str();
215-
Canvas.RemoveText(toInsert2);
216-
varDeclType = Canvas.getRewrittenText(varDeclRange);
217220
}
218221
if (varDeclsNum > 1) {
219222
SourceRange prevVarDeclRange(varDeclsStarts.back(), varDeclsEnds.back());
220223
varDeclsStarts.pop_back();
221224
varDeclsEnds.pop_back();
222-
Canvas.ReplaceText(prevVarDeclRange, varDeclType);
225+
Canvas.ReplaceText(prevVarDeclRange, "");
223226
txtStr = Canvas.getRewrittenText(varDeclRange).str();
224227
auto it = std::remove(txtStr.begin(), txtStr.end(), ',');
225228
txtStr.erase(it, txtStr.end());
226229
}
227-
mRewriter.InsertTextAfterToken(notSingleDeclEnd, txtStr + ";\n");
230+
varDeclsNames.push_front(txtStr + ";\n");
228231
}
229232
return true;
230233
}
@@ -273,9 +276,12 @@ class ClangSplitter : public RecursiveASTVisitor<ClangSplitter> {
273276
DenseSet<DeclStmt*> mMultipleDecls;
274277
std::deque<SourceLocation> varDeclsStarts;
275278
std::deque<SourceLocation> varDeclsEnds;
279+
std::deque<std::string> varDeclsNames;
276280
int varDeclsNum = 0;
277281
SourceLocation notSingleDeclStart;
278282
SourceLocation notSingleDeclEnd;
283+
SourceRange TypeRange;
284+
bool isArrayTypeFlag = false;
279285
std::string txtStr;
280286
std::string varDeclType;
281287
};

0 commit comments

Comments
 (0)