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