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