blob: f544c1c89aaadea944a546cfd832ae632527692b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.debug.ui.contentassist;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.model.IExpression;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.ui.IDebugView;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.debug.core.IJavaArray;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaObject;
import org.eclipse.jdt.debug.core.IJavaPrimitiveValue;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaType;
import org.eclipse.jdt.debug.core.IJavaValue;
import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
import org.eclipse.jdt.internal.debug.eval.ast.engine.ASTEvaluationEngine;
import org.eclipse.jdt.internal.debug.eval.ast.engine.ArrayRuntimeContext;
import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
public class CurrentValueContext extends CurrentFrameContext {
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.contentassist.IJavaDebugContentAssistContext#getType()
*/
@Override
public IType getType() throws CoreException {
IJavaValue value = resolveValue();
if (value == null || value instanceof IJavaPrimitiveValue) {
// no object selected, use the frame
return super.getType();
}
IType type = null;
if (value instanceof IJavaArray) {
// completion in context of Object
IJavaType[] types = ((IJavaDebugTarget)value.getDebugTarget()).getJavaTypes("java.lang.Object"); //$NON-NLS-1$
if (types.length > 0) {
type = JavaDebugUtils.resolveType(types[0]);
}
} else {
type = JavaDebugUtils.resolveType(value);
}
if (type == null) {
unableToResolveType();
}
return type;
}
/**
* Returns the value for which completions are to be computed for, or <code>null</code> if none.
*
* @return the value for which completions are to be computed for, or <code>null</code> if none
* @throws CoreException if an exception occurs
*/
protected IJavaValue resolveValue() throws CoreException {
IJavaStackFrame stackFrame= getStackFrame();
if (stackFrame == null) {
unableToResolveType();
}
IWorkbenchWindow window= JDIDebugUIPlugin.getActiveWorkbenchWindow();
if (window == null) {
unableToResolveType();
}
IWorkbenchPage page= window.getActivePage();
if (page == null) {
unableToResolveType();
}
IDebugView view= (IDebugView)page.getActivePart();
if (view == null) {
unableToResolveType();
}
ISelection selection= view.getViewer().getSelection();
if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
IStructuredSelection viewerSelection= (IStructuredSelection)selection;
if (viewerSelection.size() > 1) {
unableToResolveType();
}
Object element= viewerSelection.getFirstElement();
IValue value= null;
if (element instanceof IVariable) {
IVariable variable = (IVariable)element;
if (!variable.getName().equals("this")) { //$NON-NLS-1$
value= variable.getValue();
}
} else if (element instanceof IExpression) {
value= ((IExpression)element).getValue();
}
if (value instanceof IJavaValue) {
return (IJavaValue) value;
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.contentassist.IJavaDebugContentAssistContext#getLocalVariables()
*/
@Override
public String[][] getLocalVariables() throws CoreException {
IJavaValue value = resolveValue();
if (value instanceof IJavaArray) {
// do a song and dance to fake 'this' as an array receiver
return new String[][]{new String[] {ArrayRuntimeContext.ARRAY_THIS_VARIABLE}, new String[] {value.getJavaType().getName()}};
} else if (value instanceof IJavaObject) {
return new String[][]{};
}
return super.getLocalVariables();
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.contentassist.IJavaDebugContentAssistContext#getSnippet(java.lang.String)
*/
@Override
public String getSnippet(String snippet) throws CoreException {
IJavaValue value = resolveValue();
if (value instanceof IJavaArray) {
return ASTEvaluationEngine.replaceThisReferences(snippet);
}
return super.getSnippet(snippet);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.contentassist.CurrentFrameContext#isStatic()
*/
@Override
public boolean isStatic() throws CoreException {
IJavaValue value = resolveValue();
if (value instanceof IJavaObject) {
return false;
}
return super.isStatic();
}
}