{"record":{"id":"e6563a075e71fab6","repo":"JetBrains/intellij-community","slug":"replace-constructor-builder-error-invalid-builder","errorCode":null,"errorMessage":"replace.constructor.builder.error.invalid.builder.class.name","messagePattern":"replace\\.constructor\\.builder\\.error\\.invalid\\.builder\\.class\\.name","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"warning","filePath":"java/java-impl-refactorings/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderDialog.java","lineNumber":509,"sourceCode":"\n  @Override\n  protected void canRun() throws ConfigurationException {\n    final PsiNameHelper nameHelper = PsiNameHelper.getInstance(myProject);\n    for (ParameterData parameterData : myParametersMap.values()) {\n      if (!nameHelper.isIdentifier(parameterData.getFieldName())) {\n        throw new ConfigurationException(\n          JavaRefactoringBundle.message(\"replace.constructor.builder.error.invalid.field.name\", parameterData.getFieldName()));\n      }\n      if (!nameHelper.isIdentifier(parameterData.getSetterName())) {\n        throw new ConfigurationException(\n          JavaRefactoringBundle.message(\"replace.constructor.builder.error.invalid.setter.name\", parameterData.getSetterName()));\n      }\n    }\n    if (myCreateBuilderClassRadioButton.isSelected()) {\n      final String className = myNewClassName.getText().trim();\n      if (className.isEmpty()) throw new ConfigurationException(null);\n      if (!nameHelper.isQualifiedName(className)) {\n        throw new ConfigurationException(\n          JavaRefactoringBundle.message(\"replace.constructor.builder.error.invalid.builder.class.name\", className));\n      }\n      final String packageName = myPackageTextField.getText().trim();\n      if (!packageName.isEmpty() && !nameHelper.isQualifiedName(packageName)) {\n        throw new ConfigurationException(\n          JavaRefactoringBundle.message(\"replace.constructor.builder.error.invalid.builder.package.name\", packageName));\n      }\n    }\n    else {\n      final String qualifiedName = myExistentClassTF.getText().trim();\n      if (qualifiedName.isEmpty()) throw new ConfigurationException(null);\n      if (!nameHelper.isQualifiedName(qualifiedName)) {\n        throw new ConfigurationException(\n          JavaRefactoringBundle.message(\"replace.constructor.builder.error.invalid.builder.qualified.class.name\", qualifiedName));\n      }\n    }\n  }\n","sourceCodeStart":491,"sourceCodeEnd":527,"githubUrl":"https://github.com/JetBrains/intellij-community/blob/be881553f2a76ac8b4ea53950d93f0de78295c19/java/java-impl-refactorings/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderDialog.java#L491-L527","documentation":"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.","triggerScenarios":"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.","commonSituations":"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').","solutions":["Enter a syntactically valid (possibly dotted) class name such as 'com.acme.FooBuilder'.","Fix doubled dots/spaces/keywords in the field.","Programmatic pre-check: PsiNameHelper.getInstance(project).isQualifiedName(className.trim())."],"exampleFix":"// before\n// builder class name: com.acme..FooBuilder -> rejected\n\n// after\n// builder class name: com.acme.FooBuilder","handlingStrategy":"validation","validationCode":"String className = myNewClassName.getText().trim();\nif (!className.isEmpty() && !PsiNameHelper.getInstance(project).isQualifiedName(className)) {\n  // block before OK; this field accepts dotted FQNs but they must be well-formed\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Default the builder-class field to the constructor's class + 'Builder' suffix.","Validate qualified names with PsiNameHelper.isQualifiedName in custom refactoring UIs."],"tags":["intellij","refactoring","builder","java","qualified-name","validation"],"backgroundTag":null,"analyzedSha":"be881553f2a76ac8b4ea53950d93f0de78295c19","analyzedAt":"2026-08-14T14:13:06.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}