JetBrains/intellij-community · error · IncorrectOperationException

Cannot rename receiver parameter

Error message

Cannot rename receiver parameter

What it means

PsiReceiverParameterImpl represents the receiver parameter ('this') of an instance method (Java 8 explicit receiver parameters, e.g. 'void m(Foo this)'). It has no name identifier — getNameIdentifier() returns null — so setName throws IncorrectOperationException("Cannot rename receiver parameter").

Source

Thrown at java/java-psi-impl/src/com/intellij/psi/impl/source/PsiReceiverParameterImpl.java:71

  @Override
  public @Nullable PsiExpression getInitializer() {
    return null;
  }

  @Override
  public boolean hasInitializer() {
    return false;
  }

  @Override
  public @Nullable PsiIdentifier getNameIdentifier() {
    return null;
  }

  @Override
  public PsiElement setName(@NotNull String name) throws IncorrectOperationException {
    throw new IncorrectOperationException("Cannot rename receiver parameter");
  }

  @Override
  public void normalizeDeclaration() throws IncorrectOperationException { }

  @Override
  public @Nullable Object computeConstantValue() {
    return null;
  }

  @Override
  public void accept(@NotNull PsiElementVisitor visitor) {
    if (visitor instanceof JavaElementVisitor) {
      ((JavaElementVisitor)visitor).visitReceiverParameter(this);
    }
    else {
      visitor.visitElement(this);
    }

View on GitHub (pinned to be881553f2)

Solutions

  1. Skip receiver parameters: check parameter instanceof PsiReceiverParameter or parameter.getNameIdentifier() == null before setName.
  2. Rename the method's first real parameter instead if the intent was to rename a normal parameter.
  3. If API requires a name, use ReadAction-safe null checks and prompt the user for a name on unnamed parameters instead of auto-renaming.

Example fix

// before
for (PsiParameter p : method.getParameterList().getParameters()) {
  p.setName(newName); // throws on receiver 'this'
}

// after
for (PsiParameter p : method.getParameterList().getParameters()) {
  if (p.getNameIdentifier() == null) continue; // receiver parameter
  p.setName(newName);
}
Defensive patterns

Strategy: type-guard

Validate before calling

if (param instanceof PsiReceiverParameter || param.getNameIdentifier() == null) continue;

Type guard

static boolean isRenamableParameter(PsiParameter p) { return p.getNameIdentifier() != null && !(p instanceof PsiReceiverParameter); }

Try / catch

try { param.setName(n); } catch (IncorrectOperationException e) { /* skip receiver 'this' */ }

Prevention

When it happens

Trigger: Calling setName on a PsiParameter obtained from method.getParameterList() where the parameter is the receiver 'this'; e.g. rename refactoring iterating all parameters, or intention trying to rename an unnamed parameter.

Common situations: Rename-all-parameters tooling; plugins that walk parameter lists and call setName on each; refactorings on code using explicit receiver parameters (common in instrumentation/annotation-heavy codebases).

Related errors


AI-assisted analysis of JetBrains/intellij-community@be881553f2 (2026-08-14). Data as JSON: /api/errors/b211761f5c77f31b. Report an issue: GitHub.