Skip to content

Commit 64f6a77

Browse files
Merge pull request #2800 from github/robertbrignull/num-hidden-methods
Add a row to the model editor tables showing how many methods have been hidden
2 parents 7a2b614 + b04ecc9 commit 64f6a77

3 files changed

Lines changed: 102 additions & 42 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import {
2+
VSCodeDataGridCell,
3+
VSCodeDataGridRow,
4+
} from "@vscode/webview-ui-toolkit/react";
5+
import * as React from "react";
6+
import { styled } from "styled-components";
7+
import { pluralize } from "../../common/word";
8+
9+
const HiddenMethodsCell = styled(VSCodeDataGridCell)`
10+
text-align: center;
11+
`;
12+
13+
interface Props {
14+
numHiddenMethods: number;
15+
someMethodsAreVisible: boolean;
16+
}
17+
18+
export function HiddenMethodsRow({
19+
numHiddenMethods,
20+
someMethodsAreVisible,
21+
}: Props) {
22+
if (numHiddenMethods === 0) {
23+
return null;
24+
}
25+
26+
return (
27+
<VSCodeDataGridRow>
28+
<HiddenMethodsCell gridColumn="span 5">
29+
{someMethodsAreVisible && "And "}
30+
{pluralize(numHiddenMethods, "method", "methods")} modeled in other
31+
CodeQL packs
32+
</HiddenMethodsCell>
33+
</VSCodeDataGridRow>
34+
);
35+
}

extensions/ql-vscode/src/view/model-editor/MethodRow.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,26 +62,19 @@ const modelTypeOptions: Array<{ value: ModeledMethodType; label: string }> = [
6262

6363
type Props = {
6464
method: Method;
65+
methodCanBeModeled: boolean;
6566
modeledMethod: ModeledMethod | undefined;
6667
methodIsUnsaved: boolean;
6768
modelingInProgress: boolean;
6869
mode: Mode;
69-
hideModeledApis: boolean;
7070
onChange: (method: Method, modeledMethod: ModeledMethod) => void;
7171
};
7272

7373
export const MethodRow = (props: Props) => {
74-
const { method, modeledMethod, methodIsUnsaved, hideModeledApis } = props;
75-
76-
const methodCanBeModeled =
77-
!method.supported ||
78-
(modeledMethod && modeledMethod?.type !== "none") ||
79-
methodIsUnsaved;
74+
const { methodCanBeModeled } = props;
8075

8176
if (methodCanBeModeled) {
8277
return <ModelableMethodRow {...props} />;
83-
} else if (hideModeledApis) {
84-
return null;
8578
} else {
8679
return <UnmodelableMethodRow {...props} />;
8780
}

extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx

Lines changed: 65 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { useMemo } from "react";
1111
import { Mode } from "../../model-editor/shared/mode";
1212
import { sortMethods } from "../../model-editor/shared/sorting";
1313
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods";
14+
import { HiddenMethodsRow } from "./HiddenMethodsRow";
1415

1516
export const GRID_TEMPLATE_COLUMNS = "0.5fr 0.125fr 0.125fr 0.125fr 0.125fr";
1617

@@ -35,42 +36,73 @@ export const ModeledMethodDataGrid = ({
3536
hideModeledApis,
3637
onChange,
3738
}: Props) => {
38-
const sortedMethods = useMemo(() => sortMethods(methods), [methods]);
39+
const [methodsWithModelability, numHiddenMethods]: [
40+
Array<{ method: Method; methodCanBeModeled: boolean }>,
41+
number,
42+
] = useMemo(() => {
43+
const methodsWithModelability = [];
44+
let numHiddenMethods = 0;
45+
for (const method of sortMethods(methods)) {
46+
const modeledMethod = modeledMethods[method.signature];
47+
const methodIsUnsaved = modifiedSignatures.has(method.signature);
48+
const methodCanBeModeled =
49+
!method.supported ||
50+
(modeledMethod && modeledMethod?.type !== "none") ||
51+
methodIsUnsaved;
52+
53+
if (methodCanBeModeled || !hideModeledApis) {
54+
methodsWithModelability.push({ method, methodCanBeModeled });
55+
} else {
56+
numHiddenMethods += 1;
57+
}
58+
}
59+
return [methodsWithModelability, numHiddenMethods];
60+
}, [hideModeledApis, methods, modeledMethods, modifiedSignatures]);
61+
62+
const someMethodsAreVisible = methodsWithModelability.length > 0;
3963

4064
return (
4165
<VSCodeDataGrid gridTemplateColumns={GRID_TEMPLATE_COLUMNS}>
42-
<VSCodeDataGridRow rowType="header">
43-
<VSCodeDataGridCell cellType="columnheader" gridColumn={1}>
44-
API or method
45-
</VSCodeDataGridCell>
46-
<VSCodeDataGridCell cellType="columnheader" gridColumn={2}>
47-
Model type
48-
</VSCodeDataGridCell>
49-
<VSCodeDataGridCell cellType="columnheader" gridColumn={3}>
50-
Input
51-
</VSCodeDataGridCell>
52-
<VSCodeDataGridCell cellType="columnheader" gridColumn={4}>
53-
Output
54-
</VSCodeDataGridCell>
55-
<VSCodeDataGridCell cellType="columnheader" gridColumn={5}>
56-
Kind
57-
</VSCodeDataGridCell>
58-
</VSCodeDataGridRow>
59-
{sortedMethods.map((method) => (
60-
<MethodRow
61-
key={method.signature}
62-
method={method}
63-
modeledMethod={modeledMethods[method.signature]}
64-
methodIsUnsaved={modifiedSignatures.has(method.signature)}
65-
modelingInProgress={inProgressMethods.hasMethod(
66-
packageName,
67-
method.signature,
68-
)}
69-
mode={mode}
70-
hideModeledApis={hideModeledApis}
71-
onChange={onChange}
72-
/>
73-
))}
66+
{someMethodsAreVisible && (
67+
<>
68+
<VSCodeDataGridRow rowType="header">
69+
<VSCodeDataGridCell cellType="columnheader" gridColumn={1}>
70+
API or method
71+
</VSCodeDataGridCell>
72+
<VSCodeDataGridCell cellType="columnheader" gridColumn={2}>
73+
Model type
74+
</VSCodeDataGridCell>
75+
<VSCodeDataGridCell cellType="columnheader" gridColumn={3}>
76+
Input
77+
</VSCodeDataGridCell>
78+
<VSCodeDataGridCell cellType="columnheader" gridColumn={4}>
79+
Output
80+
</VSCodeDataGridCell>
81+
<VSCodeDataGridCell cellType="columnheader" gridColumn={5}>
82+
Kind
83+
</VSCodeDataGridCell>
84+
</VSCodeDataGridRow>
85+
{methodsWithModelability.map(({ method, methodCanBeModeled }) => (
86+
<MethodRow
87+
key={method.signature}
88+
method={method}
89+
methodCanBeModeled={methodCanBeModeled}
90+
modeledMethod={modeledMethods[method.signature]}
91+
methodIsUnsaved={modifiedSignatures.has(method.signature)}
92+
modelingInProgress={inProgressMethods.hasMethod(
93+
packageName,
94+
method.signature,
95+
)}
96+
mode={mode}
97+
onChange={onChange}
98+
/>
99+
))}
100+
</>
101+
)}
102+
<HiddenMethodsRow
103+
numHiddenMethods={numHiddenMethods}
104+
someMethodsAreVisible={someMethodsAreVisible}
105+
/>
74106
</VSCodeDataGrid>
75107
);
76108
};

0 commit comments

Comments
 (0)