Skip to content

Commit e39fc24

Browse files
authored
Fix failing "Go to Definition" for some types (#994)
1 parent e99adb0 commit e39fc24

1 file changed

Lines changed: 39 additions & 11 deletions

File tree

src/providers/documentation_builder.ts

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import * as Prism from "prismjs";
44
import * as csharp from "prismjs/components/prism-csharp";
55
import { marked } from "marked";
66
import type { GodotNativeSymbol } from "./documentation_types";
7-
import { get_extension_uri } from "../utils";
7+
import { createLogger, get_extension_uri } from "../utils";
88
import yabbcode = require("ya-bbcode");
99

10+
const log = createLogger("providers.docs_builder");
1011
const parser = new yabbcode();
1112

1213
//! I do not understand why this is necessary
@@ -120,6 +121,10 @@ export function make_html_content(webview: vscode.Webview, symbol: GodotNativeSy
120121
export function make_symbol_document(symbol: GodotNativeSymbol): string {
121122
const classlink = make_link(symbol.native_class, undefined);
122123

124+
function make_symbol_id(name: string) {
125+
return name.replace(/[^A-Za-z0-9_-]/g, "_");
126+
}
127+
123128
function make_function_signature(s: GodotNativeSymbol, with_class = false) {
124129
const parts = /\((.*)?\)\s*\-\>\s*(([A-z0-9]+)?)$/.exec(s.detail);
125130
if (!parts) {
@@ -132,7 +137,7 @@ export function make_symbol_document(symbol: GodotNativeSymbol): string {
132137
);
133138
args = args.replace(/\s=\s(.*?)[\,\)]/g, "");
134139
return `${ret_type} ${with_class ? `${classlink}.` : ""}${element("a", s.name, {
135-
href: `#${s.name}`,
140+
href: `#${make_symbol_id(s.name)}`,
136141
})}( ${args} )`;
137142
}
138143

@@ -146,7 +151,7 @@ export function make_symbol_document(symbol: GodotNativeSymbol): string {
146151
return;
147152
}
148153
const type = make_link(parts[2], undefined);
149-
const name = element("a", s.name, { href: `#${s.name}` });
154+
const name = element("a", s.name, { href: `#${make_symbol_id(s.name)}` });
150155
const title = element("h4", `${type} ${with_class ? `${classlink}.` : ""}${s.name}`);
151156
const doc = element("p", format_documentation(s.documentation, symbol.native_class));
152157
const div = element("div", title + doc);
@@ -193,7 +198,9 @@ export function make_symbol_document(symbol: GodotNativeSymbol): string {
193198
};
194199
}
195200
case SymbolKind.Method:
196-
case SymbolKind.Function: {
201+
case SymbolKind.Function:
202+
case SymbolKind.Constructor:
203+
case SymbolKind.Operator: {
197204
const signature = make_function_signature(s, with_class);
198205
const title = element("h4", signature);
199206
const doc = element("p", format_documentation(s.documentation, symbol.native_class));
@@ -227,34 +234,51 @@ export function make_symbol_document(symbol: GodotNativeSymbol): string {
227234

228235
let constants = "";
229236
let signals = "";
237+
let constructors_index = "";
238+
let constructors = "";
230239
let methods_index = "";
231240
let methods = "";
241+
let operators_index = "";
242+
let operators = "";
232243
let properties_index = "";
233244
let propertyies = "";
234245
let others = "";
235246

236247
if (symbol.children) {
237248
for (const s of symbol.children as GodotNativeSymbol[]) {
238249
const elements = make_symbol_elements(s);
250+
if (!elements) {
251+
log.debug(`Unable to render symbol "${s.name}" (unhandled SymbolKind ${s.kind})`);
252+
continue;
253+
}
254+
const id = make_symbol_id(s.name);
239255
switch (s.kind) {
240256
case SymbolKind.Property:
241257
case SymbolKind.Variable:
242258
properties_index += element("li", elements.index);
243-
propertyies += element("li", elements.body, { id: s.name });
259+
propertyies += element("li", elements.body, { id });
244260
break;
245261
case SymbolKind.Constant:
246-
constants += element("li", elements.body, { id: s.name });
262+
constants += element("li", elements.body, { id });
247263
break;
248264
case SymbolKind.Event:
249-
signals += element("li", elements.body, { id: s.name });
265+
signals += element("li", elements.body, { id });
266+
break;
267+
case SymbolKind.Constructor:
268+
constructors_index += element("li", elements.index);
269+
constructors += element("li", elements.body, { id });
250270
break;
251271
case SymbolKind.Method:
252272
case SymbolKind.Function:
253273
methods_index += element("li", elements.index);
254-
methods += element("li", elements.body, { id: s.name });
274+
methods += element("li", elements.body, { id });
275+
break;
276+
case SymbolKind.Operator:
277+
operators_index += element("li", elements.index);
278+
operators += element("li", elements.body, { id });
255279
break;
256280
default:
257-
others += element("li", elements.body, { id: s.name });
281+
others += element("li", elements.body, { id });
258282
break;
259283
}
260284
}
@@ -268,11 +292,15 @@ export function make_symbol_document(symbol: GodotNativeSymbol): string {
268292
};
269293

270294
add_group("Properties", properties_index);
271-
add_group("Constants", constants);
272-
add_group("Signals", signals);
295+
add_group("Constructors", constructors_index);
273296
add_group("Methods", methods_index);
297+
add_group("Operators", operators_index);
298+
add_group("Signals", signals);
299+
add_group("Constants", constants);
274300
add_group("Property Descriptions", propertyies);
301+
add_group("Constructor Descriptions", constructors);
275302
add_group("Method Descriptions", methods);
303+
add_group("Operator Descriptions", operators);
276304
add_group("Other Members", others);
277305
doc += element("script", `var godot_class = "${symbol.native_class}";`);
278306

0 commit comments

Comments
 (0)