package jetbrains.mps.debugger.java.api.state.watchables; /*Generated by MPS */ import jetbrains.mps.debug.api.programState.IWatchable; import com.sun.jdi.LocalVariable; import jetbrains.mps.debugger.java.api.state.proxy.JavaStackFrame; import jetbrains.mps.debugger.java.api.state.proxy.JavaValue; import com.sun.jdi.ThreadReference; import com.sun.jdi.StackFrame; import jetbrains.mps.debugger.java.api.state.customViewers.CustomViewersManager; import jetbrains.mps.debug.api.programState.IValue; import javax.swing.Icon; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SNodeReference; import jetbrains.mps.debugger.java.api.state.proxy.JavaLocation; import jetbrains.mps.textgen.trace.TraceInfoProvider; import java.util.Iterator; import jetbrains.mps.textgen.trace.DebugInfo; import jetbrains.mps.debugger.java.api.state.JavaUiState; import java.util.List; import jetbrains.mps.debug.api.programState.WatchablesCategory; public class JavaLocalVariable extends JavaWatchable implements IWatchable { private final LocalVariable myLocalVariable; private final JavaStackFrame myStackFrame; private final JavaValue myCachedValue; public JavaLocalVariable(LocalVariable variable, JavaStackFrame stackFrame, ThreadReference threadReference) { super(threadReference); myLocalVariable = variable; myStackFrame = stackFrame; StackFrame javaStackFrame = myStackFrame.getStackFrame(); if (javaStackFrame != null) { myCachedValue = CustomViewersManager.getInstance().fromJdi(javaStackFrame.getValue(myLocalVariable), threadReference); } else { myCachedValue = null; } } public LocalVariable getLocalVariable() { return myLocalVariable; } @Override public String getName() { return myLocalVariable.name(); } @Override public IValue getValue() { return myCachedValue; } @Override public Icon getPresentationIcon() { return getValue().getPresentationIcon(); } @Nullable @Override public SNodeReference getSourceNode() { JavaLocation location = myStackFrame.getLocation(); if (location == null) { return null; } TraceInfoProvider traceProvider = myStackFrame.getThread().getDebugSession().getTraceProvider(); for (Iterator<DebugInfo> it = traceProvider.debugInfo(JavaUiState.modelNameFromLocation(location)).iterator(); it.hasNext();) { DebugInfo di = it.next(); List<SNodeReference> varNodes = di.getVariableNodesForPosition(location.getFileName(), location.getLineNumber(), myLocalVariable.name()); if (!(varNodes.isEmpty())) { return varNodes.get(0); } } return null; } @Override public WatchablesCategory getCategory() { return JavaWatchablesCategory.LOCAL_VARIABLE; } }