@@ -43,65 +43,91 @@ class CheckedExceptionsDetector : Detector(), Detector.UastScanner {
4343 override fun createUastHandler (context : JavaContext ) = object : UElementHandler () {
4444
4545 init {
46- println (context.uastFile?.asRecursiveLogString())
46+ // println(context.uastFile?.asRecursiveLogString())
4747 }
4848
4949 override fun visitCallExpression (node : UCallExpression ) {
5050
5151 val parrentNode = node
52- val method = parrentNode.resolve()? : return
52+ val method = parrentNode.resolve() ? : return
5353 val uMethod = context.uastContext.getMethod(method)
5454
5555 val haveTryCatch = ArrayList <String >()
5656
57- val tryException = findParrentByUast(parrentNode,UTryExpression ::class .java)
58- if (tryException!= null ) {
57+ val tryException = findParrentByUast(parrentNode, UTryExpression ::class .java)
58+ if (tryException != null ) {
5959 for (catchCause in tryException.catchClauses) {
6060 haveTryCatch.add(findExceptionClassName(catchCause))
6161 }
6262 }
6363
64- uMethod.accept(object : AbstractUastVisitor () {
64+ uMethod.accept(object : AbstractUastVisitor () {
6565 override fun visitCallExpression (node : UCallExpression ): Boolean {
6666 if (node.uastParent !is UCallExpression ) return super .visitCallExpression(node)
6767 val parentResolve = (node.uastParent as UCallExpression ).resolve()
6868 val resolve = node.resolve()
69- if (parentResolve?.containingClass?.qualifiedName != " kotlin.coroutines.Continuation"
70- && parentResolve?.containingClass?.qualifiedName != " com.thirdegg.lintrules.android.Continuation" )
69+ if (parentResolve?.containingClass?.qualifiedName?.contains(" Continuation" ) != true ) {
7170 return super .visitCallExpression(node)
71+ }
7272
73- if ((node.uastParent as UCallExpression ? )?.methodName!= " resumeWithException" ) return super .visitCallExpression(node)
73+ if ((node.uastParent as UCallExpression ? )?.methodName != " resumeWithException" )
74+ return super .visitCallExpression(node)
75+
76+ val clazzName = resolve?.containingClass?.qualifiedName
77+ ? : return super .visitCallExpression(node)
78+
79+ if (haveTryCatch.contains(clazzName))
80+ return super .visitCallExpression(node)
81+
82+ var superClass = resolve.containingClass?.superClass
83+ while (superClass!= null ) {
84+ if (haveTryCatch.contains(superClass.qualifiedName))
85+ return super .visitCallExpression(node)
86+ superClass = superClass.superClass
87+ }
7488
75- val clazzName = resolve?.containingClass?.qualifiedName? : return super .visitCallExpression(node)
7689 context.report(ISSUE_PATTERN , parrentNode, context.getNameLocation(parrentNode),
7790 " Exception not checked: $clazzName " )
7891
92+ println (clazzName)
93+
7994 return super .visitCallExpression(node)
8095 }
8196 })
8297
83- uMethod.accept(object : AbstractUastVisitor () {
98+ uMethod.accept(object : AbstractUastVisitor () {
8499
85100 override fun visitThrowExpression (node : UThrowExpression ): Boolean {
86101
87- node.accept(object : AbstractUastVisitor () {
102+ node.accept(object : AbstractUastVisitor () {
103+
88104 override fun visitCallExpression (node : UCallExpression ): Boolean {
89105 if (node is KotlinUFunctionCallExpression ) {
90106 // TODO kotlin.Exception() not catch
91107 val clazz = node.resolve()
92- val clazzName = clazz?.containingClass?.qualifiedName
93- if (clazzName== null || haveTryCatch.contains(clazzName)) return super .visitCallExpression(node)
94- context.report(ISSUE_PATTERN , parrentNode, context.getNameLocation(parrentNode),
95- " Exception not checked: $clazzName " )
108+ val clazzName = clazz?.containingClass?.qualifiedName? : return super .visitCallExpression(node)
109+ if (haveTryCatch.contains(clazzName)) return super .visitCallExpression(node)
110+
111+ var superClass = clazz.containingClass?.superClass
112+ while (superClass!= null ) {
113+ if (haveTryCatch.contains(superClass?.qualifiedName))
114+ return super .visitCallExpression(node)
115+ superClass = superClass?.superClass
116+ }
117+
118+ context.report(ISSUE_PATTERN , parrentNode, context.getNameLocation(parrentNode)," Exception not checked: $clazzName " )
96119 }
97120 return super .visitCallExpression(node)
98121 }
122+
99123 })
124+
100125 return super .visitThrowExpression(node)
101126 }
102127
103128 })
104129 }
105130
131+
106132 }
107133}
0 commit comments