private JavaElement getJavaElement(LocalVariableBinding binding) {
    LocalDeclaration local = binding.declaration;

    JavaElement parent = null;
    ReferenceContext referenceContext =
        binding.declaringScope.isLambdaSubscope()
            ? binding.declaringScope.namedMethodScope().referenceContext()
            : binding.declaringScope.referenceContext();
    if (referenceContext instanceof AbstractMethodDeclaration) {
      AbstractMethodDeclaration methodDeclaration = (AbstractMethodDeclaration) referenceContext;
      parent = this.getJavaElementOfCompilationUnit(methodDeclaration, methodDeclaration.binding);
    } else if (referenceContext instanceof TypeDeclaration) {
      // Local variable is declared inside an initializer
      TypeDeclaration typeDeclaration = (TypeDeclaration) referenceContext;

      JavaElement type =
          this.getJavaElementOfCompilationUnit(typeDeclaration, typeDeclaration.binding);
      parent = Util.getUnresolvedJavaElement(local.sourceStart, local.sourceEnd, type);
    }
    if (parent == null) return null;

    return new LocalVariable(
        parent,
        new String(local.name),
        local.declarationSourceStart,
        local.declarationSourceEnd,
        local.sourceStart,
        local.sourceEnd,
        local.type == null
            ? Signature.createTypeSignature(binding.type.signableName(), true)
            : Util.typeSignature(local.type),
        binding.declaration.annotations,
        local.modifiers,
        local.getKind() == AbstractVariableDeclaration.PARAMETER);
  }
  private JavaElement getUnresolvedJavaElement() {
    if (JavaCore.getPlugin() == null) {
      return null;
    }
    if (!(this.resolver instanceof DefaultBindingResolver)) return null;

    DefaultBindingResolver defaultBindingResolver = (DefaultBindingResolver) this.resolver;
    if (!defaultBindingResolver.fromJavaProject) return null;
    return Util.getUnresolvedJavaElement(
        this.binding,
        defaultBindingResolver.workingCopyOwner,
        defaultBindingResolver.getBindingsToNodesMap());
  }
 private JavaElement getUnresolvedJavaElement(
     org.eclipse.jdt.internal.compiler.lookup.TypeBinding typeBinding) {
   if (JavaCore.getPlugin() == null) {
     return null;
   }
   if (this.resolver instanceof DefaultBindingResolver) {
     DefaultBindingResolver defaultBindingResolver = (DefaultBindingResolver) this.resolver;
     if (!defaultBindingResolver.fromJavaProject) return null;
     return org.eclipse.jdt.internal.core.util.Util.getUnresolvedJavaElement(
         typeBinding,
         defaultBindingResolver.workingCopyOwner,
         defaultBindingResolver.getBindingsToNodesMap());
   }
   return null;
 }
  public IJavaElement[] getVisibleElements(String typeSignature) {
    if (this.assistScope == null) return new IJavaElement[0];

    if (!this.hasComputedVisibleElementBindings) {
      computeVisibleElementBindings();
    }

    TypeBinding assignableTypeBinding = null;
    if (typeSignature != null) {
      assignableTypeBinding = getTypeFromSignature(typeSignature, this.assistScope);
      if (assignableTypeBinding == null) return new IJavaElement[0];
    }

    int length =
        this.visibleLocalVariables.size() + this.visibleFields.size() + this.visibleMethods.size();
    if (length == 0) return new IJavaElement[0];

    IJavaElement[] result = new IJavaElement[length];

    int elementCount = 0;

    int size = this.visibleLocalVariables.size();
    if (size > 0) {
      next:
      for (int i = 0; i < size; i++) {
        try {
          LocalVariableBinding binding =
              (LocalVariableBinding) this.visibleLocalVariables.elementAt(i);
          if (binding.type == null
              || (assignableTypeBinding != null
                  && !binding.type.isCompatibleWith(assignableTypeBinding))) continue next;
          JavaElement localVariable = getJavaElement(binding);
          if (localVariable != null) result[elementCount++] = localVariable;
        } catch (AbortCompilation e) {
          // log the exception and proceed
          Util.logRepeatedMessage(e.getKey(), e);
        }
      }
    }
    size = this.visibleFields.size();
    if (size > 0) {
      next:
      for (int i = 0; i < size; i++) {
        try {
          FieldBinding binding = (FieldBinding) this.visibleFields.elementAt(i);
          if (assignableTypeBinding != null
              && !binding.type.isCompatibleWith(assignableTypeBinding)) continue next;
          if (this.assistScope.isDefinedInSameUnit(binding.declaringClass)) {
            JavaElement field = getJavaElementOfCompilationUnit(binding);
            if (field != null) result[elementCount++] = field;
          } else {
            JavaElement field = Util.getUnresolvedJavaElement(binding, this.owner, EmptyNodeMap);
            if (field != null) result[elementCount++] = field.resolved(binding);
          }
        } catch (AbortCompilation e) {
          // log the exception and proceed
          Util.logRepeatedMessage(e.getKey(), e);
        }
      }
    }
    size = this.visibleMethods.size();
    if (size > 0) {
      next:
      for (int i = 0; i < size; i++) {
        try {
          MethodBinding binding = (MethodBinding) this.visibleMethods.elementAt(i);
          if (assignableTypeBinding != null
              && !binding.returnType.isCompatibleWith(assignableTypeBinding)) continue next;
          if (this.assistScope.isDefinedInSameUnit(binding.declaringClass)) {
            JavaElement method = getJavaElementOfCompilationUnit(binding);
            if (method != null) result[elementCount++] = method;
          } else {
            JavaElement method = Util.getUnresolvedJavaElement(binding, this.owner, EmptyNodeMap);
            if (method != null) result[elementCount++] = method.resolved(binding);
          }
        } catch (AbortCompilation e) {
          // log the exception and proceed
          Util.logRepeatedMessage(e.getKey(), e);
        }
      }
    }

    if (elementCount != result.length) {
      System.arraycopy(result, 0, result = new IJavaElement[elementCount], 0, elementCount);
    }

    return result;
  }