This commit is contained in:
Jacob Dufault 2017-02-18 18:34:51 -08:00
parent 41f2a75de0
commit fd1d8c8785
13 changed files with 87 additions and 78 deletions

View File

@ -16,6 +16,11 @@ bool Type::operator==(const Type& rhs) const {
} }
bool Type::is_fundamental() const { bool Type::is_fundamental() const {
//switch (cx_type.kind) {
//case CXType_Auto:
//return true;
//}
// NOTE: This will return false for pointed types. Should we call // NOTE: This will return false for pointed types. Should we call
// strip_qualifiers for the user? // strip_qualifiers for the user?
return cx_type.kind >= CXType_FirstBuiltin && return cx_type.kind >= CXType_FirstBuiltin &&

View File

@ -85,7 +85,8 @@ struct TypeDef {
std::vector<clang::SourceLocation> uses; std::vector<clang::SourceLocation> uses;
TypeDef(TypeId id, const std::string& usr) : id(id), usr(usr) { TypeDef(TypeId id, const std::string& usr) : id(id), usr(usr) {
std::cout << "Creating type with usr " << usr << std::endl; //assert(usr.size() > 0);
//std::cout << "Creating type with usr " << usr << std::endl;
} }
}; };
@ -152,6 +153,8 @@ struct ParsingDatabase {
std::vector<FuncDef> funcs; std::vector<FuncDef> funcs;
std::vector<VarDef> vars; std::vector<VarDef> vars;
ParsingDatabase();
TypeId ToTypeId(const std::string& usr); TypeId ToTypeId(const std::string& usr);
FuncId ToFuncId(const std::string& usr); FuncId ToFuncId(const std::string& usr);
VarId ToVarId(const std::string& usr); VarId ToVarId(const std::string& usr);
@ -163,6 +166,8 @@ struct ParsingDatabase {
std::string ToString(); std::string ToString();
}; };
ParsingDatabase::ParsingDatabase() {}
TypeId ParsingDatabase::ToTypeId(const std::string& usr) { TypeId ParsingDatabase::ToTypeId(const std::string& usr) {
auto it = usr_to_type_id.find(usr); auto it = usr_to_type_id.find(usr);
if (it != usr_to_type_id.end()) if (it != usr_to_type_id.end())
@ -296,6 +301,12 @@ void Write(Writer& writer, const char* key, uint64_t value) {
} }
std::string ParsingDatabase::ToString() { std::string ParsingDatabase::ToString() {
auto it = usr_to_type_id.find("");
if (it != usr_to_type_id.end()) {
Resolve(it->second)->short_name = "<fundamental>";
assert(Resolve(it->second)->uses.size() == 0);
}
#define WRITE(name) Write(writer, #name, def.name) #define WRITE(name) Write(writer, #name, def.name)
rapidjson::StringBuffer output; rapidjson::StringBuffer output;
@ -539,7 +550,8 @@ void Dump(clang::Cursor cursor) {
void InsertTypeUsageAtLocation(ParsingDatabase* db, clang::Type type, const clang::SourceLocation& location) { void InsertTypeUsageAtLocation(ParsingDatabase* db, clang::Type type, const clang::SourceLocation& location) {
clang::Type raw_type = type.strip_qualifiers(); clang::Type raw_type = type.strip_qualifiers();
if (raw_type.is_fundamental()) std::string usr = raw_type.get_usr();
if (usr == "")
return; return;
// Add a usage to the type of the variable. // Add a usage to the type of the variable.
@ -583,7 +595,9 @@ void HandleVarDecl(ParsingDatabase* db, NamespaceStack* ns, clang::Cursor var, s
// TODO: Figure out how to scan initializations properly. We probably need // TODO: Figure out how to scan initializations properly. We probably need
// to scan for assignment statement, or definition+ctor. // to scan for assignment statement, or definition+ctor.
var_def->initializations.push_back(var.get_source_location()); var_def->initializations.push_back(var.get_source_location());
var_def->variable_type = db->ToTypeId(var.get_type().strip_qualifiers().get_usr()); std::string var_type_usr = var.get_type().strip_qualifiers().get_usr();
if (var_type_usr != "")
var_def->variable_type = db->ToTypeId(var_type_usr);
} }
@ -945,7 +959,7 @@ void DiffDocuments(rapidjson::Document& expected, rapidjson::Document& actual) {
int main(int argc, char** argv) { int main(int argc, char** argv) {
for (std::string path : GetFilesInFolder("tests")) { for (std::string path : GetFilesInFolder("tests")) {
// TODO: Fix all existing tests. // TODO: Fix all existing tests.
//if (path != "tests/method_definition.cc") continue; //if (path != "tests/usage/func_usage_addr_func.cc") continue;
// Parse expected output from the test, parse it into JSON document. // Parse expected output from the test, parse it into JSON document.
std::string expected_output; std::string expected_output;

View File

@ -10,10 +10,7 @@ void user() {
/* /*
OUTPUT: OUTPUT:
{ {
"types": [{ "types": [],
"id": 0,
"uses": ["tests/usage/func_usage_addr_func.cc:6:8"]
}],
"functions": [{ "functions": [{
"id": 0, "id": 0,
"usr": "c:@F@consume#*v#", "usr": "c:@F@consume#*v#",
@ -41,16 +38,14 @@ OUTPUT:
"variables": [{ "variables": [{
"id": 0, "id": 0,
"declaration": "tests/usage/func_usage_addr_func.cc:1:19", "declaration": "tests/usage/func_usage_addr_func.cc:1:19",
"initializations": ["tests/usage/func_usage_addr_func.cc:1:19"], "initializations": ["tests/usage/func_usage_addr_func.cc:1:19"]
"variable_type": 0
}, { }, {
"id": 1, "id": 1,
"usr": "c:func_usage_addr_func.cc@61@F@user#@x", "usr": "c:func_usage_addr_func.cc@61@F@user#@x",
"short_name": "x", "short_name": "x",
"qualified_name": "x", "qualified_name": "x",
"declaration": "tests/usage/func_usage_addr_func.cc:6:8", "declaration": "tests/usage/func_usage_addr_func.cc:6:8",
"initializations": ["tests/usage/func_usage_addr_func.cc:6:8"], "initializations": ["tests/usage/func_usage_addr_func.cc:6:8"]
"variable_type": 0
}] }]
} }
*/ */

View File

@ -17,9 +17,6 @@ OUTPUT:
"qualified_name": "Foo", "qualified_name": "Foo",
"definition": "tests/usage/func_usage_addr_method.cc:1:8", "definition": "tests/usage/func_usage_addr_method.cc:1:8",
"funcs": [0] "funcs": [0]
}, {
"id": 1,
"uses": ["tests/usage/func_usage_addr_method.cc:6:8"]
}], }],
"functions": [{ "functions": [{
"id": 0, "id": 0,
@ -44,8 +41,7 @@ OUTPUT:
"short_name": "x", "short_name": "x",
"qualified_name": "x", "qualified_name": "x",
"declaration": "tests/usage/func_usage_addr_method.cc:6:8", "declaration": "tests/usage/func_usage_addr_method.cc:6:8",
"initializations": ["tests/usage/func_usage_addr_method.cc:6:8"], "initializations": ["tests/usage/func_usage_addr_method.cc:6:8"]
"variable_type": 1
}] }]
} }
*/ */

View File

@ -9,8 +9,6 @@ class Foo {
// TODO(libclang): libclang doesn't expose the |helper| reference in the ast, // TODO(libclang): libclang doesn't expose the |helper| reference in the ast,
// so we can't add the |helper| usage. // so we can't add the |helper| usage.
// TODO: Remove "id" 1 output
/* /*
OUTPUT: OUTPUT:
{ {
@ -21,8 +19,6 @@ OUTPUT:
"qualified_name": "Foo", "qualified_name": "Foo",
"definition": "tests/usage/func_usage_class_inline_var_def.cc:5:7", "definition": "tests/usage/func_usage_class_inline_var_def.cc:5:7",
"vars": [0] "vars": [0]
}, {
"id": 1
}], }],
"functions": [{ "functions": [{
"id": 0, "id": 0,
@ -38,7 +34,6 @@ OUTPUT:
"qualified_name": "Foo::x", "qualified_name": "Foo::x",
"declaration": "tests/usage/func_usage_class_inline_var_def.cc:6:7", "declaration": "tests/usage/func_usage_class_inline_var_def.cc:6:7",
"initializations": ["tests/usage/func_usage_class_inline_var_def.cc:6:7"], "initializations": ["tests/usage/func_usage_class_inline_var_def.cc:6:7"],
"variable_type": 1,
"declaring_type": 0 "declaring_type": 0
}] }]
} }

View File

@ -1,5 +1,5 @@
class Foo { class Foo {
int member; Foo* member;
}; };
/* /*
OUTPUT: OUTPUT:
@ -10,9 +10,8 @@ OUTPUT:
"short_name": "Foo", "short_name": "Foo",
"qualified_name": "Foo", "qualified_name": "Foo",
"definition": "tests/vars/class_member.cc:1:7", "definition": "tests/vars/class_member.cc:1:7",
"vars": [0] "vars": [0],
}, { "uses": ["tests/vars/class_member.cc:2:8"]
"id": 1
}], }],
"functions": [], "functions": [],
"variables": [{ "variables": [{
@ -20,9 +19,9 @@ OUTPUT:
"usr": "c:@S@Foo@FI@member", "usr": "c:@S@Foo@FI@member",
"short_name": "member", "short_name": "member",
"qualified_name": "Foo::member", "qualified_name": "Foo::member",
"declaration": "tests/vars/class_member.cc:2:7", "declaration": "tests/vars/class_member.cc:2:8",
"initializations": ["tests/vars/class_member.cc:2:7"], "initializations": ["tests/vars/class_member.cc:2:8"],
"variable_type": 1, "variable_type": 0,
"declaring_type": 0 "declaring_type": 0
}] }]
} }

View File

@ -1,7 +1,8 @@
class Foo { class Foo {
static int member; static Foo* member;
}; };
int Foo::member = 0; Foo* Foo::member = nullptr;
/* /*
OUTPUT: OUTPUT:
{ {
@ -11,9 +12,8 @@ OUTPUT:
"short_name": "Foo", "short_name": "Foo",
"qualified_name": "Foo", "qualified_name": "Foo",
"definition": "tests/vars/class_static_member.cc:1:7", "definition": "tests/vars/class_static_member.cc:1:7",
"vars": [0] "vars": [0],
}, { "uses": ["tests/vars/class_static_member.cc:2:15", "tests/vars/class_static_member.cc:4:11"]
"id": 1
}], }],
"functions": [], "functions": [],
"variables": [{ "variables": [{
@ -21,9 +21,9 @@ OUTPUT:
"usr": "c:@S@Foo@member", "usr": "c:@S@Foo@member",
"short_name": "member", "short_name": "member",
"qualified_name": "Foo::member", "qualified_name": "Foo::member",
"declaration": "tests/vars/class_static_member.cc:2:14", "declaration": "tests/vars/class_static_member.cc:2:15",
"initializations": ["tests/vars/class_static_member.cc:4:10"], "initializations": ["tests/vars/class_static_member.cc:4:11"],
"variable_type": 1, "variable_type": 0,
"declaring_type": 0 "declaring_type": 0
}] }]
} }

View File

@ -1,26 +1,33 @@
struct Foo;
void foo() { void foo() {
int a; Foo* a;
} }
/* /*
OUTPUT: OUTPUT:
{ {
"types": [{ "types": [{
"id": 0 "id": 0,
"usr": "c:@S@Foo",
"short_name": "Foo",
"qualified_name": "Foo",
"declaration": "tests/vars/function_local.cc:1:8",
"uses": ["tests/vars/function_local.cc:4:8"]
}], }],
"functions": [{ "functions": [{
"id": 0, "id": 0,
"usr": "c:@F@foo#", "usr": "c:@F@foo#",
"short_name": "foo", "short_name": "foo",
"qualified_name": "foo", "qualified_name": "foo",
"definition": "tests/vars/function_local.cc:1:6" "definition": "tests/vars/function_local.cc:3:6"
}], }],
"variables": [{ "variables": [{
"id": 0, "id": 0,
"usr": "c:function_local.cc@16@F@foo#@a", "usr": "c:function_local.cc@31@F@foo#@a",
"short_name": "a", "short_name": "a",
"qualified_name": "a", "qualified_name": "a",
"declaration": "tests/vars/function_local.cc:2:7", "declaration": "tests/vars/function_local.cc:4:8",
"initializations": ["tests/vars/function_local.cc:2:7"], "initializations": ["tests/vars/function_local.cc:4:8"],
"variable_type": 0 "variable_type": 0
}] }]
} }

View File

@ -1,32 +1,39 @@
void foo(int p0, int p1) {} struct Foo;
void foo(Foo* p0, Foo* p1) {}
/* /*
OUTPUT: OUTPUT:
{ {
"types": [{ "types": [{
"id": 0 "id": 0,
"usr": "c:@S@Foo",
"short_name": "Foo",
"qualified_name": "Foo",
"declaration": "tests/vars/function_param.cc:1:8",
"uses": ["tests/vars/function_param.cc:3:15", "tests/vars/function_param.cc:3:24"]
}], }],
"functions": [{ "functions": [{
"id": 0, "id": 0,
"usr": "c:@F@foo#I#I#", "usr": "c:@F@foo#*$@S@Foo#S0_#",
"short_name": "foo", "short_name": "foo",
"qualified_name": "foo", "qualified_name": "foo",
"definition": "tests/vars/function_param.cc:1:6" "definition": "tests/vars/function_param.cc:3:6"
}], }],
"variables": [{ "variables": [{
"id": 0, "id": 0,
"usr": "c:function_param.cc@9@F@foo#I#I#@p0", "usr": "c:function_param.cc@24@F@foo#*$@S@Foo#S0_#@p0",
"short_name": "p0", "short_name": "p0",
"qualified_name": "p0", "qualified_name": "p0",
"declaration": "tests/vars/function_param.cc:1:14", "declaration": "tests/vars/function_param.cc:3:15",
"initializations": ["tests/vars/function_param.cc:1:14"], "initializations": ["tests/vars/function_param.cc:3:15"],
"variable_type": 0 "variable_type": 0
}, { }, {
"id": 1, "id": 1,
"usr": "c:function_param.cc@17@F@foo#I#I#@p1", "usr": "c:function_param.cc@33@F@foo#*$@S@Foo#S0_#@p1",
"short_name": "p1", "short_name": "p1",
"qualified_name": "p1", "qualified_name": "p1",
"declaration": "tests/vars/function_param.cc:1:22", "declaration": "tests/vars/function_param.cc:3:24",
"initializations": ["tests/vars/function_param.cc:1:22"], "initializations": ["tests/vars/function_param.cc:3:24"],
"variable_type": 0 "variable_type": 0
}] }]
} }

View File

@ -7,9 +7,7 @@ void foo(int, int) {}
OUTPUT: OUTPUT:
{ {
"types": [{ "types": [],
"id": 0
}],
"functions": [{ "functions": [{
"id": 0, "id": 0,
"usr": "c:@F@foo#I#I#", "usr": "c:@F@foo#I#I#",
@ -20,8 +18,7 @@ OUTPUT:
"variables": [{ "variables": [{
"id": 0, "id": 0,
"declaration": "tests/vars/function_param_unnamed.cc:1:13", "declaration": "tests/vars/function_param_unnamed.cc:1:13",
"initializations": ["tests/vars/function_param_unnamed.cc:1:13", "tests/vars/function_param_unnamed.cc:1:18"], "initializations": ["tests/vars/function_param_unnamed.cc:1:13", "tests/vars/function_param_unnamed.cc:1:18"]
"variable_type": 0
}] }]
} }
*/ */

View File

@ -1,15 +1,16 @@
void foo() { void foo() {
int a; int a;
a = 1;
{ {
int a; int a;
a = 2;
} }
a = 3;
} }
/* /*
OUTPUT: OUTPUT:
{ {
"types": [{ "types": [],
"id": 0
}],
"functions": [{ "functions": [{
"id": 0, "id": 0,
"usr": "c:@F@foo#", "usr": "c:@F@foo#",
@ -24,15 +25,15 @@ OUTPUT:
"qualified_name": "a", "qualified_name": "a",
"declaration": "tests/vars/function_shadow_local.cc:2:7", "declaration": "tests/vars/function_shadow_local.cc:2:7",
"initializations": ["tests/vars/function_shadow_local.cc:2:7"], "initializations": ["tests/vars/function_shadow_local.cc:2:7"],
"variable_type": 0 "uses": ["tests/vars/function_shadow_local.cc:3:3", "tests/vars/function_shadow_local.cc:8:3"]
}, { }, {
"id": 1, "id": 1,
"usr": "c:function_shadow_local.cc@33@F@foo#@a", "usr": "c:function_shadow_local.cc@43@F@foo#@a",
"short_name": "a", "short_name": "a",
"qualified_name": "a", "qualified_name": "a",
"declaration": "tests/vars/function_shadow_local.cc:4:9", "declaration": "tests/vars/function_shadow_local.cc:5:9",
"initializations": ["tests/vars/function_shadow_local.cc:4:9"], "initializations": ["tests/vars/function_shadow_local.cc:5:9"],
"variable_type": 0 "uses": ["tests/vars/function_shadow_local.cc:6:5"]
}] }]
} }
*/ */

View File

@ -4,9 +4,7 @@ void foo(int p) {
/* /*
OUTPUT: OUTPUT:
{ {
"types": [{ "types": [],
"id": 0
}],
"functions": [{ "functions": [{
"id": 0, "id": 0,
"usr": "c:@F@foo#I#", "usr": "c:@F@foo#I#",
@ -20,16 +18,14 @@ OUTPUT:
"short_name": "p", "short_name": "p",
"qualified_name": "p", "qualified_name": "p",
"declaration": "tests/vars/function_shadow_param.cc:1:14", "declaration": "tests/vars/function_shadow_param.cc:1:14",
"initializations": ["tests/vars/function_shadow_param.cc:1:14"], "initializations": ["tests/vars/function_shadow_param.cc:1:14"]
"variable_type": 0
}, { }, {
"id": 1, "id": 1,
"usr": "c:function_shadow_param.cc@21@F@foo#I#@p", "usr": "c:function_shadow_param.cc@21@F@foo#I#@p",
"short_name": "p", "short_name": "p",
"qualified_name": "p", "qualified_name": "p",
"declaration": "tests/vars/function_shadow_param.cc:2:7", "declaration": "tests/vars/function_shadow_param.cc:2:7",
"initializations": ["tests/vars/function_shadow_param.cc:2:7"], "initializations": ["tests/vars/function_shadow_param.cc:2:7"]
"variable_type": 0
}] }]
} }
*/ */

View File

@ -2,9 +2,7 @@ static int global = 0;
/* /*
OUTPUT: OUTPUT:
{ {
"types": [{ "types": [],
"id": 0
}],
"functions": [], "functions": [],
"variables": [{ "variables": [{
"id": 0, "id": 0,
@ -12,8 +10,7 @@ OUTPUT:
"short_name": "global", "short_name": "global",
"qualified_name": "global", "qualified_name": "global",
"declaration": "tests/vars/global_variable.cc:1:12", "declaration": "tests/vars/global_variable.cc:1:12",
"initializations": ["tests/vars/global_variable.cc:1:12"], "initializations": ["tests/vars/global_variable.cc:1:12"]
"variable_type": 0
}] }]
} }
*/ */