1+ #include < algorithm>
2+ #include " antlr4-runtime/antlr4-runtime.h"
3+ #include " PHPVisitor.h"
4+ #include " Token.h"
5+
6+ antlrcpp::Any PHPVisitor::visitProg (PHPParser::ProgContext *ctx)
7+ {
8+ antlr4::Token *token = ctx->getStart ();
9+
10+ int line = token->getLine ();
11+ std::string word = token->getText ();
12+
13+ debug () && printf (" func:%s line:%d %s\n " , __FUNCTION__, line, word.data ());
14+
15+ return visitChildren (ctx);
16+ }
17+
18+ antlrcpp::Any PHPVisitor::visitPhpBlock (PHPParser::PhpBlockContext *context)
19+ {
20+ antlr4::Token *token = context->getStart ();
21+
22+ int line = token->getLine ();
23+ std::string word = token->getText ();
24+
25+ // printf("func:%s line:%d %s\n", __FUNCTION__, line, word.data());
26+ return visitChildren (context);
27+ }
28+
29+ antlrcpp::Any PHPVisitor::visitClassName (PHPParser::ClassNameContext *context)
30+ {
31+ antlr4::Token *token = context->Identifier ()->getSymbol ();
32+
33+ int line = token->getLine ();// - 1;
34+ std::string word = token->getText ();
35+
36+ debug () && printf (" func:%s line:%d %s\n " , __FUNCTION__, line, word.data ());
37+ return visitChildren (context);
38+ }
39+
40+ antlrcpp::Any PHPVisitor::visitClassDefinition (PHPParser::ClassDefinitionContext *context)
41+ {
42+ antlr4::Token *token = context->getStart ();
43+
44+ int line = token->getLine ();
45+ std::string word = token->getText ();
46+
47+
48+ debug () && printf (" func:%s line:%d %s\n " , __FUNCTION__, line, word.data ());
49+ return visitChildren (context);
50+ }
51+
52+ antlrcpp::Any PHPVisitor::visitClassImplements (PHPParser::ClassImplementsContext *context)
53+ {
54+ antlr4::Token *token = context->getStart ();
55+
56+ int line = token->getLine ();
57+ std::string word = token->getText ();
58+
59+ debug () && printf (" func:%s line:%d %s\n " , __FUNCTION__, line, word.data ());
60+ return visitChildren (context);
61+ }
62+
63+
64+ antlrcpp::Any PHPVisitor::visitClassMember (PHPParser::ClassMemberContext *context)
65+ {
66+
67+ debug () && printf (" \n " );
68+ antlr4::Token *token = context->getStart ();
69+
70+ int line = token->getLine ();
71+ std::string word = token->getText ();
72+
73+ debug () && printf (" func:%s line:%d %s\n " , __FUNCTION__, line, word.data ());
74+
75+ PHPParser::FieldDefinitionContext *field = context->fieldDefinition ();
76+ if (field) {
77+ antlr4::Token *token9 = field->fieldName ()->variablename ()->getStart ();
78+
79+ std::string word9 = token9->getText ();
80+ debug () && printf (" \t field:%s line:%zu %s\n " , __FUNCTION__, token9->getLine (), word9.data ());
81+
82+ classFields.push_back (word9);
83+ }
84+
85+ // 修饰
86+ std::vector<PHPParser::FieldModifierContext *> members = context->fieldModifier ();
87+ if (members.size () > 0 ){
88+
89+ for (size_t i =0 ; i < members.size (); i ++) {
90+
91+ antlr4::Token *token5 = context->fieldModifier (i)->getStart ();
92+
93+ int line5 = token5->getLine ();
94+ std::string word5 = token5->getText ();
95+ // printf("\tfunc-par:%s line:%d %s\n", __FUNCTION__, line5, word5.data());
96+ }
97+ }
98+
99+ if (context->Function ()) {
100+ antlr4::Token *token2 = context->Function ()->getSymbol ();
101+
102+ int line2 = token2->getLine ();
103+ std::string word2 = token2->getText ();
104+ // printf("functionA---:%s line:%d %s\n", __FUNCTION__, line2, word2.data());
105+
106+ if (context->functionName ()) {
107+ antlr4::Token *token3 = context->functionName ()->getStart ();
108+
109+ int line3 = token3->getLine ();
110+ std::string word3 = token3->getText ();
111+
112+ methods.push_back (word3);
113+
114+ debug () && printf (" function name---:%s line:%d %s\n " , __FUNCTION__, line3, word3.data ());
115+ }
116+
117+ PHPParser::ParametersDefinitionContext *param = context->parametersDefinition ();
118+ if (param) {
119+
120+ std::vector<PHPParser::ParamDefContext *> params = param->paramDef ();
121+
122+ for (size_t i =0 ; i < params.size (); i ++) {
123+ antlr4::Token *token7 = param->paramDef (i)->paramName ()->Identifier ()->getSymbol ();
124+
125+ std::string word7 = token7->getText ();
126+
127+ debug () && printf (" \t function param---:%s line:%zu %s\n " , __FUNCTION__, token7->getLine (), word7.data ());
128+ }
129+ }
130+ }
131+
132+ // PSR-2不支持 //TODO
133+ if (context->Var ()) {
134+ antlr4::Token *token8 = context->Var ()->getSymbol ();
135+
136+ int line8 = token8->getLine ();
137+ std::string word8 = token8->getText ();
138+
139+ debug () && printf (" \t var---:%s line:%d %s\n " , __FUNCTION__, line8, word8.data ());
140+ }
141+ return visitChildren (context);
142+ }
143+
144+
145+ antlrcpp::Any PHPVisitor::visitClassModifier (PHPParser::ClassModifierContext *context)
146+ {
147+ antlr4::Token *token = context->getStart ();
148+ int line = token->getLine ();
149+ std::string word = token->getText ();
150+
151+ debug () && printf (" func:%s line:%d %s\n " , __FUNCTION__, line, word.data ());
152+ return visitChildren (context);
153+ }
154+
155+
156+ std::string PHPVisitor::gerSetter ()
157+ {
158+ std::stringstream str;
159+ for (size_t i =0 ; i < classFields.size (); i ++) {
160+ std::string field = classFields[i];
161+
162+ std::string setter = gerFieldSetter (field);
163+ // printf("%s\n", setter.data());
164+
165+ str << setter;
166+
167+ if (i < classFields.size () - 1 ) {
168+ str << " \n " ;
169+ }
170+ }
171+
172+ return str.str ();
173+ }
174+
175+ std::string PHPVisitor::gerGetter ()
176+ {
177+ std::stringstream str;
178+ for (size_t i =0 ; i < classFields.size (); i ++) {
179+ std::string field = classFields[i];
180+
181+ std::string getter = gerFieldGetter (field);
182+
183+ str << getter;
184+
185+ if (i < classFields.size () - 1 ) {
186+ str << " \n " ;
187+ }
188+ }
189+
190+ return str.str ();
191+ }
192+
193+ std::string PHPVisitor::gerGetterSetter ()
194+ {
195+ std::stringstream str;
196+ for (size_t i =0 ; i < classFields.size (); i ++) {
197+ std::string field = classFields[i];
198+
199+ std::string getter = gerFieldGetter (field);
200+ std::string setter = gerFieldSetter (field);
201+
202+ str << setter << " \n " << getter;
203+
204+ if (i < classFields.size () - 1 ) {
205+ str << " \n " ;
206+ }
207+ }
208+
209+ return str.str ();
210+ }
211+
212+ std::string PHPVisitor::gerFieldGetter (std::string field)
213+ {
214+ std::string name = " get" + std::string (toUpper (field));
215+ if (std::find (methods.begin (), methods.end (), name) != methods.end ()) {
216+ return " " ;
217+ }
218+ std::string tab = " " ;// "\t";
219+ std::stringstream res;
220+ res << tab << " /**\n "
221+ << tab << " * @return mixed\n " // TODO: 类型推导
222+ << tab << " */\n "
223+ << tab << " public function " << name <<" ()\n "
224+ << tab << " {\n "
225+ << tab << " \t return $this->" << field << " ;\n "
226+ << tab << " }\n " ;
227+ return res.str ();
228+ }
229+
230+ std::string PHPVisitor::gerFieldSetter (std::string field)
231+ {
232+ std::string name = " set" + std::string (toUpper (field));
233+ if (std::find (methods.begin (), methods.end (), name) != methods.end ()) {
234+ return " " ;
235+ }
236+ std::string tab = " " ;// "\t";
237+ std::stringstream res;
238+ res << tab << " /**\n "
239+ << tab << " * @param mixed $" << field << " \n " // TODO:: 类型推导
240+ << tab << " *\n "
241+ << tab << " * @return self\n "
242+ << tab << " */\n "
243+ << tab << " public function " << name <<" ($" << field <<" )\n "
244+ << tab << " {\n "
245+ << tab << " \t $this->" << field <<" = $" << field << " ;\n "
246+ " \n " // 空行
247+ << tab << " \t return $this;\n " // TODO: config
248+ << tab << " }\n " ;
249+ return res.str ();
250+ }
251+
252+ char * PHPVisitor::toUpper (std::string str)
253+ {
254+ char * res = (char *)str.data ();
255+
256+ if (res[0 ] >= ' a' && res[0 ] <= ' z' ){
257+ res[0 ] = res[0 ]-32 ;
258+ }
259+
260+ return res;
261+ }
262+
263+ void PHPVisitor::setDebug (bool _isDebug) {
264+ isDebug = _isDebug;
265+ }
266+
267+ bool PHPVisitor::debug () {
268+ return isDebug; // TODO: config
269+ }
0 commit comments