diff --git a/src/lib_gui/qt/window/QtProjectSetupScreen.cpp b/src/lib_gui/qt/window/QtProjectSetupScreen.cpp index 7ee29463..8bb5148e 100644 --- a/src/lib_gui/qt/window/QtProjectSetupScreen.cpp +++ b/src/lib_gui/qt/window/QtProjectSetupScreen.cpp @@ -116,10 +116,10 @@ void QtProjectSetupScreen::loadProjectSettings() { m_cppStandard->setCurrentText(QString::fromStdString(projSettings->getStandard())); } - //else if (m_language->currentIndex() == 1) // c - //{ - // m_cStandard->setCurrentText(QString::fromStdString(projSettings->getStandard())); - //} + else if (m_language->currentIndex() == 1) // c + { + m_cStandard->setCurrentText(QString::fromStdString(projSettings->getStandard())); + } } m_sourcePaths->setList(projSettings->getSourcePaths()); @@ -150,7 +150,7 @@ void QtProjectSetupScreen::populateForm(QFormLayout* layout) QLabel* languageLabel = new QLabel("Language"); m_language = new QComboBox(); m_language->insertItem(0, "C++"); - // m_language->insertItem(1, "C"); + m_language->insertItem(1, "C"); connect(m_language, SIGNAL(currentIndexChanged(int)), this, SLOT(handleSelectionChanged(int))); layout->addRow(languageLabel, m_language); @@ -167,7 +167,7 @@ void QtProjectSetupScreen::populateForm(QFormLayout* layout) layout->addRow(m_cppStandardLabel, m_cppStandard); - /*m_cStandardLabel = new QLabel("Standard"); + m_cStandardLabel = new QLabel("Standard"); m_cStandard = new QComboBox(); m_cStandard->insertItem(0, "89"); @@ -178,7 +178,7 @@ void QtProjectSetupScreen::populateForm(QFormLayout* layout) m_cStandard->insertItem(5, "1x"); layout->addRow(m_cStandardLabel, m_cStandard); m_cStandardLabel->hide(); - m_cStandard->hide();*/ + m_cStandard->hide(); QPushButton* helpButton; @@ -244,10 +244,10 @@ void QtProjectSetupScreen::handleUpdateButtonPress() { projSettings->setStandard(m_cppStandard->currentText().toStdString()); } - /*else if (m_cStandard->isVisible()) + else if (m_cStandard->isVisible()) { projSettings->setStandard(m_cStandard->currentText().toStdString()); - }*/ + } projSettings->setSourcePaths(m_sourcePaths->getList()); projSettings->setHeaderSearchPaths(m_includePaths->getList()); @@ -266,10 +266,10 @@ void QtProjectSetupScreen::handleUpdateButtonPress() { projSettings->setStandard(m_cppStandard->currentText().toStdString()); } - /*else if (m_cStandard->isVisible()) + else if (m_cStandard->isVisible()) { projSettings->setStandard(m_cStandard->currentText().toStdString()); - }*/ + } MessageLoadProject(projectFile).dispatch(); clear(); @@ -310,7 +310,7 @@ void QtProjectSetupScreen::handlePreferencesButtonPress() void QtProjectSetupScreen::handleSelectionChanged(int index) { - /*if (index != 0) + if (index != 0) { m_cStandardLabel->show(); m_cStandard->show(); @@ -323,5 +323,5 @@ void QtProjectSetupScreen::handleSelectionChanged(int index) m_cppStandard->show(); m_cStandardLabel->hide(); m_cStandard->hide(); - }*/ + } } diff --git a/src/lib_parser/data/parser/cxx/ASTVisitor.cpp b/src/lib_parser/data/parser/cxx/ASTVisitor.cpp index b31c3593..a47d9b58 100644 --- a/src/lib_parser/data/parser/cxx/ASTVisitor.cpp +++ b/src/lib_parser/data/parser/cxx/ASTVisitor.cpp @@ -50,7 +50,7 @@ bool ASTVisitor::VisitTypedefDecl(clang::TypedefDecl* declaration) return true; } -bool ASTVisitor::VisitCXXRecordDecl(clang::CXXRecordDecl* declaration) +bool ASTVisitor::VisitRecordDecl(clang::RecordDecl* declaration) { if (isLocatedInUnparsedProjectFile(declaration)) { @@ -74,18 +74,21 @@ bool ASTVisitor::VisitCXXRecordDecl(clang::CXXRecordDecl* declaration) } if ((declaration->isClass() || declaration->isStruct()) && - declaration->hasDefinition() && declaration->getDefinition() == declaration && declaration->getNumBases()) + declaration->isThisDeclarationADefinition()) { - for (const clang::CXXBaseSpecifier& it : declaration->bases()) + if (clang::CXXRecordDecl* cxxDecl = clang::dyn_cast_or_null(declaration)) { - m_client->onInheritanceParsed( - getParseLocation(it.getSourceRange()), - utility::getDeclNameHierarchy(declaration), - utility::qualTypeToDataType(it.getType())->getTypeNameHierarchy(), - convertAccessType(it.getAccessSpecifier()) - ); + for (const clang::CXXBaseSpecifier& it : cxxDecl->bases()) + { + m_client->onInheritanceParsed( + getParseLocation(it.getSourceRange()), + utility::getDeclNameHierarchy(declaration), + utility::qualTypeToDataType(it.getType())->getTypeNameHierarchy(), + convertAccessType(it.getAccessSpecifier()) + ); - // TODO: check for template class and add arguments! + // TODO: check for template class and add arguments! + } } } } @@ -1004,17 +1007,21 @@ ParseLocation ASTVisitor::getParseLocationOfFunctionBody(const clang::FunctionDe return ParseLocation(); } -ParseLocation ASTVisitor::getParseLocationOfRecordBody(clang::CXXRecordDecl* decl) const +ParseLocation ASTVisitor::getParseLocationOfRecordBody(clang::RecordDecl* decl) const { - if (decl->hasDefinition() && decl->isThisDeclarationADefinition()) + + if (decl->isThisDeclarationADefinition()) { clang::SourceRange range; - clang::ClassTemplateDecl* templateDecl = decl->getDescribedClassTemplate(); - if (templateDecl) + if (clang::CXXRecordDecl* cxxDecl = clang::dyn_cast_or_null(decl)) { - range = templateDecl->getSourceRange(); + clang::ClassTemplateDecl* templateDecl = cxxDecl->getDescribedClassTemplate(); + if (templateDecl) + { + range = templateDecl->getSourceRange(); + } } - else + if (range.isInvalid()) { range = decl->getDefinition()->getSourceRange(); } diff --git a/src/lib_parser/data/parser/cxx/ASTVisitor.h b/src/lib_parser/data/parser/cxx/ASTVisitor.h index a4f9a322..f0578cec 100644 --- a/src/lib_parser/data/parser/cxx/ASTVisitor.h +++ b/src/lib_parser/data/parser/cxx/ASTVisitor.h @@ -28,7 +28,7 @@ public: virtual bool VisitStmt(const clang::Stmt* statement); // avoid visiting virtual bool VisitTypedefDecl(clang::TypedefDecl* declaration); // typedefs - virtual bool VisitCXXRecordDecl(clang::CXXRecordDecl* declaration); // structs, classes and inheritance + virtual bool VisitRecordDecl(clang::RecordDecl* declaration); virtual bool VisitVarDecl(clang::VarDecl* declaration); // global variables and static fields virtual bool VisitFieldDecl(clang::FieldDecl* declaration); // fields virtual bool VisitFunctionDecl(clang::FunctionDecl* declaration); // functions @@ -86,7 +86,7 @@ private: ParseLocation getParseLocationForTokensInRange(const clang::SourceRange& range) const; ParseLocation getParseLocationForNamedDecl(const clang::NamedDecl* decl) const; ParseLocation getParseLocationOfFunctionBody(const clang::FunctionDecl* decl) const; - ParseLocation getParseLocationOfRecordBody(clang::CXXRecordDecl* decl) const; + ParseLocation getParseLocationOfRecordBody(clang::RecordDecl* decl) const; ParseTypeUsage getParseTypeUsage(const clang::TypeLoc& typeLoc, const clang::QualType& type) const; ParseTypeUsage getParseTypeUsage(const clang::TypeLoc& typeLoc, const std::shared_ptr type) const; diff --git a/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp b/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp index 78e838ab..6ac4a182 100644 --- a/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp +++ b/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp @@ -210,6 +210,7 @@ std::shared_ptr CxxDeclNameResolver::getDeclName() } CxxTypeNameResolver typenNameResolver(getIgnoredContextDecls()); + typenNameResolver.ignoreContextDecl(functionDecl); std::string returnTypeString = typenNameResolver.qualTypeToDataType(functionDecl->getReturnType())->getFullTypeName(); std::string parameterString = "(";