From 269e90ad665315a5930a35ec453de4da5ea29ebc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Giraudet?= Date: Tue, 11 Mar 2025 18:53:02 +0100 Subject: [PATCH 01/18] Add DAP server to Minecraft --- build.gradle | 8 +- gradle.properties | 12 +- .../debugger/DatapackBreakpointClient.java | 29 +- .../mod/debugger/command/EditCommand.java | 51 - .../debugger/gui/CommandHighLineUtils.java | 80 - .../mod/debugger/gui/CommandLineTextList.java | 196 - .../mcfpp/mod/debugger/gui/EditScreen.java | 75 - .../debugger/gui/EditScreenKeyBinding.java | 26 - .../mcfpp/mod/debugger/DatapackDebugger.java | 30 +- .../top/mcfpp/mod/debugger/DebuggerInfo.java | 13 + .../mod/debugger/EncapsulationBreaker.java | 30 + .../debugger/command/BreakPointCommand.java | 144 +- .../command/BreakpointSuggestionProvider.java | 18 +- .../debugger/command/FunctionInAction.java | 31 +- .../debugger/command/FunctionOutAction.java | 24 +- .../debugger/command/FunctionPathGetter.java | 20 + .../command/FunctionStackManager.java | 31 +- .../debugger/command/FunctionTextLoader.java | 22 + .../top/mcfpp/mod/debugger/dap/DapServer.java | 246 + .../mcfpp/mod/debugger/dap/DebuggerState.java | 165 + .../debugger/dap/WebSocketInputStream.java | 32 + .../debugger/dap/WebSocketOutputStream.java | 39 + .../mod/debugger/dap/WebSocketServer.java | 78 + .../mixin/CommandExecutionContextMixin.java | 161 +- .../debugger/mixin/CommandFunctionMixin.java | 94 +- .../debugger/mixin/FixCommandActionMixin.java | 7 +- .../SingleCommandActionSourcedMixin.java | 38 + .../assets/datapack-debugger/lang/en_us.json | 4 +- .../resources/datapack-debugger.mixins.json | 4 +- vscode/.eslintrc.json | 22 + vscode/.gitignore | 8 + vscode/.vscodeignore | 14 + vscode/LICENSE.txt | 23 + vscode/ThirdPartyNotices.txt | 37 + vscode/package-lock.json | 4252 +++++++++++++++++ vscode/package.json | 136 + vscode/src/SocketDebugSession.ts | 111 + vscode/src/SocketDescriptorFactory.ts | 16 + vscode/src/debug-logger.ts | 20 + vscode/src/debug-tracker.ts | 40 + vscode/src/extension.ts | 30 + vscode/src/logger.ts | 78 + vscode/src/tests/adapter.test.ts | 140 + vscode/src/tests/data/test.md | 5 + vscode/src/tests/data/testLazyBreakpoint.md | 5 + vscode/src/tests/data/testWithException.md | 5 + vscode/src/web-extension.ts | 20 + vscode/tsconfig.json | 30 + 48 files changed, 6210 insertions(+), 490 deletions(-) delete mode 100644 src/client/java/top/mcfpp/mod/debugger/command/EditCommand.java delete mode 100644 src/client/java/top/mcfpp/mod/debugger/gui/CommandHighLineUtils.java delete mode 100644 src/client/java/top/mcfpp/mod/debugger/gui/CommandLineTextList.java delete mode 100644 src/client/java/top/mcfpp/mod/debugger/gui/EditScreen.java delete mode 100644 src/client/java/top/mcfpp/mod/debugger/gui/EditScreenKeyBinding.java create mode 100644 src/main/java/top/mcfpp/mod/debugger/DebuggerInfo.java create mode 100644 src/main/java/top/mcfpp/mod/debugger/EncapsulationBreaker.java create mode 100644 src/main/java/top/mcfpp/mod/debugger/command/FunctionPathGetter.java create mode 100644 src/main/java/top/mcfpp/mod/debugger/dap/DapServer.java create mode 100644 src/main/java/top/mcfpp/mod/debugger/dap/DebuggerState.java create mode 100644 src/main/java/top/mcfpp/mod/debugger/dap/WebSocketInputStream.java create mode 100644 src/main/java/top/mcfpp/mod/debugger/dap/WebSocketOutputStream.java create mode 100644 src/main/java/top/mcfpp/mod/debugger/dap/WebSocketServer.java create mode 100644 src/main/java/top/mcfpp/mod/debugger/mixin/SingleCommandActionSourcedMixin.java create mode 100644 vscode/.eslintrc.json create mode 100644 vscode/.gitignore create mode 100644 vscode/.vscodeignore create mode 100644 vscode/LICENSE.txt create mode 100644 vscode/ThirdPartyNotices.txt create mode 100644 vscode/package-lock.json create mode 100644 vscode/package.json create mode 100644 vscode/src/SocketDebugSession.ts create mode 100644 vscode/src/SocketDescriptorFactory.ts create mode 100644 vscode/src/debug-logger.ts create mode 100644 vscode/src/debug-tracker.ts create mode 100644 vscode/src/extension.ts create mode 100644 vscode/src/logger.ts create mode 100644 vscode/src/tests/adapter.test.ts create mode 100644 vscode/src/tests/data/test.md create mode 100644 vscode/src/tests/data/testLazyBreakpoint.md create mode 100644 vscode/src/tests/data/testWithException.md create mode 100644 vscode/src/web-extension.ts create mode 100644 vscode/tsconfig.json diff --git a/build.gradle b/build.gradle index ebd37e3..7e0ec93 100644 --- a/build.gradle +++ b/build.gradle @@ -31,6 +31,12 @@ loom { } dependencies { + implementation 'org.eclipse.lsp4j:org.eclipse.lsp4j:0.24.0' + implementation 'org.eclipse.lsp4j:org.eclipse.lsp4j.debug:0.24.0' + implementation 'jakarta.websocket:jakarta.websocket-api:2.2.0' + implementation 'org.glassfish.tyrus:tyrus-server:2.2.0' + implementation 'org.glassfish.tyrus:tyrus-container-grizzly-server:2.2.0' + // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" @@ -38,6 +44,7 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + modImplementation "net.fabricmc.fabric-api:fabric-key-binding-api-v1:${project.fabric_version}" } processResources { @@ -57,7 +64,6 @@ java { // if it is present. // If you remove this line, sources will not be generated. withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } diff --git a/gradle.properties b/gradle.properties index 1d27d42..37f7266 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,14 +4,14 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.21 -yarn_mappings=1.21+build.9 -loader_version=0.15.11 +minecraft_version=1.21.4 +yarn_mappings=1.21.4+build.8 +loader_version=0.16.10 # Mod Properties -mod_version=1.1.2 -maven_group=top.mcfpp.mod.debugger +mod_version=1.0.0 +maven_group=net.gunivers archives_base_name=datapack-debugger # Dependencies -fabric_version=0.100.7+1.21 \ No newline at end of file +fabric_version=0.118.0+1.21.4 \ No newline at end of file diff --git a/src/client/java/top/mcfpp/mod/debugger/DatapackBreakpointClient.java b/src/client/java/top/mcfpp/mod/debugger/DatapackBreakpointClient.java index c04eb01..8ee0026 100644 --- a/src/client/java/top/mcfpp/mod/debugger/DatapackBreakpointClient.java +++ b/src/client/java/top/mcfpp/mod/debugger/DatapackBreakpointClient.java @@ -1,14 +1,33 @@ package top.mcfpp.mod.debugger; import net.fabricmc.api.ClientModInitializer; -import top.mcfpp.mod.debugger.command.EditCommand; -import top.mcfpp.mod.debugger.gui.EditScreenKeyBinding; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.util.InputUtil; +import org.lwjgl.glfw.GLFW; +import top.mcfpp.mod.debugger.command.BreakPointCommand;; public class DatapackBreakpointClient implements ClientModInitializer { + + private static KeyBinding stepInto; + @Override public void onInitializeClient() { - // This entrypoint is suitable for setting up client-specific logic, such as rendering. - EditScreenKeyBinding.onInitialize(); - EditCommand.onInitialize(); + stepInto = KeyBindingHelper.registerKeyBinding(new KeyBinding( + "net.gunivers.step", // The translation key of the keybinding's name + InputUtil.Type.KEYSYM, // The type of the keybinding, KEYSYM for keyboard, MOUSE for mouse. + GLFW.GLFW_KEY_F7, // The keycode of the key + "net.gunivers.datapack_debugger" // The translation key of the keybinding's category. + )); + + ClientTickEvents.END_CLIENT_TICK.register(client -> { + while(stepInto.wasPressed()) { + if(BreakPointCommand.debugMode) { + BreakPointCommand.step(1, client.player.getCommandSource(client.getServer().getWorld(client.player.getWorld().getRegistryKey()))); + } + } + }); } + } diff --git a/src/client/java/top/mcfpp/mod/debugger/command/EditCommand.java b/src/client/java/top/mcfpp/mod/debugger/command/EditCommand.java deleted file mode 100644 index 96e268b..0000000 --- a/src/client/java/top/mcfpp/mod/debugger/command/EditCommand.java +++ /dev/null @@ -1,51 +0,0 @@ -package top.mcfpp.mod.debugger.command; - -import com.mojang.brigadier.suggestion.SuggestionProvider; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.minecraft.command.CommandSource; -import net.minecraft.command.argument.IdentifierArgumentType; -import net.minecraft.util.Identifier; -import top.mcfpp.mod.debugger.gui.EditScreen; - - -import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; -import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; - -public class EditCommand { - public static final SuggestionProvider SUGGESTION_PROVIDER = (context, builder) -> { - //CommandSource.suggestIdentifiers(commandFunctionManager.getFunctionTags(), builder, "#"); - return CommandSource.suggestIdentifiers(FunctionTextLoader.functionIds(), builder); - }; - public static void onInitialize(){ - - ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> { - dispatcher.register(literal("edit") - .requires(source->source.hasPermissionLevel(2)) - .executes(context -> { - EditScreen.setOpen(true); - return 1; - }) - .then(argument("name", IdentifierArgumentType.identifier()) - .suggests(SUGGESTION_PROVIDER) - .executes(context -> { - context.getSource().getClient().executeSync(()->{ - Identifier identifier = context.getArgument("name",Identifier.class); - EditScreen.setFunction(identifier); - EditScreen.setOpen(true); - }); - return 1; - })) - ); - - }); - - ClientTickEvents.END_CLIENT_TICK.register(client -> { - while(EditScreen.isOpen()){ - client.setScreen(new EditScreen()); - EditScreen.setOpen(false); - } - }); - } -} diff --git a/src/client/java/top/mcfpp/mod/debugger/gui/CommandHighLineUtils.java b/src/client/java/top/mcfpp/mod/debugger/gui/CommandHighLineUtils.java deleted file mode 100644 index 8690a8f..0000000 --- a/src/client/java/top/mcfpp/mod/debugger/gui/CommandHighLineUtils.java +++ /dev/null @@ -1,80 +0,0 @@ -package top.mcfpp.mod.debugger.gui; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.ParseResults; -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.context.CommandContextBuilder; -import com.mojang.brigadier.context.ParsedArgument; -import net.minecraft.command.CommandSource; -import net.minecraft.text.OrderedText; -import net.minecraft.text.Style; -import net.minecraft.util.Formatting; - -import java.util.List; -import java.util.Objects; -import java.util.stream.Stream; - -public class CommandHighLineUtils { - - public static OrderedText highlightOneLine(CommandDispatcher commandDispatcher, CommandSource commandSource, String original){ - StringReader stringReader = new StringReader(original); - boolean bl = stringReader.canRead() && stringReader.peek() == '/'; - if (bl) { - stringReader.skip(); - } - ParseResults parse = commandDispatcher.parse(stringReader, commandSource); - return highlight(parse,original,bl?1:0); - } - - private static final Style ERROR_STYLE; - private static final Style INFO_STYLE; - private static final List