Skip to content

Conversation

@jvsqzj
Copy link
Contributor

@jvsqzj jvsqzj commented Aug 26, 2025

No description provided.


if let Content::Some(statement::StatementContent::Compound(_))
= self.truebranch.content.as_ref() {
aux.depth -= 1;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will this work correctly when, say, true-branch is a compound but else-branch is not?

Copy link
Contributor Author

@jvsqzj jvsqzj Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We did some inspection of this scenario with the dmlc compiler and it really does not allow to have one liners without braces in #if or #else blocks.

I think this syntax requires that the braces are always present, as the compiler fails when trying to compile such scenarios (and likewise the DLS AST also throws a syntax error in those cases) so I would not worry about having blocks which are not compound (they will always be, apparently)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#if/else cannot have single-statements on object level, but on statement level it is allowed.

See statement::HashIfContent (statement level) as compared to structure::HashIfContent (object level)
Sidenote: these probably should not have been called the exact same thing (even if in separate modules), I might rename one or both to more clearly distinguish the types.

@jvsqzj jvsqzj force-pushed the handle-compound-content-in-hashif branch from 06714ae to cb229d5 Compare December 18, 2025 23:54
Comment on lines 110 to 112
if self.should_increment_depth() {
aux.depth += 1;
aux.depth = aux.depth.wrapping_add(1);
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JonatanWaern we'd like to hear your comments on this solution.
We are using this u32 value of 0xFFFF_FFFF to signal the child code block of a top-level #if/#else block it should actually use a zero-level indentation (ie remain at the top level).

We did not want to change the type of aux.depth to i32 as there will never be a negative indentation, so IMO it would add far more possibilities of undefined behavior to allow for negative values here than to just interpret the biggest possible value as a boundary.

The wrapping_add takes care of taking the depth to the corresponding value accordingly; either 0 for top level, or n+1 for any other nested #if/#else

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I dislike in-type magic values in rust on principle, and AFAIK it's best practice to avoid. In particular setting it to a magic max value, and relying on a wrapping add seems hacky to me.

Instead, it may be that indentation is sufficiently complicated that we should introduce a dedicated structure/enum to support it? (which could support incrementation and hard-set overrides) I have some ideas for this, so I may try my hand at it later (at the moment I need to get the builds to work again)

Copy link
Contributor

@JonatanWaern JonatanWaern Jan 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have prepared a draft for what such a handler could look like in #185, you could rebase on it to see if it fits for what you need

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants