@@ -405,118 +405,27 @@ def _is_expandable(self, value: Any) -> bool:
405405 return isinstance (value , (dict , list , tuple , set ))
406406
407407 def _get_preview (self , value : Any , fallback_text : str = "" ) -> str :
408- """Get a truncated preview of a variable value - optimized for MicroPython."""
408+ """Get a 30-char preview of a variable value with '...' if truncated - optimized for MicroPython."""
409409 try :
410- if value is None :
411- return "None"
412-
413- # Fast path for common types to avoid repr() overhead
414- if isinstance (value , bool ):
415- return "True" if value else "False"
416- elif isinstance (value , int ):
417- return str (value )
418- elif isinstance (value , float ):
419- # Limit float precision to reduce string length
420- return f"{ value :.6g} "
421- elif isinstance (value , str ):
422- if len (value ) > 30 :
423- return value [:30 ] + "..."
424- else :
425- return repr (value ) # Only use repr for short strings
426-
427- # For collections, show actual content if small, otherwise use lightweight approach
428- elif isinstance (value , dict ):
429- if len (value ) == 0 :
430- return "{}"
431- elif len (value ) <= 3 :
432- # Show actual content for small dictionaries
433- try :
434- repr_val = repr (value )
435- if len (repr_val ) <= 60 :
436- return repr_val
437- else :
438- # Fallback to key list if repr is too long
439- keys = list (value .keys ())[:3 ]
440- key_str = ", " .join (repr (k ) for k in keys )
441- return f"{{{ key_str } }}"
442- except :
443- return f"dict({ len (value )} items)"
444- else :
445- return f"dict({ len (value )} items)"
446- elif isinstance (value , (list , tuple )):
447- if len (value ) == 0 :
448- return "[]" if isinstance (value , list ) else "()"
449- elif len (value ) <= 4 :
450- # Show actual content for small lists/tuples
451- try :
452- repr_val = repr (value )
453- if len (repr_val ) <= 60 :
454- return repr_val
455- else :
456- # Fallback to item preview if repr is too long
457- items = [str (item )[:10 ] for item in value [:3 ]]
458- bracket = "[]" if isinstance (value , list ) else "()"
459- return f"{ bracket [0 ]} { ', ' .join (items )} ...{ bracket [1 ]} "
460- except :
461- type_name = type (value ).__name__
462- return f"{ type_name } ({ len (value )} items)"
463- else :
464- type_name = type (value ).__name__
465- return f"{ type_name } ({ len (value )} items)"
466- elif isinstance (value , set ):
467- if len (value ) == 0 :
468- return "set()"
469- elif len (value ) <= 4 :
470- # Show actual content for small sets
471- try :
472- repr_val = repr (value )
473- if len (repr_val ) <= 60 :
474- return repr_val
475- else :
476- # Fallback to item preview
477- items = [str (item )[:10 ] for item in list (value )[:3 ]]
478- return f"{{{ ', ' .join (items )} ...}}"
479- except :
480- return f"set({ len (value )} items)"
481- else :
482- return f"set({ len (value )} items)"
483-
484- # For other complex types, use lightweight approach
485- type_name = type (value ).__name__
486- try :
487- if hasattr (value , '__len__' ):
488- length = len (value ) # type: ignore
489- if length == 0 :
490- return f"{ type_name } (empty)"
491- else :
492- return f"{ type_name } ({ length } items)"
493- except :
494- pass
495-
496- # Final fallback - avoid expensive repr() for complex objects
497- return f"<{ type_name } object>"
498-
410+ # Get repr and truncate to exactly 30 chars with "..." if needed
411+ repr_val = repr (value )
412+ if len (repr_val ) <= 30 :
413+ return repr_val
414+ else :
415+ return repr_val [:30 ] + "..."
499416 except (TypeError , ValueError , MemoryError ):
500417 # Memory-safe fallback
501- return fallback_text or f"<{ type (value ).__name__ } object>"
418+ return fallback_text or f"<{ type (value ).__name__ } object>" [: 30 ]
502419
503420 def _get_variable_info (self , name : str , value : Any ) -> dict [str , str | int ]:
504421 """Get DAP-compliant variable information with proper type handling."""
505422 try :
506423 # Handle expandable types
507424 if self ._is_expandable (value ):
508425 var_ref = self .var_cache .add_variable (value )
426+ preview = self ._get_preview (value ) # Always use consistent preview
509427
510428 if isinstance (value , dict ):
511- # Show actual content for small dicts, generic preview for large ones
512- if len (value ) == 0 :
513- preview = "dict(empty)"
514- elif len (value ) <= 3 :
515- # Show actual keys for small dictionaries
516- preview = self ._get_preview (value )
517- else :
518- preview = f"dict({ len (value )} items)"
519-
520429 return {
521430 "name" : name ,
522431 "value" : preview ,
@@ -526,15 +435,6 @@ def _get_variable_info(self, name: str, value: Any) -> dict[str, str | int]:
526435 "indexedVariables" : 0 ,
527436 }
528437 elif isinstance (value , list ):
529- # Show actual content for small lists, generic preview for large ones
530- if len (value ) == 0 :
531- preview = "list(empty)"
532- elif len (value ) <= 4 :
533- # Show actual items for small lists
534- preview = self ._get_preview (value )
535- else :
536- preview = f"list({ len (value )} items)"
537-
538438 return {
539439 "name" : name ,
540440 "value" : preview ,
@@ -544,14 +444,6 @@ def _get_variable_info(self, name: str, value: Any) -> dict[str, str | int]:
544444 "namedVariables" : 0 ,
545445 }
546446 elif isinstance (value , tuple ):
547- # Show actual content for small tuples
548- if len (value ) == 0 :
549- preview = "tuple(empty)"
550- elif len (value ) <= 4 :
551- preview = self ._get_preview (value )
552- else :
553- preview = f"tuple({ len (value )} items)"
554-
555447 return {
556448 "name" : name ,
557449 "value" : preview ,
@@ -561,14 +453,6 @@ def _get_variable_info(self, name: str, value: Any) -> dict[str, str | int]:
561453 "namedVariables" : 0 ,
562454 }
563455 elif isinstance (value , set ):
564- # Show actual content for small sets
565- if len (value ) == 0 :
566- preview = "set(empty)"
567- elif len (value ) <= 4 :
568- preview = self ._get_preview (value )
569- else :
570- preview = f"set({ len (value )} items)"
571-
572456 return {
573457 "name" : name ,
574458 "value" : preview ,
@@ -596,18 +480,14 @@ def _get_variable_info_fast(self, name: str, value: Any) -> dict[str, str | int]
596480 # Handle expandable types
597481 if self ._is_expandable (value ):
598482 var_ref = self .var_cache .add_variable (value )
599- type_name = type (value ). __name__
483+ preview = self . _get_preview (value ) # Always use consistent preview
600484
601485 # Use pre-calculated length for better performance
602486 length = 0
603487 try :
604488 length = len (value ) # type: ignore
605- if length == 0 :
606- preview = f"{ type_name } (empty)"
607- else :
608- preview = f"{ type_name } ({ length } items)"
609489 except :
610- preview = f"< { type_name } object>"
490+ pass
611491
612492 # Return optimized structure based on type
613493 if isinstance (value , dict ):
@@ -632,7 +512,7 @@ def _get_variable_info_fast(self, name: str, value: Any) -> dict[str, str | int]
632512 return {
633513 "name" : name ,
634514 "value" : preview ,
635- "type" : type_name ,
515+ "type" : type ( value ). __name__ ,
636516 "variablesReference" : var_ref ,
637517 "indexedVariables" : min (length , 1000 ),
638518 "namedVariables" : 0 ,
@@ -719,7 +599,7 @@ def _var_error(name: str):
719599
720600 @staticmethod
721601 def _special_vars (varref : int ):
722- return {"name" : "Special " , "value" : "" , "variablesReference" : varref }
602+ return {"name" : "special " , "value" : "" , "variablesReference" : varref }
723603
724604 def get_variables (self , variables_ref ):
725605 """Get variables for a scope with enhanced complex variable support."""
0 commit comments