Search in sources :

Example 1 with FieldImpl

use of org.eclipse.che.api.debug.shared.model.impl.FieldImpl in project che by eclipse.

the class JavaDebugger method getValue.

/**
     * Get value of variable with specified path. Each item in path is name of variable.
     * <p>
     * Path must be specified according to the following rules:
     * <ol>
     * <li>If need to get field of this object of current frame then first element in array always should be
     * 'this'.</li>
     * <li>If need to get static field in current frame then first element in array always should be 'static'.</li>
     * <li>If need to get local variable in current frame then first element should be the name of local variable.</li>
     * </ol>
     * </p>
     * Here is example. <br/>
     * Assume we have next hierarchy of classes and breakpoint set in line: <i>// breakpoint</i>:
     * <pre>
     *    class A {
     *       private String str;
     *       ...
     *    }
     *
     *    class B {
     *       private A a;
     *       ....
     *
     *       void method() {
     *          A var = new A();
     *          var.setStr(...);
     *          a = var;
     *          // breakpoint
     *       }
     *    }
     * </pre>
     * There are two ways to access variable <i>str</i> in class <i>A</i>:
     * <ol>
     * <li>Through field <i>a</i> in class <i>B</i>: ['this', 'a', 'str']</li>
     * <li>Through local variable <i>var</i> in method <i>B.method()</i>: ['var', 'str']</li>
     * </ol>
     *
     * @param variablePath
     *         path to variable
     * @return variable or <code>null</code> if variable not found
     * @throws DebuggerException
     *         when any other errors occur when try to access the variable
     */
@Override
public SimpleValue getValue(VariablePath variablePath) throws DebuggerException {
    List<String> path = variablePath.getPath();
    if (path.size() == 0) {
        throw new IllegalArgumentException("Path to value may not be empty. ");
    }
    JdiVariable variable;
    int offset;
    if ("this".equals(path.get(0)) || "static".equals(path.get(0))) {
        if (path.size() < 2) {
            throw new IllegalArgumentException("Name of field required. ");
        }
        variable = getCurrentFrame().getFieldByName(path.get(1));
        offset = 2;
    } else {
        try {
            variable = getCurrentFrame().getLocalVariableByName(path.get(0));
        } catch (DebuggerAbsentInformationException e) {
            return null;
        }
        offset = 1;
    }
    for (int i = offset; variable != null && i < path.size(); i++) {
        variable = variable.getValue().getVariableByName(path.get(i));
    }
    if (variable == null) {
        return null;
    }
    List<Variable> variables = new ArrayList<>();
    for (JdiVariable ch : variable.getValue().getVariables()) {
        VariablePathDto chPath = newDto(VariablePathDto.class).withPath(new ArrayList<>(path));
        chPath.getPath().add(ch.getName());
        if (ch instanceof JdiField) {
            JdiField f = (JdiField) ch;
            variables.add(new FieldImpl(f.getName(), true, f.getValue().getAsString(), f.getTypeName(), f.isPrimitive(), Collections.<Variable>emptyList(), chPath, f.isFinal(), f.isStatic(), f.isTransient(), f.isVolatile()));
        } else {
            // Array element.
            variables.add(new VariableImpl(ch.getTypeName(), ch.getName(), ch.getValue().getAsString(), ch.isPrimitive(), chPath, Collections.emptyList(), true));
        }
    }
    return new SimpleValueImpl(variables, variable.getValue().getAsString());
}
Also used : Variable(org.eclipse.che.api.debug.shared.model.Variable) VariablePathDto(org.eclipse.che.api.debug.shared.dto.VariablePathDto) SimpleValueImpl(org.eclipse.che.api.debug.shared.model.impl.SimpleValueImpl) ArrayList(java.util.ArrayList) FieldImpl(org.eclipse.che.api.debug.shared.model.impl.FieldImpl) Breakpoint(org.eclipse.che.api.debug.shared.model.Breakpoint) DebuggerAbsentInformationException(org.eclipse.che.plugin.jdb.server.exceptions.DebuggerAbsentInformationException) VariableImpl(org.eclipse.che.api.debug.shared.model.impl.VariableImpl)

Aggregations

ArrayList (java.util.ArrayList)1 VariablePathDto (org.eclipse.che.api.debug.shared.dto.VariablePathDto)1 Breakpoint (org.eclipse.che.api.debug.shared.model.Breakpoint)1 Variable (org.eclipse.che.api.debug.shared.model.Variable)1 FieldImpl (org.eclipse.che.api.debug.shared.model.impl.FieldImpl)1 SimpleValueImpl (org.eclipse.che.api.debug.shared.model.impl.SimpleValueImpl)1 VariableImpl (org.eclipse.che.api.debug.shared.model.impl.VariableImpl)1 DebuggerAbsentInformationException (org.eclipse.che.plugin.jdb.server.exceptions.DebuggerAbsentInformationException)1