From 3766182f93959f11334e9fc137be0e56bce2f804 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Sat, 1 Dec 2018 17:04:15 +0000 Subject: [PATCH] Added vscode task to generate launch.json A few plugins will make the experience a lot better: https://marketplace.visualstudio.com/items?itemName=redhat.java https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack --- .../net/fabricmc/loom/LoomGradlePlugin.java | 1 + .../loom/task/GenVsCodeProjectTask.java | 106 ++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java diff --git a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java index a27916a..b325682 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java +++ b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java @@ -37,6 +37,7 @@ public class LoomGradlePlugin extends AbstractPlugin { makeTask("genSources", GenSourcesTask.class); makeTask("genIdeaWorkspace", GenIdeaProjectTask.class).dependsOn("idea").setGroup("ide"); + makeTask("vscode", GenVsCodeProjectTask.class).setGroup("ide"); makeTask("runClient", RunClientTask.class).dependsOn("buildNeeded").setGroup("minecraftMapped"); makeTask("runServer", RunServerTask.class).dependsOn("buildNeeded").setGroup("minecraftMapped"); diff --git a/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java new file mode 100644 index 0000000..d5c96aa --- /dev/null +++ b/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java @@ -0,0 +1,106 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.task; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.IdeaRunConfig; +import org.apache.commons.io.FileUtils; +import org.gradle.api.DefaultTask; +import org.gradle.api.tasks.TaskAction; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +//Recommended vscode plugins: +// https://marketplace.visualstudio.com/items?itemName=redhat.java +// https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug +// https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack +public class GenVsCodeProjectTask extends DefaultTask { + + @TaskAction + public void genRuns() { + LoomGradleExtension extension = getProject().getExtensions().getByType(LoomGradleExtension.class); + File projectDir = new File(".vscode"); + if (!projectDir.exists()) { + projectDir.mkdir(); + } + File launchJson = new File(projectDir, "launch.json"); + if (launchJson.exists()) { + launchJson.delete(); + } + + VsCodeLaunch launch = new VsCodeLaunch(); + launch.add(IdeaRunConfig.clientRunConfig(getProject())); + launch.add(IdeaRunConfig.serverRunConfig(getProject())); + + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + String json = gson.toJson(launch); + + try { + FileUtils.writeStringToFile(launchJson, json, StandardCharsets.UTF_8); + } catch (IOException e) { + throw new RuntimeException("Failed to write launch.json", e); + } + + File runDir = new File(Constants.WORKING_DIRECTORY, extension.runDir); + if (!runDir.exists()) { + runDir.mkdirs(); + } + } + + private static class VsCodeLaunch { + public String version = "0.2.0"; + public List configurations = new ArrayList<>(); + + public void add(IdeaRunConfig runConfig) { + configurations.add(new VsCodeConfiguration(runConfig)); + } + } + + private static class VsCodeConfiguration { + public String type = "java"; + public String name; + public String request = "launch"; + public String cwd = "${workspaceFolder}\\run"; + public String conolse = "internalConsole"; + public boolean stopOnEntry = false; + public String mainClass; + public String vmArgs; + public String args; + + public VsCodeConfiguration(IdeaRunConfig runConfig) { + this.name = runConfig.configName; + this.mainClass = runConfig.mainClass; + this.vmArgs = runConfig.vmArgs; + this.args = runConfig.programArgs; + } + } +}