
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