Newer
Older
dub_jkp / source / dub / generators / sublimetext.d
  1. /**
  2. Generator for SublimeText project files
  3.  
  4. Copyright: © 2014 Nicholas Londey
  5. License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file.
  6. Authors: Nicholas Londey
  7. */
  8. module dub.generators.sublimetext;
  9.  
  10. import dub.compilers.compiler;
  11. import dub.generators.generator;
  12. import dub.internal.vibecompat.data.json;
  13. import dub.internal.vibecompat.inet.path;
  14. import dub.internal.logging;
  15. import dub.packagemanager;
  16. import dub.project;
  17.  
  18. import std.algorithm;
  19. import std.array;
  20. import std.file;
  21.  
  22.  
  23. class SublimeTextGenerator : ProjectGenerator {
  24.  
  25. this(Project project)
  26. {
  27. super(project);
  28. }
  29.  
  30. override void generateTargets(GeneratorSettings settings, in TargetInfo[string] targets)
  31. {
  32. auto buildSettings = targets[m_project.name].buildSettings;
  33. logDebug("About to generate sublime project for %s.", m_project.rootPackage.name);
  34.  
  35. auto root = Json([
  36. "folders": targets.byValue.map!(f => targetFolderJson(f)).array.Json,
  37. "build_systems": buildSystems(settings.platform, settings.toolWorkingDirectory.toNativeString()),
  38. "settings": [ "include_paths": buildSettings.importPaths.map!Json.array.Json ].Json,
  39. ]);
  40.  
  41. auto jsonString = appender!string();
  42. writePrettyJsonString(jsonString, root);
  43.  
  44. string projectPath = m_project.name ~ ".sublime-project";
  45.  
  46. write(projectPath, jsonString.data);
  47.  
  48. logInfo("Generated", Color.green, "%s", projectPath);
  49. }
  50. }
  51.  
  52.  
  53. private Json targetFolderJson(in ProjectGenerator.TargetInfo target)
  54. {
  55. return [
  56. "name": target.pack.basePackage.name.Json,
  57. "path": target.pack.basePackage.path.toNativeString.Json,
  58. "follow_symlinks": true.Json,
  59. "folder_exclude_patterns": [".dub"].map!Json.array.Json,
  60. ].Json;
  61. }
  62.  
  63.  
  64. private Json buildSystems(BuildPlatform buildPlatform, string workingDiretory)
  65. {
  66. static immutable BUILD_TYPES = [
  67. //"plain",
  68. "debug",
  69. "release",
  70. "release-debug",
  71. "release-nobounds",
  72. //"unittest",
  73. "docs",
  74. "ddox",
  75. "profile",
  76. "profile-gc",
  77. "cov",
  78. "cov-ctfe",
  79. "unittest-cov",
  80. "unittest-cov-ctfe",
  81. "syntax"
  82. ];
  83.  
  84. string fileRegex;
  85.  
  86. if (buildPlatform.frontendVersion >= 2066 && buildPlatform.compiler == "dmd")
  87. fileRegex = r"^(.+)\(([0-9]+)\,([0-9]+)\)\: (.*)$";
  88. else
  89. fileRegex = r"^(.+)\(([0-9]+)\)\:() (.*)$";
  90.  
  91. auto arch = buildPlatform.architecture[0];
  92.  
  93. Json makeBuildSystem(string buildType)
  94. {
  95. return Json([
  96. "name": "DUB build " ~ buildType.Json,
  97. "cmd": ["dub", "build", "--build=" ~ buildType, "--arch=" ~ arch, "--compiler="~buildPlatform.compilerBinary].map!Json.array.Json,
  98. "file_regex": fileRegex.Json,
  99. "working_dir": workingDiretory.Json,
  100. "variants": [
  101. [
  102. "name": "Run".Json,
  103. "cmd": ["dub", "run", "--build=" ~ buildType, "--arch=" ~ arch, "--compiler="~buildPlatform.compilerBinary].map!Json.array.Json,
  104. ].Json
  105. ].array.Json,
  106. ]);
  107. }
  108.  
  109. auto buildSystems = BUILD_TYPES.map!makeBuildSystem.array;
  110.  
  111. buildSystems ~= [
  112. "name": "DUB test".Json,
  113. "cmd": ["dub", "test", "--arch=" ~ arch, "--compiler="~buildPlatform.compilerBinary].map!Json.array.Json,
  114. "file_regex": r"^(.+)\(([0-9]+)\)\:() (.*)$".Json,
  115. "working_dir": workingDiretory.Json,
  116. ].Json;
  117.  
  118. return buildSystems.array.Json;
  119. }
  120.  
  121. unittest
  122. {
  123. auto buildPlatform = BuildPlatform();
  124. buildPlatform.architecture ~= "x86_64";
  125.  
  126. auto result = buildPlatform.buildSystems(getcwd()).toString;
  127. }