Add test infrastructure for completion in mpp
Allow to specify specific expected module in test data for completion items
This commit is contained in:
+52
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.completion.test
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.completion.CodeCompletionHandlerBase
|
||||||
|
import com.intellij.codeInsight.lookup.LookupManager
|
||||||
|
import com.intellij.codeInsight.lookup.impl.LookupImpl
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import com.intellij.openapi.editor.EditorFactory
|
||||||
|
import com.intellij.psi.PsiDocumentManager
|
||||||
|
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil
|
||||||
|
import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure
|
||||||
|
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
|
||||||
|
import org.jetbrains.kotlin.idea.test.extractMarkerOffset
|
||||||
|
import org.jetbrains.kotlin.idea.test.findFileWithCaret
|
||||||
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
abstract class AbstractMultiPlatformCompletionTest : AbstractMultiModuleTest() {
|
||||||
|
protected fun doTest(testPath: String) {
|
||||||
|
setupMppProjectFromDirStructure(File(testPath))
|
||||||
|
val file = project.findFileWithCaret()
|
||||||
|
val doc = PsiDocumentManager.getInstance(myProject).getDocument(file)!!
|
||||||
|
val offset = doc.extractMarkerOffset(project)
|
||||||
|
val editor = EditorFactory.getInstance().createEditor(doc, myProject)!!
|
||||||
|
editor.caretModel.moveToOffset(offset)
|
||||||
|
try {
|
||||||
|
testCompletion(file, editor)
|
||||||
|
} finally {
|
||||||
|
EditorFactory.getInstance().releaseEditor(editor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun testCompletion(file: KtFile, editor: Editor) {
|
||||||
|
testCompletion(file.text, null, { completionType, invocationCount ->
|
||||||
|
CodeCompletionHandlerBase(completionType).invokeCompletion(
|
||||||
|
myProject, InjectedLanguageUtil
|
||||||
|
.getEditorForInjectedLanguageNoCommit(editor, file), invocationCount
|
||||||
|
)
|
||||||
|
|
||||||
|
val lookup = LookupManager.getActiveLookup(editor) as LookupImpl
|
||||||
|
lookup.items?.toTypedArray()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getTestDataPath(): String {
|
||||||
|
return COMPLETION_TEST_DATA_BASE_PATH + "/smartMultiFile/" + getTestName(false) + "/"
|
||||||
|
}
|
||||||
|
}
|
||||||
+15
-1
@@ -27,7 +27,9 @@ import com.intellij.codeInsight.lookup.LookupElementPresentation
|
|||||||
import com.intellij.codeInsight.lookup.impl.LookupCellRenderer
|
import com.intellij.codeInsight.lookup.impl.LookupCellRenderer
|
||||||
import com.intellij.ui.JBColor
|
import com.intellij.ui.JBColor
|
||||||
import com.intellij.util.ArrayUtil
|
import com.intellij.util.ArrayUtil
|
||||||
|
import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject
|
||||||
import org.jetbrains.kotlin.idea.test.AstAccessControl
|
import org.jetbrains.kotlin.idea.test.AstAccessControl
|
||||||
|
import org.jetbrains.kotlin.idea.util.module
|
||||||
import org.jetbrains.kotlin.js.resolve.JsPlatform
|
import org.jetbrains.kotlin.js.resolve.JsPlatform
|
||||||
import org.jetbrains.kotlin.resolve.TargetPlatform
|
import org.jetbrains.kotlin.resolve.TargetPlatform
|
||||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||||
@@ -88,7 +90,11 @@ object ExpectedCompletionUtils {
|
|||||||
val PRESENTATION_TYPE_TEXT: String = "typeText"
|
val PRESENTATION_TYPE_TEXT: String = "typeText"
|
||||||
val PRESENTATION_TAIL_TEXT: String = "tailText"
|
val PRESENTATION_TAIL_TEXT: String = "tailText"
|
||||||
val PRESENTATION_TEXT_ATTRIBUTES: String = "attributes"
|
val PRESENTATION_TEXT_ATTRIBUTES: String = "attributes"
|
||||||
val validKeys: Set<String> = setOf(LOOKUP_STRING, ALL_LOOKUP_STRINGS, PRESENTATION_ITEM_TEXT, PRESENTATION_TYPE_TEXT, PRESENTATION_TAIL_TEXT, PRESENTATION_TEXT_ATTRIBUTES)
|
val MODULE_NAME: String = "module"
|
||||||
|
val validKeys: Set<String> = setOf(
|
||||||
|
LOOKUP_STRING, ALL_LOOKUP_STRINGS, PRESENTATION_ITEM_TEXT, PRESENTATION_TYPE_TEXT,
|
||||||
|
PRESENTATION_TAIL_TEXT, PRESENTATION_TEXT_ATTRIBUTES, MODULE_NAME
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,12 +321,20 @@ object ExpectedCompletionUtils {
|
|||||||
if (presentation.tailText != null) {
|
if (presentation.tailText != null) {
|
||||||
map.put(CompletionProposal.PRESENTATION_TAIL_TEXT, presentation.tailText)
|
map.put(CompletionProposal.PRESENTATION_TAIL_TEXT, presentation.tailText)
|
||||||
}
|
}
|
||||||
|
item.moduleName?.let {
|
||||||
|
map.put(CompletionProposal.MODULE_NAME, it)
|
||||||
|
}
|
||||||
|
|
||||||
result.add(ExpectedCompletionUtils.CompletionProposal(map))
|
result.add(ExpectedCompletionUtils.CompletionProposal(map))
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val LookupElement.moduleName: String?
|
||||||
|
get() {
|
||||||
|
return (`object` as? DeclarationLookupObject)?.psiElement?.module?.name
|
||||||
|
}
|
||||||
|
|
||||||
private fun textAttributes(presentation: LookupElementPresentation): String {
|
private fun textAttributes(presentation: LookupElementPresentation): String {
|
||||||
return buildString {
|
return buildString {
|
||||||
if (presentation.isItemTextBold) {
|
if (presentation.isItemTextBold) {
|
||||||
|
|||||||
+4
@@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.openapi.startup.StartupManager
|
import com.intellij.openapi.startup.StartupManager
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
import com.intellij.openapi.util.io.FileUtil
|
||||||
import com.intellij.openapi.util.text.StringUtil
|
import com.intellij.openapi.util.text.StringUtil
|
||||||
|
import com.intellij.openapi.vfs.VfsUtilCore
|
||||||
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess
|
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
import com.intellij.psi.search.FileTypeIndex
|
import com.intellij.psi.search.FileTypeIndex
|
||||||
@@ -201,3 +202,6 @@ fun Project.allKotlinFiles(): List<KtFile> {
|
|||||||
.map { PsiManager.getInstance(this).findFile(it) }
|
.map { PsiManager.getInstance(this).findFile(it) }
|
||||||
.filterIsInstance<KtFile>()
|
.filterIsInstance<KtFile>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Project.findFileWithCaret() =
|
||||||
|
allKotlinFiles().single { "<caret>" in VfsUtilCore.loadText(it.virtualFile) }
|
||||||
|
|||||||
+2
-6
@@ -9,15 +9,14 @@ import com.intellij.codeInsight.navigation.GotoTargetHandler
|
|||||||
import com.intellij.codeInsight.navigation.NavigationUtil
|
import com.intellij.codeInsight.navigation.NavigationUtil
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.editor.EditorFactory
|
import com.intellij.openapi.editor.EditorFactory
|
||||||
import com.intellij.openapi.vfs.VfsUtilCore
|
|
||||||
import com.intellij.psi.PsiDocumentManager
|
import com.intellij.psi.PsiDocumentManager
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.GotoSuperActionHandler
|
import org.jetbrains.kotlin.idea.codeInsight.GotoSuperActionHandler
|
||||||
import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure
|
import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure
|
||||||
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
|
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
|
||||||
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||||
import org.jetbrains.kotlin.idea.test.allKotlinFiles
|
|
||||||
import org.jetbrains.kotlin.idea.test.extractMarkerOffset
|
import org.jetbrains.kotlin.idea.test.extractMarkerOffset
|
||||||
|
import org.jetbrains.kotlin.idea.test.findFileWithCaret
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest() {
|
abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest() {
|
||||||
@@ -25,7 +24,7 @@ abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest
|
|||||||
|
|
||||||
protected fun doTest(testDataDir: String) {
|
protected fun doTest(testDataDir: String) {
|
||||||
setupMppProjectFromDirStructure(File(testDataDir))
|
setupMppProjectFromDirStructure(File(testDataDir))
|
||||||
val file = findFileWithCaret()
|
val file = project.findFileWithCaret()
|
||||||
val doc = PsiDocumentManager.getInstance(myProject).getDocument(file)!!
|
val doc = PsiDocumentManager.getInstance(myProject).getDocument(file)!!
|
||||||
val offset = doc.extractMarkerOffset(project, "<caret>")
|
val offset = doc.extractMarkerOffset(project, "<caret>")
|
||||||
val editor = EditorFactory.getInstance().createEditor(doc, myProject)
|
val editor = EditorFactory.getInstance().createEditor(doc, myProject)
|
||||||
@@ -37,9 +36,6 @@ abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest
|
|||||||
EditorFactory.getInstance().releaseEditor(editor)
|
EditorFactory.getInstance().releaseEditor(editor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findFileWithCaret() =
|
|
||||||
project.allKotlinFiles().single { "<caret>" in VfsUtilCore.loadText(it.virtualFile) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user