public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
    if (isReferenceTo(element)) return getElement();

    final String newName;
    if (element instanceof PsiClass) {
      PsiClass psiClass = (PsiClass) element;
      final boolean jvmFormat =
          Boolean.TRUE.equals(JavaClassReferenceProvider.JVM_FORMAT.getValue(getOptions()));
      newName = jvmFormat ? ClassUtil.getJVMClassName(psiClass) : psiClass.getQualifiedName();
    } else if (element instanceof PsiPackage) {
      PsiPackage psiPackage = (PsiPackage) element;
      newName = psiPackage.getQualifiedName();
    } else {
      throw new IncorrectOperationException("Cannot bind to " + element);
    }
    assert newName != null;

    TextRange range =
        new TextRange(
            myJavaClassReferenceSet.getReference(0).getRangeInElement().getStartOffset(),
            getRangeInElement().getEndOffset());
    final ElementManipulator<PsiElement> manipulator = getManipulator(getElement());
    if (manipulator != null) {
      final PsiElement finalElement = manipulator.handleContentChange(getElement(), range, newName);
      range = new TextRange(range.getStartOffset(), range.getStartOffset() + newName.length());
      myJavaClassReferenceSet.reparse(finalElement, range);
      return finalElement;
    }
    return element;
  }
  public static FileReferenceSet createSet(
      PsiElement element,
      final boolean soft,
      boolean endingSlashNotAllowed,
      final boolean urlEncoded) {

    String text;
    int offset;

    final ElementManipulator<PsiElement> manipulator = ElementManipulators.getManipulator(element);
    assert manipulator != null;
    final TextRange range = manipulator.getRangeInElement(element);
    offset = range.getStartOffset();
    text = range.substring(element.getText());
    for (final FileReferenceHelper helper : FileReferenceHelperRegistrar.getHelpers()) {
      text = helper.trimUrl(text);
    }

    return new FileReferenceSet(text, element, offset, null, true, endingSlashNotAllowed) {
      @Override
      protected boolean isUrlEncoded() {
        return urlEncoded;
      }

      @Override
      protected boolean isSoft() {
        return soft;
      }
    };
  }
 public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
   final ElementManipulator<PsiElement> manipulator = getManipulator(getElement());
   if (manipulator != null) {
     final PsiElement element =
         manipulator.handleContentChange(getElement(), getRangeInElement(), newElementName);
     myRange =
         new TextRange(
             getRangeInElement().getStartOffset(),
             getRangeInElement().getStartOffset() + newElementName.length());
     return element;
   }
   throw new IncorrectOperationException(
       "Manipulator for this element is not defined: " + getElement());
 }
 @Override
 public PsiElement bindToElement(@NotNull final PsiElement element)
     throws IncorrectOperationException {
   if (!(element instanceof PsiPackage)) {
     throw new IncorrectOperationException("Cannot bind to " + element);
   }
   final String newName = ((PsiPackage) element).getQualifiedName();
   final TextRange range =
       new TextRange(
           getReferenceSet().getReference(0).getRangeInElement().getStartOffset(),
           getRangeInElement().getEndOffset());
   final ElementManipulator<PsiElement> manipulator =
       ElementManipulators.getManipulator(getElement());
   return manipulator.handleContentChange(getElement(), range, newName);
 }