@@ -177,7 +177,7 @@ func (i *javascriptIndexer) IndexDir(ctx context.Context, dir string) (*schema.I
177177				className  :=  firstCaptureContentOr (content , captures ["class_name" ], "" )
178178				superClasses  :=  firstCaptureContentOr (content , captures ["superclasses" ], "" )
179179				classDocs  :=  firstCaptureContentOr (content , captures ["class_docs" ], "\n " )
180- 				classDocs  =  sanitizeDocs (classDocs )
180+ 				classDocs  =  extractClassDocs (classDocs )
181181
182182				classLabel  :=  schema .Markdown ("class "  +  className  +  superClasses )
183183				classes  :=  classesByMod [modName ]
@@ -317,80 +317,149 @@ func getFunctions(node *sitter.Node, content []byte, q string, searchKeyPrefix [
317317	return  functions , nil 
318318}
319319
320- func  extractFunctionDocs (s  string ) string  {
320+ func  extractClassDocs (s  string ) string  {
321321	// JSDoc comments must start with a /** 
322322	// sequence in order to be recognized by the JSDoc parser. 
323323	// Comments beginning with /*, /***, or more than 3 stars are ignored by Jsdoc Parser. 
324- 	if  strings .HasPrefix (s , "/**" ) &&  ! strings .HasPrefix (s , "/***" ) {
325- 		comment  :=  []byte (s )
326- 		funcDocs  :=  "" 
327- 		node , err  :=  sitter .ParseCtx (context .Background (), comment , jsdoc .GetLanguage ())
328- 		if  err  !=  nil  {
329- 			return  "" 
324+ 	if  ! strings .HasPrefix (s , "/**" ) &&  strings .HasPrefix (s , "/***" ) {
325+ 		return  sanitizeDocs (s )
326+ 	}
327+ 
328+ 	comment  :=  []byte (s )
329+ 	classDocs  :=  "" 
330+ 	node , err  :=  sitter .ParseCtx (context .Background (), comment , jsdoc .GetLanguage ())
331+ 	if  err  !=  nil  {
332+ 		return  "" 
333+ 	}
334+ 	query , err  :=  sitter .NewQuery ([]byte (` 
335+ 	(document 
336+ 		(description)? @class_description 
337+ 		(tag 
338+ 			(tag_name)? @tag_name 
339+ 			(type)? @identifier_type 
340+ 			(identifier)? @identifier_name 
341+ 			(description)? @identifier_description 
342+ 		) 
343+ 	)* 
344+ 	` ), jsdoc .GetLanguage ())
345+ 	if  err  !=  nil  {
346+ 		return  "" 
347+ 	}
348+ 
349+ 	defer  query .Close ()
350+ 
351+ 	cursor  :=  sitter .NewQueryCursor ()
352+ 	defer  cursor .Close ()
353+ 	cursor .Exec (query , node )
354+ 
355+ 	propertiesSection  :=  "" 
356+ 	for  {
357+ 		match , ok  :=  cursor .NextMatch ()
358+ 		if  ! ok  {
359+ 			break 
330360		}
331- 		query , err  :=  sitter .NewQuery ([]byte (` 
332- 		(document 
333- 			(description)? @func_description 
334- 			(tag 
335- 				(tag_name)? @tag_name 
336- 				(type)? @identifier_type 
337- 				(identifier)? @identifier_name 
338- 				(description)? @identifier_description 
339- 			) 
340- 		)* 
341- 		` ), jsdoc .GetLanguage ())
342- 		if  err  !=  nil  {
343- 			return  "" 
361+ 		captures  :=  getCaptures (query , match )
362+ 		classDescription  :=  firstCaptureContentOr (comment , captures ["class_description" ], "" )
363+ 		classDocs  =  fmt .Sprintf ("%s\n " , classDescription )
364+ 
365+ 		identifierType  :=  firstCaptureContentOr (comment , captures ["identifier_type" ], "" )
366+ 		if  identifierType  !=  ""  {
367+ 			identifierType  =  fmt .Sprintf (" (%s)" , identifierType )
368+ 		}
369+ 		identifierName  :=  firstCaptureContentOr (comment , captures ["identifier_name" ], "" )
370+ 		identifierDescription  :=  firstCaptureContentOr (comment , captures ["identifier_description" ], "" )
371+ 		if  identifierDescription  !=  ""  {
372+ 			identifierDescription  =  fmt .Sprintf (": %s" , identifierDescription )
344373		}
345374
346- 		defer  query .Close ()
375+ 		tagName  :=  firstCaptureContentOr (comment , captures ["tag_name" ], "" )
376+ 		switch  tagName  {
377+ 		case  "@property" :
378+ 			propertiesSection  +=  fmt .Sprintf ("\n \t %s%s%s" , identifierName , identifierType , identifierDescription )
379+ 		}
380+ 	}
347381
348- 		 cursor   :=   sitter . NewQueryCursor () 
349- 		defer   cursor . Close ( )
350- 		 cursor . Exec ( query ,  node ) 
382+ 	if   len ( propertiesSection )  >   0  { 
383+ 		classDocs   +=   fmt . Sprintf ( " \n  Properties: \n %s" ,  propertiesSection )
384+ 	} 
351385
352- 		argsSection  :=  "" 
353- 		returnSection  :=  "" 
354- 		for  {
355- 			match , ok  :=  cursor .NextMatch ()
356- 			if  ! ok  {
357- 				break 
358- 			}
359- 			captures  :=  getCaptures (query , match )
360- 			funcDescription  :=  firstCaptureContentOr (comment , captures ["func_description" ], "" )
361- 			funcDocs  =  fmt .Sprintf ("%s\n " , funcDescription )
386+ 	return  classDocs 
387+ }
362388
363- 			identifierType  :=  firstCaptureContentOr (comment , captures ["identifier_type" ], "" )
364- 			if  identifierType  !=  ""  {
365- 				identifierType  =  fmt .Sprintf (" (%s)" , identifierType )
366- 			}
367- 			identifierName  :=  firstCaptureContentOr (comment , captures ["identifier_name" ], "" )
368- 			identifierDescription  :=  firstCaptureContentOr (comment , captures ["identifier_description" ], "" )
369- 			if  identifierDescription  !=  ""  {
370- 				identifierDescription  =  fmt .Sprintf (": %s" , identifierDescription )
371- 			}
389+ func  extractFunctionDocs (s  string ) string  {
390+ 	// JSDoc comments must start with a /** 
391+ 	// sequence in order to be recognized by the JSDoc parser. 
392+ 	// Comments beginning with /*, /***, or more than 3 stars are ignored by Jsdoc Parser. 
393+ 	if  ! strings .HasPrefix (s , "/**" ) &&  strings .HasPrefix (s , "/***" ) {
394+ 		return  sanitizeDocs (s )
395+ 	}
372396
373- 			tagName  :=  firstCaptureContentOr (comment , captures ["tag_name" ], "" )
374- 			switch  tagName  {
375- 			case  "@param" :
376- 				argsSection  +=  fmt .Sprintf ("\n \t %s%s%s" , identifierName , identifierType , identifierDescription )
377- 			case  "@return" :
378- 				returnSection  +=  fmt .Sprintf ("\n \t %s%s%s" , identifierName , identifierType , identifierDescription )
379- 			}
397+ 	comment  :=  []byte (s )
398+ 	funcDocs  :=  "" 
399+ 	node , err  :=  sitter .ParseCtx (context .Background (), comment , jsdoc .GetLanguage ())
400+ 	if  err  !=  nil  {
401+ 		return  "" 
402+ 	}
403+ 	query , err  :=  sitter .NewQuery ([]byte (` 
404+ 	(document 
405+ 		(description)? @func_description 
406+ 		(tag 
407+ 			(tag_name)? @tag_name 
408+ 			(type)? @identifier_type 
409+ 			(identifier)? @identifier_name 
410+ 			(description)? @identifier_description 
411+ 		) 
412+ 	)* 
413+ 	` ), jsdoc .GetLanguage ())
414+ 	if  err  !=  nil  {
415+ 		return  "" 
416+ 	}
417+ 
418+ 	defer  query .Close ()
419+ 
420+ 	cursor  :=  sitter .NewQueryCursor ()
421+ 	defer  cursor .Close ()
422+ 	cursor .Exec (query , node )
423+ 
424+ 	argsSection  :=  "" 
425+ 	returnSection  :=  "" 
426+ 	for  {
427+ 		match , ok  :=  cursor .NextMatch ()
428+ 		if  ! ok  {
429+ 			break 
380430		}
431+ 		captures  :=  getCaptures (query , match )
432+ 		funcDescription  :=  firstCaptureContentOr (comment , captures ["func_description" ], "" )
433+ 		funcDocs  =  fmt .Sprintf ("%s\n " , funcDescription )
381434
382- 		if  len (argsSection ) >  0  {
383- 			funcDocs  +=  fmt .Sprintf ("\n  Arguments:\n %s" , argsSection )
435+ 		identifierType  :=  firstCaptureContentOr (comment , captures ["identifier_type" ], "" )
436+ 		if  identifierType  !=  ""  {
437+ 			identifierType  =  fmt .Sprintf (" (%s)" , identifierType )
438+ 		}
439+ 		identifierName  :=  firstCaptureContentOr (comment , captures ["identifier_name" ], "" )
440+ 		identifierDescription  :=  firstCaptureContentOr (comment , captures ["identifier_description" ], "" )
441+ 		if  identifierDescription  !=  ""  {
442+ 			identifierDescription  =  fmt .Sprintf (": %s" , identifierDescription )
384443		}
385444
386- 		if  len (returnSection ) >  0  {
387- 			funcDocs  +=  fmt .Sprintf ("\n  Returns:\n %s" , returnSection )
445+ 		tagName  :=  firstCaptureContentOr (comment , captures ["tag_name" ], "" )
446+ 		switch  tagName  {
447+ 		case  "@param" :
448+ 			argsSection  +=  fmt .Sprintf ("\n \t %s%s%s" , identifierName , identifierType , identifierDescription )
449+ 		case  "@return" :
450+ 			returnSection  +=  fmt .Sprintf ("\n \t %s%s%s" , identifierName , identifierType , identifierDescription )
388451		}
452+ 	}
453+ 
454+ 	if  len (argsSection ) >  0  {
455+ 		funcDocs  +=  fmt .Sprintf ("\n  Arguments:\n %s" , argsSection )
456+ 	}
389457
390- 		return  funcDocs 
458+ 	if  len (returnSection ) >  0  {
459+ 		funcDocs  +=  fmt .Sprintf ("\n  Returns:\n %s" , returnSection )
391460	}
392461
393- 	return  sanitizeDocs ( s ) 
462+ 	return  funcDocs 
394463}
395464
396465func  sanitizeDocs (s  string ) string  {
0 commit comments