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
- Skip receiver parameters: check parameter instanceof PsiReceiverParameter or parameter.getNameIdentifier() == null before setName.
- Rename the method's first real parameter instead if the intent was to rename a normal parameter.
- 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
- Check getNameIdentifier() != null before renaming parameters.
- Remember receiver parameters ('this') are nameless by spec.
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
- ''{0}'' is not an identifier.
- Cannot rename light class
- Implicitly declared class may have no name
- Can't change name of JShell holder method
- psi.error.attempt.to.edit.class.file
AI-assisted analysis of JetBrains/intellij-community@be881553f2 (2026-08-14).
Data as JSON: /api/errors/b211761f5c77f31b.
Report an issue: GitHub.