xref: /aosp_15_r20/external/ksp/api/src/main/kotlin/com/google/devtools/ksp/visitor/KSTopDownVisitor.kt (revision af87fb4bb8e3042070d2a054e912924f599b22b7)
1 /*
2  * Copyright 2020 Google LLC
3  * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package com.google.devtools.ksp.visitor
18 
19 import com.google.devtools.ksp.symbol.*
20 
21 /**
22  * Visit all elements recursively.
23  *
24  * For subclasses overriding a function, remember to call the corresponding super method.
25  */
26 abstract class KSTopDownVisitor<D, R> : KSDefaultVisitor<D, R>() {
Sequencenull27     private fun Sequence<KSNode>.accept(data: D) {
28         forEach { it.accept(this@KSTopDownVisitor, data) }
29     }
Listnull30     private fun List<KSNode>.accept(data: D) {
31         forEach { it.accept(this@KSTopDownVisitor, data) }
32     }
33 
KSNodenull34     private fun KSNode.accept(data: D) = accept(this@KSTopDownVisitor, data)
35 
36     override fun visitPropertyDeclaration(property: KSPropertyDeclaration, data: D): R {
37         property.type.accept(data)
38         property.extensionReceiver?.accept(data)
39         property.getter?.accept(data)
40         property.setter?.accept(data)
41         return super.visitPropertyDeclaration(property, data)
42     }
43 
visitAnnotatednull44     override fun visitAnnotated(annotated: KSAnnotated, data: D): R {
45         annotated.annotations.accept(data)
46         return super.visitAnnotated(annotated, data)
47     }
48 
visitClassDeclarationnull49     override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: D): R {
50         classDeclaration.superTypes.accept(data)
51         return super.visitClassDeclaration(classDeclaration, data)
52     }
53 
visitDeclarationnull54     override fun visitDeclaration(declaration: KSDeclaration, data: D): R {
55         declaration.typeParameters.accept(data)
56         return super.visitDeclaration(declaration, data)
57     }
58 
visitDeclarationContainernull59     override fun visitDeclarationContainer(declarationContainer: KSDeclarationContainer, data: D): R {
60         declarationContainer.declarations.accept(data)
61         return super.visitDeclarationContainer(declarationContainer, data)
62     }
63 
visitAnnotationnull64     override fun visitAnnotation(annotation: KSAnnotation, data: D): R {
65         annotation.annotationType.accept(data)
66         annotation.arguments.accept(data)
67         return super.visitAnnotation(annotation, data)
68     }
69 
visitFunctionDeclarationnull70     override fun visitFunctionDeclaration(function: KSFunctionDeclaration, data: D): R {
71         function.extensionReceiver?.accept(data)
72         function.parameters.accept(data)
73         function.returnType?.accept(data)
74         return super.visitFunctionDeclaration(function, data)
75     }
76 
visitCallableReferencenull77     override fun visitCallableReference(reference: KSCallableReference, data: D): R {
78         reference.functionParameters.accept(data)
79         reference.receiverType?.accept(data)
80         reference.returnType.accept(data)
81         return super.visitCallableReference(reference, data)
82     }
83 
visitParenthesizedReferencenull84     override fun visitParenthesizedReference(reference: KSParenthesizedReference, data: D): R {
85         reference.element.accept(data)
86         return super.visitParenthesizedReference(reference, data)
87     }
88 
visitPropertyGetternull89     override fun visitPropertyGetter(getter: KSPropertyGetter, data: D): R {
90         getter.returnType?.accept(data)
91         return super.visitPropertyGetter(getter, data)
92     }
93 
visitPropertySetternull94     override fun visitPropertySetter(setter: KSPropertySetter, data: D): R {
95         setter.parameter.accept(data)
96         return super.visitPropertySetter(setter, data)
97     }
98 
visitReferenceElementnull99     override fun visitReferenceElement(element: KSReferenceElement, data: D): R {
100         element.typeArguments.accept(data)
101         return super.visitReferenceElement(element, data)
102     }
103 
visitTypeAliasnull104     override fun visitTypeAlias(typeAlias: KSTypeAlias, data: D): R {
105         typeAlias.type.accept(data)
106         return super.visitTypeAlias(typeAlias, data)
107     }
108 
visitTypeArgumentnull109     override fun visitTypeArgument(typeArgument: KSTypeArgument, data: D): R {
110         typeArgument.type?.accept(data)
111         return super.visitTypeArgument(typeArgument, data)
112     }
113 
visitTypeParameternull114     override fun visitTypeParameter(typeParameter: KSTypeParameter, data: D): R {
115         typeParameter.bounds.accept(data)
116         return super.visitTypeParameter(typeParameter, data)
117     }
118 
visitTypeReferencenull119     override fun visitTypeReference(typeReference: KSTypeReference, data: D): R {
120         typeReference.element?.accept(data)
121         return super.visitTypeReference(typeReference, data)
122     }
123 
visitClassifierReferencenull124     override fun visitClassifierReference(reference: KSClassifierReference, data: D): R {
125         reference.qualifier?.accept(data)
126         return super.visitClassifierReference(reference, data)
127     }
128 
visitDefNonNullReferencenull129     override fun visitDefNonNullReference(reference: KSDefNonNullReference, data: D): R {
130         reference.enclosedType.accept(data)
131         return super.visitDefNonNullReference(reference, data)
132     }
133 
visitValueParameternull134     override fun visitValueParameter(valueParameter: KSValueParameter, data: D): R {
135         valueParameter.type?.accept(data)
136         return super.visitValueParameter(valueParameter, data)
137     }
138 }
139