JetBrains/intellij-community · warning · ConfigurationException

replace.constructor.builder.error.invalid.setter.name

Error message

replace.constructor.builder.error.invalid.setter.name

What it means

Thrown by ReplaceConstructorWithBuilderDialog.canRun() (ReplaceConstructorWithBuilderDialog.java:501) when any parameters-table row has a setter name that fails PsiNameHelper.isIdentifier. The refactoring generates setXxx(...) methods on the builder class; the user-editable setter-name column must hold a legal method identifier. Checked per-row, right after the field-name check for the same row.

Source

Thrown at java/java-impl-refactorings/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderDialog.java:501

    UIUtil.setEnabled(myCreateNewPanel, createNew, true);
    myExistentClassTF.setEnabled(!createNew);
  }

  @Override
  public JComponent getPreferredFocusedComponent() {
    return myNewClassName;
  }

  @Override
  protected void canRun() throws ConfigurationException {
    final PsiNameHelper nameHelper = PsiNameHelper.getInstance(myProject);
    for (ParameterData parameterData : myParametersMap.values()) {
      if (!nameHelper.isIdentifier(parameterData.getFieldName())) {
        throw new ConfigurationException(
          JavaRefactoringBundle.message("replace.constructor.builder.error.invalid.field.name", parameterData.getFieldName()));
      }
      if (!nameHelper.isIdentifier(parameterData.getSetterName())) {
        throw new ConfigurationException(
          JavaRefactoringBundle.message("replace.constructor.builder.error.invalid.setter.name", parameterData.getSetterName()));
      }
    }
    if (myCreateBuilderClassRadioButton.isSelected()) {
      final String className = myNewClassName.getText().trim();
      if (className.isEmpty()) throw new ConfigurationException(null);
      if (!nameHelper.isQualifiedName(className)) {
        throw new ConfigurationException(
          JavaRefactoringBundle.message("replace.constructor.builder.error.invalid.builder.class.name", className));
      }
      final String packageName = myPackageTextField.getText().trim();
      if (!packageName.isEmpty() && !nameHelper.isQualifiedName(packageName)) {
        throw new ConfigurationException(
          JavaRefactoringBundle.message("replace.constructor.builder.error.invalid.builder.package.name", packageName));
      }
    }
    else {
      final String qualifiedName = myExistentClassTF.getText().trim();

View on GitHub (pinned to be881553f2)

Solutions

  1. Fix the Setter Name cell named in the error message to a valid Java identifier.
  2. Keep the conventional 'set' + capitalized-parameter shape unless you have a reason not to.
  3. Scan all rows before OK — the loop reports only the first invalid setter.

Example fix

// before
// setter name cell: set-width -> ConfigurationException

// after
// setter name cell: setWidth
Defensive patterns

Strategy: validation

Validate before calling

PsiNameHelper helper = PsiNameHelper.getInstance(project);
for (ParameterData pd : myParametersMap.values()) {
  if (!helper.isIdentifier(pd.getSetterName())) {
    // correct the setter cell before confirming the dialog
  }
}

Prevention

When it happens

Trigger: Replace Constructor with Builder with a Setter Name cell edited to 'set-my-value', 'set', empty, or a keyword; or a constructor parameter whose derived setter collides with a Java keyword.

Common situations: Hand-tuning setter names to fluent style and introducing a dash or leaving the cell blank; parameter named such that the stripped name becomes a keyword.

Related errors


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