1//
2// Parameter.cpp
3//
4// Library: CppParser
5// Package: SymbolTable
6// Module: Parameter
7//
8// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
9// and Contributors.
10//
11// SPDX-License-Identifier: BSL-1.0
12//
13
14
15#include "Poco/CppParser/Parameter.h"
16#include "Poco/CppParser/NameSpace.h"
17#include "Poco/CppParser/TypeDef.h"
18#include "Poco/CppParser/Utility.h"
19#include "Poco/String.h"
20#include "Poco/NumberFormatter.h"
21#include <cstddef>
22
23
24namespace Poco {
25namespace CppParser {
26
27
28int Parameter::_count(0);
29
30
31Parameter::Parameter(const std::string& decl, Function* /*pFunction*/):
32 Decl(handleDecl(decl), 0), // handle init values
33 _type(),
34 _isRef(false),
35 _isPointer(false),
36 _isConst(false)
37{
38 std::size_t pos = declaration().rfind(name());
39 std::string tmp;
40 if (pos == 0 && name().size() == declaration().size())
41 tmp = declaration();
42 else
43 tmp = declaration().substr(0, pos);
44 _type = Poco::trim(tmp);
45 std::size_t rightCut = _type.size();
46 while (rightCut > 0 && (_type[rightCut-1] == '&' || _type[rightCut-1] == '*' || _type[rightCut-1] == '\t' || _type[rightCut-1] == ' '))
47 {
48 if (_type[rightCut-1] == '&')
49 _isRef = true;
50 if (_type[rightCut-1] == '*')
51 _isPointer = true;
52 --rightCut;
53 }
54 _type = Poco::trim(_type.substr(0, rightCut));
55 if (_type.find("const ") == 0)
56 {
57 _isConst = true;
58 _type = _type.substr(6);
59 }
60 if (_type.find("const\t") == 0)
61 {
62 _type = _type.substr(6);
63 _isConst = true;
64 }
65
66 Poco::trimInPlace(_type);
67 pos = decl.find("=");
68 _hasDefaultValue = (pos != std::string::npos);
69 if (_hasDefaultValue)
70 {
71 _defaultDecl = decl.substr(pos + 1);
72 Poco::trimInPlace(_defaultDecl);
73 std::size_t posStart = _defaultDecl.find("(");
74 std::size_t posEnd = _defaultDecl.rfind(")");
75 if (posStart != std::string::npos && posEnd != std::string::npos)
76 {
77 _defaultValue = _defaultDecl.substr(posStart + 1, posEnd-posStart - 1);
78 }
79 else
80 {
81 poco_assert (posStart == std::string::npos && posEnd == std::string::npos);
82 _defaultValue = _defaultDecl;
83 }
84 Poco::trimInPlace(_defaultValue);
85 }
86}
87
88
89Parameter::~Parameter()
90{
91}
92
93
94Symbol::Kind Parameter::kind() const
95{
96 return Symbol::SYM_PARAMETER;
97}
98
99
100bool Parameter::vectorType(const std::string& type, NameSpace* pNS)
101{
102 bool ret = type.find("vector") != std::string::npos;
103 if (!ret)
104 {
105 Symbol* pSym = pNS->lookup(type);
106 if (pSym)
107 {
108 if (pSym->kind() == Symbol::SYM_TYPEDEF)
109 {
110 TypeDef* pType = static_cast<TypeDef*>(pSym);
111 ret = pType->declaration().find("vector") != std::string::npos;
112 }
113 }
114 }
115 return ret;
116}
117
118
119std::string Parameter::handleDecl(const std::string& decl)
120{
121 std::size_t pos = decl.find('=');
122 std::string result(decl.substr(0, pos));
123 // now check if we have to add a paramName
124 Poco::trimInPlace(result);
125 std::size_t posSpace = result.rfind(' ');
126 bool mustAdd = false;
127 if (posSpace>0)
128 {
129 std::string tmp(result.substr(posSpace+1));
130 mustAdd = (tmp.find('<') != -1 || tmp.find('>') != -1 || tmp.find('*') != -1 || tmp.find('&') != -1);
131 }
132 else
133 mustAdd = true;
134 if (mustAdd)
135 {
136 result.append(" ");
137 result.append("param");
138 result.append(Poco::NumberFormatter::format(++_count));
139 //never add the default val it breaks the upper class parser
140 }
141 return result;
142}
143
144
145} } // namespace Poco::CppParser
146