Phase 1 is complete.
Implemented commits:
334e888aparser: lower method call property sources to PROPERTY_REFd8fd6e2bparser: lower property targets to PROPERTY_REF7e169263generator: accept PROPERTY_REF in property target paths
Representative AST dumps were checked with ./build/njs -a -c ....
Expression:
var o={a:1}; o.a
Observed:
- final read node is
PROPERTY
Expression:
var o={a:function(){return 1}}; o.a()
Observed:
- call node is
METHOD_CALL METHOD_CALL.leftisPROPERTY_REF
Expression:
var o={a:1}; o.a = 1
Observed:
- assignment left-hand side is
PROPERTY_REF
Expression:
var o={a:1}; o.a++
Observed:
POST_INCREMENT.leftisPROPERTY_REF
Expression:
var o={a:1}; delete o.a
Observed:
- final node is
PROPERTY_DELETE - parser now reaches it through
PROPERTY -> PROPERTY_REF -> PROPERTY_DELETE
Expression:
var o={x:1,m:function(){return this.x}}; o.m\x``
Observed:
- tagged call lowers to
METHOD_CALL METHOD_CALL.leftisPROPERTY_REF
Expression:
var dst={}; for (dst.a in {x:1}) {}
Observed:
FOR_IN.left.leftisPROPERTY_REF
Expression:
var o={x:1,m:function(){return this.x}}; (0, o.m)()
Observed:
- final call node is
FUNCTION_CALL - comma right side remains plain
PROPERTY
This matches the phase-1 chain invariant.
Verified with ./build/njs -c:
(o.f)()preserves receivero.t\!`` preserves receiver(o.a) = 2(o.a)++delete (o.a)for ((dst.a) in {x:1}) {}
Also verified:
make -j4 njsmake -j4 unit_test
Unit test total at closeout:
TOTAL: PASSED [5986/5986]
These are intentionally deferred beyond phase 1:
- remove
METHOD_CALL.u.objectoptional-call back-reference hack - remove optional-chain shape recovery in parser/generator
- unify call node family
- solve
(o?.m)()/ preserved-thisdesign gap - tighten generator splits further so fewer paths tolerate plain
PROPERTY
Remaining plain PROPERTY assumptions are phase-1 acceptable:
- initial member parsing still creates
PROPERTY - parser upgrades to
PROPERTY_REFonly at consuming contexts - optional helpers still accept both
PROPERTYandPROPERTY_REFtransitively
No additional phase-1 correctness gaps were found in parser/generator after the closeout audit.