Clang import; NamespaceDecl, varDecl4, varDecl5
This commit is contained in:
parent
b8ae957365
commit
54a9b61329
|
@ -41,6 +41,7 @@ static const std::string IfStmt = "IfStmt";
|
|||
static const std::string ImplicitCastExpr = "ImplicitCastExpr";
|
||||
static const std::string IntegerLiteral = "IntegerLiteral";
|
||||
static const std::string MemberExpr = "MemberExpr";
|
||||
static const std::string NamespaceDecl = "NamespaceDecl";
|
||||
static const std::string NullStmt = "NullStmt";
|
||||
static const std::string ParmVarDecl = "ParmVarDecl";
|
||||
static const std::string RecordDecl = "RecordDecl";
|
||||
|
@ -145,6 +146,7 @@ namespace clangastdump {
|
|||
|
||||
void dumpAst(int num = 0, int indent = 0) const;
|
||||
void createTokens1(TokenList *tokenList) {
|
||||
//dumpAst();
|
||||
setLocations(tokenList, 0, 1, 1);
|
||||
createTokens(tokenList);
|
||||
if (nodeType == VarDecl || nodeType == RecordDecl || nodeType == TypedefDecl)
|
||||
|
@ -444,6 +446,18 @@ Token *clangastdump::AstNode::createTokens(TokenList *tokenList)
|
|||
return addtoken(tokenList, mExtTokens.back());
|
||||
if (nodeType == NullStmt)
|
||||
return addtoken(tokenList, ";");
|
||||
if (nodeType == NamespaceDecl) {
|
||||
if (children.empty())
|
||||
return nullptr;
|
||||
Token *defToken = addtoken(tokenList, "namespace");
|
||||
Token *nameToken = (mExtTokens[mExtTokens.size() - 2].compare(0,4,"col:") == 0) ?
|
||||
addtoken(tokenList, mExtTokens.back()) : nullptr;
|
||||
Scope *scope = createScope(tokenList, Scope::ScopeType::eNamespace, children);
|
||||
scope->classDef = defToken;
|
||||
if (nameToken)
|
||||
scope->className = nameToken->str();
|
||||
return nullptr;
|
||||
}
|
||||
if (nodeType == MemberExpr) {
|
||||
Token *s = children[0]->createTokens(tokenList);
|
||||
Token *dot = addtoken(tokenList, ".");
|
||||
|
@ -504,17 +518,19 @@ Token *clangastdump::AstNode::createTokens(TokenList *tokenList)
|
|||
|
||||
Token * clangastdump::AstNode::createTokensVarDecl(TokenList *tokenList)
|
||||
{
|
||||
bool isInit = mExtTokens.back() == "cinit";
|
||||
const std::string addr = mExtTokens.front();
|
||||
const std::string type = isInit ? mExtTokens[mExtTokens.size() - 2] : mExtTokens.back();
|
||||
const std::string name = isInit ? mExtTokens[mExtTokens.size() - 3] : mExtTokens[mExtTokens.size() - 2];
|
||||
int typeIndex = mExtTokens.size() - 1;
|
||||
while (typeIndex > 1 && std::isalpha(mExtTokens[typeIndex][0]))
|
||||
typeIndex--;
|
||||
const std::string type = mExtTokens[typeIndex];
|
||||
const std::string name = mExtTokens[typeIndex - 1];
|
||||
addTypeTokens(tokenList, type);
|
||||
Token *vartok1 = addtoken(tokenList, name);
|
||||
Scope *scope = const_cast<Scope *>(tokenList->back()->scope());
|
||||
const AccessControl accessControl = (scope->type == Scope::ScopeType::eGlobal) ? (AccessControl::Global) : (AccessControl::Local);
|
||||
scope->varlist.push_back(Variable(vartok1, type, 0, accessControl, nullptr, scope));
|
||||
mData->varDecl(addr, vartok1, &scope->varlist.back());
|
||||
if (isInit) {
|
||||
if (mExtTokens.back() == "cinit") {
|
||||
Token *eq = addtoken(tokenList, "=");
|
||||
eq->astOperand1(vartok1);
|
||||
eq->astOperand2(children.back()->createTokens(tokenList));
|
||||
|
|
|
@ -1745,8 +1745,11 @@ Variable::Variable(const Token *name_, const std::string &clangType,
|
|||
pos = clangType.find("]", pos1);
|
||||
Dimension dim;
|
||||
dim.tok = nullptr;
|
||||
dim.known = true;
|
||||
dim.known = pos > pos1;
|
||||
if (pos > pos1)
|
||||
dim.num = MathLib::toLongNumber(clangType.substr(pos1, pos-pos1));
|
||||
else
|
||||
dim.num = 0;
|
||||
mDimensions.push_back(dim);
|
||||
++pos;
|
||||
} while (pos < clangType.size() && clangType[pos] == '[');
|
||||
|
|
|
@ -38,6 +38,7 @@ private:
|
|||
TEST_CASE(funcdecl4);
|
||||
TEST_CASE(ifelse);
|
||||
TEST_CASE(memberExpr);
|
||||
TEST_CASE(namespaceDecl);
|
||||
TEST_CASE(recordDecl);
|
||||
TEST_CASE(typedefDecl1);
|
||||
TEST_CASE(typedefDecl2);
|
||||
|
@ -45,7 +46,12 @@ private:
|
|||
TEST_CASE(vardecl1);
|
||||
TEST_CASE(vardecl2);
|
||||
TEST_CASE(vardecl3);
|
||||
TEST_CASE(vardecl4);
|
||||
TEST_CASE(vardecl5);
|
||||
TEST_CASE(whileStmt);
|
||||
|
||||
// C++..
|
||||
TEST_CASE(namespaceDecl);
|
||||
}
|
||||
|
||||
std::string parse(const char clang[]) {
|
||||
|
@ -170,6 +176,13 @@ private:
|
|||
parse(clang));
|
||||
}
|
||||
|
||||
void namespaceDecl() {
|
||||
const char clang[] = "`-NamespaceDecl 0x2e5f658 <hello.cpp:1:1, col:24> col:11 x\n"
|
||||
" `-VarDecl 0x2e5f6d8 <col:15, col:19> col:19 var 'int'";
|
||||
ASSERT_EQUALS("namespace x { int var@1 ; }",
|
||||
parse(clang));
|
||||
}
|
||||
|
||||
void recordDecl() {
|
||||
const char clang[] = "`-RecordDecl 0x354eac8 <1.c:1:1, line:4:1> line:1:8 struct S definition\n"
|
||||
" |-FieldDecl 0x354eb88 <line:2:3, col:7> col:7 x 'int'\n"
|
||||
|
@ -236,6 +249,16 @@ private:
|
|||
ASSERT_EQUALS("const int * p@1 ;", parse(clang));
|
||||
}
|
||||
|
||||
void vardecl4() {
|
||||
const char clang[] = "|-VarDecl 0x23d6c78 <line:137:1, col:14> col:14 stdin 'FILE *' extern";
|
||||
ASSERT_EQUALS("FILE * stdin@1 ;", parse(clang));
|
||||
}
|
||||
|
||||
void vardecl5() {
|
||||
const char clang[] = "|-VarDecl 0x2e31fc0 <line:27:1, col:38> col:26 sys_errlist 'const char *const []' extern";
|
||||
ASSERT_EQUALS("const char *const [] sys_errlist@1 ;", parse(clang));
|
||||
}
|
||||
|
||||
void whileStmt() {
|
||||
const char clang[] = "`-FunctionDecl 0x3d45b18 <1.c:1:1, line:3:1> line:1:6 foo 'void ()'\n"
|
||||
" `-CompoundStmt 0x3d45c48 <col:12, line:3:1>\n"
|
||||
|
|
Loading…
Reference in New Issue