Skip to content

Commit 759f503

Browse files
authored
Merge branch 'main' into findInMap-bug-fix
2 parents 69c083c + eb75e98 commit 759f503

34 files changed

+3673
-38
lines changed

src/artifacts/IntrinsicFunctionsDocs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { IntrinsicFunction } from '../context/ContextType';
22

3-
export const intrinsicFunctionsDocsMap = getIntrinsicFunctionsDocsMap();
3+
export const intrinsicFunctionsDocsMap: ReadonlyMap<IntrinsicFunction, string> = getIntrinsicFunctionsDocsMap();
44

55
function getIntrinsicFunctionsDocsMap(): Map<IntrinsicFunction, string> {
66
const intrinsicFunctionsDocsMap = new Map<IntrinsicFunction, string>();

src/artifacts/OutputSectionFieldDocs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export const outputSectionFieldDocsMap = getOutputSectionFieldDocsMap();
1+
export const outputSectionFieldDocsMap: ReadonlyMap<string, string> = getOutputSectionFieldDocsMap();
22

33
function getOutputSectionFieldDocsMap(): Map<string, string> {
44
const outputSectionFieldDocsMap = new Map<string, string>();

src/artifacts/ParameterAttributeDocs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export const parameterAttributeDocsMap = getParameterAttributeDocsMap();
1+
export const parameterAttributeDocsMap: ReadonlyMap<string, string> = getParameterAttributeDocsMap();
22

33
function getParameterAttributeDocsMap(): Map<string, string> {
44
const parameterAttributeDocsMap = new Map<string, string>();

src/artifacts/PseudoParameterDocs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { PseudoParameter } from '../context/ContextType';
22

3-
export const pseudoParameterDocsMap = getPseudoParameterDocsMap();
3+
export const pseudoParameterDocsMap: ReadonlyMap<PseudoParameter, string> = getPseudoParameterDocsMap();
44

55
function getPseudoParameterDocsMap(): Map<PseudoParameter, string> {
66
const pseudoParameterDocsMap = new Map<PseudoParameter, string>();

src/artifacts/ResourceAttributeDocs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ResourceAttribute } from '../context/ContextType';
22

3-
export const resourceAttributeDocsMap = getResourceAttributeDocsMap();
3+
export const resourceAttributeDocsMap: ReadonlyMap<ResourceAttribute, string> = getResourceAttributeDocsMap();
44

55
function getResourceAttributeDocsMap(): Map<ResourceAttribute, string> {
66
const resourceAttributeDocsMap = new Map<ResourceAttribute, string>();

src/artifacts/TemplateSectionDocs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { TopLevelSection } from '../context/ContextType';
22

3-
export const templateSectionDocsMap = getTemplateSectionDocsMap();
3+
export const templateSectionDocsMap: ReadonlyMap<TopLevelSection, string> = getTemplateSectionDocsMap();
44

55
function getTemplateSectionDocsMap(): Map<TopLevelSection, string> {
66
const templateSectionDocsMap = new Map<TopLevelSection, string>();

src/autocomplete/IntrinsicFunctionArgumentCompletionProvider.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,9 @@ export class IntrinsicFunctionArgumentCompletionProvider implements CompletionPr
247247
return undefined;
248248
}
249249

250-
private getPseudoParametersAsCompletionItems(pseudoParameterMap: Map<PseudoParameter, string>): CompletionItem[] {
250+
private getPseudoParametersAsCompletionItems(
251+
pseudoParameterMap: ReadonlyMap<PseudoParameter, string>,
252+
): CompletionItem[] {
251253
const completionItems: CompletionItem[] = [];
252254
for (const [paramName, doc] of pseudoParameterMap) {
253255
completionItems.push(
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { CodeLens, Position, Range } from 'vscode-languageserver';
2+
import { TextDocument } from 'vscode-languageserver-textdocument';
3+
import { TopLevelSection } from '../context/ContextType';
4+
import { getEntityMap } from '../context/SectionContextBuilder';
5+
import { Resource } from '../context/semantic/Entity';
6+
import { SyntaxTreeManager } from '../context/syntaxtree/SyntaxTreeManager';
7+
import { ServerComponents } from '../server/ServerComponents';
8+
9+
const MANAGED_RESOURCE_CONSTANTS = {
10+
COMMAND_TITLE: 'Open Stack Template',
11+
COMMAND_NAME: 'aws.cloudformation.api.openStackTemplate',
12+
STACK_NAME_REGEX: /^\s*"?StackName"?\s*:/,
13+
} as const;
14+
15+
export class ManagedResourceCodeLens {
16+
constructor(private readonly syntaxTreeManager: SyntaxTreeManager) {}
17+
18+
getCodeLenses(uri: string, document: TextDocument): CodeLens[] {
19+
const lenses: CodeLens[] = [];
20+
21+
const syntaxTree = this.syntaxTreeManager.getSyntaxTree(uri);
22+
if (!syntaxTree) {
23+
return lenses;
24+
}
25+
26+
const resourcesMap = getEntityMap(syntaxTree, TopLevelSection.Resources);
27+
if (!resourcesMap) {
28+
return lenses;
29+
}
30+
31+
const text = document.getText();
32+
const lines = text.split('\n');
33+
34+
for (const [, resourceContext] of resourcesMap) {
35+
const resource = resourceContext.entity as Resource;
36+
const metadata = resource.Metadata;
37+
38+
if (
39+
metadata?.ManagedByStack === true &&
40+
typeof metadata.StackName === 'string' &&
41+
typeof metadata.PrimaryIdentifier === 'string'
42+
) {
43+
const stackName = metadata.StackName;
44+
const primaryIdentifier = metadata.PrimaryIdentifier;
45+
46+
const startRow = resourceContext.startPosition.row;
47+
const endRow = resourceContext.endPosition.row;
48+
49+
for (let i = startRow; i <= endRow && i < lines.length; i++) {
50+
if (MANAGED_RESOURCE_CONSTANTS.STACK_NAME_REGEX.test(lines[i])) {
51+
lenses.push({
52+
range: Range.create(Position.create(i, 0), Position.create(i, 0)),
53+
command: {
54+
title: MANAGED_RESOURCE_CONSTANTS.COMMAND_TITLE,
55+
command: MANAGED_RESOURCE_CONSTANTS.COMMAND_NAME,
56+
arguments: [stackName, primaryIdentifier],
57+
},
58+
});
59+
break;
60+
}
61+
}
62+
}
63+
}
64+
65+
return lenses;
66+
}
67+
68+
static create(components: ServerComponents): ManagedResourceCodeLens {
69+
return new ManagedResourceCodeLens(components.syntaxTreeManager);
70+
}
71+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { CodeLens, Position, Range } from 'vscode-languageserver';
2+
3+
const STACK_ACTION_TITLES = {
4+
DRY_RUN: 'Dry Run Deployment',
5+
DEPLOY: 'Deploy',
6+
} as const;
7+
8+
const STACK_ACTION_COMMANDS = {
9+
VALIDATE: 'aws.cloudformation.api.validateTemplate',
10+
DEPLOY: 'aws.cloudformation.api.deployTemplate',
11+
} as const;
12+
13+
export function getStackActionsCodeLenses(uri: string): CodeLens[] {
14+
const range = Range.create(Position.create(0, 0), Position.create(0, 0));
15+
16+
return [
17+
{
18+
range,
19+
command: {
20+
title: STACK_ACTION_TITLES.DRY_RUN,
21+
command: STACK_ACTION_COMMANDS.VALIDATE,
22+
arguments: [uri],
23+
},
24+
},
25+
{
26+
range,
27+
command: {
28+
title: STACK_ACTION_TITLES.DEPLOY,
29+
command: STACK_ACTION_COMMANDS.DEPLOY,
30+
arguments: [uri],
31+
},
32+
},
33+
];
34+
}

src/handlers/CodeLensHandler.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { CodeLens, CodeLensParams } from 'vscode-languageserver';
2+
import { ServerRequestHandler } from 'vscode-languageserver/lib/common/server';
3+
import { getStackActionsCodeLenses } from '../codeLens/StackActionsCodeLens';
4+
import { ServerComponents } from '../server/ServerComponents';
5+
import { LoggerFactory } from '../telemetry/LoggerFactory';
6+
7+
const log = LoggerFactory.getLogger('CodeLensHandler');
8+
9+
export function codeLensHandler(
10+
components: ServerComponents,
11+
): ServerRequestHandler<CodeLensParams, CodeLens[], never, void> {
12+
return (params, _token, _workDoneProgress, _resultProgress) => {
13+
log.debug({
14+
Handler: 'CodeLens',
15+
Document: params.textDocument.uri,
16+
});
17+
18+
const document = components.documents.documents.get(params.textDocument.uri);
19+
if (!document) {
20+
return [];
21+
}
22+
23+
const stackActions = getStackActionsCodeLenses(params.textDocument.uri);
24+
const managedResourceActions = components.managedResourceCodeLens.getCodeLenses(
25+
params.textDocument.uri,
26+
document,
27+
);
28+
29+
return [...stackActions, ...managedResourceActions];
30+
};
31+
}

0 commit comments

Comments
 (0)