@@ -4,9 +4,10 @@ import * as Prism from "prismjs";
44import * as csharp from "prismjs/components/prism-csharp" ;
55import { marked } from "marked" ;
66import type { GodotNativeSymbol } from "./documentation_types" ;
7- import { get_extension_uri } from "../utils" ;
7+ import { createLogger , get_extension_uri } from "../utils" ;
88import yabbcode = require( "ya-bbcode" ) ;
99
10+ const log = createLogger ( "providers.docs_builder" ) ;
1011const 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
120121export 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 - Z a - z 0 - 9 _ - ] / g, "_" ) ;
126+ }
127+
123128 function make_function_signature ( s : GodotNativeSymbol , with_class = false ) {
124129 const parts = / \( ( .* ) ? \) \s * \- \> \s * ( ( [ A - z 0 - 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