| /******************************************************************************* |
| * 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 |
| *******************************************************************************/ |
| /* |
| |
| |
| */ |
| 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(); |
| } |
| } |