Add access path suggestions to MaD model for Ruby (#3303)

This commit is contained in:
Shati Patel
2024-01-31 16:15:41 +00:00
committed by GitHub
parent b7ee9f9dd4
commit c6c27f4ca3
4 changed files with 131 additions and 0 deletions

View File

@@ -11,6 +11,7 @@ import {
rubyMethodSignature,
rubyPath,
} from "./access-paths";
import { parseAccessPathSuggestionsResults } from "./suggestions";
export const ruby: ModelsAsDataLanguage = {
availableModes: [Mode.Framework],
@@ -168,6 +169,9 @@ export const ruby: ModelsAsDataLanguage = {
},
parseResults: parseGenerateModelResults,
},
accessPathSuggestions: {
parseResults: parseAccessPathSuggestionsResults,
},
getArgumentOptions: (method) => {
const argumentsList = getArgumentsList(method.methodParameters).map(
(argument, index): MethodArgument => {

View File

@@ -0,0 +1,56 @@
import type { BaseLogger } from "../../../common/logging";
import type { DecodedBqrsChunk } from "../../../common/bqrs-cli-types";
import type { ModelsAsDataLanguage } from "../models-as-data";
import type { AccessPathSuggestionRow } from "../../suggestions";
import { isDefinitionType } from "../../suggestions";
import { parseRubyMethodFromPath, rubyMethodSignature } from "./access-paths";
export function parseAccessPathSuggestionsResults(
bqrs: DecodedBqrsChunk,
_modelsAsDataLanguage: ModelsAsDataLanguage,
logger: BaseLogger,
): AccessPathSuggestionRow[] {
return bqrs.tuples
.map((tuple, index): AccessPathSuggestionRow | null => {
const row = tuple.filter(
(value): value is string => typeof value === "string",
);
if (row.length !== 5) {
void logger.log(
`Skipping result ${index} because it has the wrong length`,
);
return null;
}
const type = row[0];
const methodName = parseRubyMethodFromPath(row[1]);
const value = row[2];
const details = row[3];
const definitionType = row[4];
if (!isDefinitionType(definitionType)) {
void logger.log(
`Skipping result ${index} because it has an invalid definition type`,
);
return null;
}
return {
method: {
packageName: "",
typeName: type,
methodName,
methodParameters: "",
signature: rubyMethodSignature(type, methodName),
},
value,
details,
definitionType,
};
})
.filter(
(suggestion): suggestion is AccessPathSuggestionRow =>
suggestion !== null,
);
}

View File

@@ -37,3 +37,11 @@ export type AccessPathOption = {
details?: string;
followup?: AccessPathOption[];
};
export function isDefinitionType(
value: string,
): value is AccessPathSuggestionDefinitionType {
return Object.values(AccessPathSuggestionDefinitionType).includes(
value as AccessPathSuggestionDefinitionType,
);
}

View File

@@ -0,0 +1,63 @@
import type { DecodedBqrsChunk } from "../../../../../src/common/bqrs-cli-types";
import { ruby } from "../../../../../src/model-editor/languages/ruby";
import { createMockLogger } from "../../../../__mocks__/loggerMock";
import { parseAccessPathSuggestionsResults } from "../../../../../src/model-editor/languages/ruby/suggestions";
describe("parseAccessPathSuggestionsResults", () => {
it("should parse the results", async () => {
const bqrsChunk: DecodedBqrsChunk = {
columns: [
{
name: "type",
kind: "String",
},
{
name: "path",
kind: "String",
},
{
name: "value",
kind: "String",
},
{
name: "details",
kind: "String",
},
{
name: "defType",
kind: "String",
},
],
tuples: [
[
"Correctness",
"Method[assert!]",
"Argument[self]",
"self in assert!",
"parameter",
],
],
};
const result = parseAccessPathSuggestionsResults(
bqrsChunk,
ruby,
createMockLogger(),
);
expect(result).toEqual([
{
method: {
packageName: "",
typeName: "Correctness",
methodName: "assert!",
methodParameters: "",
signature: "Correctness#assert!",
},
value: "Argument[self]",
details: "self in assert!",
definitionType: "parameter",
},
]);
});
});