Skip to content

Commit b38b544

Browse files
committed
src
1 parent 2292146 commit b38b544

File tree

3 files changed

+397
-0
lines changed

3 files changed

+397
-0
lines changed

src/PHPVisitor.cpp

Lines changed: 269 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,269 @@
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("\tfield:%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("\tfunction 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("\tvar---:%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 << "\treturn $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 << "\treturn $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+
}

src/PHPVisitor.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
#include "PHPParserVisitor.h"
3+
#include "PHPParserBaseVisitor.h"
4+
5+
class PHPVisitor : public PHPParserBaseVisitor {
6+
public:
7+
8+
std::vector<std::string> classFields;
9+
std::vector<std::string> methods;
10+
std::string gerSetter();
11+
std::string gerGetter();
12+
std::string gerGetterSetter();
13+
void setDebug(bool isDebug);
14+
15+
antlrcpp::Any visitProg(PHPParser::ProgContext *ctx) override;
16+
antlrcpp::Any visitPhpBlock(PHPParser::PhpBlockContext *ctx) override ;
17+
antlrcpp::Any visitClassName(PHPParser::ClassNameContext *context) override;
18+
antlrcpp::Any visitClassDefinition(PHPParser::ClassDefinitionContext *context) override ;
19+
antlrcpp::Any visitClassImplements(PHPParser::ClassImplementsContext *context) override;
20+
antlrcpp::Any visitClassMember(PHPParser::ClassMemberContext *context) override;
21+
antlrcpp::Any visitClassModifier(PHPParser::ClassModifierContext *context) override;
22+
23+
private:
24+
bool isDebug = false;
25+
std::string gerFieldSetter(std::string field);
26+
std::string gerFieldGetter(std::string field);
27+
char* toUpper(std::string str);
28+
bool debug();
29+
};

0 commit comments

Comments
 (0)