From 6859109503d573b63280041588e9e1eb62e50402 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 19 Apr 2016 01:00:54 +0300 Subject: [PATCH] Replaced MetaStyle project with codegen_style/numbers in MSVC. --- Telegram.sln | 12 --- .../codegen/common/basic_tokenized_file.cpp | 3 + .../codegen/common/basic_tokenized_file.h | 1 + .../SourceFiles/codegen/common/clean_file.cpp | 33 ++++--- .../SourceFiles/codegen/common/clean_file.h | 9 +- .../codegen/common/clean_file_reader.h | 7 +- .../SourceFiles/codegen/numbers/generator.cpp | 56 ++++++++++++ .../codegen/numbers/parsed_file.cpp | 85 ++++++++++++++++++- .../SourceFiles/codegen/numbers/parsed_file.h | 6 +- Telegram/Telegram.vcxproj | 29 +------ Telegram/Telegram.vcxproj.filters | 15 +--- .../vc/codegen_style/codegen_style.vcxproj | 2 +- 12 files changed, 184 insertions(+), 74 deletions(-) diff --git a/Telegram.sln b/Telegram.sln index b474402bc..0bcdb9682 100644 --- a/Telegram.sln +++ b/Telegram.sln @@ -5,15 +5,12 @@ VisualStudioVersion = 14.0.24720.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Telegram", "Telegram\Telegram.vcxproj", "{B12702AD-ABFB-343A-A199-8E24837244A3}" ProjectSection(ProjectDependencies) = postProject - {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0} = {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0} {E4DF8176-4DEF-4859-962F-B497E3E7A323} = {E4DF8176-4DEF-4859-962F-B497E3E7A323} {E417CAA4-259B-4C99-88E3-805F1300E8EB} = {E417CAA4-259B-4C99-88E3-805F1300E8EB} {EB7D16AC-EACF-4577-B05A-F28E5F356794} = {EB7D16AC-EACF-4577-B05A-F28E5F356794} {7C25BFBD-7930-4DE2-AF33-27CE1CC521E6} = {7C25BFBD-7930-4DE2-AF33-27CE1CC521E6} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MetaStyle", "Telegram\MetaStyle.vcxproj", "{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MetaEmoji", "Telegram\MetaEmoji.vcxproj", "{EB7D16AC-EACF-4577-B05A-F28E5F356794}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Updater", "Telegram\Updater.vcxproj", "{6B4BA3BE-7B15-4B4C-B200-81ABFDEF2C76}" @@ -48,15 +45,6 @@ Global {B12702AD-ABFB-343A-A199-8E24837244A3}.Release|Win32.ActiveCfg = Release|Win32 {B12702AD-ABFB-343A-A199-8E24837244A3}.Release|Win32.Build.0 = Release|Win32 {B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x64.ActiveCfg = Release|Win32 - {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Debug|Win32.ActiveCfg = Debug|Win32 - {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Debug|Win32.Build.0 = Debug|Win32 - {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Debug|x64.ActiveCfg = Debug|Win32 - {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Deploy|Win32.ActiveCfg = Deploy|Win32 - {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Deploy|Win32.Build.0 = Deploy|Win32 - {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Deploy|x64.ActiveCfg = Release|Win32 - {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Release|Win32.ActiveCfg = Release|Win32 - {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Release|Win32.Build.0 = Release|Win32 - {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Release|x64.ActiveCfg = Release|Win32 {EB7D16AC-EACF-4577-B05A-F28E5F356794}.Debug|Win32.ActiveCfg = Debug|Win32 {EB7D16AC-EACF-4577-B05A-F28E5F356794}.Debug|x64.ActiveCfg = Debug|Win32 {EB7D16AC-EACF-4577-B05A-F28E5F356794}.Deploy|Win32.ActiveCfg = Deploy|Win32 diff --git a/Telegram/SourceFiles/codegen/common/basic_tokenized_file.cpp b/Telegram/SourceFiles/codegen/common/basic_tokenized_file.cpp index 2a80bea35..7bbc9c59d 100644 --- a/Telegram/SourceFiles/codegen/common/basic_tokenized_file.cpp +++ b/Telegram/SourceFiles/codegen/common/basic_tokenized_file.cpp @@ -57,6 +57,9 @@ Token invalidToken() { BasicTokenizedFile::BasicTokenizedFile(const QString &filepath) : reader_(filepath) { } +BasicTokenizedFile::BasicTokenizedFile(const QByteArray &content, const QString &filepath) : reader_(content, filepath) { +} + bool BasicTokenizedFile::putBack() { if (currentToken_ > 0) { --currentToken_; diff --git a/Telegram/SourceFiles/codegen/common/basic_tokenized_file.h b/Telegram/SourceFiles/codegen/common/basic_tokenized_file.h index d33e06ee4..fcfcd27a4 100644 --- a/Telegram/SourceFiles/codegen/common/basic_tokenized_file.h +++ b/Telegram/SourceFiles/codegen/common/basic_tokenized_file.h @@ -37,6 +37,7 @@ class LogStream; class BasicTokenizedFile { public: explicit BasicTokenizedFile(const QString &filepath); + explicit BasicTokenizedFile(const QByteArray &content, const QString &filepath = QString()); BasicTokenizedFile(const BasicTokenizedFile &other) = delete; BasicTokenizedFile &operator=(const BasicTokenizedFile &other) = delete; diff --git a/Telegram/SourceFiles/codegen/common/clean_file.cpp b/Telegram/SourceFiles/codegen/common/clean_file.cpp index 154084792..ba104fe9b 100644 --- a/Telegram/SourceFiles/codegen/common/clean_file.cpp +++ b/Telegram/SourceFiles/codegen/common/clean_file.cpp @@ -55,13 +55,22 @@ bool readFile(const QString &filepath, QByteArray *outResult) { } // namespace -CleanFile::CleanFile(const QString &filepath) : filepath_(filepath) { +CleanFile::CleanFile(const QString &filepath) +: filepath_(filepath) +, read_(true) { +} + +CleanFile::CleanFile(const QByteArray &content, const QString &filepath) +: filepath_(filepath) +, content_(content) +, read_(false) { } bool CleanFile::read() { - QByteArray content; - if (!readFile(filepath_, &content)) { - return false; + if (read_) { + if (!readFile(filepath_, &content_)) { + return false; + } } filepath_ = QFileInfo(filepath_).absoluteFilePath(); @@ -73,19 +82,19 @@ bool CleanFile::read() { auto insideComment = InsideComment::None; bool insideString = false; - const char *begin = content.cbegin(), *end = content.cend(), *offset = begin; + const char *begin = content_.cbegin(), *end = content_.cend(), *offset = begin; auto feedContent = [this, &offset, end](const char *ch) { if (ch > offset) { - if (content_.isEmpty()) content_.reserve(end - offset - 2); - content_.append(offset, ch - offset); + if (result_.isEmpty()) result_.reserve(end - offset - 2); + result_.append(offset, ch - offset); offset = ch; } }; auto feedComment = [this, &offset, end](const char *ch) { if (ch > offset) { // comments_.push_back({ content_.size(), QByteArray(offset, ch - offset) }); - if (content_.isEmpty()) content_.reserve(end - offset - 2); - content_.append(' '); + if (result_.isEmpty()) result_.reserve(end - offset - 2); + result_.append(' '); offset = ch; } }; @@ -142,10 +151,10 @@ bool CleanFile::read() { return false; } if (insideComment == InsideComment::None && end > offset) { - if (content_.isEmpty()) { - content_ = content; + if (result_.isEmpty()) { + result_ = content_; } else { - content_.append(offset, end - offset); + result_.append(offset, end - offset); } } return true; diff --git a/Telegram/SourceFiles/codegen/common/clean_file.h b/Telegram/SourceFiles/codegen/common/clean_file.h index 82edf5a79..8afbb7f36 100644 --- a/Telegram/SourceFiles/codegen/common/clean_file.h +++ b/Telegram/SourceFiles/codegen/common/clean_file.h @@ -33,16 +33,17 @@ namespace common { class CleanFile { public: explicit CleanFile(const QString &filepath); + explicit CleanFile(const QByteArray &content, const QString &filepath = QString()); CleanFile(const CleanFile &other) = delete; CleanFile &operator=(const CleanFile &other) = delete; bool read(); const char *data() const { - return content_.constData(); + return result_.constData(); } const char *end() const { - return content_.constEnd(); + return result_.constEnd(); } static constexpr int MaxSize = 10 * 1024 * 1024; @@ -52,8 +53,8 @@ public: private: QString filepath_; - - QByteArray content_; + QByteArray content_, result_; + bool read_; //struct Comment { // int offset; // QByteArray content; diff --git a/Telegram/SourceFiles/codegen/common/clean_file_reader.h b/Telegram/SourceFiles/codegen/common/clean_file_reader.h index 18c8ee31e..923dd9bb0 100644 --- a/Telegram/SourceFiles/codegen/common/clean_file_reader.h +++ b/Telegram/SourceFiles/codegen/common/clean_file_reader.h @@ -30,7 +30,9 @@ namespace common { // Wrapper allows you to read forward the CleanFile without overflow checks. class CleanFileReader { public: - CleanFileReader(const QString &filepath) : file_(filepath) { + explicit CleanFileReader(const QString &filepath) : file_(filepath) { + } + explicit CleanFileReader(const QByteArray &content, const QString &filepath = QString()) : file_(content, filepath) { } bool read() { @@ -57,6 +59,9 @@ public: const char *currentPtr() const { return pos_; } + int charsLeft() const { + return (end_ - pos_); + } // Log error to std::cerr with 'code' at line number 'line' in data(). LogStream logError(int code, int line) const { diff --git a/Telegram/SourceFiles/codegen/numbers/generator.cpp b/Telegram/SourceFiles/codegen/numbers/generator.cpp index e80f48297..4c6dcb8b8 100644 --- a/Telegram/SourceFiles/codegen/numbers/generator.cpp +++ b/Telegram/SourceFiles/codegen/numbers/generator.cpp @@ -47,6 +47,62 @@ bool Generator::writeHeader() { bool Generator::writeSource() { source_ = std::make_unique(basePath_ + ".cpp", project_); + source_->stream() << "\ +QVector phoneNumberParse(const QString &number) {\n\ + QVector result;\n\ +\n\ + int32 len = number.size();\n\ + if (len > 0) switch (number.at(0).unicode()) {\n"; + + QString already; + for (auto i = rules_.data.cend(), e = rules_.data.cbegin(); i != e;) { + --i; + QString k = i.key(); + bool onlyLastChanged = true; + while (!already.isEmpty() && (already.size() > k.size() || !already.endsWith(k.at(already.size() - 1)))) { + if (!onlyLastChanged) { + source_->stream() << QString("\t").repeated(1 + already.size()) << "}\n"; + source_->stream() << QString("\t").repeated(already.size()) << "break;\n"; + } + already = already.mid(0, already.size() - 1); + onlyLastChanged = false; + } + if (already == k) { + source_->stream() << QString("\t").repeated(1 + already.size()) << "}\n"; + } else { + bool onlyFirstCheck = true; + while (already.size() < k.size()) { + if (!onlyFirstCheck) source_->stream() << QString("\t").repeated(1 + already.size()) << "if (len > " << already.size() << ") switch (number.at(" << already.size() << ").unicode()) {\n"; + source_->stream() << QString("\t").repeated(1 + already.size()) << "case '" << k.at(already.size()).toLatin1() << "':\n"; + already.push_back(k.at(already.size())); + onlyFirstCheck = false; + } + } + if (i.value().isEmpty()) { + source_->stream() << QString("\t").repeated(1 + already.size()) << "return QVector(1, " << k.size() << ");\n"; + } else { + source_->stream() << QString("\t").repeated(1 + already.size()) << "result.reserve(" << (i.value().size() + 1) << ");\n"; + source_->stream() << QString("\t").repeated(1 + already.size()) << "result.push_back(" << k.size() << ");\n"; + for (int j = 0, l = i.value().size(); j < l; ++j) { + source_->stream() << QString("\t").repeated(1 + already.size()) << "result.push_back(" << i.value().at(j) << ");\n"; + } + source_->stream() << QString("\t").repeated(1 + already.size()) << "return result;\n"; + } + } + bool onlyLastChanged = true; + while (!already.isEmpty()) { + if (!onlyLastChanged) { + source_->stream() << QString("\t").repeated(1 + already.size()) << "}\n"; + } + already = already.mid(0, already.size() - 1); + onlyLastChanged = false; + } + source_->stream() << "\ + }\n\ +\n\ + return result;\n\ +}\n"; + return source_->finalize(); } diff --git a/Telegram/SourceFiles/codegen/numbers/parsed_file.cpp b/Telegram/SourceFiles/codegen/numbers/parsed_file.cpp index 3dc5508af..5fd4c81e4 100644 --- a/Telegram/SourceFiles/codegen/numbers/parsed_file.cpp +++ b/Telegram/SourceFiles/codegen/numbers/parsed_file.cpp @@ -26,6 +26,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include #include "codegen/common/basic_tokenized_file.h" #include "codegen/common/logging.h" +#include "codegen/common/clean_file_reader.h" +#include "codegen/common/checked_utf8_string.h" using BasicToken = codegen::common::BasicTokenizedFile::Token; using BasicType = BasicToken::Type; @@ -34,21 +36,98 @@ namespace codegen { namespace numbers { namespace { +QByteArray replaceStrings(const QString &filepath) { + common::CleanFileReader reader(filepath); + if (!reader.read()) { + return QByteArray(); + } + common::CheckedUtf8String string(reader.currentPtr(), reader.charsLeft()); + if (!string.isValid()) { + return QByteArray(); + } + + QStringList lines = string.toString().split('\n'); + for (auto &line : lines) { + auto match = QRegularExpression("^(\\d+;[A-Z]+;)([^;]+)(;.+)?$").match(line); + if (match.hasMatch()) { + line = match.captured(1) + '"' + match.captured(2) + '"' + match.captured(3); + } + } + return lines.join('\n').toUtf8(); +} + } // namespace ParsedFile::ParsedFile(const Options &options) -: file_(options.inputPath) +: content_(replaceStrings(options.inputPath)) +, file_(content_, options.inputPath) , options_(options) { } bool ParsedFile::read() { - if (!file_.read()) { + if (content_.isEmpty() || !file_.read()) { return false; } auto filepath = QFileInfo(options_.inputPath).absoluteFilePath(); do { - if (auto startToken = file_.getToken(BasicType::Name)) { + if (auto code = file_.getToken(BasicType::Int)) { + if (!file_.getToken(BasicType::Semicolon)) { + logErrorUnexpectedToken() << "';'"; + return false; + } + if (!file_.getToken(BasicType::Name)) { + logErrorUnexpectedToken() << "country code"; + return false; + } + if (!file_.getToken(BasicType::Semicolon)) { + logErrorUnexpectedToken() << "';'"; + return false; + } + if (!file_.getToken(BasicType::String)) { + logErrorUnexpectedToken() << "country name"; + return false; + } + if (file_.getToken(BasicType::Semicolon)) { + if (auto firstPart = file_.getToken(BasicType::Int)) { + if (firstPart.original.toByteArray() != code.original.toByteArray()) { + file_.putBack(); + result_.data.insert(code.original.toStringUnchecked(), Rule()); + continue; + } + + Rule rule; + while (auto part = file_.getToken(BasicType::Name)) { + rule.push_back(part.original.size()); + } + result_.data.insert(code.original.toStringUnchecked(), rule); + if (rule.isEmpty()) { + logErrorUnexpectedToken() << "bad phone pattern"; + return false; + } + + if (!file_.getToken(BasicType::Semicolon)) { + logErrorUnexpectedToken() << "';'"; + return false; + } + if (!file_.getToken(BasicType::Int)) { + logErrorUnexpectedToken() << "country phone len"; + return false; + } + file_.getToken(BasicType::Semicolon); + continue; + } else { + logErrorUnexpectedToken() << "country phone pattern"; + return false; + } + } else if (file_.getToken(BasicType::Int)) { + file_.putBack(); + result_.data.insert(code.original.toStringUnchecked(), Rule()); + continue; + } else { + logErrorUnexpectedToken() << "country phone pattern"; + return false; + } } if (file_.atEnd()) { break; diff --git a/Telegram/SourceFiles/codegen/numbers/parsed_file.h b/Telegram/SourceFiles/codegen/numbers/parsed_file.h index 7f158b972..8c9609344 100644 --- a/Telegram/SourceFiles/codegen/numbers/parsed_file.h +++ b/Telegram/SourceFiles/codegen/numbers/parsed_file.h @@ -28,10 +28,9 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org namespace codegen { namespace numbers { -struct Rule { -}; +using Rule = QVector; struct Rules { - QVector data; + QMap data; }; // Parses an input file to the internal struct. @@ -63,6 +62,7 @@ private: return file_.logErrorUnexpectedToken(); } + QByteArray content_; common::BasicTokenizedFile file_; Options options_; bool failed_ = false; diff --git a/Telegram/Telegram.vcxproj b/Telegram/Telegram.vcxproj index ff3e6f773..6bf9744be 100644 --- a/Telegram/Telegram.vcxproj +++ b/Telegram/Telegram.vcxproj @@ -1053,11 +1053,6 @@ - - true - true - true - @@ -1251,6 +1246,7 @@ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/core/basic_types.h" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl\Release\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\..\..\Libraries\breakpad\src" "-I.\ThirdParty\minizip" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" + @@ -1583,18 +1579,10 @@ $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) - - .\GeneratedFiles\style_classes.h - "$(SolutionDir)$(Platform)\$(Configuration)Style\MetaStyle.exe" -classes_in ".\Resources\style_classes.txt" -classes_out ".\GeneratedFiles\style_classes.h" -styles_in ".\Resources\style.txt" -styles_out ".\GeneratedFiles\style_auto.h" -path_to_sprites ".\Resources\art\\" - - - .\GeneratedFiles\style_auto.h - .\GeneratedFiles\style_auto.cpp - "$(SolutionDir)$(Platform)\$(Configuration)Style\MetaStyle.exe" -classes_in ".\Resources\style_classes.txt" -classes_out ".\GeneratedFiles\style_classes.h" -styles_in ".\Resources\style.txt" -styles_out ".\GeneratedFiles\style_auto.h" -path_to_sprites ".\Resources\art\\" - + .\GeneratedFiles\numbers.h .\GeneratedFiles\numbers.cpp - "$(SolutionDir)$(Platform)\$(Configuration)Style\MetaStyle.exe" -classes_in ".\Resources\style_classes.txt" -classes_out ".\GeneratedFiles\style_classes.h" -styles_in ".\Resources\style.txt" -styles_out ".\GeneratedFiles\style_auto.h" -path_to_sprites ".\Resources\art\\" + "$(SolutionDir)$(Platform)\codegen\$(Configuration)\codegen_numbers.exe" "-o.\GeneratedFiles" ".\Resources\numbers.txt" .\GeneratedFiles\lang_auto.h @@ -1616,16 +1604,6 @@ $(QTDIR)\bin\moc.exe;%(FullPath) - - true - true - true - - - true - true - true - $(QTDIR)\bin\moc.exe;%(FullPath) @@ -2229,7 +2207,6 @@ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl\Release\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\..\..\Libraries\breakpad\src" "-I.\ThirdParty\minizip" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/playerwidget.h" - $(QTDIR)\bin\moc.exe;%(FullPath) diff --git a/Telegram/Telegram.vcxproj.filters b/Telegram/Telegram.vcxproj.filters index bd8a0352a..2a5b14af6 100644 --- a/Telegram/Telegram.vcxproj.filters +++ b/Telegram/Telegram.vcxproj.filters @@ -111,9 +111,6 @@ SourceFiles - - GeneratedFiles - SourceFiles @@ -1094,12 +1091,6 @@ SourceFiles - - GeneratedFiles - - - GeneratedFiles - SourceFiles @@ -1127,9 +1118,6 @@ SourceFiles - - SourceFiles - Version @@ -1250,6 +1238,9 @@ GeneratedFiles\styles + + GeneratedFiles + diff --git a/Telegram/build/vc/codegen_style/codegen_style.vcxproj b/Telegram/build/vc/codegen_style/codegen_style.vcxproj index aa95a1a6b..15a73d76a 100644 --- a/Telegram/build/vc/codegen_style/codegen_style.vcxproj +++ b/Telegram/build/vc/codegen_style/codegen_style.vcxproj @@ -100,7 +100,7 @@ UNICODE;WIN32;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;%(PreprocessorDefinitions) - MultiThreadedDLL + MultiThreaded .;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);.\..\..\..\SourceFiles;$(QTDIR)\include\QtCore;.\..\%(AdditionalIncludeDirectories) true Level4