Devicetree
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Daniel Golle" <daniel@makrotopia.org>
Cc: krzk+dt@kernel.org, robh@kernel.org, devicetree@vger.kernel.org,
	conor+dt@kernel.org
Subject: Re: [PATCH v3 1/3] dt-bindings: add DTS style checker
Date: Mon, 11 May 2026 22:36:04 +0000	[thread overview]
Message-ID: <20260511223604.C6BB8C2BCB0@smtp.kernel.org> (raw)
In-Reply-To: <dba9d5612e7435da84a95fd85ec404f803bbbdfd.1778454442.git.daniel@makrotopia.org>

Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
- [High] The line classifier fails to handle trailing inline comments and whitespace, corrupting block depth and AST parsing.
- [High] The `mixed-indent-chars` rule directly conflicts with `continuation-alignment`, causing it to flag properly aligned continuation lines.
- [High] `check_continuation_alignment` incorrectly compares raw string length instead of visual display columns.
- [Medium] Regex patterns wrongly reject valid Devicetree identifiers starting with digits.
- [Medium] `check_value_whitespace` fails to validate cell array contents that span multiple lines.
--

commit fa5d5813b5bacc079c40709e0ab8be2c7e12de57
Author: Daniel Golle <daniel@makrotopia.org>

dt-bindings: add DTS style checker

This commit adds a Python tool that checks DTS coding style on examples in YAML
binding files and on .dts/.dtsi/.dtso source files. Rules are kept in a small
declarative registry and can be run in relaxed or strict modes.

> diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
> new file mode 100755
> index 0000000000000..e1dd548fe9486
> --- /dev/null
> +++ b/scripts/dtc/dt-check-style
> @@ -0,0 +1,1063 @@

[ ... ]

> +re_node_header = re.compile(
> +    r'^(?:([a-zA-Z_][a-zA-Z0-9_]*):\s*)?'
> +    r'([a-zA-Z][a-zA-Z0-9,._+-]*|/)'
> +    r'(?:@([0-9a-fA-F,]+))?'
> +    r'\s*\{$')

The Devicetree specification allows node names to begin with numeric digits.
Does this regex reject valid hardware nodes like 1wire@... or 3d-engine@... by
mandating that node names start with a letter?

[ ... ]

> +def parse_property_name(dl):
> +    m = re.match(r'^([a-zA-Z#][a-zA-Z0-9,._+#-]*)\s*[=;]', dl.stripped)
> +    if m:
> +        dl.prop_name = m.group(1)

Similarly, does this regex incorrectly reject property names that begin with
numeric digits by requiring them to start with a letter or #?

[ ... ]

> +def classify_lines(text):
> +    """Return a list of DtsLine. Tracks { } depth and groups
> +    continuation lines onto their leading PROPERTY line."""
> +    out = []
> +    in_block_comment = False
> +    prev_complete = True
> +    depth = 0
> +
> +    # Split preserving the indent string verbatim
> +    re_lead = re.compile(r'^([ \t]*)(.*)$')
> +
> +    for i, raw in enumerate(text.split('\n'), start=1):
> +        m = re_lead.match(raw)
> +        indent_str = m.group(1)
> +        stripped = m.group(2)

It appears the stripped variable retains trailing inline comments and
whitespace. Will lines formatted with trailing comments such as
node { /* comment */ or prop = <1>; // comment fail the subsequent suffix
checks like stripped.endswith('{') and stripped.endswith(';')?

If so, it seems node openings would be misclassified as properties, and
properties would erroneously set prev_complete = False, turning subsequent
lines into continuation lines.

[ ... ]

> +def check_mixed_indent_chars(ctx):
> +    """Indent must be all-spaces or all-tabs, never mixed on one line."""
> +    for dl in ctx.lines:
> +        if not dl.indent_str:
> +            continue
> +        if dl.linetype == LineType.PREPROCESSOR:
> +            continue
> +        if ' ' in dl.indent_str and '\t' in dl.indent_str:
> +            yield (dl.lineno, 'mixed tabs and spaces in indent')

Will this rule flag properly aligned continuation lines?

The standard practice for aligning multi-line properties in DTS is to use
tabs for base indentation and spaces for fine-grained alignment (e.g., to align
precisely under a < character). Unlike check_indent_consistent(), this rule
doesn't seem to exclude continuation lines.

[ ... ]

> +def check_value_whitespace(ctx):
> +    """Inside a <...> cell list use single spaces between values; no
> +    leading or trailing whitespace inside the brackets. Outside
> +    strings and comments only."""
> +    for dl in ctx.lines:
> +        if dl.linetype not in (LineType.PROPERTY, LineType.CONTINUATION):
> +            continue
> +        text = _strip_strings_and_comments(dl.raw)
> +        for m in re.finditer(r'<([^<>]*)>', text):

If a cell array declaration is split across multiple lines, will it bypass this
whitespace validation entirely?

Since this rule operates strictly on a line-by-line basis, neither line would
contain both < and > characters, which would cause the regex match to fail.

[ ... ]

> +def check_continuation_alignment(ctx):
> +    """A multi-line property's continuation lines must align their
> +    first non-whitespace character to the column of the first '<' or
> +    '"' after the '=' in the leading line."""
> +    for dl in ctx.lines:
> +        if dl.linetype != LineType.PROPERTY:
> +            continue
> +        if not dl.continuations:
> +            continue
> +        eq = dl.raw.find('=')
> +        if eq < 0:
> +            continue
> +        # First '<' or '"' after '='
> +        rest = dl.raw[eq + 1:]
> +        m = re.search(r'[<"]', rest)
> +        if not m:
> +            continue
> +        target_col = eq + 1 + m.start()
> +        for cont in dl.continuations:
> +            if len(cont.indent_str) != target_col:
> +                yield (cont.lineno,
> +                       'continuation should align to column %d '
> +                       '(under "<" or \\")' % (target_col + 1))

Does this logic accurately calculate display columns for lines using tab
indentation?

A properly aligned continuation line in a DTS file utilizing tabs will
naturally have a string length significantly shorter than target_col. This
checks len(cont.indent_str), which counts tab characters as length 1,
instead of calculating visual display width, which might result in false
positives for correctly aligned lines.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1778454442.git.daniel@makrotopia.org?part=1

  reply	other threads:[~2026-05-11 22:36 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-10 23:58 [PATCH v3 0/3] dt-bindings: automated coding style check for DTS examples Daniel Golle
2026-05-10 23:58 ` [PATCH v3 1/3] dt-bindings: add DTS style checker Daniel Golle
2026-05-11 22:36   ` sashiko-bot [this message]
2026-05-10 23:58 ` [PATCH v3 2/3] dt-bindings: wire style checker into dt_binding_check Daniel Golle
2026-05-11 23:06   ` sashiko-bot
2026-05-10 23:59 ` [PATCH v3 3/3] dt-bindings: add self-test fixtures for style checker Daniel Golle
2026-05-11 23:11   ` sashiko-bot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260511223604.C6BB8C2BCB0@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=daniel@makrotopia.org \
    --cc=devicetree@vger.kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=robh@kernel.org \
    --cc=sashiko@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox