<div dir="ltr">Hi all!<div><br></div><div>While doing exploratory work on high-integrity classes and private field syntax I've run up against a parsing issue with classes that I thought might be good to bring to the list, even though it's probably too late to do anything about it now.</div><div><br></div><div>For private field syntax, it turns out that we want the declaration of the field to be located within the class body.  E.g.</div><div><br></div><div>    class C {</div><div>      private _a;</div><div>    }</div><div><br></div><div>For refactoring purposes, it is desirable to allow the creation of helper functions which have access to the private field, but aren't properties of either the prototype or the constructor.  To take a somewhat contrived example:</div><div><br></div><div>    class C {</div><div>      private _a;</div><div>      function isC(x) { return _a.has(x); } // Hypothetical only</div><div>      static cast(x) {</div><div>        if (isC(x)) return x;</div><div>        else return new this(x);</div><div>      }</div><div>    }</div><div><br></div><div>This leads us toward the idea of allowing declarations nested within the class body.</div><div><br></div><div>Grammatically, there is no problem extending ES6 class syntax to make this possible.  We simply use lookahead to determine whether to parse a declaration or a concise method.  Given this stream:</div><div><br></div><div>    class C {</div><div>      function <next_token></div><div><br></div><div>if `next_token` is not "(", then we know that it cannot be a method definition and therefore must be a function declaration.</div><div><br></div><div>The trouble arises with the introduction of async functions.  Given this stream:</div><div><br></div><div>    class C {</div><div>      async function <...more input...></div><div><br></div><div>We cannot tell with just two tokens of lookahead whether we need to parse a concise method or a function declaration.</div><div><br></div><div>In retrospect, for this reason I think it might have been a good idea to disallow "function" as a concise method identifier within class bodies.  I regret that I wasn't able to see this issue sooner, but I appreciate that it may be too late to address it now.</div><div><br></div><div>Otherwise, are there any other parsing tricks which might help out?  (I'm not 100% sure what our constraints are with respect to lookahead or rewind.)</div><div><br></div><div>Thanks!</div><div>Kevin</div></div>