summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libs/utils/textfileformat.cpp34
-rw-r--r--src/libs/utils/textfileformat.h4
-rw-r--r--src/plugins/cpptools/cpppreprocessor.cpp21
-rw-r--r--src/plugins/cpptools/cpppreprocessor.h6
4 files changed, 59 insertions, 6 deletions
diff --git a/src/libs/utils/textfileformat.cpp b/src/libs/utils/textfileformat.cpp
index bbd90e7a8a..c4b26695b3 100644
--- a/src/libs/utils/textfileformat.cpp
+++ b/src/libs/utils/textfileformat.cpp
@@ -304,6 +304,40 @@ TextFileFormat::ReadResult TextFileFormat::readFileUTF8(const QString &fileName,
return TextFileFormat::ReadSuccess;
}
+TextFileFormat::ReadResult TextFileFormat::readFileUTF8(const QString &fileName,
+ const QTextCodec *defaultCodec,
+ QByteArray *plainText, QString *errorString)
+{
+ QByteArray data;
+ try {
+ Utils::FileReader reader;
+ if (!reader.fetch(fileName, errorString))
+ return Utils::TextFileFormat::ReadIOError;
+ data = reader.data();
+ } catch (const std::bad_alloc &) {
+ *errorString = QCoreApplication::translate("Utils::TextFileFormat", "Out of memory.");
+ return Utils::TextFileFormat::ReadMemoryAllocationError;
+ }
+
+ Utils::TextFileFormat format = Utils::TextFileFormat::detect(data);
+ if (!format.codec)
+ format.codec = defaultCodec ? defaultCodec : QTextCodec::codecForLocale();
+ if (format.codec->name() == "UTF-8") {
+ if (format.hasUtf8Bom)
+ data.remove(0, 3);
+ *plainText = data;
+ return Utils::TextFileFormat::ReadSuccess;
+ }
+
+ QString target;
+ if (!format.decode(data, &target)) {
+ *errorString = QCoreApplication::translate("Utils::TextFileFormat", "An encoding error was encountered.");
+ return Utils::TextFileFormat::ReadEncodingError;
+ }
+ *plainText = target.toUtf8();
+ return Utils::TextFileFormat::ReadSuccess;
+}
+
/*!
Writes out a text file.
*/
diff --git a/src/libs/utils/textfileformat.h b/src/libs/utils/textfileformat.h
index 91121c9a9d..9ca55042e1 100644
--- a/src/libs/utils/textfileformat.h
+++ b/src/libs/utils/textfileformat.h
@@ -77,7 +77,9 @@ public:
QString *plainText, TextFileFormat *format, QString *errorString,
QByteArray *decodingErrorSample = 0);
static ReadResult readFileUTF8(const QString &fileName, QByteArray *plainText,
- QString *errorString);
+ QString *errorString); // TODO: Remove this version.
+ static ReadResult readFileUTF8(const QString &fileName, const QTextCodec *defaultCodec,
+ QByteArray *plainText, QString *errorString);
bool writeFile(const QString &fileName, QString plainText, QString *errorString) const;
diff --git a/src/plugins/cpptools/cpppreprocessor.cpp b/src/plugins/cpptools/cpppreprocessor.cpp
index 56668fe644..f8d14bf123 100644
--- a/src/plugins/cpptools/cpppreprocessor.cpp
+++ b/src/plugins/cpptools/cpppreprocessor.cpp
@@ -2,11 +2,15 @@
#include "cppmodelmanager.h"
+#include <coreplugin/editormanager/editormanager.h>
+
+#include <utils/fileutils.h>
#include <utils/hostosinfo.h>
#include <utils/textfileformat.h>
#include <QCoreApplication>
#include <QCryptographicHash>
+#include <QTextCodec>
/*!
* \class CppTools::Internal::CppPreprocessor
@@ -30,7 +34,8 @@ CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager,
m_modelManager(modelManager),
m_dumpFileNameWhileParsing(dumpFileNameWhileParsing),
m_preprocess(this, &m_env),
- m_revision(0)
+ m_revision(0),
+ m_defaultCodec(Core::EditorManager::defaultTextCodec())
{
m_preprocess.setKeepComments(true);
}
@@ -41,7 +46,8 @@ CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager, const S
m_modelManager(modelManager),
m_dumpFileNameWhileParsing(dumpFileNameWhileParsing),
m_preprocess(this, &m_env),
- m_revision(0)
+ m_revision(0),
+ m_defaultCodec(Core::EditorManager::defaultTextCodec())
{
m_preprocess.setKeepComments(true);
}
@@ -182,9 +188,14 @@ void CppPreprocessor::getFileContents(const QString &absoluteFilePath,
return;
}
- QString errStr;
- if (contents)
- Utils::TextFileFormat::readFileUTF8(absoluteFilePath, contents, &errStr);
+ if (contents) {
+ QString error;
+ if (Utils::TextFileFormat::readFileUTF8(absoluteFilePath, m_defaultCodec, contents, &error)
+ != Utils::TextFileFormat::ReadSuccess) {
+ qWarning("Error reading file \"%s\": \"%s\".", qPrintable(absoluteFilePath),
+ qPrintable(error));
+ }
+ }
if (revision)
*revision = 0;
}
diff --git a/src/plugins/cpptools/cpppreprocessor.h b/src/plugins/cpptools/cpppreprocessor.h
index d0d84ac8e3..40a9509701 100644
--- a/src/plugins/cpptools/cpppreprocessor.h
+++ b/src/plugins/cpptools/cpppreprocessor.h
@@ -9,6 +9,10 @@
#include <QHash>
#include <QPointer>
+QT_BEGIN_NAMESPACE
+class QTextCodec;
+QT_END_NAMESPACE
+
namespace CppTools {
namespace Internal {
@@ -75,6 +79,7 @@ protected:
virtual void sourceNeeded(unsigned line, const QString &fileName, IncludeType type);
private:
+ CppPreprocessor();
void addFrameworkPath(const QString &frameworkPath);
CPlusPlus::Snapshot m_snapshot;
@@ -92,6 +97,7 @@ private:
QSet<QString> m_processed;
unsigned m_revision;
QHash<QString, QString> m_fileNameCache;
+ QTextCodec *m_defaultCodec;
};
} // namespace Internal