blob: 37afec733fa4700520f18cfb8e15d982426645ec [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2005 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
*******************************************************************************/
/*
* $RCSfile: ASTBoundResolver.java,v $
* $Revision: 1.9 $ $Date: 2005/08/24 21:13:53 $
*/
package org.eclipse.jem.workbench.utility;
import java.text.MessageFormat;
import org.eclipse.jdt.core.dom.*;
import org.eclipse.jem.internal.instantiation.*;
import org.eclipse.jem.workbench.utility.ParseTreeCreationFromAST.InvalidExpressionException;
/**
* This works on resolved AST nodes. If the nodes had not been resolved, this will return noting.
*
* @since 1.0.0
*/
public class ASTBoundResolver extends ParseTreeCreationFromAST.Resolver {
/* (non-Javadoc)
* @see org.eclipse.jem.workbench.utility.ParseTreeCreationFromAST.IResolver#resolveName(org.eclipse.jdt.core.dom.Name)
*/
public PTExpression resolveName(Name name) {
IBinding binding = name.resolveBinding();
if (binding == null)
return null;
switch (binding.getKind()) {
case IBinding.TYPE:
String typename = getTypeName((ITypeBinding) binding);
PTName ptname = InstantiationFactory.eINSTANCE.createPTName();
ptname.setName(typename);
return ptname;
case IBinding.VARIABLE:
IVariableBinding variableBinding = (IVariableBinding) binding;
if (variableBinding.isField()) {
if (Modifier.isStatic(variableBinding.getModifiers())) {
PTFieldAccess fa = InstantiationFactory.eINSTANCE.createPTFieldAccess();
// If just a simple name, then it is like this.field, so no receiver. Not sure how to handle this yet.
if (name.isQualifiedName()) {
// There are parts before this one. Get them as an expression (either a name, or another field access)
fa.setReceiver(resolveName(((QualifiedName) name).getQualifier()));
}
fa.setField(variableBinding.getName());
return fa;
} else {
throwInvalidExpressionException(MessageFormat.format(WorkbenchUtilityMessages.ASTBoundResolver_CannotHandleLocalField_EXC_, new Object[]{variableBinding.getName()}));
// push(new PushFieldVariable(variableId, getTypeSignature(declaringTypeBinding), fCounter));
// push(new PushThis(getEnclosingLevel(node, declaringTypeBinding)));
// storeInstruction();
}
} else {
throwInvalidExpressionException(MessageFormat.format(WorkbenchUtilityMessages.ASTBoundResolver_CannotHandleLocalVariable_EXC_, new Object[]{variableBinding.getName()}));
// push(new PushLocalVariable(variableId));
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jem.workbench.utility.IResolver#resolveType(org.eclipse.jdt.core.dom.Type)
*/
public String resolveType(Type type) {
ITypeBinding binding = type.resolveBinding();
return (binding != null) ? getTypeName(binding) : null;
}
/* (non-Javadoc)
* @see org.eclipse.jem.workbench.utility.ParseTreeCreationFromAST.Resolver#resolveType(org.eclipse.jdt.core.dom.Name)
*/
public String resolveType(Name name) throws InvalidExpressionException {
ITypeBinding binding = name.resolveTypeBinding();
return (binding != null) ? getTypeName(binding) : null;
}
protected String getTypeName(ITypeBinding typeBinding) {
StringBuffer name;
if (typeBinding.isArray()) {
name= new StringBuffer(getTypeName(typeBinding.getElementType()));
int dimensions= typeBinding.getDimensions();
for (int i= 0; i < dimensions; i++) {
name.append("[]"); //$NON-NLS-1$
}
return name.toString();
}
name= new StringBuffer(typeBinding.getName());
IPackageBinding packageBinding= typeBinding.getPackage();
typeBinding= typeBinding.getDeclaringClass();
while(typeBinding != null) {
name.insert(0, '$').insert(0, typeBinding.getName());
typeBinding= typeBinding.getDeclaringClass();
}
if (packageBinding != null && !packageBinding.isUnnamed()) {
name.insert(0, '.').insert(0, packageBinding.getName());
}
return name.toString();
}
/* (non-Javadoc)
* @see org.eclipse.jem.workbench.utility.ParseTreeCreationFromAST.Resolver#resolveThis()
*/
public PTExpression resolveThis() throws InvalidExpressionException {
return InstantiationFactory.eINSTANCE.createPTThisLiteral();
}
}