ID

R695

Status

Backlog

Bucket

cleanup

Priority

6

Theme

service

Created

2026-08-17

Updated

2026-08-17

Lint an SDL input field that binds to no member on a JavaBean-target @service bean

InputBeanResolver.bindJavaBean is partial by design: an SDL input field whose binding key names no setter on the bean is skipped, and the bean simply does not populate it. Only the all-fields-miss case rejects. The partiality is deliberate (a bean may legitimately ignore fields the input carries), but it means a typo in a field name, or in a @field(name:) value, produces a member that stays null with nothing in the build saying so. The record arm has no such hole: its direction-B check fails a field that names no component, on the grounds that the value would otherwise be silently dropped.

The gap deserves a warning rather than a rejection, since a hard reject would break beans that are deliberately partial. That needs a new LintRule arm, a SourceLocation for the SDL input field (which InputBeanResolver does not currently thread), and a call on how much noise the rule produces against beans that ignore fields on purpose. A @field(name:)-carrying field that misses is the strongest candidate for the rule, since the directive is an authored claim that a named member exists.

Filed out of R693’s spec pass, which answered the equivalent open question by deferral. R693 fixes the specific silent drop it names (a nested grouping input whose leaves match members now binds them rather than dropping the group) and leaves this pre-existing contract untouched, so the two items do not overlap.