From 40a94c4e2e9aca435aa0dddffe93d41d9fded6e3 Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Fri, 26 Jan 2024 00:55:47 -0500 Subject: [PATCH] decomp: auto-gen docstring with a best effort attempt to determine param type (#335) --- src/languages/ir2/ir2-completions.ts | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/languages/ir2/ir2-completions.ts b/src/languages/ir2/ir2-completions.ts index a4d87d2..ff42c68 100644 --- a/src/languages/ir2/ir2-completions.ts +++ b/src/languages/ir2/ir2-completions.ts @@ -1,5 +1,6 @@ import * as vscode from "vscode"; import { getArgumentsInSignature } from "../opengoal/opengoal-tools"; +import { getFuncBodyFromPosition } from "./ir2-utils"; export class IRCompletionItemProvider implements vscode.CompletionItemProvider { provideCompletionItems( @@ -32,9 +33,33 @@ export class IRCompletionItemProvider implements vscode.CompletionItemProvider { position.character, ); + const funcBody = getFuncBodyFromPosition(document, position); + if (funcBody === undefined) { + return []; + } + let docstring = `"something\n`; for (const arg of args) { - docstring += ` @param ${arg.name} something\n`; + // Determine the nature of the parameter + // _ - unused (if it doesn't show up AT ALL) + // ! - mutated (if it's involved in a set) + // ? - optional (can't easily determine this and is frankly rare) + let paramFound = false; + for (let i = 1; i < funcBody.length; i++) { + const line = funcBody[i]; + if (line.includes(`(set! (-> ${arg.name}`)) { + docstring += ` @param! ${arg.name} something\n`; + paramFound = true; + break; + } else if (line.includes(arg.name)) { + paramFound = true; + } + } + if (paramFound) { + docstring += ` @param ${arg.name} something\n`; + } else { + docstring += ` @param_ ${arg.name} something\n`; + } } docstring += ` @returns something"`;