@@ -29,7 +29,19 @@ public JCTree.JCReturn getReturn(JCTree.JCClassDecl classDecl) {
2929 if (returnAttr == null ) {
3030 return null ;
3131 }
32+
3233 String target = TreeUtil .getAnnotationValue (classDecl .sym , FeignReturn .class .getName (), "target()" );
34+ if (TypeUtil .isPrimitive (target ) || TypeUtil .isStr (target )) {
35+ if (returnAttr .params ().length != 1 ) {
36+ throw new RuntimeException ("FeignReturn params() size error: " + target );
37+ }
38+
39+ TypeTag baseType = TypeUtil .getBaseType (target );
40+ Object data = TreeUtil .getValue (baseType , returnAttr .params ()[0 ]);
41+ JCTree .JCExpression argsVal = syntaxTreeMaker .newElement (baseType , data );
42+ return syntaxTreeMaker .getTreeMaker ().Return (argsVal );
43+ }
44+
3345 Symbol .ClassSymbol targetClass = syntaxTreeMaker .getTypeElement (target );
3446 if (targetClass == null ) {
3547 throw new RuntimeException ("FeignReturn target() cannot be found: " + target );
@@ -44,60 +56,43 @@ public JCTree.JCReturn getReturn(JCTree.JCClassDecl classDecl) {
4456
4557 private JCTree .JCReturn constMethod (String className , Symbol .ClassSymbol targetClass , String [] params ) {
4658 // 类构造方法
47- List <JCTree .JCExpression > paramType = getParamType (targetClass , true , params );
48- if (null == paramType ) {
59+ List <JCTree .JCExpression > paramList = getConstParam (targetClass , params );
60+ if (null == paramList ) {
4961 // 无匹配的构造方法
5062 throw new RuntimeException ("[Return Error] Can't find match param constructor from " + className + " by " + Arrays .toString (params ));
5163 }
52- JCTree .JCExpression jcExpression = syntaxTreeMaker .NewObject (className , paramType );
64+ JCTree .JCExpression jcExpression = syntaxTreeMaker .NewObject (className , paramList );
5365 return syntaxTreeMaker .getTreeMaker ().Return (jcExpression );
5466 }
5567
5668 private JCTree .JCReturn staticMethod (String className , Symbol .ClassSymbol targetClass , String staticMethod , String [] params ) {
57- List <JCTree .JCExpression > paramType ;
69+ List <JCTree .JCExpression > paramList ;
5870 if (params .length == 0 ) {
59- paramType = TreeUtil .emptyExpression ();
71+ paramList = TreeUtil .emptyExpression ();
6072 } else {
61- paramType = getParamType (targetClass , false , params );
62- if (null == paramType ) {
73+ paramList = getStaticParam (targetClass , params );
74+ if (null == paramList ) {
6375 // 无匹配的静态方法
6476 throw new RuntimeException ("[Return Error] Can't find match param static method from " + className + " by " + Arrays .toString (params ));
6577 }
6678 }
6779
6880 JCTree .JCExpression clazzType = syntaxTreeMaker .findClass (className );
69- JCTree .JCMethodInvocation method = syntaxTreeMaker .getMethod (clazzType , staticMethod , paramType );
81+ JCTree .JCMethodInvocation method = syntaxTreeMaker .getMethod (clazzType , staticMethod , paramList );
7082 return syntaxTreeMaker .getTreeMaker ().Return (method );
7183 }
7284
7385 /**
7486 * 参数转换
7587 * @param classSymbol 解析类节点
76- * @param isConstruct 解析构造方法还是静态方法
7788 * @param values 参数数据
7889 * @return 返回对应参数元素
7990 */
80- private List <JCTree .JCExpression > getParamType (Symbol .ClassSymbol classSymbol , boolean isConstruct , String [] values ) {
81- int length = values .length ;
82-
83- List <JCTree .JCExpression > param = null ;
84-
85- boolean findParam ;
91+ private List <JCTree .JCExpression > getConstParam (Symbol .ClassSymbol classSymbol , String [] values ) {
8692 for (Symbol element : classSymbol .getEnclosedElements ()) {
87-
8893 // 构造方法
89- if (isConstruct ) {
90- if (!element .isConstructor ()) {
91- continue ;
92- }
93- } else {
94- // 静态方法
95- if (element .getKind () != ElementKind .METHOD ) {
96- continue ;
97- }
98- if (!element .isStatic ()) {
99- continue ;
100- }
94+ if (!element .isConstructor ()) {
95+ continue ;
10196 }
10297
10398 Symbol .MethodSymbol methodSymbol = (Symbol .MethodSymbol ) element ;
@@ -108,44 +103,78 @@ private List<JCTree.JCExpression> getParamType(Symbol.ClassSymbol classSymbol, b
108103 continue ;
109104 }
110105
111- findParam = true ;
112- for (int i = 0 ; findParam && i < length ; i ++) {
113- Symbol .VarSymbol varSymbol = parameters .get (i );
114- String value = values [i ];
115-
116- String typeName = TreeUtil .getOriginalTypeName (varSymbol );
117- TypeTag baseType = TypeUtil .getBaseType (typeName );
118-
119- JCTree .JCExpression argsVal ;
120-
121- // 不支持复杂对象
122- if (null == baseType ) {
123- param = null ;
124- findParam = false ;
125- continue ;
126- }
127-
128- Object data = TreeUtil .getValue (baseType , value );
129- // 数据与类型不匹配
130- if (null == data ) {
131- param = null ;
132- findParam = false ;
133- continue ;
134- }
135- argsVal = syntaxTreeMaker .newElement (baseType , data );
136-
137- if (null == param ) {
138- param = List .of (argsVal );
139- } else {
140- param = param .append (argsVal );
141- }
106+ if (values .length == 0 ) {
107+ return List .<JCTree .JCExpression >nil ();
108+ }
109+
110+ List <JCTree .JCExpression > param = getParam (parameters , values );
111+ if (param != null ) {
112+ return param ;
113+ }
114+ }
115+ return null ;
116+ }
117+
118+
119+ /**
120+ * 参数转换
121+ * @param classSymbol 解析类节点
122+ * @param values 参数数据
123+ * @return 返回对应参数元素
124+ */
125+ private List <JCTree .JCExpression > getStaticParam (Symbol .ClassSymbol classSymbol , String [] values ) {
126+ for (Symbol element : classSymbol .getEnclosedElements ()) {
127+ // 静态方法
128+ if (element .getKind () != ElementKind .METHOD || !element .isStatic ()) {
129+ continue ;
130+ }
131+
132+ Symbol .MethodSymbol methodSymbol = (Symbol .MethodSymbol ) element ;
133+ List <Symbol .VarSymbol > parameters = methodSymbol .getParameters ();
134+
135+ // 参数个数一致
136+ if (parameters .size () != values .length ) {
137+ continue ;
138+ }
139+ if (values .length == 0 ) {
140+ return List .<JCTree .JCExpression >nil ();
142141 }
143142
143+ List <JCTree .JCExpression > param = getParam (parameters , values );
144144 if (param != null ) {
145145 return param ;
146146 }
147147 }
148+ return null ;
149+ }
150+
151+ private List <JCTree .JCExpression > getParam (List <Symbol .VarSymbol > parameters , String [] values ) {
152+ List <JCTree .JCExpression > param = null ;
153+ for (int i = 0 ; i < parameters .size (); i ++) {
154+ Symbol .VarSymbol varSymbol = parameters .get (i );
155+ String value = values [i ];
156+
157+ String typeName = TreeUtil .getOriginalTypeName (varSymbol );
158+ TypeTag baseType = TypeUtil .getBaseType (typeName );
159+
160+ // 不支持复杂对象
161+ if (null == baseType ) {
162+ return null ;
163+ }
164+
165+ Object data = TreeUtil .getValue (baseType , value );
166+ // 数据与类型不匹配
167+ if (null == data ) {
168+ return null ;
169+ }
148170
171+ JCTree .JCExpression argsVal = syntaxTreeMaker .newElement (baseType , data );
172+ if (null == param ) {
173+ param = List .of (argsVal );
174+ } else {
175+ param = param .append (argsVal );
176+ }
177+ }
149178 return null ;
150179 }
151180}
0 commit comments