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;
}
}