JetBrains/intellij-community · warning · ConfigurationException

replace.constructor.builder.error.invalid.field.name

Error message

replace.constructor.builder.error.invalid.field.name

What it means

Thrown by ReplaceConstructorWithBuilderDialog.canRun() (ReplaceConstructorWithBuilderDialog.java:497) when any row of the parameters table has a field name that fails PsiNameHelper.isIdentifier. Replace Constructor with Builder generates a builder field per constructor parameter; each user-editable field name in the table must be a legal identifier before the refactoring can run.

Source

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

    return splitter;
  }

  private void setEnabled(final boolean createNew) {
    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));

View on GitHub (pinned to be881553f2)

Solutions

  1. Find the offending row in the parameters table and fix its Field Name to a valid identifier (the error message names the value).
  2. If a constructor parameter is legitimately a keyword, give the builder field a suffixed name ('defaultValue') while keeping the setter name aligned.
  3. Re-check every row — validation loops over all ParameterData entries and stops at the first bad one.

Example fix

// before
// constructor: Foo(int default) -> suggested field name 'default' -> invalid

// after
// table row: field name 'defaultValue', setter name 'defaultValue' -> valid
Defensive patterns

Strategy: validation

Validate before calling

PsiNameHelper helper = PsiNameHelper.getInstance(project);
for (ParameterData pd : myParametersMap.values()) {
  if (!helper.isIdentifier(pd.getFieldName())) {
    // fix this row (e.g. keyword parameter 'default' -> 'defaultValue') before OK
  }
}

Prevention

When it happens

Trigger: Refactoring | Replace Constructor with Builder on a constructor; editing the 'Field Name' column of the parameters table to a keyword ('default'), empty, digit-leading, or dashed value ('max-size') and clicking OK.

Common situations: Accepting auto-derived names that clash with Java keywords (parameter named 'default'), hand-editing several rows quickly and leaving one invalid, or clearing a cell accidentally.

Related errors


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