diff --git a/extensions/ql-vscode/src/stories/model-editor/ExternalApiUsageName.stories.tsx b/extensions/ql-vscode/src/stories/model-editor/ExternalApiUsageName.stories.tsx new file mode 100644 index 000000000..46c1600fa --- /dev/null +++ b/extensions/ql-vscode/src/stories/model-editor/ExternalApiUsageName.stories.tsx @@ -0,0 +1,18 @@ +import * as React from "react"; + +import { Meta, StoryFn } from "@storybook/react"; + +import { ExternalApiUsageName as ExternalApiUsageNameComponent } from "../../view/model-editor/ExternalApiUsageName"; +import { createExternalApiUsage } from "../../../test/factories/data-extension/external-api-factories"; + +export default { + title: "CodeQL Model Editor/External API Usage Name", + component: ExternalApiUsageNameComponent, +} as Meta; + +const Template: StoryFn = (args) => ( + +); + +export const ExternalApiUsageName = Template.bind({}); +ExternalApiUsageName.args = createExternalApiUsage(); diff --git a/extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx b/extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx index 0b66bd26a..9d25fbeed 100644 --- a/extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx +++ b/extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx @@ -4,6 +4,8 @@ import { ModelingStatus, ModelingStatusIndicator, } from "../model-editor/ModelingStatusIndicator"; +import { ExternalApiUsage } from "../../model-editor/external-api-usage"; +import { ExternalApiUsageName } from "../model-editor/ExternalApiUsageName"; const Container = styled.div` background-color: var(--vscode-peekViewResult-background); @@ -21,21 +23,20 @@ const DependencyContainer = styled.div` justify-content: space-between; `; -const DependencyName = styled.span` - font-family: var(--vscode-editor-font-family); -`; - export type MethodModelingProps = { modelingStatus: ModelingStatus; + externalApiUsage: ExternalApiUsage; }; -export const MethodModeling = (props: MethodModelingProps) => { - const { modelingStatus } = props; +export const MethodModeling = ({ + modelingStatus, + externalApiUsage, +}: MethodModelingProps): JSX.Element => { return ( API or Method - that.dependency.THENAME + diff --git a/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx b/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx index 46fe2926e..f57e301b9 100644 --- a/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx +++ b/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx @@ -2,6 +2,7 @@ import * as React from "react"; import { useEffect } from "react"; import { MethodModeling } from "./MethodModeling"; import { ModelingStatus } from "../model-editor/ModelingStatusIndicator"; +import { ExternalApiUsage } from "../../model-editor/external-api-usage"; export function MethodModelingView(): JSX.Element { useEffect(() => { @@ -22,5 +23,22 @@ export function MethodModelingView(): JSX.Element { }, []); const modelingStatus: ModelingStatus = "saved"; - return ; + const externalApiUsage: ExternalApiUsage = { + library: "sql2o", + libraryVersion: "1.6.0", + signature: "org.sql2o.Connection#createQuery(String)", + packageName: "org.sql2o", + typeName: "Connection", + methodName: "createQuery", + methodParameters: "(String)", + supported: true, + supportedType: "summary", + usages: [], + }; + return ( + + ); } diff --git a/extensions/ql-vscode/src/view/method-modeling/__tests__/MethodModeling.spec.tsx b/extensions/ql-vscode/src/view/method-modeling/__tests__/MethodModeling.spec.tsx index 39d3862b1..2c411891f 100644 --- a/extensions/ql-vscode/src/view/method-modeling/__tests__/MethodModeling.spec.tsx +++ b/extensions/ql-vscode/src/view/method-modeling/__tests__/MethodModeling.spec.tsx @@ -1,14 +1,18 @@ import * as React from "react"; import { render as reactRender, screen } from "@testing-library/react"; import { MethodModeling, MethodModelingProps } from "../MethodModeling"; +import { createExternalApiUsage } from "../../../../test/factories/data-extension/external-api-factories"; describe(MethodModeling.name, () => { const render = (props: MethodModelingProps) => reactRender(); - it("renders method name", () => { - render({ modelingStatus: "saved" }); + it("renders method modeling panel", () => { + render({ + modelingStatus: "saved", + externalApiUsage: createExternalApiUsage(), + }); - expect(screen.getByText("that.dependency.THENAME")).toBeInTheDocument(); + expect(screen.getByText("API or Method")).toBeInTheDocument(); }); }); diff --git a/extensions/ql-vscode/src/view/model-editor/ExternalApiUsageName.tsx b/extensions/ql-vscode/src/view/model-editor/ExternalApiUsageName.tsx new file mode 100644 index 000000000..495f51114 --- /dev/null +++ b/extensions/ql-vscode/src/view/model-editor/ExternalApiUsageName.tsx @@ -0,0 +1,19 @@ +import * as React from "react"; +import { styled } from "styled-components"; +import { ExternalApiUsage } from "../../model-editor/external-api-usage"; + +const Name = styled.span` + font-family: var(--vscode-editor-font-family); +`; + +export const ExternalApiUsageName = ( + externalApiUsage: ExternalApiUsage, +): JSX.Element => { + return ( + + {externalApiUsage.packageName && <>{externalApiUsage.packageName}.} + {externalApiUsage.typeName}.{externalApiUsage.methodName} + {externalApiUsage.methodParameters} + + ); +}; diff --git a/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx index aadb5df3d..1d94698c5 100644 --- a/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx @@ -25,6 +25,7 @@ import { ModelingStatusIndicator, } from "./ModelingStatusIndicator"; import { InProgressDropdown } from "./InProgressDropdown"; +import { ExternalApiUsageName } from "./ExternalApiUsageName"; const ApiOrMethodCell = styled(VSCodeDataGridCell)` display: flex; @@ -218,7 +219,7 @@ function ModelableMethodRow(props: Props) { - + {mode === Mode.Application && ( {externalApiUsage.usages.length} @@ -294,7 +295,7 @@ function UnmodelableMethodRow(props: Props) { - + {mode === Mode.Application && ( {externalApiUsage.usages.length} @@ -310,18 +311,6 @@ function UnmodelableMethodRow(props: Props) { ); } -function ExternalApiUsageName(props: { externalApiUsage: ExternalApiUsage }) { - return ( - - {props.externalApiUsage.packageName && ( - <>{props.externalApiUsage.packageName}. - )} - {props.externalApiUsage.typeName}.{props.externalApiUsage.methodName} - {props.externalApiUsage.methodParameters} - - ); -} - function sendJumpToUsageMessage(externalApiUsage: ExternalApiUsage) { vscode.postMessage({ t: "jumpToUsage", diff --git a/extensions/ql-vscode/src/view/model-editor/__tests__/ExternalApiUsageName.spec.tsx b/extensions/ql-vscode/src/view/model-editor/__tests__/ExternalApiUsageName.spec.tsx new file mode 100644 index 000000000..87b59013c --- /dev/null +++ b/extensions/ql-vscode/src/view/model-editor/__tests__/ExternalApiUsageName.spec.tsx @@ -0,0 +1,18 @@ +import * as React from "react"; +import { render as reactRender, screen } from "@testing-library/react"; +import { ExternalApiUsageName } from "../ExternalApiUsageName"; +import { ExternalApiUsage } from "../../../model-editor/external-api-usage"; +import { createExternalApiUsage } from "../../../../test/factories/data-extension/external-api-factories"; + +describe(ExternalApiUsageName.name, () => { + const render = (props: ExternalApiUsage) => + reactRender(); + + it("renders method name", () => { + const apiUsage = createExternalApiUsage(); + render(apiUsage); + + const name = `${apiUsage.packageName}.${apiUsage.typeName}.${apiUsage.methodName}${apiUsage.methodParameters}`; + expect(screen.getByText(name)).toBeInTheDocument(); + }); +}); diff --git a/extensions/ql-vscode/test/factories/data-extension/external-api-factories.ts b/extensions/ql-vscode/test/factories/data-extension/external-api-factories.ts index 1b7941119..540973e17 100644 --- a/extensions/ql-vscode/test/factories/data-extension/external-api-factories.ts +++ b/extensions/ql-vscode/test/factories/data-extension/external-api-factories.ts @@ -7,15 +7,15 @@ import { ModeledMethodType } from "../../../src/model-editor/modeled-method"; import { ResolvableLocationValue } from "../../../src/common/bqrs-cli-types"; export function createExternalApiUsage({ - library = "test", + library = "sql2o-1.6.0.jar", supported = true, - supportedType = "none" as ModeledMethodType, + supportedType = "summary" as ModeledMethodType, usages = [], - signature = "test", - packageName = "test", - typeName = "test", - methodName = "test", - methodParameters = "test", + signature = "org.sql2o.Sql2o#open()", + packageName = "org.sql2o", + typeName = "Sql2o", + methodName = "open", + methodParameters = "()", }: { library?: string; supported?: boolean;