diff --git a/.vscode/launch.json b/.vscode/launch.json index c8c1f83c8..6de8b630d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,7 +14,8 @@ "sourcePaths": [ "${workspaceRoot}/com.microsoft.java.debug.core/main/java", "${workspaceRoot}/com.microsoft.java.debug.plugin/src/main/java" - ] + ], + "projectName": "com.microsoft.java.debug.plugin" } ] } \ No newline at end of file diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/IProvider.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/IProvider.java index 74b5e17d9..86c30929c 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/IProvider.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/IProvider.java @@ -24,4 +24,10 @@ public interface IProvider { */ default void initialize(IDebugAdapterContext debugContext, Map options) { } + + /** + * Close the provider and free all associated resources. + */ + default void close() { + } } diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/AbstractDisconnectRequestHandler.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/AbstractDisconnectRequestHandler.java index 3a9653dcd..888009890 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/AbstractDisconnectRequestHandler.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/AbstractDisconnectRequestHandler.java @@ -23,6 +23,7 @@ import com.microsoft.java.debug.core.Configuration; import com.microsoft.java.debug.core.adapter.IDebugAdapterContext; import com.microsoft.java.debug.core.adapter.IDebugRequestHandler; +import com.microsoft.java.debug.core.adapter.IHotCodeReplaceProvider; import com.microsoft.java.debug.core.adapter.LaunchMode; import com.microsoft.java.debug.core.protocol.Messages.Response; import com.microsoft.java.debug.core.protocol.Requests.Arguments; @@ -50,6 +51,7 @@ public CompletableFuture handle(Command command, Arguments arguments, * @param context the debug context */ private void destroyResource(IDebugAdapterContext context) { + destroyProviders(context); if (shouldDestroyLaunchFiles(context)) { destroyLaunchFiles(context); } @@ -97,4 +99,11 @@ private void destroyLaunchFiles(IDebugAdapterContext context) { } protected abstract void destroyDebugSession(Command command, Arguments arguments, Response response, IDebugAdapterContext context); + + protected void destroyProviders(IDebugAdapterContext context) { + IHotCodeReplaceProvider hcrProvider = context.getProvider(IHotCodeReplaceProvider.class); + if (hcrProvider != null) { + hcrProvider.close(); + } + } } diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java index 7170e1549..a615e8963 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java @@ -32,5 +32,4 @@ public void destroyDebugSession(Command command, Arguments arguments, Response r } } } - } diff --git a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JavaHotCodeReplaceProvider.java b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JavaHotCodeReplaceProvider.java index e601bc128..3ea1635d2 100644 --- a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JavaHotCodeReplaceProvider.java +++ b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JavaHotCodeReplaceProvider.java @@ -265,8 +265,16 @@ public void initialize(IDebugAdapterContext context, Map options } this.context = context; currentDebugSession = context.getDebugSession(); + } + + @Override + public void close() { + if (DebugSettings.getCurrent().hotCodeReplace != DebugSettings.HotCodeReplace.NEVER) { + // Remove the listener. + ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); + } - // TODO: Change IProvider interface for shutdown event + eventSubject.onComplete(); } @Override