JetBrains/intellij-community · warning · ConfigurationException

replace.constructor.builder.error.invalid.builder.package.na

Error message

replace.constructor.builder.error.invalid.builder.package.name

What it means

Thrown by ReplaceConstructorWithBuilderDialog.canRun() (ReplaceConstructorWithBuilderDialog.java:514) in the create-new-builder branch when the package field is non-empty but fails PsiNameHelper.isQualifiedName. The generated builder class goes into this package; only the grammar is checked (empty package is permitted). Same ConfigurationException UX as the sibling checks.

Source

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

      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();
      if (qualifiedName.isEmpty()) throw new ConfigurationException(null);
      if (!nameHelper.isQualifiedName(qualifiedName)) {
        throw new ConfigurationException(
          JavaRefactoringBundle.message("replace.constructor.builder.error.invalid.builder.qualified.class.name", qualifiedName));
      }
    }
  }

  private JScrollPane createTablePanel() {
    myTableModel = new MyTableModel();
    myTable = new JBTable(myTableModel);
    myTable.setSurrendersFocusOnKeystroke(true);
    myTable.getTableHeader().setReorderingAllowed(false);

View on GitHub (pinned to be881553f2)

Solutions

  1. Correct the package field to dot-separated identifiers (or clear it for the default package).
  2. Use the package picker to select an existing package.
  3. Pre-validate non-empty input with PsiNameHelper.isQualifiedName().

Example fix

// before
// package: com.acme. -> rejected

// after
// package: com.acme.builder
Defensive patterns

Strategy: validation

Validate before calling

String pkg = myPackageTextField.getText().trim();
if (!pkg.isEmpty() && !PsiNameHelper.getInstance(project).isQualifiedName(pkg)) {
  // block before OK; empty package (default) is allowed
}

Prevention

When it happens

Trigger: Replace Constructor with Builder with 'Create builder class' selected and a package field containing 'com acme', 'util.', '1pkg', or keyword segments.

Common situations: Typing a brand-new package with typos, trailing dot from completion, or pasting a package with a newline/space character.

Related errors


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