in core/src/main/java/com/facebook/ktfmt/format/RedundantElementRemover.kt [31:72]
fun dropRedundantElements(code: String, options: FormattingOptions): String {
val file = Parser.parse(code)
val redundantImportDetector = RedundantImportDetector(enabled = options.removeUnusedImports)
val redundantSemicolonDetector = RedundantSemicolonDetector()
file.accept(
object : KtTreeVisitorVoid() {
override fun visitElement(element: PsiElement) {
if (element is KDocImpl) {
redundantImportDetector.takeKdoc(element)
} else {
redundantSemicolonDetector.takeElement(element) { super.visitElement(element) }
}
}
override fun visitPackageDirective(directive: KtPackageDirective) {
redundantImportDetector.takePackageDirective(directive) {
super.visitPackageDirective(directive)
}
}
override fun visitImportList(importList: KtImportList) {
redundantImportDetector.takeImportList(importList) { super.visitImportList(importList) }
}
override fun visitReferenceExpression(expression: KtReferenceExpression) {
redundantImportDetector.takeReferenceExpression(expression)
super.visitReferenceExpression(expression)
}
})
val result = StringBuilder(code)
val elementsToRemove =
redundantSemicolonDetector.getRedundantSemicolonElements() +
redundantImportDetector.getRedundantImportElements()
for (element in elementsToRemove.sortedByDescending(PsiElement::endOffset)) {
result.replace(element.startOffset, element.endOffset, "")
}
return result.toString()
}