@@ -255,7 +255,25 @@ fn completion_dot(
255
255
Some ( def_ref) => {
256
256
if let Some ( def) = gs. get_symbols ( ) . get_symbol ( def_ref) {
257
257
let module_info = gs. get_packages ( ) . get_module_info ( & pos. filename ) ;
258
- let attrs = def. get_all_attributes ( gs. get_symbols ( ) , module_info) ;
258
+ let attrs = match & def. get_sema_info ( ) . ty {
259
+ Some ( symbol_ty) => match & symbol_ty. kind {
260
+ TypeKind :: Union ( union_types) => {
261
+ let mut union_attrs = vec ! [ ] ;
262
+ for union_ty in union_types {
263
+ if let TypeKind :: StrLit ( _) | TypeKind :: Str = & union_ty. kind {
264
+ union_attrs. extend ( gs. get_symbols ( ) . get_type_all_attribute (
265
+ union_ty,
266
+ "" ,
267
+ module_info,
268
+ ) ) ;
269
+ }
270
+ }
271
+ union_attrs
272
+ }
273
+ _ => def. get_all_attributes ( gs. get_symbols ( ) , module_info) ,
274
+ } ,
275
+ None => def. get_all_attributes ( gs. get_symbols ( ) , module_info) ,
276
+ } ;
259
277
for attr in attrs {
260
278
let attr_def = gs. get_symbols ( ) . get_symbol ( attr) ;
261
279
if let Some ( attr_def) = attr_def {
@@ -277,6 +295,18 @@ fn completion_dot(
277
295
} ;
278
296
let kind = match & def. get_sema_info ( ) . ty {
279
297
Some ( symbol_ty) => match & symbol_ty. kind {
298
+ TypeKind :: Union ( union_types) => {
299
+ if union_types. iter ( ) . any ( |ut| {
300
+ matches ! (
301
+ & ut. kind,
302
+ TypeKind :: StrLit ( _) | TypeKind :: Str
303
+ )
304
+ } ) {
305
+ Some ( KCLCompletionItemKind :: Function )
306
+ } else {
307
+ type_to_item_kind ( attr_ty)
308
+ }
309
+ }
280
310
TypeKind :: Schema ( _) => {
281
311
Some ( KCLCompletionItemKind :: SchemaAttr )
282
312
}
@@ -319,90 +349,6 @@ fn completion_dot(
319
349
None => { }
320
350
}
321
351
322
- if let Some ( scope) = gs. look_up_scope ( pos) {
323
- if let Some ( defs) = gs. get_all_defs_in_scope ( scope) {
324
- for symbol_ref in defs {
325
- if let Some ( def) = gs. get_symbols ( ) . get_symbol ( symbol_ref) {
326
- let sema_info = def. get_sema_info ( ) ;
327
- if let Some ( ty) = & sema_info. ty {
328
- if let TypeKind :: Union ( union_types) = & ty. kind {
329
- for union_ty in union_types {
330
- if let TypeKind :: StrLit ( _) | TypeKind :: Str = & union_ty. kind {
331
- let module_info =
332
- gs. get_packages ( ) . get_module_info ( & pos. filename ) ;
333
- let str_attrs = gs. get_symbols ( ) . get_type_all_attribute (
334
- & union_ty,
335
- "" ,
336
- module_info,
337
- ) ;
338
- for str_attr in str_attrs {
339
- let str_attr_def = gs. get_symbols ( ) . get_symbol ( str_attr) ;
340
- if let Some ( str_attr_def) = str_attr_def {
341
- let str_sema_info = str_attr_def. get_sema_info ( ) ;
342
- let attr_name = str_attr_def. get_name ( ) ;
343
- match & str_sema_info. ty {
344
- Some ( str_attr_ty) => {
345
- let label: String = match & str_attr_ty. kind {
346
- TypeKind :: Function ( func_ty) => {
347
- func_ty_complete_label (
348
- & attr_name, func_ty,
349
- )
350
- }
351
- _ => attr_name. clone ( ) ,
352
- } ;
353
- let insert_text = match & str_attr_ty. kind {
354
- TypeKind :: Function ( func_ty) => {
355
- Some ( func_ty_complete_insert_text (
356
- & attr_name, func_ty,
357
- ) )
358
- }
359
- _ => None ,
360
- } ;
361
- let kind =
362
- Some ( KCLCompletionItemKind :: Function ) ;
363
- let documentation = match & str_sema_info. doc {
364
- Some ( doc) => {
365
- if doc. is_empty ( ) {
366
- None
367
- } else {
368
- Some ( doc. clone ( ) )
369
- }
370
- }
371
- None => None ,
372
- } ;
373
- items. insert ( KCLCompletionItem {
374
- label,
375
- detail : Some ( format ! (
376
- "{}: {}" ,
377
- attr_name,
378
- str_attr_ty. ty_str( )
379
- ) ) ,
380
- documentation,
381
- kind,
382
- insert_text,
383
- } ) ;
384
- }
385
- None => {
386
- items. insert ( KCLCompletionItem {
387
- label : attr_name,
388
- detail : None ,
389
- documentation : None ,
390
- kind : None ,
391
- insert_text : None ,
392
- } ) ;
393
- }
394
- }
395
- }
396
- }
397
- }
398
- }
399
- }
400
- }
401
- }
402
- }
403
- }
404
- }
405
-
406
352
Some ( into_completion_items ( & items) . into ( ) )
407
353
}
408
354
0 commit comments