return varDecl.getInitializer().resolveTypeBinding();
return Bindings.normalizeTypeBinding(varDecl.getInitializer().resolveTypeBinding());
	private static ITypeBinding getPossibleTypeBinding(ASTNode node) {		ASTNode parent= node.getParent();		switch (parent.getNodeType()) {			case ASTNode.ARRAY_TYPE: {				int dim= 1;				while (parent.getParent() instanceof ArrayType) {					parent= parent.getParent();					dim++;				}				ITypeBinding parentBinding= getPossibleTypeBinding(parent);				if (parentBinding != null && parentBinding.getDimensions() == dim) {					return parentBinding.getElementType();				}				return null;			}			case ASTNode.PARAMETERIZED_TYPE: {				ITypeBinding parentBinding= getPossibleTypeBinding(parent);				if (parentBinding == null || !parentBinding.isParameterizedType()) {					return null;				}				if (node.getLocationInParent() == ParameterizedType.TYPE_PROPERTY) {					return parentBinding;				}				ITypeBinding[] typeArguments= parentBinding.getTypeArguments();				List argumentNodes= ((ParameterizedType) parent).typeArguments();				int index= argumentNodes.indexOf(node);				if (index != -1 && typeArguments.length == argumentNodes.size()) {					return typeArguments[index];				}				return null;			}			case ASTNode.WILDCARD_TYPE: {				ITypeBinding parentBinding= getPossibleTypeBinding(parent);				if (parentBinding == null || !parentBinding.isWildcardType()) {					return null;				}				WildcardType wildcardType= (WildcardType) parent;				if (parentBinding.isUpperbound() == wildcardType.isUpperBound()) {					return parentBinding.getBound();				}				return null;			}			case ASTNode.QUALIFIED_TYPE: {				ITypeBinding parentBinding= getPossibleTypeBinding(parent);				if (parentBinding == null || !parentBinding.isMember()) {					return null;				}				if (node.getLocationInParent() == QualifiedType.QUALIFIER_PROPERTY) {					return parentBinding.getDeclaringClass();				}				return parentBinding;			}			case ASTNode.VARIABLE_DECLARATION_STATEMENT:				return guessVariableType(((VariableDeclarationStatement) parent).fragments());			case ASTNode.FIELD_DECLARATION:				return guessVariableType(((FieldDeclaration) parent).fragments());			case ASTNode.VARIABLE_DECLARATION_EXPRESSION:				return guessVariableType(((VariableDeclarationExpression) parent).fragments());			case ASTNode.SINGLE_VARIABLE_DECLARATION:				SingleVariableDeclaration varDecl= (SingleVariableDeclaration) parent;				if (varDecl.getInitializer() != null) {					return varDecl.getInitializer().resolveTypeBinding();				}				break;			case ASTNode.ARRAY_CREATION:				ArrayCreation creation= (ArrayCreation) parent;				if (creation.getInitializer() != null) {					return creation.getInitializer().resolveTypeBinding();				}				return getPossibleReferenceBinding(parent);			case ASTNode.TYPE_LITERAL:				return ((TypeLiteral) parent).getType().resolveBinding();			case ASTNode.CLASS_INSTANCE_CREATION:				return getPossibleReferenceBinding(parent);			case ASTNode.CAST_EXPRESSION:				return getPossibleReferenceBinding(parent);			case ASTNode.TAG_ELEMENT:				TagElement tagElement= (TagElement) parent;				if (TagElement.TAG_THROWS.equals(tagElement.getTagName()) || TagElement.TAG_EXCEPTION.equals(tagElement.getTagName())) {					ASTNode methNode= tagElement.getParent().getParent();					if (methNode instanceof MethodDeclaration) {						List thrownExcpetions= ((MethodDeclaration) methNode).thrownExceptions();						if (thrownExcpetions.size() == 1) {							return ((Name) thrownExcpetions.get(0)).resolveTypeBinding();						}					}				}				break;		}		return null;	}