JetBrains/intellij-community · warning · ConfigurationException

replace.constructor.builder.error.invalid.builder.class.name

Error message

replace.constructor.builder.error.invalid.builder.class.name

What it means

Thrown by ReplaceConstructorWithBuilderDialog.canRun() (ReplaceConstructorWithBuilderDialog.java:509) when the 'Create new builder class' option is selected, the class-name field is non-empty (empty is caught earlier with a null-message exception), and the text fails PsiNameHelper.isQualifiedName. Note this field accepts a qualified name (dots allowed), unlike the parameter-object dialog's simple-name field.

Source

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

  @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();
      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));
      }
    }
  }

View on GitHub (pinned to be881553f2)

Solutions

  1. Enter a syntactically valid (possibly dotted) class name such as 'com.acme.FooBuilder'.
  2. Fix doubled dots/spaces/keywords in the field.
  3. Programmatic pre-check: PsiNameHelper.getInstance(project).isQualifiedName(className.trim()).

Example fix

// before
// builder class name: com.acme..FooBuilder -> rejected

// after
// builder class name: com.acme.FooBuilder
Defensive patterns

Strategy: validation

Validate before calling

String className = myNewClassName.getText().trim();
if (!className.isEmpty() && !PsiNameHelper.getInstance(project).isQualifiedName(className)) {
  // block before OK; this field accepts dotted FQNs but they must be well-formed
}

Prevention

When it happens

Trigger: Replace Constructor with Builder, 'Create builder class' radio selected, and the class-name field holding 'My Builder', 'com..Builder', '.Builder', or a keyword-terminated segment.

Common situations: Pasting a name with leading/trailing spaces already trimmed but internal spaces, doubled dots from editing, or a segment that is a Java keyword ('new').

Related errors


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