1/*
2 * Copyright (c) 2021 - 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef ARK_DYNAMICCALLINFO_H
17#define ARK_DYNAMICCALLINFO_H
18
19#include <optional>
20
21#include "varbinder/ETSBinder.h"
22#include "ir/expression.h"
23
24namespace ark::es2panda::checker {
25
26class DynamicCall {
27    using NameHolder = ArenaVector<util::StringView>;
28
29public:
30    struct Result {
31        const ir::AstNode *obj;
32        const NameHolder name;  // NOLINT(readability-identifier-naming)
33    };
34
35    /**
36     * Resolve callee
37     * @param varbinder
38     * @param callee expression used to call method
39     * @return callee and name from which should be used to produce call
40     */
41    static Result ResolveCall(const varbinder::ETSBinder *varbinder, const ir::Expression *callee);
42    static bool IsByValue(const varbinder::ETSBinder *varbinder, const ir::Expression *callee)
43    {
44        return ResolveCall(varbinder, callee).name.empty();
45    }
46
47    /**
48     * Example: A[0].C.D => return: A[0], name: ".C.D"
49     * @param expr member expression
50     * @param name to store result
51     * @return object with remaining member expression
52     */
53    static Result SqueezeExpr(ArenaAllocator *allocator, const ir::MemberExpression *expr);
54
55private:
56    static const ir::Expression *SqueezeExpr(const ir::MemberExpression *expr, NameHolder &name);
57};
58
59}  // namespace ark::es2panda::checker
60#endif  // ARK_DYNAMICCALLINFO_H
61