JetBrains/intellij-community · error · CodeGenerationException
No binding on root component of nested form
Error message
No binding on root component of nested form
What it means
When compiling a nested form, the code requires the nested form's first (root) component to have a field binding; if getComponent(0).getBinding() is null it throws CodeGenerationException('No binding on root component of nested form ...'). The generated code assigns the instantiated nested-form root to a field, so a binding is mandatory.
Source
Thrown at java/compiler/forms-compiler/src/com/intellij/uiDesigner/compiler/AsmCodeGenerator.java:410
String className;
if (lwComponent instanceof LwNestedForm) {
LwRootContainer nestedFormContainer;
LwNestedForm nestedForm = (LwNestedForm) lwComponent;
if (myFormLoader == null) {
throw new CodeGenerationException(null, "Attempt to compile nested form with no nested form loader specified");
}
try {
nestedFormContainer = myFormLoader.loadForm(nestedForm.getFormFileName());
}
catch (Exception e) {
throw new CodeGenerationException(lwComponent.getId(), e.getMessage());
}
// if nested form is empty, ignore
if (nestedFormContainer.getComponentCount() == 0) {
return;
}
if (nestedFormContainer.getComponent(0).getBinding() == null) {
throw new CodeGenerationException(lwComponent.getId(), "No binding on root component of nested form " + nestedForm.getFormFileName());
}
try {
Utils.validateNestedFormLoop(nestedForm.getFormFileName(), myFormLoader);
}
catch (RecursiveFormNestingException e) {
throw new CodeGenerationException(lwComponent.getId(), "Recursive form nesting is not allowed");
}
className = myFormLoader.getClassToBindName(nestedFormContainer);
}
else {
className = getComponentCodeGenerator(lwComponent.getParent()).mapComponentClass(lwComponent.getComponentClassName());
}
Type componentType = typeFromClassName(className);
int componentLocal = generator.newLocal(componentType);
myIdToLocalMap.put(lwComponent.getId(), Integer.valueOf(componentLocal));
InstrumentationClassFinder.PseudoClass componentClass = getComponentClass(className, myFinder);View on GitHub (pinned to be881553f2)
Solutions
- Open the nested form in the GUI Designer and set a binding (field name) on its root component
- Alternatively edit the nested .form XML and add binding="fieldName" to the first component element
- Ensure the class bound to the form actually declares that field
Example fix
<!-- before: nested form root --> <component id="root" class="javax.swing.JPanel"> <!-- after --> <component id="root" class="javax.swing.JPanel" binding="rootPanel">
Defensive patterns
Strategy: validation
Validate before calling
LwRootContainer nested = formLoader.loadForm(nestedForm.getFormFileName());
if (nested.getComponentCount() > 0 && nested.getComponent(0).getBinding() == null) {
// fail with actionable message before bytecode generation
} Try / catch
catch (CodeGenerationException e) if message contains 'No binding on root component': open the named nested .form and set a root binding, then rebuild
Prevention
- Always set a field binding on the root component of forms intended for nesting
- Add a designer/inspection check that nested forms have root bindings
- After editing nested forms, verify the root binding survived the edit
When it happens
Trigger: A .form embedded via a nested-form component whose own root component has no 'field name' (binding) set in the GUI Designer.
Common situations: Author edited the nested form and cleared/renamed the root binding; nested form created by copying a panel form whose root was never bound; older forms migrated between designer versions losing root bindings.
Related errors
- Attempt to compile nested form with no nested form loader sp
- Recursive form nesting is not allowed
- Class not found:
- Unsupported class version error:
- Cannot bind: field is of primitive type:
AI-assisted analysis of JetBrains/intellij-community@be881553f2 (2026-08-14).
Data as JSON: /api/errors/58cba2074b8b0917.
Report an issue: GitHub.