1/*
2 * Copyright (c) 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#include "ast/ast_method.h"
17
18#include "ast/ast_interface_type.h"
19#include "util/string_builder.h"
20
21namespace OHOS {
22namespace Idl {
23void ASTMethod::CheckOverload(AutoPtr<ASTInterfaceType> interface)
24{
25    if (interface == nullptr) {
26        return;
27    }
28    interface = interface->GetExtendsInterface();
29    while (interface != nullptr) {
30        const std::vector<AutoPtr<ASTMethod>> methodMap =
31            interface->GetMethodsBySystem(Options::GetInstance().GetSystemLevel());
32        if (std::any_of(methodMap.begin(), methodMap.end(),
33            [this] (const AutoPtr<ASTMethod> &method) { return name_ == method->GetName();})) {
34            isOverload_ = true;
35            return;
36        }
37        interface = interface->GetExtendsInterface();
38    }
39    isOverload_ = false;
40}
41
42std::string ASTMethod::GetSignature()
43{
44    if (signature_.empty()) {
45        BuildSignature();
46    }
47    return signature_;
48}
49
50void ASTMethod::BuildSignature()
51{
52    StringBuilder sb;
53
54    sb.AppendFormat("(%s)", returnType_->GetSignature().c_str());
55    for (size_t i = 0; i < parameters_.size(); i++) {
56        sb.Append(parameters_[i]->GetType()->GetSignature());
57    }
58    signature_ = sb.ToString();
59}
60
61void ASTMethod::AddParameter(const AutoPtr<ASTParameter> &parameter)
62{
63    if (parameter == nullptr) {
64        return;
65    }
66    parameters_.push_back(parameter);
67}
68
69AutoPtr<ASTParameter> ASTMethod::GetParameter(size_t index)
70{
71    if (index >= parameters_.size()) {
72        return nullptr;
73    }
74
75    return parameters_[index];
76}
77
78std::string ASTMethod::Dump(const std::string &prefix)
79{
80    StringBuilder sb;
81
82    if (Options::GetInstance().GetInterfaceType() == InterfaceType::SA) {
83        if (returnType_ != nullptr) {
84            sb.Append(prefix).Append(returnType_->ToString()).Append(' ');
85        }
86    } else {
87        sb.Append(prefix).Append(attr_->Dump(prefix));
88    }
89    sb.Append(name_).Append('(');
90    if (parameters_.size() > 0) {
91        sb.Append('\n');
92        for (auto parameter : parameters_) {
93            std::string info = parameter->Dump(prefix + TAB);
94            sb.Append(info);
95            if (parameter != parameters_[parameters_.size() - 1]) {
96                sb.Append(",\n");
97            }
98        }
99    }
100    sb.Append(");\n");
101
102    return sb.ToString();
103}
104} // namespace Idl
105} // namespace OHOS