From 6182edadfde0265dd9a91ff1783d084f834cdef8 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 29 Mar 2019 15:17:09 +0300 Subject: [PATCH] New J2K: Move imports into JKImportList --- .../kotlin/nj2k/JavaToJKTreeBuilder.kt | 39 ++++++++++++------- .../jetbrains/kotlin/nj2k/NewCodeBuilder.kt | 6 ++- .../conversions/FilterImportsConversion.kt | 8 ++-- .../org/jetbrains/kotlin/nj2k/tree/impl/jk.kt | 10 ++++- nj2k/src/org/jetbrains/kotlin/nj2k/tree/jk.kt | 6 ++- .../kotlin/nj2k/tree/visitors/JKVisitor.kt | 1 + .../nj2k/tree/visitors/JKVisitorVoid.kt | 2 + .../visitors/JKVisitorWithCommentsPrinting.kt | 8 ++++ 8 files changed, 59 insertions(+), 21 deletions(-) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt index fd86903c97a..5c756b6e9b5 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt @@ -69,18 +69,24 @@ class JavaToJKTreeBuilder constructor( private fun PsiJavaFile.toJK(): JKFile = JKFileImpl( packageStatement?.toJK() ?: JKPackageDeclarationImpl(JKNameIdentifierImpl("")), - importList?.toJK().orEmpty(), + importList.toJK(filterOutUsedImports = true), with(declarationMapper) { classes.map { it.toJK() } } ) - private fun PsiImportList.toJK(): List = - importStatements.filter { import -> - when { - import.isSingleUnusedImport() -> true - import.isOnDemand -> true - else -> false - } - }.map { it.toJK() } + private fun PsiImportList?.toJK(filterOutUsedImports: Boolean): JKImportList = + JKImportListImpl( + this?.importStatements?.let { imports -> + if (filterOutUsedImports) { + imports.filter { import -> + when { + import.isSingleUnusedImport() -> true + import.isOnDemand -> true + else -> false + } + } + } else imports.toList() + }?.map { it.toJK() }.orEmpty() + ) private fun PsiImportStatement.isSingleUnusedImport(): Boolean { @@ -953,7 +959,7 @@ class JavaToJKTreeBuilder constructor( }.last() - fun buildTree(psi: PsiElement): JKTreeElement? = + fun buildTree(psi: PsiElement): JKTreeRoot? = when (psi) { is PsiJavaFile -> psi.toJK() is PsiExpression -> with(expressionTreeMapper) { psi.toJK() } @@ -962,9 +968,16 @@ class JavaToJKTreeBuilder constructor( is PsiField -> with(declarationMapper) { psi.toJK() } is PsiMethod -> with(declarationMapper) { psi.toJK() } is PsiAnnotation -> with(declarationMapper) { psi.toJK() } - else -> - null - } + is PsiImportList -> psi.toJK(filterOutUsedImports = false) + is PsiImportStatement -> psi.toJK() + is PsiJavaCodeReferenceElement -> + if (psi.parent is PsiReferenceList) { + val factory = JavaPsiFacade.getInstance(psi.project).elementFactory + val type = factory.createType(psi) + JKTypeElementImpl(type.toJK(symbolProvider).updateNullabilityRecursively(Nullability.NotNull)) + } else null + else -> null + }?.let { JKTreeRootImpl(it) } private val tokenCache = mutableMapOf() diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/NewCodeBuilder.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/NewCodeBuilder.kt index 9d79309f0a6..ea642f5707c 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/NewCodeBuilder.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/NewCodeBuilder.kt @@ -172,7 +172,7 @@ class NewCodeBuilder { if (file.packageDeclaration.packageName.value.isNotEmpty()) { file.packageDeclaration.accept(this) } - file.importList.forEach { it.accept(this) } + file.importList.accept(this) file.declarationList.forEach { it.accept(this) } } @@ -188,6 +188,10 @@ class NewCodeBuilder { printer.printlnWithNoIndent(packageNameEscaped) } + override fun visitImportListRaw(importList: JKImportList) { + importList.imports.forEach { it.accept(this) } + } + override fun visitImportStatementRaw(importStatement: JKImportStatement) { printer.printWithNoIndent("import ") val importNameEscaped = diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/FilterImportsConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/FilterImportsConversion.kt index 34867594ca0..4c0bf39dcc3 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/FilterImportsConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/FilterImportsConversion.kt @@ -6,16 +6,16 @@ package org.jetbrains.kotlin.nj2k.conversions import org.jetbrains.kotlin.nj2k.ImportStorage -import org.jetbrains.kotlin.nj2k.tree.JKFile +import org.jetbrains.kotlin.nj2k.tree.JKImportList import org.jetbrains.kotlin.nj2k.tree.JKTreeElement class FilterImportsConversion : RecursiveApplicableConversionBase() { override fun applyToElement(element: JKTreeElement): JKTreeElement { - if (element is JKFile) { - for (import in element.importList) { + if (element is JKImportList) { + for (import in element.imports) { if (!ImportStorage.isImportNeeded(import.name.value)) { - element.importList -= import + element.imports -= import } } } diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/jk.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/jk.kt index 640a814840e..27558ad1fcb 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/jk.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/jk.kt @@ -36,14 +36,14 @@ class JKTreeRootImpl(element: JKTreeElement) : JKTreeRoot, JKBranchElementBase() class JKFileImpl( packageDeclaration: JKPackageDeclaration, - importList: List, + importList: JKImportList, declarationList: List ) : JKFile, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitFile(this, data) override var packageDeclaration: JKPackageDeclaration by child(packageDeclaration) - override var importList: List by children(importList) + override var importList: JKImportList by child(importList) override var declarationList by children(declarationList) } @@ -573,6 +573,12 @@ class JKImportStatementImpl(name: JKNameIdentifier) : JKImportStatement, JKBranc override var rightNonCodeElements: List = listOf(JKSpaceElementImpl("\n")) } +class JKImportListImpl(imports: List) : JKImportList, JKBranchElementBase() { + override var imports by children(imports) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitImportList(this, data) +} + + class JKAnnotationParameterImpl(value: JKAnnotationMemberValue) : JKAnnotationParameter, JKBranchElementBase() { override var value: JKAnnotationMemberValue by child(value) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/jk.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/jk.kt index 4ca9da20301..cf78d8b1853 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/jk.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/jk.kt @@ -48,9 +48,13 @@ interface JKImportStatement : JKTreeElement { val name: JKNameIdentifier } +interface JKImportList : JKTreeElement { + var imports: List +} + interface JKFile : JKTreeElement, JKBranchElement { var packageDeclaration: JKPackageDeclaration - var importList: List + var importList: JKImportList var declarationList: List } diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt index 2f4a70566f8..0cd854570e1 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt @@ -7,6 +7,7 @@ interface JKVisitor { fun visitTreeRoot(treeRoot: JKTreeRoot, data: D): R = visitTreeElement(treeRoot, data) fun visitDeclaration(declaration: JKDeclaration, data: D): R = visitTreeElement(declaration, data) fun visitImportStatement(importStatement: JKImportStatement, data: D): R = visitTreeElement(importStatement, data) + fun visitImportList(importList: JKImportList, data: D): R = visitTreeElement(importList, data) fun visitFile(file: JKFile, data: D): R = visitTreeElement(file, data) fun visitClass(klass: JKClass, data: D): R = visitDeclaration(klass, data) fun visitInheritanceInfo(inheritanceInfo: JKInheritanceInfo, data: D): R = visitTreeElement(inheritanceInfo, data) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorVoid.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorVoid.kt index 99abbb802c4..5791bc0fa3b 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorVoid.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorVoid.kt @@ -11,6 +11,8 @@ interface JKVisitorVoid : JKVisitor { override fun visitDeclaration(declaration: JKDeclaration, data: Nothing?) = visitDeclaration(declaration) fun visitImportStatement(importStatement: JKImportStatement) = visitTreeElement(importStatement, null) override fun visitImportStatement(importStatement: JKImportStatement, data: Nothing?) = visitImportStatement(importStatement) + fun visitImportList(importList: JKImportList) = visitTreeElement(importList, null) + override fun visitImportList(importList: JKImportList, data: Nothing?) = visitImportList(importList) fun visitFile(file: JKFile) = visitTreeElement(file, null) override fun visitFile(file: JKFile, data: Nothing?) = visitFile(file) fun visitClass(klass: JKClass) = visitDeclaration(klass, null) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt index 608a509e6f9..ef4842b8105 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt @@ -38,6 +38,14 @@ interface JKVisitorWithCommentsPrinting : JKVisitorVoid { fun visitImportStatementRaw(importStatement: JKImportStatement) = visitTreeElementRaw(importStatement) + override fun visitImportList(importList: JKImportList) { + printLeftNonCodeElements(importList) + visitImportListRaw(importList) + printRightNonCodeElements(importList) + } + + fun visitImportListRaw(importList: JKImportList) = visitTreeElementRaw(importList) + override fun visitFile(file: JKFile) { printLeftNonCodeElements(file) visitFileRaw(file)