Description
Rephrasing of #85
Examples work in part assuming #39 is also necessary for this. Glad to be proven wrong on that front.
Examples are also using the syntax from #84 for fragments, but assume this is just sugar for now.
I would like to investigate implicitly combining adjacent completion values of statements that resolve to JSX expressions.
<div>
<A />
<B />
</div>
Is an example where implicit returns struggle. However, if instead we treat the completion value of statements as the mechanism for adding sugar we can do a few things.
Combine adjacent JSX completion values into fragments
- This should only combine JSXElement literals, no other literal kinds should be combined. Completion positions not using JSXElement literals are not combined.
- This should only combine places that have a normal completion
This works fairly well, but can have some odd syntax going on with semicolons and blocks:
<A />;
<B />;
Would be equivalent to both:
<A />
<B />
And
<>
<A />
<B />
</>
Implicit return for JSX completion values of functions
arr.map(item => {
if (Date.now() % 2) <Odd></Odd>
else <Even></Even>
});
The function has a completion value that is JSX. I would make a warning or error if mixing types that are not JSX and JSX here:
arr.map(item => {
if (Date.now() % 2) <Odd></Odd> // <Odd> is in a completion position for the function
else "even"; // ERROR: implicit return of JSXElement cannot collide with a non-JSXElement
});