@@ -16,11 +16,8 @@ import java.util.*
16
16
import javax.annotation.processing.AbstractProcessor
17
17
import javax.annotation.processing.RoundEnvironment
18
18
import javax.lang.model.SourceVersion
19
- import javax.lang.model.element.ElementKind
19
+ import javax.lang.model.element.*
20
20
import javax.lang.model.element.ElementKind.*
21
- import javax.lang.model.element.ExecutableElement
22
- import javax.lang.model.element.Modifier
23
- import javax.lang.model.element.TypeElement
24
21
import kotlin.collections.ArrayList
25
22
import kotlin.math.abs
26
23
@@ -226,56 +223,121 @@ class TheRouterAnnotationProcessor : AbstractProcessor() {
226
223
val list: ArrayList <ServiceProviderItem > = ArrayList ()
227
224
val set = roundEnv.getElementsAnnotatedWith(ServiceProvider ::class .java)
228
225
for (element in set) {
229
- require(element.kind == METHOD ) { element.simpleName.toString() + " is not method" }
230
- var isStatic = false
231
- for (m in element.modifiers) {
232
- if (m == Modifier .STATIC ) {
233
- isStatic = true
234
- break
235
- }
226
+ val serviceProviderItem = if (element.kind == METHOD ) {
227
+ handleMethodServiceProviderItem(element)
228
+ } else {
229
+ handleClassServiceProviderItem(element)
236
230
}
237
- require(isStatic) {
238
- (element.enclosingElement.toString()
239
- + " ." + element.simpleName + " () is not static method" )
240
- }
241
- val serviceProviderItem = ServiceProviderItem ()
242
- serviceProviderItem.element = element
243
- serviceProviderItem.methodName = element.simpleName.toString()
244
- serviceProviderItem.className = element.enclosingElement.toString()
245
- if (element is ExecutableElement ) {
246
- serviceProviderItem.returnType = element.returnType.toString()
247
- val parameters = element.parameters
248
- if (parameters.size > 0 ) {
249
- val params: ArrayList <String > = ArrayList <String >()
250
- repeat(parameters.size) { i ->
251
- params.add(transformNumber(parameters[i].asType().toString()))
231
+ list.add(serviceProviderItem)
232
+ }
233
+ return list
234
+ }
235
+
236
+ private fun handleClassServiceProviderItem (element : Element ): ServiceProviderItem {
237
+ val serviceProviderItem = ServiceProviderItem (false )
238
+ serviceProviderItem.element = element
239
+ val annotation = element.getAnnotation(ServiceProvider ::class .java)
240
+ serviceProviderItem.className = element.toString()
241
+ serviceProviderItem.methodName = " "
242
+
243
+ var toStringStr = annotation.toString()
244
+ // 过滤最后一个字符')'
245
+ toStringStr = toStringStr.substring(0 , toStringStr.length - 1 )
246
+ toStringStr.split(" ," ).forEach { temp ->
247
+ if (temp.contains(KEY_RETURNTYPE )) {
248
+ val value = handleReturnType(temp.trim())
249
+ if (! ServiceProvider ::class .java.name.equals(value, ignoreCase = true )) {
250
+ serviceProviderItem.returnType = value
251
+ }
252
+ } else if (temp.contains(KEY_PARAMS )) {
253
+ val value = handleParams(temp.trim())
254
+ if (value.size > 1 ) {
255
+ serviceProviderItem.params = transform(value)
256
+ } else if (value.size == 1 ) {
257
+ if (value[0 ].trim().isNotEmpty()) {
258
+ serviceProviderItem.params = transform(value)
252
259
}
253
- serviceProviderItem.params = params
254
260
}
255
261
}
256
- var toStringStr = element.getAnnotation(ServiceProvider ::class .java).toString()
257
- // 过滤最后一个字符')'
258
- toStringStr = toStringStr.substring(0 , toStringStr.length - 1 )
259
- toStringStr.split(" ," ).forEach { temp ->
260
- if (temp.contains(KEY_RETURNTYPE )) {
261
- val value = handleReturnType(temp.trim())
262
- if (! ServiceProvider ::class .java.name.equals(value, ignoreCase = true )) {
263
- serviceProviderItem.returnType = value
262
+ }
263
+
264
+ if (serviceProviderItem.returnType.isEmpty()) {
265
+ if (element is TypeElement ) {
266
+ if (element.interfaces.size == 0 ) {
267
+ serviceProviderItem.returnType = serviceProviderItem.className
268
+ } else if (element.interfaces.size == 1 ) {
269
+ serviceProviderItem.returnType = element.interfaces[0 ].toString()
270
+ } else {
271
+ val prop = Properties ()
272
+ try {
273
+ val gradleProperties = FileInputStream (PROPERTY_FILE )
274
+ prop.load(gradleProperties)
275
+ } catch (e: Exception ) {
276
+ e.printStackTrace()
277
+ }
278
+ if (! STR_TRUE .equals(prop.getProperty(KEY_USE_EXTEND ), ignoreCase = true )) {
279
+ throw IllegalArgumentException (
280
+ element.enclosingElement.toString() + " ." + element.simpleName +
281
+ " has multiple interfaces. Must to be specified returnType=XXX," +
282
+ " or configuration KEY_USE_EXTEND=true in gradle.properties"
283
+ )
284
+ } else {
285
+ serviceProviderItem.returnType = serviceProviderItem.className
264
286
}
265
- } else if (temp.contains(KEY_PARAMS )) {
266
- val value = handleParams(temp.trim())
267
- if (value.size > 1 ) {
287
+ }
288
+ }
289
+ }
290
+ return serviceProviderItem
291
+ }
292
+
293
+ private fun handleMethodServiceProviderItem (element : Element ): ServiceProviderItem {
294
+ var isStatic = false
295
+ for (m in element.modifiers) {
296
+ if (m == Modifier .STATIC ) {
297
+ isStatic = true
298
+ break
299
+ }
300
+ }
301
+ require(isStatic) {
302
+ (element.enclosingElement.toString()
303
+ + " ." + element.simpleName + " () is not static method" )
304
+ }
305
+ val serviceProviderItem = ServiceProviderItem (true )
306
+ serviceProviderItem.element = element
307
+ serviceProviderItem.methodName = element.simpleName.toString()
308
+ serviceProviderItem.className = element.enclosingElement.toString()
309
+ if (element is ExecutableElement ) {
310
+ serviceProviderItem.returnType = element.returnType.toString()
311
+ val parameters = element.parameters
312
+ if (parameters.size > 0 ) {
313
+ val params: ArrayList <String > = ArrayList <String >()
314
+ repeat(parameters.size) { i ->
315
+ params.add(transformNumber(parameters[i].asType().toString()))
316
+ }
317
+ serviceProviderItem.params = params
318
+ }
319
+ }
320
+ var toStringStr = element.getAnnotation(ServiceProvider ::class .java).toString()
321
+ // 过滤最后一个字符')'
322
+ toStringStr = toStringStr.substring(0 , toStringStr.length - 1 )
323
+ toStringStr.split(" ," ).forEach { temp ->
324
+ if (temp.contains(KEY_RETURNTYPE )) {
325
+ val value = handleReturnType(temp.trim())
326
+ if (! ServiceProvider ::class .java.name.equals(value, ignoreCase = true )) {
327
+ serviceProviderItem.returnType = value
328
+ }
329
+ } else if (temp.contains(KEY_PARAMS )) {
330
+ val value = handleParams(temp.trim())
331
+ if (value.size > 1 ) {
332
+ serviceProviderItem.params = transform(value)
333
+ } else if (value.size == 1 ) {
334
+ if (value[0 ].trim().isNotEmpty()) {
268
335
serviceProviderItem.params = transform(value)
269
- } else if (value.size == 1 ) {
270
- if (value[0 ].trim().isNotEmpty()) {
271
- serviceProviderItem.params = transform(value)
272
- }
273
336
}
274
337
}
275
338
}
276
- list.add(serviceProviderItem)
277
339
}
278
- return list
340
+ return serviceProviderItem
279
341
}
280
342
281
343
private fun handleReturnType (str : String ): String {
@@ -498,14 +560,26 @@ class TheRouterAnnotationProcessor : AbstractProcessor() {
498
560
}
499
561
ps.println (" ) {" )
500
562
ps.println (" \t\t\t // 加上编译期的类型校验,防止方法实际返回类型与注解声明返回类型不匹配" )
501
- ps.print (
502
- String .format(
503
- " \t\t\t %s retyrnType = %s.%s(" ,
504
- serviceProviderItem.returnType,
505
- serviceProviderItem.className,
506
- serviceProviderItem.methodName
563
+
564
+ if (serviceProviderItem.isMethod) {
565
+ ps.print (
566
+ String .format(
567
+ " \t\t\t %s returnType = %s.%s(" ,
568
+ serviceProviderItem.returnType,
569
+ serviceProviderItem.className,
570
+ serviceProviderItem.methodName
571
+ )
507
572
)
508
- )
573
+ } else {
574
+ ps.print (
575
+ String .format(
576
+ " \t\t\t %s returnType = new %s(" ,
577
+ serviceProviderItem.returnType,
578
+ serviceProviderItem.className
579
+ )
580
+ )
581
+ }
582
+
509
583
for (count in serviceProviderItem.params.indices) {
510
584
if (! serviceProviderItem.params[count].trim { it <= ' ' }.isEmpty()) {
511
585
// 参数强转
@@ -523,7 +597,7 @@ class TheRouterAnnotationProcessor : AbstractProcessor() {
523
597
}
524
598
}
525
599
ps.println (" );" )
526
- ps.println (" \t\t\t obj = (T) retyrnType ;" )
600
+ ps.println (" \t\t\t obj = (T) returnType ;" )
527
601
ps.print (" \t\t } else " )
528
602
}
529
603
ps.println (" {\n " )
0 commit comments