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> ¶meter) 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