~~ lineWidth: 40 ~~
== should format ==
obj.prop.otherProp;
obj.prop[ "computed"   ];
testing
    .this
    .out
    .a.lot
    .more;
testing.this.out.for.when.it.passes.thelineWidth;

[expect]
obj.prop.otherProp;
obj.prop["computed"];
testing
    .this
    .out
    .a.lot
    .more;
testing.this.out.for.when.it.passes
    .thelineWidth;

== should not indent for other nodes ==
call({
    prop: 5,
    prop: 7,
}).member;

[expect]
call({
    prop: 5,
    prop: 7,
}).member;

== should support optional chaining ==
obj?.test.test;
obj.other
    ?.test;
obj?.["test"];
obj.other
        ?.["test"];

[expect]
obj?.test.test;
obj.other
    ?.test;
obj?.["test"];
obj.other
    ?.["test"];

== should support non-null assertion ==
test![0];
test!.test;

[expect]
test![0];
test!.test;

== should keep comments in long chains==
member
    .test() // 1
    // 2
    .testing // 3
    // 4
    /* 5 */ .asdf() // 6
    .test[  1  ] // 7
    .other;

[expect]
member
    .test() // 1
    // 2
    .testing // 3
    // 4
    /* 5 */ .asdf() // 6
    .test[1] // 7
    .other;

== should keep comments inside computed properties in long chains ==
member
    .test[ // 1
        /* 2*/
        // other
        inner // test
        // asdf
    ] // other
    .asdf;

[expect]
member
    .test[ // 1
        /* 2*/
        // other
        inner // test
        // asdf
    ] // other
    .asdf;

== should look at computed property end for determining whether to go to a newline or not ==
member.testing[
    // test
    4
].test;

[expect]
member.testing[
    // test
    4
].test;
