blob: 14fc9a5c84ea536eadba588b583712a93fb01e42 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 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.eval.ast.instructions;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.jdi.internal.PrimitiveTypeImpl;
import org.eclipse.jdi.internal.VirtualMachineImpl;
import org.eclipse.jdt.debug.core.IJavaType;
import org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget;
import org.eclipse.jdt.internal.debug.core.model.JDIType;
import org.eclipse.osgi.util.NLS;
import com.sun.jdi.VirtualMachine;
public class LocalVariableCreation extends CompoundInstruction {
/**
* Indicate if the type is a primitive type.
*/
private boolean fIsPrimitiveType;
/**
* The name of the variable to create.
*/
private String fName;
/**
* The signature of the type, or of the element type in case of an array
* type.
*/
private String fTypeSignature;
/**
* The dimension of the array type.
*/
private int fDimension;
/**
* Indicate if there is an initializer for this variable.
*/
private boolean fHasInitializer;
/**
* Constructor for LocalVariableCreation.
*
* @param name
* the name of the variable to create.
* @param typeSignature
* the signature of the type, or of the element type in case of
* an array type.
* @param dimension
* the dimension of the array type, <code>0</code> if it's not an
* array type.
* @param isPrimitiveType
* indicate if the type is a primitive type.
* @param hasInitializer
* indicate if there is an initializer for this variable.
* @param start
*/
public LocalVariableCreation(String name, String typeSignature,
int dimension, boolean isPrimitiveType, boolean hasInitializer,
int start) {
super(start);
fName = name;
fTypeSignature = typeSignature.replace('/', '.');
fIsPrimitiveType = isPrimitiveType;
fHasInitializer = hasInitializer;
fDimension = dimension;
}
/**
* @see org.eclipse.jdt.internal.debug.eval.ast.instructions.Instruction#execute()
*/
@Override
public void execute() throws CoreException {
IJavaType type;
if (fIsPrimitiveType) {
JDIDebugTarget debugTarget = (JDIDebugTarget) getVM();
VirtualMachine vm = debugTarget.getVM();
if (vm == null) {
debugTarget
.requestFailed(
InstructionsEvaluationMessages.LocalVariableCreation_Execution_failed___VM_disconnected__1,
null);
}
type = JDIType.createType(debugTarget, PrimitiveTypeImpl.create(
(VirtualMachineImpl) vm, fTypeSignature));
} else if (fDimension == 0) {
type = getType(RuntimeSignature.toString(fTypeSignature)); // See
// Bug
// 22165
} else {
type = getArrayType(fTypeSignature, fDimension);
}
IVariable var = createInternalVariable(fName, type);
if (fHasInitializer) {
Object value = popValue();
if (value instanceof String)
var.setValue((String) value);
}
}
@Override
public String toString() {
return NLS.bind(InstructionsEvaluationMessages.LocalVariableCreation_create_local_variable__0___1___1,
new String[] { fName, fTypeSignature });
}
}