data: Macro handling
Macros have now edges from Files where they are usesd
This commit is contained in:
+1
-54
@@ -338,58 +338,5 @@ endif ()
|
||||
|
||||
# Linux package
|
||||
if(UNIX AND NOT APPLE)
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_SOURCE_DIR}/setup/Linux/findAndCopyLibraries.sh
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
)
|
||||
|
||||
INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/bin/app/data
|
||||
DESTINATION share/coati/.config/coati
|
||||
PATTERN "log/*" EXCLUDE
|
||||
PATTERN "projects/*" EXCLUDE
|
||||
)
|
||||
INSTALL(FILES ${CMAKE_SOURCE_DIR}/setup/Linux/coati.desktop
|
||||
DESTINATION share/applications
|
||||
)
|
||||
INSTALL(FILES ${CMAKE_SOURCE_DIR}/bin/app/data/gui/icon/logo_1024_1024.png
|
||||
DESTINATION share/icons
|
||||
RENAME coati.png)
|
||||
INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/setup/Linux/lib
|
||||
DESTINATION share/coati
|
||||
)
|
||||
INSTALL(FILES
|
||||
${CMAKE_SOURCE_DIR}/setup/Linux/libqxcb.so
|
||||
DESTINATION share/coati/platforms
|
||||
)
|
||||
INSTALL(PROGRAMS
|
||||
${CMAKE_SOURCE_DIR}/setup/Linux/Coati.sh
|
||||
DESTINATION share/coati
|
||||
)
|
||||
INSTALL(PROGRAMS ${CMAKE_SOURCE_DIR}/setup/Linux/coati
|
||||
DESTINATION bin/
|
||||
)
|
||||
# add the automatically determined parts of the RPATH
|
||||
# which point to directories outside the build tree to the install RPATH
|
||||
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||
|
||||
INSTALL(TARGETS ${APP_PROJECT_NAME}
|
||||
DESTINATION share/coati
|
||||
)
|
||||
|
||||
SET(CPACK_GENERATOR "DEB;TGZ")
|
||||
SET(CPACK_ARCHIVE_COMPONENT_INSTALL "ON")
|
||||
|
||||
# DEBIAN PACKAGE
|
||||
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Andreas Stallinger <astallinger@coati.io>")
|
||||
SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
|
||||
SET(CPACK_PACKAGE_NAME "Coati")
|
||||
SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "http://coati.io")
|
||||
SET(CPACK_DEBIAN_PACKAGE_SECTION "devel")
|
||||
SET(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local")
|
||||
SET(CPACK_PACKAGE_VERSION ${GIT_VERSION_NUMBER})
|
||||
SET(CPACK_PACKAGE_EXECUTABLES "Coati")
|
||||
SET(CPACK_STRIP_FILES "share/coati/Coati")
|
||||
|
||||
INCLUDE(CPack)
|
||||
|
||||
include(cmake/LinuxPackage.cmake)
|
||||
endif ()
|
||||
|
||||
@@ -179,6 +179,10 @@
|
||||
<normal>#DDD</normal>
|
||||
<hover>#CCC</hover>
|
||||
</file>
|
||||
<macro>
|
||||
<normal>#DDD</normal>
|
||||
<hover>#CCC</hover>
|
||||
</macro>
|
||||
</node>
|
||||
<edge>
|
||||
<type_of>
|
||||
@@ -247,6 +251,10 @@
|
||||
<normal>#EEE</normal>
|
||||
<hover>#DDD</hover>
|
||||
</aggregation>
|
||||
<macro_use>
|
||||
<normal>#878787</normal>
|
||||
<hover>#878787</hover>
|
||||
</macro_use>
|
||||
</edge>
|
||||
</graph>
|
||||
|
||||
|
||||
@@ -179,6 +179,10 @@
|
||||
<normal>#1B564E</normal>
|
||||
<hover>#247368</hover>
|
||||
</file>
|
||||
<macro>
|
||||
<normal>#1B564E</normal>
|
||||
<hover>#247368</hover>
|
||||
</macro>
|
||||
</node>
|
||||
<edge>
|
||||
<type_of>
|
||||
@@ -247,6 +251,10 @@
|
||||
<normal>#5D5D5D</normal>
|
||||
<hover>#6D6D6D</hover>
|
||||
</aggregation>
|
||||
<macro_use>
|
||||
<normal>#247368</normal>
|
||||
<hover>#247368</hover>
|
||||
</macro_use>
|
||||
</edge>
|
||||
</graph>
|
||||
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
# execute_process(
|
||||
# COMMAND ${CMAKE_SOURCE_DIR}/setup/Linux/findAndCopyLibraries.sh
|
||||
# WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
# )
|
||||
|
||||
INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/bin/app/data
|
||||
DESTINATION share/coati/.config/coati
|
||||
PATTERN "log/*" EXCLUDE
|
||||
PATTERN "projects/*" EXCLUDE
|
||||
)
|
||||
INSTALL(FILES ${CMAKE_SOURCE_DIR}/setup/Linux/coati.desktop
|
||||
DESTINATION share/applications
|
||||
)
|
||||
INSTALL(FILES ${CMAKE_SOURCE_DIR}/bin/app/data/gui/icon/logo_1024_1024.png
|
||||
DESTINATION share/icons
|
||||
RENAME coati.png)
|
||||
INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/setup/Linux/lib
|
||||
DESTINATION share/coati
|
||||
)
|
||||
INSTALL(FILES
|
||||
${CMAKE_SOURCE_DIR}/setup/Linux/libqxcb.so
|
||||
DESTINATION share/coati/platforms
|
||||
)
|
||||
INSTALL(PROGRAMS
|
||||
${CMAKE_SOURCE_DIR}/setup/Linux/Coati.sh
|
||||
DESTINATION share/coati
|
||||
)
|
||||
INSTALL(PROGRAMS ${CMAKE_SOURCE_DIR}/setup/Linux/coati
|
||||
DESTINATION bin/
|
||||
)
|
||||
# add the automatically determined parts of the RPATH
|
||||
# which point to directories outside the build tree to the install RPATH
|
||||
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||
|
||||
INSTALL(TARGETS ${APP_PROJECT_NAME}
|
||||
DESTINATION share/coati
|
||||
)
|
||||
|
||||
SET(CPACK_GENERATOR "DEB;TGZ")
|
||||
SET(CPACK_ARCHIVE_COMPONENT_INSTALL "ON")
|
||||
|
||||
# DEBIAN PACKAGE
|
||||
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Andreas Stallinger <astallinger@coati.io>")
|
||||
SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
|
||||
SET(CPACK_PACKAGE_NAME "Coati")
|
||||
SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "http://coati.io")
|
||||
SET(CPACK_DEBIAN_PACKAGE_SECTION "devel")
|
||||
SET(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local")
|
||||
SET(CPACK_PACKAGE_VERSION ${GIT_VERSION_NUMBER})
|
||||
SET(CPACK_PACKAGE_EXECUTABLES "Coati")
|
||||
SET(CPACK_STRIP_FILES "share/coati/Coati")
|
||||
|
||||
INCLUDE(CPack)
|
||||
@@ -169,6 +169,7 @@ Parser::Arguments Project::getParserArguments() const
|
||||
// utility::append(args.systemHeaderSearchPaths, headerSearchSubPaths);
|
||||
|
||||
utility::append(args.systemHeaderSearchPaths, projSettings->getHeaderSearchPaths());
|
||||
|
||||
utility::append(args.systemHeaderSearchPaths, appSettings->getHeaderSearchPaths());
|
||||
|
||||
utility::append(args.frameworkSearchPaths, projSettings->getFrameworkSearchPaths());
|
||||
|
||||
@@ -111,6 +111,7 @@ size_t GraphViewStyle::getFontSizeForNodeType(Node::NodeType type)
|
||||
case Node::NODE_TYPEDEF:
|
||||
case Node::NODE_TEMPLATE_PARAMETER_TYPE:
|
||||
case Node::NODE_FILE:
|
||||
case Node::NODE_MACRO:
|
||||
return s_fontSize;
|
||||
|
||||
case Node::NODE_UNDEFINED_FUNCTION:
|
||||
@@ -197,6 +198,7 @@ GraphViewStyle::NodeMargins GraphViewStyle::getMarginsForNodeType(Node::NodeType
|
||||
case Node::NODE_GLOBAL_VARIABLE:
|
||||
case Node::NODE_FIELD:
|
||||
case Node::NODE_ENUM_CONSTANT:
|
||||
case Node::NODE_MACRO:
|
||||
margins.left = margins.right = 5;
|
||||
margins.top = margins.bottom = 3;
|
||||
break;
|
||||
@@ -352,6 +354,7 @@ GraphViewStyle::NodeStyle GraphViewStyle::getStyleForNodeType(
|
||||
case Node::NODE_GLOBAL_VARIABLE:
|
||||
case Node::NODE_FIELD:
|
||||
case Node::NODE_ENUM_CONSTANT:
|
||||
case Node::NODE_MACRO:
|
||||
if (isActive || isFocused)
|
||||
{
|
||||
style.fontBold = true;
|
||||
|
||||
@@ -664,6 +664,42 @@ Id Storage::onFileIncludeParsed(const ParseLocation& location, const FileInfo& f
|
||||
return fileNodeId;
|
||||
}
|
||||
|
||||
Id Storage::onMacroDefineParsed(const ParseLocation &location, const NameHierarchy& macroNameHierarchy) {
|
||||
|
||||
Id macroId = 0;
|
||||
|
||||
Id fileId = m_sqliteStorage.getFileByName(location.filePath.fileName()).id;
|
||||
if(fileId != 0)
|
||||
{
|
||||
macroId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy);
|
||||
addSourceLocation(macroId, location);
|
||||
}
|
||||
else
|
||||
{
|
||||
//TODO: What to do with this ones?
|
||||
//LOG_ERROR("External MacroDefined :" + macroNameHierarchy.getFullName());
|
||||
}
|
||||
|
||||
return macroId;
|
||||
}
|
||||
|
||||
Id Storage::onMacroExpandParsed(const ParseLocation &location, const NameHierarchy& macroNameHierarchy) {
|
||||
Id macroExpandId = addNodeHierarchy(Node::NODE_UNDEFINED, macroNameHierarchy);
|
||||
Id fileId = m_sqliteStorage.getFileByName(location.filePath.fileName()).id;
|
||||
|
||||
if(fileId != 0)
|
||||
{
|
||||
addEdge(fileId, macroExpandId,Edge::EDGE_MACRO_USAGE, location);
|
||||
}
|
||||
else
|
||||
{
|
||||
//TODO: What to do with this ones?
|
||||
//LOG_ERROR("External MacroExpand :" + macroNameHierarchy.getFullName());
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Id Storage::getIdForNodeWithName(const std::string& fullName) const // use name hierarchy here
|
||||
{
|
||||
std::vector<std::string> nameParts = utility::splitToVector(fullName, "::");
|
||||
|
||||
@@ -119,6 +119,9 @@ public:
|
||||
virtual Id onFileIncludeParsed(
|
||||
const ParseLocation& location, const FileInfo& fileInfo, const FileInfo& includedFileInfo);
|
||||
|
||||
virtual Id onMacroDefineParsed(const ParseLocation& location, const NameHierarchy& macroNameHierarchy);
|
||||
virtual Id onMacroExpandParsed(const ParseLocation& location, const NameHierarchy& macroNameHierarchy);
|
||||
|
||||
// StorageAccess implementation
|
||||
virtual Id getIdForNodeWithName(const std::string& fullName) const;
|
||||
virtual Id getIdForEdgeWithName(const std::string& name) const;
|
||||
|
||||
@@ -49,6 +49,8 @@ Edge::EdgeType Edge::intToType(int value)
|
||||
return EDGE_INCLUDE;
|
||||
case 0x8000:
|
||||
return EDGE_AGGREGATION;
|
||||
case 0x10000:
|
||||
return EDGE_MACRO_USAGE;
|
||||
}
|
||||
|
||||
return EDGE_NONE;
|
||||
@@ -214,7 +216,10 @@ std::string Edge::getTypeString(EdgeType type)
|
||||
return "include";
|
||||
case EDGE_AGGREGATION:
|
||||
return "aggregation";
|
||||
case EDGE_MACRO_USAGE:
|
||||
return "macro_use";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
@@ -358,6 +363,12 @@ bool Edge::checkType() const
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
case EDGE_MACRO_USAGE:
|
||||
if(!m_to->isType(Node::NODE_MACRO) || !m_from->isType(Node::NODE_FILE))
|
||||
{
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
LOG_ERROR_STREAM(
|
||||
|
||||
@@ -36,7 +36,8 @@ public:
|
||||
|
||||
EDGE_INCLUDE = 0x4000,
|
||||
|
||||
EDGE_AGGREGATION = 0x8000
|
||||
EDGE_AGGREGATION = 0x8000,
|
||||
EDGE_MACRO_USAGE = 0x10000,
|
||||
};
|
||||
|
||||
static int typeToInt(EdgeType type);
|
||||
|
||||
@@ -47,7 +47,10 @@ std::string Node::getTypeString(NodeType type)
|
||||
return "template_parameter_type";
|
||||
case NODE_FILE:
|
||||
return "file";
|
||||
case NODE_MACRO:
|
||||
return "macro";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
@@ -92,7 +95,10 @@ Node::NodeType Node::intToType(int value)
|
||||
return NODE_TEMPLATE_PARAMETER_TYPE;
|
||||
case 0x8000:
|
||||
return NODE_FILE;
|
||||
case 0x10000:
|
||||
return NODE_MACRO;
|
||||
}
|
||||
|
||||
return NODE_UNDEFINED;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,8 @@ public:
|
||||
NODE_TYPEDEF = 0x2000,
|
||||
NODE_TEMPLATE_PARAMETER_TYPE = 0x4000,
|
||||
|
||||
NODE_FILE = 0x8000
|
||||
NODE_FILE = 0x8000,
|
||||
NODE_MACRO = 0x10000,
|
||||
};
|
||||
|
||||
static std::string getTypeString(NodeType type);
|
||||
|
||||
@@ -6,8 +6,12 @@
|
||||
|
||||
#include "utility/types.h"
|
||||
#include "data/name/NameHierarchy.h"
|
||||
|
||||
#include "utility/file/FileInfo.h"
|
||||
|
||||
#include "ParseLocation.h"
|
||||
|
||||
|
||||
struct ParseFunction;
|
||||
struct ParseLocation;
|
||||
struct ParseTypeUsage;
|
||||
@@ -132,6 +136,11 @@ public:
|
||||
virtual Id onFileParsed(const FileInfo& fileInfo) = 0;
|
||||
virtual Id onFileIncludeParsed(
|
||||
const ParseLocation& location, const FileInfo& fileInfo, const FileInfo& includedFileInfo) = 0;
|
||||
|
||||
|
||||
virtual Id onMacroDefineParsed(const ParseLocation& location, const NameHierarchy& macroNameHierarchy) = 0;
|
||||
virtual Id onMacroExpandParsed(
|
||||
const ParseLocation& location, const NameHierarchy& macroNameHierarchy) = 0;
|
||||
};
|
||||
|
||||
#endif // PARSER_CLIENT_H
|
||||
|
||||
@@ -18,11 +18,11 @@ public:
|
||||
virtual ~ASTVisitor();
|
||||
|
||||
// Left for debugging purposes. Uncomment to see a colored ast-dump of the parsed file.
|
||||
// virtual bool VisitTranslationUnitDecl(clang::TranslationUnitDecl* decl)
|
||||
// {
|
||||
// decl->dump();
|
||||
// return true;
|
||||
// }
|
||||
// virtual bool VisitTranslationUnitDecl(clang::TranslationUnitDecl* decl)
|
||||
// {
|
||||
// decl->dump();
|
||||
// return true;
|
||||
// }
|
||||
|
||||
// RecursiveASTVisitor implementation
|
||||
virtual bool VisitStmt(const clang::Stmt* statement); // avoid visiting
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
#include "data/parser/cxx/PreprocessorCallbacks.h"
|
||||
|
||||
|
||||
#include "clang/Driver/Util.h"
|
||||
#include "clang/Basic/IdentifierTable.h"
|
||||
#include "clang/Lex/MacroArgs.h"
|
||||
|
||||
#include "utility/file/FileManager.h"
|
||||
#include "utility/file/FileRegister.h"
|
||||
|
||||
@@ -62,6 +67,56 @@ void PreprocessorCallbacks::InclusionDirective(
|
||||
}
|
||||
}
|
||||
|
||||
void PreprocessorCallbacks::MacroDefined( const clang::Token &MacroNameTok, const clang::MacroDirective *MD)
|
||||
{
|
||||
// ignore builtin macros
|
||||
if(m_sourceManager.getSpellingLoc(MacroNameTok.getLocation()).printToString(m_sourceManager)[0] == '<')
|
||||
{
|
||||
return;
|
||||
}
|
||||
m_sourceManager.getSpellingLoc(MacroNameTok.getLocation()).dump(m_sourceManager);
|
||||
|
||||
NameHierarchy nameHierarchy;
|
||||
nameHierarchy.push(std::make_shared<NameElement>(MacroNameTok.getIdentifierInfo()->getName().str()));
|
||||
m_client->onMacroDefineParsed( getParseLocation(MacroNameTok), nameHierarchy);
|
||||
}
|
||||
|
||||
void PreprocessorCallbacks::MacroExpands(
|
||||
const clang::Token &MacroNameTok, const clang::MacroDefinition &MD,
|
||||
clang::SourceRange Range, const clang::MacroArgs *Args
|
||||
){
|
||||
NameHierarchy nameHierarchy;
|
||||
nameHierarchy.push(std::make_shared<NameElement>(MacroNameTok.getIdentifierInfo()->getName().str()));
|
||||
|
||||
m_client->onMacroExpandParsed( getParseLocation(MacroNameTok), nameHierarchy);
|
||||
}
|
||||
|
||||
ParseLocation PreprocessorCallbacks::getParseLocation(const clang::Token &MacroNameTok) const
|
||||
{
|
||||
clang::SourceLocation location = MacroNameTok.getLocation();
|
||||
return ParseLocation(
|
||||
m_sourceManager.getFilename(location),
|
||||
m_sourceManager.getSpellingLineNumber(location),
|
||||
m_sourceManager.getSpellingColumnNumber(location),
|
||||
m_sourceManager.getSpellingLineNumber(MacroNameTok.getEndLoc()),
|
||||
m_sourceManager.getSpellingColumnNumber(MacroNameTok.getEndLoc()) - 1
|
||||
);
|
||||
}
|
||||
|
||||
ParseLocation PreprocessorCallbacks::getParseLocation(clang::MacroInfo *macroInfo) const
|
||||
{
|
||||
clang::SourceLocation location = macroInfo->getDefinitionLoc();
|
||||
clang::SourceLocation endLocation = macroInfo->getDefinitionEndLoc();
|
||||
|
||||
return ParseLocation(
|
||||
m_sourceManager.getFilename(location),
|
||||
m_sourceManager.getSpellingLineNumber(location),
|
||||
m_sourceManager.getSpellingColumnNumber(location),
|
||||
m_sourceManager.getSpellingLineNumber(endLocation),
|
||||
m_sourceManager.getSpellingColumnNumber(endLocation) - 1
|
||||
);
|
||||
}
|
||||
|
||||
ParseLocation PreprocessorCallbacks::getParseLocation(const clang::SourceRange& sourceRange) const
|
||||
{
|
||||
if (sourceRange.isInvalid())
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
#define PREPROCESSOR_CALLBACKS_H
|
||||
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
#include "clang/Lex/MacroInfo.h"
|
||||
#include "clang/Lex/PPCallbacks.h"
|
||||
#include "clang/Lex/Token.h"
|
||||
|
||||
class FileRegister;
|
||||
class ParserClient;
|
||||
@@ -22,8 +24,17 @@ public:
|
||||
clang::CharSourceRange fileNameRange, const clang::FileEntry* fileEntry, llvm::StringRef searchPath,
|
||||
llvm::StringRef relativePath, const clang::Module* imported);
|
||||
|
||||
virtual void MacroDefined(const clang::Token &MacroNameTok, const clang::MacroDirective *MD );
|
||||
|
||||
virtual void MacroExpands(
|
||||
const clang::Token &MacroNameTok, const clang::MacroDefinition &MD,
|
||||
clang::SourceRange Range, const clang::MacroArgs *Args
|
||||
);
|
||||
|
||||
private:
|
||||
ParseLocation getParseLocation(const clang::SourceRange& sourceRange) const;
|
||||
ParseLocation getParseLocation(const clang::Token& MacroNameToc) const;
|
||||
ParseLocation getParseLocation(clang::MacroInfo *MacroNameToc) const;
|
||||
|
||||
const clang::SourceManager& m_sourceManager;
|
||||
ParserClient* m_client;
|
||||
|
||||
@@ -63,6 +63,7 @@ FileInfo FileSystem::getFileInfoForPath(FilePath filePath)
|
||||
return FileInfo();
|
||||
}
|
||||
|
||||
|
||||
std::vector<FileInfo> FileSystem::getFileInfosFromPaths(
|
||||
const std::vector<FilePath>& paths, const std::vector<std::string>& fileExtensions
|
||||
){
|
||||
|
||||
@@ -20,6 +20,7 @@ public:
|
||||
const std::vector<FilePath>& paths, const std::vector<std::string>& fileExtensions);
|
||||
|
||||
static std::string getTimeStringNow();
|
||||
|
||||
static std::vector<FilePath> getSubDirectories(const FilePath& path);
|
||||
|
||||
static bool exists(const std::string& path);
|
||||
|
||||
@@ -1201,6 +1201,30 @@ public:
|
||||
TS_ASSERT_EQUALS(client->typeUses[3], "int main() -> A <9:16 9:16>");
|
||||
}
|
||||
|
||||
void test_cxx_parser_finds_macro_define()
|
||||
{
|
||||
std::shared_ptr<TestParserClient> client = parseCode(
|
||||
"#define PI\n"
|
||||
"void test()\n"
|
||||
"{\n"
|
||||
"};\n"
|
||||
);
|
||||
TS_ASSERT_EQUALS(client->macros.size(),1);
|
||||
TS_ASSERT_EQUALS(client->macros[0], "PI <1:9 1:10>");
|
||||
}
|
||||
|
||||
void test_cxx_parser_finds_macro_expand()
|
||||
{
|
||||
std::shared_ptr<TestParserClient> client = parseCode(
|
||||
"#define PI 3.14159265359\n"
|
||||
"void test()\n"
|
||||
"{\n"
|
||||
"double i = PI;"
|
||||
"};\n"
|
||||
);
|
||||
TS_ASSERT_EQUALS(client->macroUses.size(),1);
|
||||
TS_ASSERT_EQUALS(client->macroUses[0], "PI <4:12 4:13>");
|
||||
}
|
||||
|
||||
void test_cxx_parser_finds_type_template_parameter_type_of_template_class()
|
||||
{
|
||||
@@ -2380,19 +2404,21 @@ public:
|
||||
void test_cxx_parser_finds_template_template_default_argument_type_of_template_function()
|
||||
{
|
||||
std::shared_ptr<TestParserClient> client = parseCode(
|
||||
"template <typename T>\n"
|
||||
"class A\n"
|
||||
"{};\n"
|
||||
"template <template<typename> class T = A>\n"
|
||||
"void test()\n"
|
||||
"{\n"
|
||||
"};\n"
|
||||
"template <typename T>\n"
|
||||
"class A\n"
|
||||
"{};\n"
|
||||
"template <template<typename> class T = A>\n"
|
||||
"void test()\n"
|
||||
"{\n"
|
||||
"};\n"
|
||||
);
|
||||
|
||||
TS_ASSERT_EQUALS(client->templateDefaultArgumentTypes.size(), 1);
|
||||
TS_ASSERT_EQUALS(client->templateDefaultArgumentTypes[0], "A<typename T> -> test<template<typename> typename T>::T<typename> <4:40 4:40>");
|
||||
TS_ASSERT_EQUALS(client->templateDefaultArgumentTypes[0],
|
||||
"A<typename T> -> test<template<typename> typename T>::T<typename> <4:40 4:40>");
|
||||
}
|
||||
|
||||
|
||||
void test_cxx_parser_parses_multiple_files()
|
||||
{
|
||||
TestFileManager fm;
|
||||
@@ -2615,6 +2641,13 @@ private:
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual Id onFieldUsageParsed(
|
||||
const ParseLocation& location, const ParseVariable& user, const NameHierarchy& usedNameHierarchy)
|
||||
{
|
||||
usages.push_back(addLocationSuffix(variableStr(user) + " -> " + usedNameHierarchy.getFullName(), location));
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual Id onGlobalVariableUsageParsed(
|
||||
const ParseLocation& location, const ParseFunction& user, const NameHierarchy& usedNameHierarchy)
|
||||
{
|
||||
@@ -2727,6 +2760,19 @@ private:
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual Id onMacroDefineParsed(const ParseLocation& location, const NameHierarchy& macroNameHierarchy)
|
||||
{
|
||||
macros.push_back(addLocationSuffix(macroNameHierarchy.getFullName() ,location));
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual Id onMacroExpandParsed(const ParseLocation& location, const NameHierarchy& macroNameHierarchy)
|
||||
{
|
||||
macroUses.push_back(addLocationSuffix(macroNameHierarchy.getFullName() ,location));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
std::vector<std::string> errors;
|
||||
|
||||
std::vector<std::string> typedefs;
|
||||
@@ -2739,12 +2785,14 @@ private:
|
||||
std::vector<std::string> methods;
|
||||
std::vector<std::string> namespaces;
|
||||
std::vector<std::string> structs;
|
||||
std::vector<std::string> macros;
|
||||
|
||||
std::vector<std::string> inheritances;
|
||||
std::vector<std::string> overrides;
|
||||
std::vector<std::string> calls;
|
||||
std::vector<std::string> usages; // for variables
|
||||
std::vector<std::string> typeUses; // for types
|
||||
std::vector<std::string> macroUses;
|
||||
std::vector<std::string> templateParameterTypes;
|
||||
std::vector<std::string> templateArgumentTypes;
|
||||
std::vector<std::string> templateDefaultArgumentTypes;
|
||||
|
||||
Reference in New Issue
Block a user