fun dropRedundantElements()

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()
  }