7272import org .eclipse .jdt .internal .debug .core .breakpoints .JavaExceptionBreakpoint ;
7373import org .eclipse .jdt .internal .debug .core .logicalstructures .JDIAllInstancesValue ;
7474import org .eclipse .jdt .internal .debug .core .logicalstructures .JDIReturnValueVariable ;
75+ import org .eclipse .jdt .internal .debug .core .model .GroupedStackFrame ;
7576import org .eclipse .jdt .internal .debug .core .model .JDIDebugModelMessages ;
7677import org .eclipse .jdt .internal .debug .core .model .JDIReferenceListEntryVariable ;
7778import org .eclipse .jdt .internal .debug .core .model .JDIReferenceListValue ;
@@ -150,6 +151,8 @@ public class JDIModelPresentation extends LabelProvider implements IDebugModelPr
150151
151152 private JavaElementLabelProvider fJavaLabelProvider ;
152153
154+ private StackFramePresentationProvider fStackFrameProvider ;
155+
153156 public JDIModelPresentation () {
154157 super ();
155158 }
@@ -164,6 +167,9 @@ public void dispose() {
164167 fJavaLabelProvider .dispose ();
165168 }
166169 fAttributes .clear ();
170+ if (fStackFrameProvider != null ) {
171+ fStackFrameProvider .close ();
172+ }
167173 }
168174
169175 /**
@@ -243,6 +249,8 @@ public String getText(Object item) {
243249 return getJavaOwningTreadText ((JavaOwningThread )item );
244250 } else if (item instanceof JavaWaitingThread ) {
245251 return getJavaWaitingTreadText ((JavaWaitingThread )item );
252+ } else if (item instanceof GroupedStackFrame groupping ) {
253+ return getFormattedString (DebugUIMessages .JDIModelPresentation_collapsed_frames , String .valueOf (groupping .getFrameCount ()));
246254 } else if (item instanceof NoMonitorInformationElement ) {
247255 return DebugUIMessages .JDIModelPresentation_5 ;
248256 } else {
@@ -736,7 +744,10 @@ public Image getImage(Object item) {
736744 return DebugUITools .getImage (IDebugUIConstants .IMG_OBJS_THREAD_RUNNING );
737745 }
738746 }
739- if (item instanceof IJavaStackFrame || item instanceof IJavaThread || item instanceof IJavaDebugTarget ) {
747+ if (item instanceof IJavaStackFrame ) {
748+ return getStackFrameImage ((IJavaStackFrame ) item );
749+ }
750+ if (item instanceof IJavaThread || item instanceof IJavaDebugTarget ) {
740751 return getDebugElementImage (item );
741752 }
742753 if (item instanceof IJavaValue ) {
@@ -936,6 +947,25 @@ protected Image getDebugElementImage(Object element) {
936947 return getDebugImage (image , flags );
937948 }
938949
950+ private Image getStackFrameImage (IJavaStackFrame stackFrame ) {
951+ var image = getStackFrameProvider ().getStackFrameImage (stackFrame );
952+ if (image == null ) {
953+ image = DebugUITools .getDefaultImageDescriptor (stackFrame );
954+ }
955+
956+ int flags = 0 ;
957+ try {
958+ if (stackFrame .isOutOfSynch ()) {
959+ flags = JDIImageDescriptor .IS_OUT_OF_SYNCH ;
960+ } else if (!stackFrame .isObsolete () && stackFrame .isSynchronized ()) {
961+ flags = JDIImageDescriptor .SYNCHRONIZED ;
962+ }
963+ } catch (DebugException e ) {
964+ // no need to log errors - elements may no longer exist by the time we render them
965+ }
966+
967+ return getDebugImage (image , flags );
968+ }
939969 /**
940970 * Returns the image associated with the given element or <code>null</code>
941971 * if none is defined.
@@ -964,15 +994,6 @@ protected Image getExpressionImage(Object expression) {
964994 */
965995 private int computeJDIAdornmentFlags (Object element ) {
966996 try {
967- if (element instanceof IJavaStackFrame ) {
968- IJavaStackFrame javaStackFrame = ((IJavaStackFrame )element );
969- if (javaStackFrame .isOutOfSynch ()) {
970- return JDIImageDescriptor .IS_OUT_OF_SYNCH ;
971- }
972- if (!javaStackFrame .isObsolete () && javaStackFrame .isSynchronized ()) {
973- return JDIImageDescriptor .SYNCHRONIZED ;
974- }
975- }
976997 if (element instanceof IJavaThread ) {
977998 int flag = 0 ;
978999 IJavaThread javaThread = ((IJavaThread )element );
@@ -2048,6 +2069,12 @@ protected JavaElementLabelProvider getJavaLabelProvider() {
20482069 return fJavaLabelProvider ;
20492070 }
20502071
2072+ private StackFramePresentationProvider getStackFrameProvider () {
2073+ if (fStackFrameProvider == null ) {
2074+ fStackFrameProvider = new StackFramePresentationProvider ();
2075+ }
2076+ return fStackFrameProvider ;
2077+ }
20512078 /**
20522079 * Returns whether the given field variable has the same name as any variables
20532080 */
0 commit comments