summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2017-04-06 13:38:02 +0000
committerKitware Robot <kwrobot@kitware.com>2017-04-06 09:38:05 -0400
commit0ef6b24988c1ea94760f4cbaf68862b5a2534f0e (patch)
tree61b3774b3960e1c20bafee5d22b491e7898b3d98 /Source
parenta6530f3ee2415f3d194f71d90a9baad502fe6183 (diff)
parent8243fe7c46075c1e310f9ad761b9906b0fb4400b (diff)
downloadcmake-0ef6b24988c1ea94760f4cbaf68862b5a2534f0e.tar.gz
Merge topic 'codelite-virtual-dirs'
8243fe7c CodeLite: Distribute source files into folders (virtual directories) Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !653
Diffstat (limited to 'Source')
-rw-r--r--Source/cmExtraCodeLiteGenerator.cxx101
-rw-r--r--Source/cmExtraCodeLiteGenerator.h4
2 files changed, 88 insertions, 17 deletions
diff --git a/Source/cmExtraCodeLiteGenerator.cxx b/Source/cmExtraCodeLiteGenerator.cxx
index fd7da181f4..856d42eee7 100644
--- a/Source/cmExtraCodeLiteGenerator.cxx
+++ b/Source/cmExtraCodeLiteGenerator.cxx
@@ -349,6 +349,87 @@ void cmExtraCodeLiteGenerator::FindMatchingHeaderfiles(
}
}
+void cmExtraCodeLiteGenerator::CreateFoldersAndFiles(
+ std::set<std::string>& cFiles, cmXMLWriter& xml,
+ const std::string& projectPath)
+{
+ std::vector<std::string> tmp_path;
+ std::vector<std::string> components;
+ size_t numOfEndEl = 0;
+
+ for (std::set<std::string>::const_iterator it = cFiles.begin();
+ it != cFiles.end(); ++it) {
+ std::string frelapath =
+ cmSystemTools::RelativePath(projectPath.c_str(), it->c_str());
+ cmsys::SystemTools::SplitPath(frelapath, components, false);
+ components.pop_back(); // erase last member -> it is file, not folder
+ components.erase(components.begin()); // erase "root"
+
+ size_t sizeOfSkip = 0;
+
+ for (size_t i = 0; i < components.size(); ++i) {
+ // skip relative path
+ if (components[i] == ".." || components[i] == ".") {
+ sizeOfSkip++;
+ continue;
+ }
+
+ // same folder
+ if (tmp_path.size() > i - sizeOfSkip &&
+ tmp_path[i - sizeOfSkip] == components[i]) {
+ continue;
+ }
+
+ // delete "old" subfolders
+ if (tmp_path.size() > i - sizeOfSkip) {
+ numOfEndEl = tmp_path.size() - i + sizeOfSkip;
+ tmp_path.erase(tmp_path.end() - numOfEndEl, tmp_path.end());
+ for (; numOfEndEl--;) {
+ xml.EndElement();
+ }
+ }
+
+ // add folder
+ xml.StartElement("VirtualDirectory");
+ xml.Attribute("Name", components[i]);
+ tmp_path.push_back(components[i]);
+ }
+
+ // delete "old" subfolders
+ numOfEndEl = tmp_path.size() - components.size() + sizeOfSkip;
+ if (numOfEndEl) {
+ tmp_path.erase(tmp_path.end() - numOfEndEl, tmp_path.end());
+ for (; numOfEndEl--;) {
+ xml.EndElement();
+ }
+ }
+
+ // add file
+ xml.StartElement("File");
+ xml.Attribute("Name", frelapath);
+ xml.EndElement();
+ }
+
+ // end of folders
+ numOfEndEl = tmp_path.size();
+ for (; numOfEndEl--;) {
+ xml.EndElement();
+ }
+}
+
+void cmExtraCodeLiteGenerator::CreateFoldersAndFiles(
+ std::map<std::string, cmSourceFile*>& cFiles, cmXMLWriter& xml,
+ const std::string& projectPath)
+{
+ std::set<std::string> s;
+ for (std::map<std::string, cmSourceFile*>::const_iterator it =
+ cFiles.begin();
+ it != cFiles.end(); ++it) {
+ s.insert(it->first);
+ }
+ this->CreateFoldersAndFiles(s, xml, projectPath);
+}
+
void cmExtraCodeLiteGenerator::CreateProjectSourceEntries(
std::map<std::string, cmSourceFile*>& cFiles,
std::set<std::string>& otherFiles, cmXMLWriter* _xml,
@@ -366,26 +447,12 @@ void cmExtraCodeLiteGenerator::CreateProjectSourceEntries(
// insert all source files in the codelite project
// first the C/C++ implementation files, then all others
- for (std::map<std::string, cmSourceFile*>::const_iterator sit =
- cFiles.begin();
- sit != cFiles.end(); ++sit) {
- xml.StartElement("File");
- std::string fpath(sit->first);
- std::string frelapath =
- cmSystemTools::RelativePath(projectPath.c_str(), sit->first.c_str());
- xml.Attribute("Name", frelapath);
- xml.EndElement();
- }
+ this->CreateFoldersAndFiles(cFiles, xml, projectPath);
xml.EndElement(); // VirtualDirectory
+
xml.StartElement("VirtualDirectory");
xml.Attribute("Name", "include");
- for (std::set<std::string>::const_iterator sit = otherFiles.begin();
- sit != otherFiles.end(); ++sit) {
- xml.StartElement("File");
- xml.Attribute(
- "Name", cmSystemTools::RelativePath(projectPath.c_str(), sit->c_str()));
- xml.EndElement();
- }
+ this->CreateFoldersAndFiles(otherFiles, xml, projectPath);
xml.EndElement(); // VirtualDirectory
// Get the number of CPUs. We use this information for the make -jN
diff --git a/Source/cmExtraCodeLiteGenerator.h b/Source/cmExtraCodeLiteGenerator.h
index 773515dbfd..3263eb61d2 100644
--- a/Source/cmExtraCodeLiteGenerator.h
+++ b/Source/cmExtraCodeLiteGenerator.h
@@ -50,6 +50,10 @@ protected:
const cmMakefile* mf,
const std::string& projectType,
const std::string& targetName);
+ void CreateFoldersAndFiles(std::set<std::string>& cFiles, cmXMLWriter& xml,
+ const std::string& projectPath);
+ void CreateFoldersAndFiles(std::map<std::string, cmSourceFile*>& cFiles,
+ cmXMLWriter& xml, const std::string& projectPath);
public:
cmExtraCodeLiteGenerator();