Package org.eclipse.jdt.internal.compiler.apt.model

Source Code of org.eclipse.jdt.internal.compiler.apt.model.VariableElementImpl

/*******************************************************************************
* Copyright (c) 2007, 2009 BEA Systems, Inc.
* 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:
*    wharley@bea.com - initial API and implementation
*   
*******************************************************************************/

package org.eclipse.jdt.internal.compiler.apt.model;

import java.util.Collections;
import java.util.List;
import java.util.Set;

import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ElementVisitor;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.Name;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.VariableElement;

import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl;
import org.eclipse.jdt.internal.compiler.impl.Constant;
import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
import org.eclipse.jdt.internal.compiler.lookup.AptBinaryLocalVariableBinding;
import org.eclipse.jdt.internal.compiler.lookup.AptSourceLocalVariableBinding;
import org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
import org.eclipse.jdt.internal.compiler.lookup.PackageBinding;
import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
import org.eclipse.jdt.internal.compiler.lookup.VariableBinding;

/**
* Implementation of VariableElement, which represents a a field, enum constant,
* method or constructor parameter, local variable, or exception parameter.
*/
public class VariableElementImpl extends ElementImpl implements VariableElement {

  /**
   * @param binding might be a FieldBinding (for a field) or a LocalVariableBinding (for a method param)
   */
  VariableElementImpl(BaseProcessingEnvImpl env, VariableBinding binding) {
    super(env, binding);
  }
 
  @Override
  public <R, P> R accept(ElementVisitor<R, P> v, P p)
  {
    return v.visitVariable(this, p);
  }

  @Override
  protected AnnotationBinding[] getAnnotationBindings()
  {
    return ((VariableBinding)_binding).getAnnotations();
  }

  @Override
  public Object getConstantValue() {
    VariableBinding variableBinding = (VariableBinding) _binding;
    Constant constant = variableBinding.constant();
    if (constant == null || constant == Constant.NotAConstant) return null;
    TypeBinding type = variableBinding.type;
    switch (type.id) {
      case TypeIds.T_boolean:
        return constant.booleanValue();
      case TypeIds.T_byte:
        return constant.byteValue();
      case TypeIds.T_char:
        return constant.charValue();
      case TypeIds.T_double:
        return constant.doubleValue();
      case TypeIds.T_float:
        return constant.floatValue();
      case TypeIds.T_int:
        return constant.intValue();
      case TypeIds.T_JavaLangString:
        return constant.stringValue();
      case TypeIds.T_long:
        return constant.longValue();
      case TypeIds.T_short:
        return constant.shortValue();
    }
    return null;
  }
 
  @Override
  public List<? extends Element> getEnclosedElements() {
    return Collections.emptyList();
  }

  @Override
  public Element getEnclosingElement() {
    if (_binding instanceof FieldBinding) {
      return _env.getFactory().newElement(((FieldBinding)_binding).declaringClass);
    }
    else if (_binding instanceof AptSourceLocalVariableBinding){
      return _env.getFactory().newElement(((AptSourceLocalVariableBinding) _binding).methodBinding);
    } else if (_binding instanceof AptBinaryLocalVariableBinding) {
      return _env.getFactory().newElement(((AptBinaryLocalVariableBinding) _binding).methodBinding);
    }
    return null;
  }

  @Override
  public ElementKind getKind() {
    if (_binding instanceof FieldBinding) {
      if (((FieldBinding)_binding).declaringClass.isEnum()) {
        return ElementKind.ENUM_CONSTANT;
      }
      else {
        return ElementKind.FIELD;
      }
    }
    else {
      return ElementKind.PARAMETER;
    }
  }

  @Override
  public Set<Modifier> getModifiers()
  {
    if (_binding instanceof VariableBinding) {
      return Factory.getModifiers(((VariableBinding)_binding).modifiers, getKind());
    }
    return Collections.emptySet();
  }

  @Override
  PackageElement getPackage()
  {
    if (_binding instanceof FieldBinding) {
      PackageBinding pkgBinding = ((FieldBinding)_binding).declaringClass.fPackage;
      return _env.getFactory().newPackageElement(pkgBinding);
    }
    else {
      // TODO: what is the package of a method parameter?
      throw new UnsupportedOperationException("NYI: VariableElmentImpl.getPackage() for method parameter"); //$NON-NLS-1$
    }
  }
 
  @Override
  public Name getSimpleName() {
    return new NameImpl(((VariableBinding)_binding).name);
  }

  @Override
  public boolean hides(Element hiddenElement)
  {
    if (_binding instanceof FieldBinding) {
      if (!(((ElementImpl)hiddenElement)._binding instanceof FieldBinding)) {
        return false;
      }
      FieldBinding hidden = (FieldBinding)((ElementImpl)hiddenElement)._binding;
      if (hidden.isPrivate()) {
        return false;
      }
      FieldBinding hider = (FieldBinding)_binding;
      if (hidden == hider) {
        return false;
      }
      if (!CharOperation.equals(hider.name, hidden.name)) {
        return false;
      }
      return null != hider.declaringClass.findSuperTypeOriginatingFrom(hidden.declaringClass);
    }
    // TODO: should we implement hides() for method parameters?
    return false;
  }

  @Override
  public String toString() {
    return new String(((VariableBinding) _binding).name);
  }
}
TOP

Related Classes of org.eclipse.jdt.internal.compiler.apt.model.VariableElementImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.