diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/utils/textfileformat.cpp | 34 | ||||
-rw-r--r-- | src/libs/utils/textfileformat.h | 4 | ||||
-rw-r--r-- | src/plugins/cpptools/cpppreprocessor.cpp | 21 | ||||
-rw-r--r-- | src/plugins/cpptools/cpppreprocessor.h | 6 |
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 |