From 8432f6cdfef41e12be7a409391718546cb4266b3 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 13:50:31 +0100 Subject: [PATCH 01/11] Move predicate variable closer to where it's used --- .../src/view/data-extensions-editor/MethodRow.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index 6f1a9ef4b..aee458f78 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -137,11 +137,6 @@ export const MethodRow = ({ }); }, [externalApiUsage]); - const predicate = - modeledMethod?.type && modeledMethod.type !== "none" - ? extensiblePredicateDefinitions[modeledMethod.type] - : undefined; - const showModelTypeCell = !externalApiUsage.supported || (modeledMethod && modeledMethod?.type !== "none"); @@ -183,6 +178,10 @@ export const MethodRow = ({ [argumentsList], ); + const predicate = + modeledMethod?.type && modeledMethod.type !== "none" + ? extensiblePredicateDefinitions[modeledMethod.type] + : undefined; const showKindCell = predicate?.supportedKinds; return ( From 70b2e68ce7a1cdd152e7af769b97e5474b7272e2 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 14:01:01 +0100 Subject: [PATCH 02/11] Rename showModelTypeCell => methodCanBeModeled --- .../ql-vscode/src/view/data-extensions-editor/MethodRow.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index aee458f78..439c32707 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -137,7 +137,7 @@ export const MethodRow = ({ }); }, [externalApiUsage]); - const showModelTypeCell = + const methodCanBeModeled = !externalApiUsage.supported || (modeledMethod && modeledMethod?.type !== "none"); const modelTypeOptions = useMemo( @@ -204,7 +204,7 @@ export const MethodRow = ({ From 8529c05396d6fb6d741d29b568b627a21ae86c35 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 14:02:39 +0100 Subject: [PATCH 03/11] Move boolean showXCell variables to be later and together --- .../src/view/data-extensions-editor/MethodRow.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index 439c32707..f767cbb05 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -137,9 +137,6 @@ export const MethodRow = ({ }); }, [externalApiUsage]); - const methodCanBeModeled = - !externalApiUsage.supported || - (modeledMethod && modeledMethod?.type !== "none"); const modelTypeOptions = useMemo( () => [ { value: "none", label: "Unmodeled" }, @@ -151,8 +148,6 @@ export const MethodRow = ({ [], ); - const showInputCell = - modeledMethod?.type && ["sink", "summary"].includes(modeledMethod?.type); const inputOptions = useMemo( () => [ { value: "Argument[this]", label: "Argument[this]" }, @@ -164,8 +159,6 @@ export const MethodRow = ({ [argumentsList], ); - const showOutputCell = - modeledMethod?.type && ["source", "summary"].includes(modeledMethod?.type); const outputOptions = useMemo( () => [ { value: "ReturnValue", label: "ReturnValue" }, @@ -178,6 +171,13 @@ export const MethodRow = ({ [argumentsList], ); + const methodCanBeModeled = + !externalApiUsage.supported || + (modeledMethod && modeledMethod?.type !== "none"); + const showInputCell = + modeledMethod?.type && ["sink", "summary"].includes(modeledMethod?.type); + const showOutputCell = + modeledMethod?.type && ["source", "summary"].includes(modeledMethod?.type); const predicate = modeledMethod?.type && modeledMethod.type !== "none" ? extensiblePredicateDefinitions[modeledMethod.type] From 5fa338e460a8b2dfb6da0605676c022a264d70c9 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 14:04:58 +0100 Subject: [PATCH 04/11] Return early if method cannot be modeled --- .../view/data-extensions-editor/MethodRow.tsx | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index f767cbb05..fe351046c 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -174,6 +174,36 @@ export const MethodRow = ({ const methodCanBeModeled = !externalApiUsage.supported || (modeledMethod && modeledMethod?.type !== "none"); + + const externalApiUsageName = ( + + {externalApiUsage.packageName}.{externalApiUsage.typeName}. + {externalApiUsage.methodName} + {externalApiUsage.methodParameters} + + ); + + if (!methodCanBeModeled) { + return ( + + + + {externalApiUsageName} + {mode === Mode.Application && ( + + {externalApiUsage.usages.length} + + )} + View + + + + + + + ); + } + const showInputCell = modeledMethod?.type && ["sink", "summary"].includes(modeledMethod?.type); const showOutputCell = @@ -188,11 +218,7 @@ export const MethodRow = ({ - - {externalApiUsage.packageName}.{externalApiUsage.typeName}. - {externalApiUsage.methodName} - {externalApiUsage.methodParameters} - + {externalApiUsageName} {mode === Mode.Application && ( {externalApiUsage.usages.length} @@ -204,7 +230,6 @@ export const MethodRow = ({ From 799b96e7f6e4dc5e26ffd067fd997d3a7fd34574 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 14:05:57 +0100 Subject: [PATCH 05/11] Convert modelTypeOptions to be a const --- .../view/data-extensions-editor/MethodRow.tsx | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index fe351046c..50d72431f 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -39,6 +39,14 @@ const ViewLink = styled(VSCodeLink)` white-space: nowrap; `; +const modelTypeOptions = [ + { value: "none", label: "Unmodeled" }, + { value: "source", label: "Source" }, + { value: "sink", label: "Sink" }, + { value: "summary", label: "Flow summary" }, + { value: "neutral", label: "Neutral" }, +]; + type Props = { externalApiUsage: ExternalApiUsage; modeledMethod: ModeledMethod | undefined; @@ -137,17 +145,6 @@ export const MethodRow = ({ }); }, [externalApiUsage]); - const modelTypeOptions = useMemo( - () => [ - { value: "none", label: "Unmodeled" }, - { value: "source", label: "Source" }, - { value: "sink", label: "Sink" }, - { value: "summary", label: "Flow summary" }, - { value: "neutral", label: "Neutral" }, - ], - [], - ); - const inputOptions = useMemo( () => [ { value: "Argument[this]", label: "Argument[this]" }, From aba574e4232dd8fcdfaf73d8de7f17a19dc7cae2 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 14:14:51 +0100 Subject: [PATCH 06/11] Pull out UmmodelableMethodRow to a separate component --- .../view/data-extensions-editor/MethodRow.tsx | 74 ++++++++++--------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index 50d72431f..9aa3d462e 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -57,12 +57,9 @@ type Props = { ) => void; }; -export const MethodRow = ({ - externalApiUsage, - modeledMethod, - mode, - onChange, -}: Props) => { +export const MethodRow = (props: Props) => { + const { externalApiUsage, modeledMethod, mode, onChange } = props; + const argumentsList = useMemo(() => { if (externalApiUsage.methodParameters === "()") { return []; @@ -172,33 +169,8 @@ export const MethodRow = ({ !externalApiUsage.supported || (modeledMethod && modeledMethod?.type !== "none"); - const externalApiUsageName = ( - - {externalApiUsage.packageName}.{externalApiUsage.typeName}. - {externalApiUsage.methodName} - {externalApiUsage.methodParameters} - - ); - if (!methodCanBeModeled) { - return ( - - - - {externalApiUsageName} - {mode === Mode.Application && ( - - {externalApiUsage.usages.length} - - )} - View - - - - - - - ); + return ; } const showInputCell = @@ -215,7 +187,7 @@ export const MethodRow = ({ - {externalApiUsageName} + {mode === Mode.Application && ( {externalApiUsage.usages.length} @@ -257,3 +229,39 @@ export const MethodRow = ({ ); }; + +function UmmodelableMethodRow(props: { + externalApiUsage: ExternalApiUsage; + mode: Mode; + jumpToUsage: () => void; +}) { + const { externalApiUsage, mode, jumpToUsage } = props; + return ( + + + + + {mode === Mode.Application && ( + + {externalApiUsage.usages.length} + + )} + View + + + + + + + ); +} + +function ExternalApiUsageName(props: { externalApiUsage: ExternalApiUsage }) { + return ( + + {props.externalApiUsage.packageName}.{props.externalApiUsage.typeName}. + {props.externalApiUsage.methodName} + {props.externalApiUsage.methodParameters} + + ); +} From 7d59224407eae1d87791704217b29546dd3bff9d Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 14:18:19 +0100 Subject: [PATCH 07/11] Pull out ModelableMethodRow as a separate component --- .../view/data-extensions-editor/MethodRow.tsx | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index 9aa3d462e..1fb86b584 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -58,7 +58,30 @@ type Props = { }; export const MethodRow = (props: Props) => { - const { externalApiUsage, modeledMethod, mode, onChange } = props; + const { externalApiUsage, modeledMethod } = props; + + const jumpToUsage = useCallback(() => { + vscode.postMessage({ + t: "jumpToUsage", + // In framework mode, the first and only usage is the definition of the method + location: externalApiUsage.usages[0].url, + }); + }, [externalApiUsage]); + + const methodCanBeModeled = + !externalApiUsage.supported || + (modeledMethod && modeledMethod?.type !== "none"); + + if (methodCanBeModeled) { + return ; + } else { + return ; + } +}; + +function ModelableMethodRow(props: Props & { jumpToUsage: () => void }) { + const { externalApiUsage, modeledMethod, mode, onChange, jumpToUsage } = + props; const argumentsList = useMemo(() => { if (externalApiUsage.methodParameters === "()") { @@ -134,14 +157,6 @@ export const MethodRow = (props: Props) => { [onChange, externalApiUsage, modeledMethod], ); - const jumpToUsage = useCallback(() => { - vscode.postMessage({ - t: "jumpToUsage", - // In framework mode, the first and only usage is the definition of the method - location: externalApiUsage.usages[0].url, - }); - }, [externalApiUsage]); - const inputOptions = useMemo( () => [ { value: "Argument[this]", label: "Argument[this]" }, @@ -165,14 +180,6 @@ export const MethodRow = (props: Props) => { [argumentsList], ); - const methodCanBeModeled = - !externalApiUsage.supported || - (modeledMethod && modeledMethod?.type !== "none"); - - if (!methodCanBeModeled) { - return ; - } - const showInputCell = modeledMethod?.type && ["sink", "summary"].includes(modeledMethod?.type); const showOutputCell = @@ -228,7 +235,7 @@ export const MethodRow = (props: Props) => { ); -}; +} function UmmodelableMethodRow(props: { externalApiUsage: ExternalApiUsage; From 8ec08ef43f96bf8d0c0192d28675fe93ece19ad2 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 14:20:58 +0100 Subject: [PATCH 08/11] Remove ugly jumpToUsage prop --- .../view/data-extensions-editor/MethodRow.tsx | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index 1fb86b584..e78baffcc 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -60,28 +60,19 @@ type Props = { export const MethodRow = (props: Props) => { const { externalApiUsage, modeledMethod } = props; - const jumpToUsage = useCallback(() => { - vscode.postMessage({ - t: "jumpToUsage", - // In framework mode, the first and only usage is the definition of the method - location: externalApiUsage.usages[0].url, - }); - }, [externalApiUsage]); - const methodCanBeModeled = !externalApiUsage.supported || (modeledMethod && modeledMethod?.type !== "none"); if (methodCanBeModeled) { - return ; + return ; } else { - return ; + return ; } }; -function ModelableMethodRow(props: Props & { jumpToUsage: () => void }) { - const { externalApiUsage, modeledMethod, mode, onChange, jumpToUsage } = - props; +function ModelableMethodRow(props: Props) { + const { externalApiUsage, modeledMethod, mode, onChange } = props; const argumentsList = useMemo(() => { if (externalApiUsage.methodParameters === "()") { @@ -157,6 +148,11 @@ function ModelableMethodRow(props: Props & { jumpToUsage: () => void }) { [onChange, externalApiUsage, modeledMethod], ); + const jumpToUsage = useCallback( + () => sendJumpToUsageMessage(externalApiUsage), + [externalApiUsage], + ); + const inputOptions = useMemo( () => [ { value: "Argument[this]", label: "Argument[this]" }, @@ -240,9 +236,14 @@ function ModelableMethodRow(props: Props & { jumpToUsage: () => void }) { function UmmodelableMethodRow(props: { externalApiUsage: ExternalApiUsage; mode: Mode; - jumpToUsage: () => void; }) { - const { externalApiUsage, mode, jumpToUsage } = props; + const { externalApiUsage, mode } = props; + + const jumpToUsage = useCallback( + () => sendJumpToUsageMessage(externalApiUsage), + [externalApiUsage], + ); + return ( @@ -272,3 +273,11 @@ function ExternalApiUsageName(props: { externalApiUsage: ExternalApiUsage }) { ); } + +function sendJumpToUsageMessage(externalApiUsage: ExternalApiUsage) { + vscode.postMessage({ + t: "jumpToUsage", + // In framework mode, the first and only usage is the definition of the method + location: externalApiUsage.usages[0].url, + }); +} From fa5c24d8370bca9fc5431b69ce812307838cf19f Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 14:56:15 +0100 Subject: [PATCH 09/11] Display an explanatory message on unmodelable methods --- .../src/view/data-extensions-editor/MethodRow.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index e78baffcc..ab6d326ca 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -256,10 +256,9 @@ function UmmodelableMethodRow(props: { )} View - - - - + + Method modeled by CodeQL or another extension pack + ); } From 0f39d41e508d3522401367fd89fbe578e33f197c Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 16:37:18 +0100 Subject: [PATCH 10/11] fix typo --- .../ql-vscode/src/view/data-extensions-editor/MethodRow.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index ab6d326ca..5d4e0b648 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -67,7 +67,7 @@ export const MethodRow = (props: Props) => { if (methodCanBeModeled) { return ; } else { - return ; + return ; } }; @@ -233,7 +233,7 @@ function ModelableMethodRow(props: Props) { ); } -function UmmodelableMethodRow(props: { +function UnmodelableMethodRow(props: { externalApiUsage: ExternalApiUsage; mode: Mode; }) { From e55800ae2d7f30dcf0195f6efc6516d7144ae5ad Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 12 Jul 2023 16:37:44 +0100 Subject: [PATCH 11/11] Tweak message --- .../ql-vscode/src/view/data-extensions-editor/MethodRow.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx index 5d4e0b648..27ffa0fe9 100644 --- a/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx @@ -257,7 +257,7 @@ function UnmodelableMethodRow(props: { View - Method modeled by CodeQL or another extension pack + Method already modeled by CodeQL or a different extension pack );