diff --git a/extensions/ql-vscode/src/common/interface-types.ts b/extensions/ql-vscode/src/common/interface-types.ts index 2d8a07fe6..1aaab0634 100644 --- a/extensions/ql-vscode/src/common/interface-types.ts +++ b/extensions/ql-vscode/src/common/interface-types.ts @@ -597,9 +597,15 @@ export type FromModelEditorMessage = | HideModeledMethodsMessage | SetModeledMethodMessage; +interface RevealInEditorMessage { + t: "revealInModelEditor"; + method: Method; +} + export type FromMethodModelingMessage = | CommonFromViewMessages - | SetModeledMethodMessage; + | SetModeledMethodMessage + | RevealInEditorMessage; interface SetMethodMessage { t: "setMethod"; diff --git a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts index e87375dc4..e42539629 100644 --- a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts +++ b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts @@ -10,6 +10,7 @@ import { redactableError } from "../../common/errors"; import { Method } from "../method"; import { ModelingStore } from "../modeling-store"; import { AbstractWebviewViewProvider } from "../../common/vscode/abstract-webview-view-provider"; +import { assertNever } from "../../common/helpers-pure"; export class MethodModelingViewProvider extends AbstractWebviewViewProvider< ToMethodModelingMessage, @@ -87,6 +88,10 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider< ); break; } + case "revealInModelEditor": + break; + default: + assertNever(msg); } } diff --git a/extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx b/extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx index 018376955..0e1d16d43 100644 --- a/extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx +++ b/extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx @@ -7,6 +7,7 @@ import { MethodName } from "../model-editor/MethodName"; import { ModeledMethod } from "../../model-editor/modeled-method"; import { MethodModelingInputs } from "./MethodModelingInputs"; import { VSCodeTag } from "@vscode/webview-ui-toolkit/react"; +import { ReviewInEditorButton } from "./ReviewInEditorButton"; const Container = styled.div` padding: 0.3rem; @@ -64,6 +65,7 @@ export const MethodModeling = ({ modeledMethod={modeledMethod} onChange={onChange} /> + ); }; diff --git a/extensions/ql-vscode/src/view/method-modeling/ReviewInEditorButton.tsx b/extensions/ql-vscode/src/view/method-modeling/ReviewInEditorButton.tsx new file mode 100644 index 000000000..a77c61146 --- /dev/null +++ b/extensions/ql-vscode/src/view/method-modeling/ReviewInEditorButton.tsx @@ -0,0 +1,25 @@ +import * as React from "react"; +import { useCallback } from "react"; +import { styled } from "styled-components"; +import { vscode } from "../vscode-api"; +import TextButton from "../common/TextButton"; +import { Method } from "../../model-editor/method"; + +const Button = styled(TextButton)` + margin-top: 0.5rem; +`; + +type Props = { + method: Method; +}; + +export const ReviewInEditorButton = ({ method }: Props) => { + const handleClick = useCallback(() => { + vscode.postMessage({ + t: "revealInModelEditor", + method, + }); + }, [method]); + + return ; +}; diff --git a/extensions/ql-vscode/src/view/vscode-api.ts b/extensions/ql-vscode/src/view/vscode-api.ts index ae75480ce..1b2e3fb6f 100644 --- a/extensions/ql-vscode/src/view/vscode-api.ts +++ b/extensions/ql-vscode/src/view/vscode-api.ts @@ -1,5 +1,6 @@ import { FromCompareViewMessage, + FromMethodModelingMessage, FromModelEditorMessage, FromResultsViewMsg, FromVariantAnalysisMessage, @@ -15,7 +16,8 @@ export interface VsCodeApi { | FromResultsViewMsg | FromCompareViewMessage | FromVariantAnalysisMessage - | FromModelEditorMessage, + | FromModelEditorMessage + | FromMethodModelingMessage, ): void; /**