Merge remote-tracking branch 'origin/main' into koesie10/update-set-selected-method-message
This commit is contained in:
@@ -507,7 +507,7 @@ interface SetMethodsMessage {
|
||||
|
||||
interface SetModeledMethodsMessage {
|
||||
t: "setModeledMethods";
|
||||
methods: Record<string, ModeledMethod>;
|
||||
methods: Record<string, ModeledMethod[]>;
|
||||
}
|
||||
|
||||
interface SetModifiedMethodsMessage {
|
||||
|
||||
@@ -102,7 +102,7 @@ export class MethodsUsageDataProvider
|
||||
}
|
||||
|
||||
private getModelingStatusIcon(method: Method): ThemeIcon {
|
||||
const modeledMethods = this.modeledMethods[method.signature];
|
||||
const modeledMethods = this.modeledMethods[method.signature] ?? [];
|
||||
const modifiedMethod = this.modifiedMethodSignatures.has(method.signature);
|
||||
|
||||
const status = getModelingStatus(modeledMethods, modifiedMethod);
|
||||
|
||||
@@ -43,10 +43,7 @@ import { AutoModeler } from "./auto-modeler";
|
||||
import { telemetryListener } from "../common/vscode/telemetry";
|
||||
import { ModelingStore } from "./modeling-store";
|
||||
import { ModelEditorViewTracker } from "./model-editor-view-tracker";
|
||||
import {
|
||||
convertFromLegacyModeledMethod,
|
||||
convertToLegacyModeledMethods,
|
||||
} from "./shared/modeled-methods-legacy";
|
||||
import { convertFromLegacyModeledMethod } from "./shared/modeled-methods-legacy";
|
||||
|
||||
export class ModelEditorView extends AbstractWebview<
|
||||
ToModelEditorMessage,
|
||||
@@ -640,7 +637,7 @@ export class ModelEditorView extends AbstractWebview<
|
||||
if (event.dbUri === this.databaseItem.databaseUri.toString()) {
|
||||
await this.postMessage({
|
||||
t: "setModeledMethods",
|
||||
methods: convertToLegacyModeledMethods(event.modeledMethods),
|
||||
methods: event.modeledMethods,
|
||||
});
|
||||
}
|
||||
}),
|
||||
|
||||
@@ -1,32 +1,5 @@
|
||||
import { ModeledMethod } from "../modeled-method";
|
||||
|
||||
/**
|
||||
* Converts a record of a single ModeledMethod indexed by signature to a record of ModeledMethod[] indexed by signature
|
||||
* for legacy usage. This function should always be used instead of the trivial conversion to track usages of this
|
||||
* conversion.
|
||||
*
|
||||
* This method should only be called inside a `postMessage` call. If it's used anywhere else, consider whether the
|
||||
* boundary is correct: the boundary should as close as possible to the extension host -> webview boundary.
|
||||
*
|
||||
* @param modeledMethods The record of a single ModeledMethod indexed by signature
|
||||
*/
|
||||
export function convertToLegacyModeledMethods(
|
||||
modeledMethods: Record<string, ModeledMethod[]>,
|
||||
): Record<string, ModeledMethod> {
|
||||
// Always take the first modeled method in the array
|
||||
return Object.fromEntries(
|
||||
Object.entries(modeledMethods)
|
||||
.map(([signature, modeledMethods]) => {
|
||||
const modeledMethod = convertToLegacyModeledMethod(modeledMethods);
|
||||
if (!modeledMethod) {
|
||||
return null;
|
||||
}
|
||||
return [signature, modeledMethod];
|
||||
})
|
||||
.filter((entry): entry is [string, ModeledMethod] => entry !== null),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a single ModeledMethod to a ModeledMethod[] for legacy usage. This function should always be used instead
|
||||
* of the trivial conversion to track usages of this conversion.
|
||||
|
||||
@@ -146,67 +146,77 @@ LibraryRow.args = {
|
||||
],
|
||||
},
|
||||
],
|
||||
modeledMethods: {
|
||||
"org.sql2o.Sql2o#Sql2o(String)": {
|
||||
type: "sink",
|
||||
input: "Argument[0]",
|
||||
output: "",
|
||||
kind: "jndi-injection",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Sql2o#Sql2o(String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "Sql2o",
|
||||
methodParameters: "(String)",
|
||||
},
|
||||
"org.sql2o.Connection#createQuery(String)": {
|
||||
type: "summary",
|
||||
input: "Argument[this]",
|
||||
output: "ReturnValue",
|
||||
kind: "taint",
|
||||
provenance: "df-manual",
|
||||
signature: "org.sql2o.Connection#createQuery(String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Connection",
|
||||
methodName: "createQuery",
|
||||
methodParameters: "(String)",
|
||||
},
|
||||
"org.sql2o.Sql2o#open()": {
|
||||
type: "summary",
|
||||
input: "Argument[this]",
|
||||
output: "ReturnValue",
|
||||
kind: "taint",
|
||||
provenance: "manual",
|
||||
signature: "org.sql2o.Sql2o#open()",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "open",
|
||||
methodParameters: "()",
|
||||
},
|
||||
"org.sql2o.Query#executeScalar(Class)": {
|
||||
type: "neutral",
|
||||
input: "",
|
||||
output: "",
|
||||
kind: "",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Query#executeScalar(Class)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Query",
|
||||
methodName: "executeScalar",
|
||||
methodParameters: "(Class)",
|
||||
},
|
||||
"org.sql2o.Sql2o#Sql2o(String,String,String)": {
|
||||
type: "neutral",
|
||||
input: "",
|
||||
output: "",
|
||||
kind: "",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Sql2o#Sql2o(String,String,String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "Sql2o",
|
||||
methodParameters: "(String,String,String)",
|
||||
},
|
||||
modeledMethodsMap: {
|
||||
"org.sql2o.Sql2o#Sql2o(String)": [
|
||||
{
|
||||
type: "sink",
|
||||
input: "Argument[0]",
|
||||
output: "",
|
||||
kind: "jndi-injection",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Sql2o#Sql2o(String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "Sql2o",
|
||||
methodParameters: "(String)",
|
||||
},
|
||||
],
|
||||
"org.sql2o.Connection#createQuery(String)": [
|
||||
{
|
||||
type: "summary",
|
||||
input: "Argument[this]",
|
||||
output: "ReturnValue",
|
||||
kind: "taint",
|
||||
provenance: "df-manual",
|
||||
signature: "org.sql2o.Connection#createQuery(String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Connection",
|
||||
methodName: "createQuery",
|
||||
methodParameters: "(String)",
|
||||
},
|
||||
],
|
||||
"org.sql2o.Sql2o#open()": [
|
||||
{
|
||||
type: "summary",
|
||||
input: "Argument[this]",
|
||||
output: "ReturnValue",
|
||||
kind: "taint",
|
||||
provenance: "manual",
|
||||
signature: "org.sql2o.Sql2o#open()",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "open",
|
||||
methodParameters: "()",
|
||||
},
|
||||
],
|
||||
"org.sql2o.Query#executeScalar(Class)": [
|
||||
{
|
||||
type: "neutral",
|
||||
input: "",
|
||||
output: "",
|
||||
kind: "",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Query#executeScalar(Class)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Query",
|
||||
methodName: "executeScalar",
|
||||
methodParameters: "(Class)",
|
||||
},
|
||||
],
|
||||
"org.sql2o.Sql2o#Sql2o(String,String,String)": [
|
||||
{
|
||||
type: "neutral",
|
||||
input: "",
|
||||
output: "",
|
||||
kind: "",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Sql2o#Sql2o(String,String,String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "Sql2o",
|
||||
methodParameters: "(String,String,String)",
|
||||
},
|
||||
],
|
||||
},
|
||||
modifiedSignatures: new Set(["org.sql2o.Sql2o#Sql2o(String)"]),
|
||||
inProgressMethods: new InProgressMethods(),
|
||||
|
||||
@@ -216,65 +216,75 @@ ModelEditor.args = {
|
||||
},
|
||||
],
|
||||
initialModeledMethods: {
|
||||
"org.sql2o.Sql2o#Sql2o(String)": {
|
||||
type: "sink",
|
||||
input: "Argument[0]",
|
||||
output: "",
|
||||
kind: "jndi-injection",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Sql2o#Sql2o(String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "Sql2o",
|
||||
methodParameters: "(String)",
|
||||
},
|
||||
"org.sql2o.Connection#createQuery(String)": {
|
||||
type: "summary",
|
||||
input: "Argument[this]",
|
||||
output: "ReturnValue",
|
||||
kind: "taint",
|
||||
provenance: "df-manual",
|
||||
signature: "org.sql2o.Connection#createQuery(String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Connection",
|
||||
methodName: "createQuery",
|
||||
methodParameters: "(String)",
|
||||
},
|
||||
"org.sql2o.Sql2o#open()": {
|
||||
type: "summary",
|
||||
input: "Argument[this]",
|
||||
output: "ReturnValue",
|
||||
kind: "taint",
|
||||
provenance: "manual",
|
||||
signature: "org.sql2o.Sql2o#open()",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "open",
|
||||
methodParameters: "()",
|
||||
},
|
||||
"org.sql2o.Query#executeScalar(Class)": {
|
||||
type: "neutral",
|
||||
input: "",
|
||||
output: "",
|
||||
kind: "",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Query#executeScalar(Class)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Query",
|
||||
methodName: "executeScalar",
|
||||
methodParameters: "(Class)",
|
||||
},
|
||||
"org.sql2o.Sql2o#Sql2o(String,String,String)": {
|
||||
type: "neutral",
|
||||
input: "",
|
||||
output: "",
|
||||
kind: "",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Sql2o#Sql2o(String,String,String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "Sql2o",
|
||||
methodParameters: "(String,String,String)",
|
||||
},
|
||||
"org.sql2o.Sql2o#Sql2o(String)": [
|
||||
{
|
||||
type: "sink",
|
||||
input: "Argument[0]",
|
||||
output: "",
|
||||
kind: "jndi-injection",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Sql2o#Sql2o(String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "Sql2o",
|
||||
methodParameters: "(String)",
|
||||
},
|
||||
],
|
||||
"org.sql2o.Connection#createQuery(String)": [
|
||||
{
|
||||
type: "summary",
|
||||
input: "Argument[this]",
|
||||
output: "ReturnValue",
|
||||
kind: "taint",
|
||||
provenance: "df-manual",
|
||||
signature: "org.sql2o.Connection#createQuery(String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Connection",
|
||||
methodName: "createQuery",
|
||||
methodParameters: "(String)",
|
||||
},
|
||||
],
|
||||
"org.sql2o.Sql2o#open()": [
|
||||
{
|
||||
type: "summary",
|
||||
input: "Argument[this]",
|
||||
output: "ReturnValue",
|
||||
kind: "taint",
|
||||
provenance: "manual",
|
||||
signature: "org.sql2o.Sql2o#open()",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "open",
|
||||
methodParameters: "()",
|
||||
},
|
||||
],
|
||||
"org.sql2o.Query#executeScalar(Class)": [
|
||||
{
|
||||
type: "neutral",
|
||||
input: "",
|
||||
output: "",
|
||||
kind: "",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Query#executeScalar(Class)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Query",
|
||||
methodName: "executeScalar",
|
||||
methodParameters: "(Class)",
|
||||
},
|
||||
],
|
||||
"org.sql2o.Sql2o#Sql2o(String,String,String)": [
|
||||
{
|
||||
type: "neutral",
|
||||
input: "",
|
||||
output: "",
|
||||
kind: "",
|
||||
provenance: "df-generated",
|
||||
signature: "org.sql2o.Sql2o#Sql2o(String,String,String)",
|
||||
packageName: "org.sql2o",
|
||||
typeName: "Sql2o",
|
||||
methodName: "Sql2o",
|
||||
methodParameters: "(String,String,String)",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
@@ -71,7 +71,7 @@ export type LibraryRowProps = {
|
||||
title: string;
|
||||
libraryVersion?: string;
|
||||
methods: Method[];
|
||||
modeledMethods: Record<string, ModeledMethod>;
|
||||
modeledMethodsMap: Record<string, ModeledMethod[]>;
|
||||
modifiedSignatures: Set<string>;
|
||||
inProgressMethods: InProgressMethods;
|
||||
viewState: ModelEditorViewState;
|
||||
@@ -92,7 +92,7 @@ export const LibraryRow = ({
|
||||
title,
|
||||
libraryVersion,
|
||||
methods,
|
||||
modeledMethods,
|
||||
modeledMethodsMap,
|
||||
modifiedSignatures,
|
||||
inProgressMethods,
|
||||
viewState,
|
||||
@@ -231,7 +231,7 @@ export const LibraryRow = ({
|
||||
<ModeledMethodDataGrid
|
||||
packageName={title}
|
||||
methods={methods}
|
||||
modeledMethods={modeledMethods}
|
||||
modeledMethodsMap={modeledMethodsMap}
|
||||
modifiedSignatures={modifiedSignatures}
|
||||
inProgressMethods={inProgressMethods}
|
||||
viewState={viewState}
|
||||
|
||||
@@ -74,7 +74,7 @@ const ButtonsContainer = styled.div`
|
||||
type Props = {
|
||||
initialViewState?: ModelEditorViewState;
|
||||
initialMethods?: Method[];
|
||||
initialModeledMethods?: Record<string, ModeledMethod>;
|
||||
initialModeledMethods?: Record<string, ModeledMethod[]>;
|
||||
initialHideModeledMethods?: boolean;
|
||||
};
|
||||
|
||||
@@ -113,7 +113,7 @@ export function ModelEditor({
|
||||
}, [hideModeledMethods]);
|
||||
|
||||
const [modeledMethods, setModeledMethods] = useState<
|
||||
Record<string, ModeledMethod>
|
||||
Record<string, ModeledMethod[]>
|
||||
>(initialModeledMethods);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -329,7 +329,7 @@ export function ModelEditor({
|
||||
</ButtonsContainer>
|
||||
<ModeledMethodsList
|
||||
methods={methods}
|
||||
modeledMethods={modeledMethods}
|
||||
modeledMethodsMap={modeledMethods}
|
||||
modifiedSignatures={modifiedSignatures}
|
||||
inProgressMethods={inProgressMethods}
|
||||
viewState={viewState}
|
||||
|
||||
@@ -12,14 +12,13 @@ import { sortMethods } from "../../model-editor/shared/sorting";
|
||||
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods";
|
||||
import { HiddenMethodsRow } from "./HiddenMethodsRow";
|
||||
import { ModelEditorViewState } from "../../model-editor/shared/view-state";
|
||||
import { convertFromLegacyModeledMethod } from "../../model-editor/shared/modeled-methods-legacy";
|
||||
|
||||
export const GRID_TEMPLATE_COLUMNS = "0.5fr 0.125fr 0.125fr 0.125fr 0.125fr";
|
||||
|
||||
export type ModeledMethodDataGridProps = {
|
||||
packageName: string;
|
||||
methods: Method[];
|
||||
modeledMethods: Record<string, ModeledMethod>;
|
||||
modeledMethodsMap: Record<string, ModeledMethod[]>;
|
||||
modifiedSignatures: Set<string>;
|
||||
inProgressMethods: InProgressMethods;
|
||||
viewState: ModelEditorViewState;
|
||||
@@ -31,7 +30,7 @@ export type ModeledMethodDataGridProps = {
|
||||
export const ModeledMethodDataGrid = ({
|
||||
packageName,
|
||||
methods,
|
||||
modeledMethods,
|
||||
modeledMethodsMap,
|
||||
modifiedSignatures,
|
||||
inProgressMethods,
|
||||
viewState,
|
||||
@@ -46,11 +45,11 @@ export const ModeledMethodDataGrid = ({
|
||||
const methodsWithModelability = [];
|
||||
let numHiddenMethods = 0;
|
||||
for (const method of sortMethods(methods)) {
|
||||
const modeledMethod = modeledMethods[method.signature];
|
||||
const modeledMethods = modeledMethodsMap[method.signature] ?? [];
|
||||
const methodIsUnsaved = modifiedSignatures.has(method.signature);
|
||||
const methodCanBeModeled = canMethodBeModeled(
|
||||
method,
|
||||
convertFromLegacyModeledMethod(modeledMethod),
|
||||
modeledMethods,
|
||||
methodIsUnsaved,
|
||||
);
|
||||
|
||||
@@ -61,7 +60,7 @@ export const ModeledMethodDataGrid = ({
|
||||
}
|
||||
}
|
||||
return [methodsWithModelability, numHiddenMethods];
|
||||
}, [hideModeledMethods, methods, modeledMethods, modifiedSignatures]);
|
||||
}, [hideModeledMethods, methods, modeledMethodsMap, modifiedSignatures]);
|
||||
|
||||
const someMethodsAreVisible = methodsWithModelability.length > 0;
|
||||
|
||||
@@ -87,13 +86,13 @@ export const ModeledMethodDataGrid = ({
|
||||
</VSCodeDataGridCell>
|
||||
</VSCodeDataGridRow>
|
||||
{methodsWithModelability.map(({ method, methodCanBeModeled }) => {
|
||||
const modeledMethod = modeledMethods[method.signature];
|
||||
const modeledMethods = modeledMethodsMap[method.signature] ?? [];
|
||||
return (
|
||||
<MethodRow
|
||||
key={method.signature}
|
||||
method={method}
|
||||
methodCanBeModeled={methodCanBeModeled}
|
||||
modeledMethods={modeledMethod ? [modeledMethod] : []}
|
||||
modeledMethods={modeledMethods}
|
||||
methodIsUnsaved={modifiedSignatures.has(method.signature)}
|
||||
modelingInProgress={inProgressMethods.hasMethod(
|
||||
packageName,
|
||||
|
||||
@@ -13,7 +13,7 @@ import { InProgressMethods } from "../../model-editor/shared/in-progress-methods
|
||||
|
||||
export type ModeledMethodsListProps = {
|
||||
methods: Method[];
|
||||
modeledMethods: Record<string, ModeledMethod>;
|
||||
modeledMethodsMap: Record<string, ModeledMethod[]>;
|
||||
modifiedSignatures: Set<string>;
|
||||
inProgressMethods: InProgressMethods;
|
||||
revealedMethodSignature: string | null;
|
||||
@@ -36,7 +36,7 @@ const libraryNameOverrides: Record<string, string> = {
|
||||
|
||||
export const ModeledMethodsList = ({
|
||||
methods,
|
||||
modeledMethods,
|
||||
modeledMethodsMap,
|
||||
modifiedSignatures,
|
||||
inProgressMethods,
|
||||
viewState,
|
||||
@@ -82,7 +82,7 @@ export const ModeledMethodsList = ({
|
||||
title={libraryNameOverrides[libraryName] ?? libraryName}
|
||||
libraryVersion={libraryVersions[libraryName]}
|
||||
methods={grouped[libraryName]}
|
||||
modeledMethods={modeledMethods}
|
||||
modeledMethodsMap={modeledMethodsMap}
|
||||
modifiedSignatures={modifiedSignatures}
|
||||
inProgressMethods={inProgressMethods}
|
||||
viewState={viewState}
|
||||
|
||||
@@ -30,15 +30,17 @@ describe(LibraryRow.name, () => {
|
||||
title="sql2o"
|
||||
libraryVersion="1.6.0"
|
||||
methods={[method]}
|
||||
modeledMethods={{
|
||||
[method.signature]: {
|
||||
...method,
|
||||
type: "sink",
|
||||
input: "Argument[0]",
|
||||
output: "",
|
||||
kind: "jndi-injection",
|
||||
provenance: "df-generated",
|
||||
},
|
||||
modeledMethodsMap={{
|
||||
[method.signature]: [
|
||||
{
|
||||
...method,
|
||||
type: "sink",
|
||||
input: "Argument[0]",
|
||||
output: "",
|
||||
kind: "jndi-injection",
|
||||
provenance: "df-generated",
|
||||
},
|
||||
],
|
||||
}}
|
||||
modifiedSignatures={new Set([method.signature])}
|
||||
inProgressMethods={new InProgressMethods()}
|
||||
|
||||
@@ -56,15 +56,17 @@ describe(ModeledMethodDataGrid.name, () => {
|
||||
<ModeledMethodDataGrid
|
||||
packageName="sql2o"
|
||||
methods={[method1, method2, method3]}
|
||||
modeledMethods={{
|
||||
[method1.signature]: {
|
||||
...method1,
|
||||
type: "sink",
|
||||
input: "Argument[0]",
|
||||
output: "",
|
||||
kind: "jndi-injection",
|
||||
provenance: "df-generated",
|
||||
},
|
||||
modeledMethodsMap={{
|
||||
[method1.signature]: [
|
||||
{
|
||||
...method1,
|
||||
type: "sink",
|
||||
input: "Argument[0]",
|
||||
output: "",
|
||||
kind: "jndi-injection",
|
||||
provenance: "df-generated",
|
||||
},
|
||||
],
|
||||
}}
|
||||
modifiedSignatures={new Set([method1.signature])}
|
||||
inProgressMethods={new InProgressMethods()}
|
||||
|
||||
@@ -56,15 +56,17 @@ describe(ModeledMethodsList.name, () => {
|
||||
reactRender(
|
||||
<ModeledMethodsList
|
||||
methods={[method1, method2, method3]}
|
||||
modeledMethods={{
|
||||
[method1.signature]: {
|
||||
...method1,
|
||||
type: "sink",
|
||||
input: "Argument[0]",
|
||||
output: "",
|
||||
kind: "jndi-injection",
|
||||
provenance: "df-generated",
|
||||
},
|
||||
modeledMethodsMap={{
|
||||
[method1.signature]: [
|
||||
{
|
||||
...method1,
|
||||
type: "sink",
|
||||
input: "Argument[0]",
|
||||
output: "",
|
||||
kind: "jndi-injection",
|
||||
provenance: "df-generated",
|
||||
},
|
||||
],
|
||||
}}
|
||||
modifiedSignatures={new Set([method1.signature])}
|
||||
inProgressMethods={new InProgressMethods()}
|
||||
|
||||
Reference in New Issue
Block a user