diff --git a/src/providers/documentation.ts b/src/providers/documentation.ts index 6dedf1c55..85ccc3fa3 100644 --- a/src/providers/documentation.ts +++ b/src/providers/documentation.ts @@ -44,13 +44,19 @@ export class GDDocumentationProvider implements CustomReadonlyEditorProvider { public register_capabilities(message: NotificationMessage) { for (const gdclass of (message.params as GodotCapabilities).native_classes) { - this.classInfo[gdclass.name] = gdclass; + this.classInfo.set(gdclass.name, gdclass); } - for (const gdclass of (message.params as GodotCapabilities).native_classes) { + for (const gdclass of this.classInfo.values()) { if (gdclass.inherits) { - const extended_classes = this.classInfo[gdclass.inherits].extended_classes || []; + if (!this.classInfo.has(gdclass.inherits)) { + this.classInfo.set(gdclass.inherits, { + name: gdclass.inherits, + inherits: "", + }); + } + const extended_classes = this.classInfo.get(gdclass.inherits).extended_classes || []; extended_classes.push(gdclass.name); - this.classInfo[gdclass.inherits].extended_classes = extended_classes; + this.classInfo.get(gdclass.inherits).extended_classes = extended_classes; } } this.ready = true; diff --git a/src/providers/hover.ts b/src/providers/hover.ts index b04a5a0ab..d15421a6d 100644 --- a/src/providers/hover.ts +++ b/src/providers/hover.ts @@ -55,11 +55,17 @@ export class GDHoverProvider implements HoverProvider { const contents = new MarkdownString(); contents.appendMarkdown(links); - contents.appendMarkdown("---"); + const uri = await convert_resource_path_to_uri(resource.path); + contents.appendMarkdown("\n---\n"); contents.appendCodeblock(definition, "gdresource"); + if (resource.type === "Texture") { + contents.appendMarkdown("\n---\n"); + contents.appendMarkdown(`\n`); + contents.supportHtml = true; + contents.isTrusted = true; + } if (resource.type === "Script") { - contents.appendMarkdown("---"); - const uri = await convert_resource_path_to_uri(resource.path); + contents.appendMarkdown("\n---\n"); const text = (await vscode.workspace.openTextDocument(uri)).getText(); contents.appendCodeblock(text, "gdscript"); } @@ -93,14 +99,22 @@ export class GDHoverProvider implements HoverProvider { type = "gdscene"; } else if (link.endsWith(".tres")) { type = "gdresource"; + } else if (link.endsWith(".png") || link.endsWith(".svg")) { + type = "image"; } else { return; } const uri = await convert_resource_path_to_uri(link); - const text = (await vscode.workspace.openTextDocument(uri)).getText(); const contents = new MarkdownString(); - contents.appendCodeblock(text, type); + if (type === "image") { + contents.appendMarkdown(``); + contents.supportHtml = true; + contents.isTrusted = true; + } else { + const text = (await vscode.workspace.openTextDocument(uri)).getText(); + contents.appendCodeblock(text, type); + } const hover = new Hover(contents); return hover; } diff --git a/src/utils/project_utils.ts b/src/utils/project_utils.ts index a54da1eaa..edadf23d6 100644 --- a/src/utils/project_utils.ts +++ b/src/utils/project_utils.ts @@ -8,12 +8,13 @@ let projectFile: string | undefined = undefined; export async function get_project_dir(): Promise { let file = ""; - if (vscode.workspace.workspaceFolders != undefined) { + if (vscode.workspace.workspaceFolders !== undefined) { const files = await vscode.workspace.findFiles("**/project.godot"); - if (files.length == 0) { + if (files.length === 0) { return undefined; - } else if (files.length == 1) { + } + if (files.length === 1) { file = files[0].fsPath; if (!fs.existsSync(file) || !fs.statSync(file).isFile()) { return undefined; @@ -34,6 +35,13 @@ export async function get_project_dir(): Promise { return projectDir; } +export async function get_project_file(): Promise { + if (projectDir === undefined || projectFile === undefined) { + await get_project_dir(); + } + return projectFile; +} + let projectVersion: string | undefined = undefined; export async function get_project_version(): Promise { @@ -66,25 +74,30 @@ export function find_project_file(start: string, depth: number = 20) { // TODO: rename this, it's actually more like "find_parent_project_file" // This function appears to be fast enough, but if speed is ever an issue, // memoizing the result should be straightforward + if (start === ".") { + if (fs.existsSync("project.godot") && fs.statSync("project.godot").isFile()) { + return "project.godot"; + } + return null; + } const folder = path.dirname(start); - if (start == folder) { + if (start === folder) { return null; } - const projectFile = path.join(folder, "project.godot"); + const projFile = path.join(folder, "project.godot"); - if (fs.existsSync(projectFile) && fs.statSync(projectFile).isFile()) { - return projectFile; - } else { - if (depth === 0) { - return null; - } - return find_project_file(folder, depth - 1); + if (fs.existsSync(projFile) && fs.statSync(projFile).isFile()) { + return projFile; + } + if (depth === 0) { + return null; } + return find_project_file(folder, depth - 1); } export async function convert_resource_path_to_uri(resPath: string): Promise { - const dir = find_project_file(resPath).replace("project.godot", ""); - return vscode.Uri.joinPath(vscode.Uri.file(dir), resPath.substring(6)); + const dir = await get_project_dir(); + return vscode.Uri.joinPath(vscode.Uri.file(dir), resPath.substring("res://".length)); } type VERIFY_STATUS = "SUCCESS" | "WRONG_VERSION" | "INVALID_EXE";