Skip to content

Commit 3435c93

Browse files
committed
revert: Overly complex variable preview.
Signed-off-by: Jos Verlinde <jos_verlinde@hotmail.com>
1 parent 49005b4 commit 3435c93

1 file changed

Lines changed: 13 additions & 133 deletions

File tree

python-ecosys/debugpy/debugpy/server/pdb_adapter.py

Lines changed: 13 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)