/** Generator for SublimeText project files Copyright: © 2014 Nicholas Londey License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file. Authors: Nicholas Londey */ module dub.generators.sublimetext; import dub.compilers.compiler; import dub.generators.generator; import dub.internal.vibecompat.data.json; import dub.internal.vibecompat.inet.path; import dub.internal.logging; import dub.packagemanager; import dub.project; import std.algorithm; import std.array; import std.file; class SublimeTextGenerator : ProjectGenerator { this(Project project) { super(project); } override void generateTargets(GeneratorSettings settings, in TargetInfo[string] targets) { auto buildSettings = targets[m_project.name].buildSettings; logDebug("About to generate sublime project for %s.", m_project.rootPackage.name); auto root = Json([ "folders": targets.byValue.map!(f => targetFolderJson(f)).array.Json, "build_systems": buildSystems(settings.platform, settings.toolWorkingDirectory.toNativeString()), "settings": [ "include_paths": buildSettings.importPaths.map!Json.array.Json ].Json, ]); auto jsonString = appender!string(); writePrettyJsonString(jsonString, root); string projectPath = m_project.name ~ ".sublime-project"; write(projectPath, jsonString.data); logInfo("Generated", Color.green, "%s", projectPath); } } private Json targetFolderJson(in ProjectGenerator.TargetInfo target) { return [ "name": target.pack.basePackage.name.Json, "path": target.pack.basePackage.path.toNativeString.Json, "follow_symlinks": true.Json, "folder_exclude_patterns": [".dub"].map!Json.array.Json, ].Json; } private Json buildSystems(BuildPlatform buildPlatform, string workingDiretory) { static immutable BUILD_TYPES = [ //"plain", "debug", "release", "release-debug", "release-nobounds", //"unittest", "docs", "ddox", "profile", "profile-gc", "cov", "cov-ctfe", "unittest-cov", "unittest-cov-ctfe", "syntax" ]; string fileRegex; if (buildPlatform.frontendVersion >= 2066 && buildPlatform.compiler == "dmd") fileRegex = r"^(.+)\(([0-9]+)\,([0-9]+)\)\: (.*)$"; else fileRegex = r"^(.+)\(([0-9]+)\)\:() (.*)$"; auto arch = buildPlatform.architecture[0]; Json makeBuildSystem(string buildType) { return Json([ "name": "DUB build " ~ buildType.Json, "cmd": ["dub", "build", "--build=" ~ buildType, "--arch=" ~ arch, "--compiler="~buildPlatform.compilerBinary].map!Json.array.Json, "file_regex": fileRegex.Json, "working_dir": workingDiretory.Json, "variants": [ [ "name": "Run".Json, "cmd": ["dub", "run", "--build=" ~ buildType, "--arch=" ~ arch, "--compiler="~buildPlatform.compilerBinary].map!Json.array.Json, ].Json ].array.Json, ]); } auto buildSystems = BUILD_TYPES.map!makeBuildSystem.array; buildSystems ~= [ "name": "DUB test".Json, "cmd": ["dub", "test", "--arch=" ~ arch, "--compiler="~buildPlatform.compilerBinary].map!Json.array.Json, "file_regex": r"^(.+)\(([0-9]+)\)\:() (.*)$".Json, "working_dir": workingDiretory.Json, ].Json; return buildSystems.array.Json; } unittest { auto buildPlatform = BuildPlatform(); buildPlatform.architecture ~= "x86_64"; auto result = buildPlatform.buildSystems(getcwd()).toString; }