// Calls

foo();
foo(1);
foo(1, 2);
foo(1, 2, );
foo(1, 2, 3);
foo(foo(1));
foo(foo(1), foo(2, 3));
foo(...spread);
foo(x, ...spread);
foo(x, ...foo());

foo({
    a: 1,
    b: 2,
    c: 3
});

foo(1, 2, 3, function(e) {
    e.foo()
});

foo(function(e) {
    e.foo()
}, function(e) {
    e.bar()
});

// Basic Functions

function f() {}
(function() {});
(function() {})();
(function f() {});
(function f() {})();

function f() {
    1
}
(function() {
    1
});
(function() {
    1
})();
(function f() {
    1
});
(function f() {
    1
})();

// Parameters

function foo(a, b, c) {
    1
}

function foo(a=1, b, c) {
    1
}

function foo(a=1, b=2, c=3) {
    1
}

function foo(a, ...rest) {
    1
}

function foo(a=1, ...rest) {
    1
}

function foo({a, b}) {
    1
}

function foo([a, b]) {
    1
}

function foo([a, b, ]) {
    1
}

// Methods

o = {
    prop: function() {},
    method() {},
    get getter() {},
    set setter(x) {},
    *gen1() {},
    *gen2() {},
    async a() {}
}

o = {
    prop: function() {
        1
    },
    method() {
        1
    },
    get getter() {
        1
    },
    set setter(x) {
        1
    },
    *gen1() {
        1
    },
    *gen2() {
        1
    },
    async a() {
        1
    }
}
// Multiple / Nested

function f() {}
function f() {}

function outer() {
    1;
    function inner() {
        2
    }
    3
}

// Async / Await

async function foo() {}
async function foo() {
    1
}
async function foo() {
    await foo()
}
o = {
    async async() {},
    async() {},
    async: 1
}
o = {
    async 1() {}
}
o = {
    async "foo"() {}
}
o = {
    async ["foo"]() {}
}
o = {
    foo: async function() {}
}
