From 6ee78f22fbb1831428633f8d68fd69b55eadc494 Mon Sep 17 00:00:00 2001 From: Zeeshan Ahmed Date: Mon, 6 Oct 2025 01:21:10 -0400 Subject: [PATCH] provide stack mgmt info for a resource --- src/handlers/ResourceHandler.ts | 10 ++++++++++ src/protocol/LspResourceHandlers.ts | 7 +++++++ src/resourceState/ResourceStateTypes.ts | 5 +++++ src/resourceState/StackManagementInfoProvider.ts | 2 +- src/server/CfnServer.ts | 2 ++ 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/handlers/ResourceHandler.ts b/src/handlers/ResourceHandler.ts index a95b697b..cd53c0eb 100644 --- a/src/handlers/ResourceHandler.ts +++ b/src/handlers/ResourceHandler.ts @@ -8,7 +8,9 @@ import { ResourceStateParams, ResourceStateResult, ResourceSummary, + ResourceIdentifier, } from '../resourceState/ResourceStateTypes'; +import { ResourceStackManagementResult } from '../resourceState/StackManagementInfoProvider'; import { ServerComponents } from '../server/ServerComponents'; import { LoggerFactory } from '../telemetry/LoggerFactory'; import { extractErrorMessage } from '../utils/Errors'; @@ -86,3 +88,11 @@ export function refreshResourceListHandler( } }; } + +export function getStackMgmtInfo( + components: ServerComponents, +): ServerRequestHandler { + return async (id) => { + return await components.stackManagementInfoProvider.getResourceManagementState(id); + }; +} diff --git a/src/protocol/LspResourceHandlers.ts b/src/protocol/LspResourceHandlers.ts index 9783ae3c..c0838db1 100644 --- a/src/protocol/LspResourceHandlers.ts +++ b/src/protocol/LspResourceHandlers.ts @@ -11,7 +11,10 @@ import { RefreshResourceListRequest, RefreshResourcesParams, RefreshResourcesResult, + StackMgmtInfoRequest, + ResourceIdentifier, } from '../resourceState/ResourceStateTypes'; +import { ResourceStackManagementResult } from '../resourceState/StackManagementInfoProvider'; export class LspResourceHandlers { constructor(private readonly connection: Connection) {} @@ -31,4 +34,8 @@ export class LspResourceHandlers { onResourceStateImport(handler: ServerRequestHandler) { this.connection.onRequest(ResourceStateRequest.method, handler); } + + onStackMgmtInfo(handler: ServerRequestHandler) { + this.connection.onRequest(StackMgmtInfoRequest.method, handler); + } } diff --git a/src/resourceState/ResourceStateTypes.ts b/src/resourceState/ResourceStateTypes.ts index 306ed25f..60e978af 100644 --- a/src/resourceState/ResourceStateTypes.ts +++ b/src/resourceState/ResourceStateTypes.ts @@ -1,5 +1,6 @@ import { CodeAction, CodeActionParams } from 'vscode-languageserver'; import { RequestType } from 'vscode-languageserver-protocol'; +import { ResourceStackManagementResult } from './StackManagementInfoProvider'; // eslint-disable-next-line @typescript-eslint/no-empty-object-type export type ResourceTypesParams = {}; @@ -86,3 +87,7 @@ export interface ResourceTemplateFormat { }; }; } + +export const StackMgmtInfoRequest = new RequestType( + 'aws/cfn/resources/stackMgmtInfo', +); diff --git a/src/resourceState/StackManagementInfoProvider.ts b/src/resourceState/StackManagementInfoProvider.ts index 796314df..d45b8b1f 100644 --- a/src/resourceState/StackManagementInfoProvider.ts +++ b/src/resourceState/StackManagementInfoProvider.ts @@ -2,7 +2,7 @@ import { CloudFormationServiceException } from '@aws-sdk/client-cloudformation'; import { CfnService } from '../services/CfnService'; import { LoggerFactory } from '../telemetry/LoggerFactory'; -type ResourceStackManagementResult = { +export type ResourceStackManagementResult = { physicalResourceId: string; managedByStack: boolean | undefined; stackName?: string; diff --git a/src/server/CfnServer.ts b/src/server/CfnServer.ts index faf514ec..f348ff4f 100644 --- a/src/server/CfnServer.ts +++ b/src/server/CfnServer.ts @@ -22,6 +22,7 @@ import { getResourceTypesHandler, importResourceStateHandler, refreshResourceListHandler, + getStackMgmtInfo, } from '../handlers/ResourceHandler'; import { listStacksHandler } from '../handlers/StackHandler'; import { @@ -82,6 +83,7 @@ export class CfnServer { this.features.resourceHandlers.onRefreshResourceList(refreshResourceListHandler(this.components)); this.features.resourceHandlers.onGetResourceTypes(getResourceTypesHandler(this.components)); this.features.resourceHandlers.onResourceStateImport(importResourceStateHandler(this.components)); + this.features.resourceHandlers.onStackMgmtInfo(getStackMgmtInfo(this.components)); } async close(): Promise {