summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Shambir <sergey.shambir.auto@gmail.com>2013-03-27 10:32:28 +0400
committerErik Verbruggen <erik.verbruggen@digia.com>2013-04-10 11:07:27 +0200
commit0609333e0287414a9007cbe71b0ab4b84ada20cb (patch)
tree01fd51755fb8a44e947371f210c28e2ce4d3644c /src
parentd61bc4fcec30c01586df9fc071e7b0dbf08da2b5 (diff)
downloadqt-creator-0609333e0287414a9007cbe71b0ab4b84ada20cb.tar.gz
CppTools: moved some logic to ProjectFile
Simplifies code and makes it independent from mimetype names. Change-Id: Ib56a07654df4986b1916c517e3862e6c3a3dd720 Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cpptools/builtinindexingsupport.cpp16
-rw-r--r--src/plugins/cpptools/cppcompletionassist.cpp3
-rw-r--r--src/plugins/cpptools/cppprojectfile.cpp52
-rw-r--r--src/plugins/cpptools/cppprojectfile.h5
-rw-r--r--src/plugins/cpptools/cpptoolsplugin.cpp87
-rw-r--r--src/plugins/cpptools/insertionpointlocator.cpp16
-rw-r--r--src/plugins/debugger/sourceutils.cpp11
7 files changed, 99 insertions, 91 deletions
diff --git a/src/plugins/cpptools/builtinindexingsupport.cpp b/src/plugins/cpptools/builtinindexingsupport.cpp
index c19aa6b910..3def71feeb 100644
--- a/src/plugins/cpptools/builtinindexingsupport.cpp
+++ b/src/plugins/cpptools/builtinindexingsupport.cpp
@@ -2,6 +2,8 @@
#include "cppmodelmanager.h"
#include "searchsymbols.h"
+#include "cpptoolsconstants.h"
+#include "cppprojectfile.h"
#include <coreplugin/icore.h>
#include <coreplugin/progressmanager/progressmanager.h>
@@ -22,24 +24,12 @@ static void parse(QFutureInterface<void> &future,
if (files.isEmpty())
return;
- const Core::MimeDatabase *mimeDb = Core::ICore::mimeDatabase();
- Core::MimeType cSourceTy = mimeDb->findByType(QLatin1String("text/x-csrc"));
- Core::MimeType cppSourceTy = mimeDb->findByType(QLatin1String("text/x-c++src"));
- Core::MimeType mSourceTy = mimeDb->findByType(QLatin1String("text/x-objcsrc"));
-
QStringList sources;
QStringList headers;
- QStringList suffixes = cSourceTy.suffixes();
- suffixes += cppSourceTy.suffixes();
- suffixes += mSourceTy.suffixes();
-
foreach (const QString &file, files) {
- QFileInfo info(file);
-
preproc->removeFromCache(file);
-
- if (suffixes.contains(info.suffix()))
+ if (ProjectFile::isSource(ProjectFile::classify(file)))
sources.append(file);
else
headers.append(file);
diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp
index 9a12884a72..6511b77545 100644
--- a/src/plugins/cpptools/cppcompletionassist.cpp
+++ b/src/plugins/cpptools/cppcompletionassist.cpp
@@ -1193,7 +1193,8 @@ bool CppCompletionAssistProcessor::objcKeywordsWanted() const
const QString fileName = m_interface->fileName();
const Core::MimeDatabase *mdb = Core::ICore::mimeDatabase();
- return mdb->findByFile(fileName).type() == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE);
+ const QString mt = mdb->findByFile(fileName).type();
+ return mt == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE);
}
int CppCompletionAssistProcessor::startCompletionInternal(const QString fileName,
diff --git a/src/plugins/cpptools/cppprojectfile.cpp b/src/plugins/cpptools/cppprojectfile.cpp
index 331b183c18..a7e62a2905 100644
--- a/src/plugins/cpptools/cppprojectfile.cpp
+++ b/src/plugins/cpptools/cppprojectfile.cpp
@@ -48,6 +48,58 @@ ProjectFile::ProjectFile(const QString &file, Kind kind)
{
}
+ProjectFile::Kind ProjectFile::classify(const QString &file)
+{
+ const Core::MimeDatabase *mimeDatabase = Core::ICore::mimeDatabase();
+ const QFileInfo fi(file);
+ const Core::MimeType mimeType = mimeDatabase->findByFile(fi);
+ if (!mimeType)
+ return Unclassified;
+ const QString mt = mimeType.type();
+ if (mt == QLatin1String(CppTools::Constants::C_SOURCE_MIMETYPE))
+ return CSource;
+ if (mt == QLatin1String(CppTools::Constants::C_HEADER_MIMETYPE))
+ return CHeader;
+ if (mt == QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE))
+ return CXXSource;
+ if (mt == QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE))
+ return CXXHeader;
+ if (mt == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE))
+ return ObjCXXSource;
+ return Unclassified;
+}
+
+/// @return True if file is header or cannot be classified (i.e has no file extension)
+bool ProjectFile::isHeader(ProjectFile::Kind kind)
+{
+ switch (kind) {
+ case ProjectFile::CHeader:
+ case ProjectFile::CXXHeader:
+ case ProjectFile::ObjCHeader:
+ case ProjectFile::ObjCXXHeader:
+ case ProjectFile::Unclassified:
+ return true;
+ default:
+ return false;
+ }
+}
+
+/// @return True if file is correctly classified source
+bool ProjectFile::isSource(ProjectFile::Kind kind)
+{
+ switch (kind) {
+ case ProjectFile::CSource:
+ case ProjectFile::CXXSource:
+ case ProjectFile::ObjCSource:
+ case ProjectFile::ObjCXXSource:
+ case ProjectFile::CudaSource:
+ case ProjectFile::OpenCLSource:
+ return true;
+ default:
+ return false;
+ }
+}
+
ProjectFileAdder::ProjectFileAdder(QList<ProjectFile> &files)
: m_files(files)
{
diff --git a/src/plugins/cpptools/cppprojectfile.h b/src/plugins/cpptools/cppprojectfile.h
index 277e6320db..15fe2c2376 100644
--- a/src/plugins/cpptools/cppprojectfile.h
+++ b/src/plugins/cpptools/cppprojectfile.h
@@ -43,6 +43,7 @@ class CPPTOOLS_EXPORT ProjectFile
public:
// enums and types
enum Kind {
+ Unclassified = 0,
CHeader = 1,
CSource = 2,
CXXHeader = 3,
@@ -58,6 +59,10 @@ public:
ProjectFile();
ProjectFile(const QString &file, Kind kind);
+ static Kind classify(const QString &file);
+ static bool isHeader(Kind kind);
+ static bool isSource(Kind kind);
+
QString path;
Kind kind;
};
diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index 66e7c20e2d..2c1cd6410b 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -39,6 +39,7 @@
#include "symbolsfindfilter.h"
#include "cpptoolssettings.h"
#include "cpptoolsreuse.h"
+#include "cppprojectfile.h"
#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/actionmanager.h>
@@ -184,51 +185,31 @@ static QStringList findFilesInProject(const QString &name,
return candidateList;
}
-// Figure out file type
-enum FileType {
- HeaderFile,
- C_SourceFile,
- CPP_SourceFile,
- ObjectiveCPP_SourceFile,
- UnknownType
-};
-
-static inline FileType fileType(const Core::MimeDatabase *mimeDatabase, const QFileInfo & fi)
-{
- const Core::MimeType mimeType = mimeDatabase->findByFile(fi);
- if (!mimeType)
- return UnknownType;
- const QString typeName = mimeType.type();
- if (typeName == QLatin1String(CppTools::Constants::C_SOURCE_MIMETYPE))
- return C_SourceFile;
- if (typeName == QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE))
- return CPP_SourceFile;
- if (typeName == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE))
- return ObjectiveCPP_SourceFile;
- if (typeName == QLatin1String(CppTools::Constants::C_HEADER_MIMETYPE)
- || typeName == QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE))
- return HeaderFile;
- return UnknownType;
-}
-
// Return the suffixes that should be checked when trying to find a
// source belonging to a header and vice versa
-static QStringList matchingCandidateSuffixes(const Core::MimeDatabase *mimeDatabase, FileType type)
+static QStringList matchingCandidateSuffixes(ProjectFile::Kind kind)
{
- switch (type) {
- case UnknownType:
- break;
- case HeaderFile: // Note that C/C++ headers are undistinguishable
- return mimeDatabase->findByType(QLatin1String(CppTools::Constants::C_SOURCE_MIMETYPE)).suffixes()
- + mimeDatabase->findByType(QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE)).suffixes()
- + mimeDatabase->findByType(QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)).suffixes();
- case C_SourceFile:
- return mimeDatabase->findByType(QLatin1String(CppTools::Constants::C_HEADER_MIMETYPE)).suffixes();
- case CPP_SourceFile:
- case ObjectiveCPP_SourceFile:
- return mimeDatabase->findByType(QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE)).suffixes();
+ Core::MimeDatabase *md = Core::ICore::instance()->mimeDatabase();
+ switch (kind) {
+ // Note that C/C++ headers are undistinguishable
+ case ProjectFile::CHeader:
+ case ProjectFile::CXXHeader:
+ case ProjectFile::ObjCHeader:
+ case ProjectFile::ObjCXXHeader:
+ return md->findByType(QLatin1String(Constants::C_SOURCE_MIMETYPE)).suffixes()
+ + md->findByType(QLatin1String(Constants::CPP_SOURCE_MIMETYPE)).suffixes()
+ + md->findByType(QLatin1String(Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)).suffixes();
+ case ProjectFile::CSource:
+ case ProjectFile::ObjCSource:
+ return md->findByType(QLatin1String(Constants::C_HEADER_MIMETYPE)).suffixes();
+ case ProjectFile::CXXSource:
+ case ProjectFile::ObjCXXSource:
+ case ProjectFile::CudaSource:
+ case ProjectFile::OpenCLSource:
+ return md->findByType(QLatin1String(Constants::CPP_HEADER_MIMETYPE)).suffixes();
+ default:
+ return QStringList();
}
- return QStringList();
}
static QStringList baseNameWithAllSuffixes(const QString &baseName, const QStringList &suffixes)
@@ -259,30 +240,26 @@ QString correspondingHeaderOrSource(const QString &fileName, bool *wasHeader)
{
using namespace Internal;
- const Core::MimeDatabase *mimeDatabase = Core::ICore::mimeDatabase();
const QFileInfo fi(fileName);
- if (m_headerSourceMapping.contains(fi.absoluteFilePath())) {
- if (wasHeader)
- *wasHeader = fileType(mimeDatabase, fi) == HeaderFile;
+ ProjectFile::Kind kind = ProjectFile::classify(fileName);
+ const bool isHeader = ProjectFile::isHeader(kind);
+ if (*wasHeader)
+ *wasHeader = isHeader;
+ if (m_headerSourceMapping.contains(fi.absoluteFilePath()))
return m_headerSourceMapping.value(fi.absoluteFilePath());
- }
-
- FileType type = fileType(mimeDatabase, fi);
- if (wasHeader)
- *wasHeader = type == HeaderFile;
if (debug)
- qDebug() << Q_FUNC_INFO << fileName << type;
+ qDebug() << Q_FUNC_INFO << fileName << kind;
- if (type == UnknownType)
+ if (kind == ProjectFile::Unclassified)
return QString();
const QString baseName = fi.completeBaseName();
const QString privateHeaderSuffix = QLatin1String("_p");
- const QStringList suffixes = matchingCandidateSuffixes(mimeDatabase, type);
+ const QStringList suffixes = matchingCandidateSuffixes(kind);
QStringList candidateFileNames = baseNameWithAllSuffixes(baseName, suffixes);
- if (type == HeaderFile) {
+ if (isHeader) {
if (baseName.endsWith(privateHeaderSuffix)) {
QString sourceBaseName = baseName;
sourceBaseName.truncate(sourceBaseName.size() - privateHeaderSuffix.size());
@@ -301,7 +278,7 @@ QString correspondingHeaderOrSource(const QString &fileName, bool *wasHeader)
const QFileInfo candidateFi(absoluteDir, candidateFileName);
if (candidateFi.isFile()) {
m_headerSourceMapping[fi.absoluteFilePath()] = candidateFi.absoluteFilePath();
- if (type != HeaderFile || !baseName.endsWith(privateHeaderSuffix))
+ if (!isHeader || !baseName.endsWith(privateHeaderSuffix))
m_headerSourceMapping[candidateFi.absoluteFilePath()] = fi.absoluteFilePath();
return candidateFi.absoluteFilePath();
}
diff --git a/src/plugins/cpptools/insertionpointlocator.cpp b/src/plugins/cpptools/insertionpointlocator.cpp
index 0e07d86b07..2401117e78 100644
--- a/src/plugins/cpptools/insertionpointlocator.cpp
+++ b/src/plugins/cpptools/insertionpointlocator.cpp
@@ -31,6 +31,7 @@
#include "cpptoolsreuse.h"
#include "symbolfinder.h"
+#include "cpptoolsconstants.h"
#include <coreplugin/icore.h>
@@ -317,19 +318,6 @@ InsertionLocation InsertionPointLocator::methodDeclarationInClass(
}
}
-static bool isSourceFile(const QString &fileName)
-{
- const Core::MimeDatabase *mimeDb = Core::ICore::mimeDatabase();
- Core::MimeType cSourceTy = mimeDb->findByType(QLatin1String("text/x-csrc"));
- Core::MimeType cppSourceTy = mimeDb->findByType(QLatin1String("text/x-c++src"));
- Core::MimeType mSourceTy = mimeDb->findByType(QLatin1String("text/x-objcsrc"));
- QStringList suffixes = cSourceTy.suffixes();
- suffixes += cppSourceTy.suffixes();
- suffixes += mSourceTy.suffixes();
- QFileInfo fileInfo(fileName);
- return suffixes.contains(fileInfo.suffix());
-}
-
namespace {
template <class Key, class Value>
class HighestValue
@@ -588,7 +576,7 @@ QList<InsertionLocation> InsertionPointLocator::methodDefinition(
const QString declFileName = QString::fromUtf8(declaration->fileName(),
declaration->fileNameLength());
QString target = declFileName;
- if (!isSourceFile(declFileName)) {
+ if (!ProjectFile::isSource(ProjectFile::classify(declFileName))) {
QString candidate = CppTools::correspondingHeaderOrSource(declFileName);
if (!candidate.isEmpty())
target = candidate;
diff --git a/src/plugins/debugger/sourceutils.cpp b/src/plugins/debugger/sourceutils.cpp
index 10cb2d0e7b..85d8db624a 100644
--- a/src/plugins/debugger/sourceutils.cpp
+++ b/src/plugins/debugger/sourceutils.cpp
@@ -33,8 +33,8 @@
#include "watchutils.h"
#include <texteditor/basetexteditor.h>
-#include <cpptools/cpptoolsconstants.h>
#include <cpptools/abstracteditorsupport.h>
+#include <cpptools/cppprojectfile.h>
#include <cpptools/ModelManagerInterface.h>
#include <cplusplus/ExpressionUnderCursor.h>
@@ -314,15 +314,11 @@ bool getUninitializedVariables(const CPlusPlus::Snapshot &snapshot,
// Editor tooltip support
bool isCppEditor(Core::IEditor *editor)
{
- using namespace CppTools::Constants;
const Core::IDocument *document= editor->document();
if (!document)
return false;
- const QByteArray mimeType = document->mimeType().toLatin1();
- return mimeType == C_SOURCE_MIMETYPE
- || mimeType == CPP_SOURCE_MIMETYPE
- || mimeType == CPP_HEADER_MIMETYPE
- || mimeType == OBJECTIVE_CPP_SOURCE_MIMETYPE;
+
+ return CppTools::ProjectFile::classify(document->fileName()) != CppTools::ProjectFile::Unclassified;
}
// Return the Cpp expression, and, if desired, the function
@@ -330,7 +326,6 @@ QString cppExpressionAt(TextEditor::ITextEditor *editor, int pos,
int *line, int *column, QString *function /* = 0 */)
{
using namespace CppTools;
- using namespace CPlusPlus;
*line = *column = 0;
if (function)
function->clear();