Fix exception in imports folding when there're two imports lists (KT-29455)

Probably caused by modifications of the recovery for import lists
https://github.com/JetBrains/kotlin/commit/65e6e21d0f3017417ecb786a63d5209c546dd744

 #KT-29455 Fixed
This commit is contained in:
Nikolay Krasko
2019-01-23 18:02:57 +03:00
parent 92a50b2880
commit ed5051a5e3
3 changed files with 27 additions and 10 deletions
@@ -35,8 +35,10 @@ import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtFunctionLiteral
import org.jetbrains.kotlin.psi.KtImportList
import org.jetbrains.kotlin.psi.psiUtil.allChildren import org.jetbrains.kotlin.psi.psiUtil.allChildren
import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.referenceExpression import org.jetbrains.kotlin.psi.psiUtil.referenceExpression
@@ -66,17 +68,19 @@ class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware {
if (root !is KtFile) { if (root !is KtFile) {
return return
} }
val imports = root.importDirectives
if (imports.size > 1) {
val importKeyword = imports[0].firstChild
val startOffset = importKeyword.endOffset + 1
val importList = root.importList val importList = root.importList
if (importList != null) { if (importList != null) {
val firstImport = importList.imports.firstOrNull()
if (firstImport != null && importList.imports.size > 1) {
val importKeyword = firstImport.firstChild
val startOffset = importKeyword.endOffset + 1
val endOffset = importList.endOffset val endOffset = importList.endOffset
val range = TextRange(startOffset, endOffset) descriptors.add(FoldingDescriptor(importList, TextRange(startOffset, endOffset)).apply {
descriptors.add(FoldingDescriptor(importList, range).apply { setCanBeRemovedWhenCollapsed(true) }) setCanBeRemovedWhenCollapsed(true)
})
} }
} }
@@ -0,0 +1,8 @@
// An empty import list in PSI
inline fun foo() {}
// Another import list in PSI
import a.foo
import a.inlineOnly
fun box(): String {}
@@ -109,6 +109,11 @@ public class KotlinFoldingTestGenerated extends AbstractKotlinFoldingTest {
runTest("idea/testData/folding/checkCollapse/customRegionsNotFullBlock.kt"); runTest("idea/testData/folding/checkCollapse/customRegionsNotFullBlock.kt");
} }
@TestMetadata("doubleImportListsError.kt")
public void testDoubleImportListsError() throws Exception {
runTest("idea/testData/folding/checkCollapse/doubleImportListsError.kt");
}
@TestMetadata("functionLiteral.kt") @TestMetadata("functionLiteral.kt")
public void testFunctionLiteral() throws Exception { public void testFunctionLiteral() throws Exception {
runTest("idea/testData/folding/checkCollapse/functionLiteral.kt"); runTest("idea/testData/folding/checkCollapse/functionLiteral.kt");