All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jtransc.ast.ast_references.kt Maven / Gradle / Ivy

package com.jtransc.ast

object References {
	fun get(clazz:AstClass) = clazz.getClassReferences()

	fun AstClass.getClassReferences(): List {
		val me = AstType.REF(this.fqname)
		val parent = if (this.extending != null) AstType.REF(this.extending) else null
		val interfaces = this.implementing.map { AstType.REF(it) }
		val fields = this.fields.flatMap { it.getClassReferences() }
		val methods = this.methods.flatMap { it.getClassReferences() }
		val annotations = this.annotations.getClassReferences()

		return (listOf(me) + listOf(parent) + interfaces + fields + methods + annotations).filterNotNull()
	}

	fun AstField.getClassReferences(): List {
		return this.genericType.getRefClasses() + this.annotations.getClassReferences()
	}

	fun AstMethod.getClassReferences(): List {
		val signatureRefs = this.genericMethodType.getRefClasses()
		val refs = this.body?.getClassReferences() ?: listOf()
		val annotations = this.annotations.getClassReferences()
		val parameterAnnotations = this.parameterAnnotations.flatMap { it }.getClassReferences()
		return signatureRefs + refs + annotations + parameterAnnotations
	}

	fun List.getClassReferences(): List {
		return this.flatMap { it.getClassReferences() }
	}

	fun Any?.getClassReferences(): List {
		return when (this) {
			null -> listOf()
			is List<*> -> this.flatMap { it.getClassReferences() }
			is AstAnnotation -> this.getClassReferences()
			is AstBody -> this.getClassReferences()
			is AstStm -> this.getClassReferences()
			is AstMethod -> this.getClassReferences()
			is AstField -> this.getClassReferences()
			is AstClass -> this.getClassReferences()
			else -> listOf()
		}
	}

	fun AstAnnotation.getClassReferences(): List {
		return listOf(this.type) + this.elements.values.getClassReferences()
	}

	fun AstBody.getClassReferences(): List {
		val locals = this.locals.flatMap { it.type.getRefClasses() }
		val traps = this.traps.map { it.exception }
		val stms = this.stm.getClassReferences()
		return locals + traps + stms
	}

	fun AstStm.getClassReferences(): List {
		val refs = ReferencesVisitor()
		refs.visit(this)
		return (refs.classReferences + refs.fieldReferences.map { it.classRef } + refs.methodReferences.flatMap { it.allClassRefs }).toList()
	}

	class ReferencesVisitor : AstVisitor() {
		val classReferences = hashSetOf()
		val fieldReferences = hashSetOf()
		val methodReferences = hashSetOf()

		override fun visit(ref: AstType.REF) {
			super.visit(ref)
			classReferences += ref
		}

		override fun visit(ref: AstFieldRef) {
			super.visit(ref)
			fieldReferences += ref
		}

		override fun visit(ref: AstMethodRef) {
			super.visit(ref)
			methodReferences += ref
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy