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.ui.JBColor
|
||||
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.util.module
|
||||
import org.jetbrains.kotlin.js.resolve.JsPlatform
|
||||
import org.jetbrains.kotlin.resolve.TargetPlatform
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
@@ -88,7 +90,11 @@ object ExpectedCompletionUtils {
|
||||
val PRESENTATION_TYPE_TEXT: String = "typeText"
|
||||
val PRESENTATION_TAIL_TEXT: String = "tailText"
|
||||
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) {
|
||||
map.put(CompletionProposal.PRESENTATION_TAIL_TEXT, presentation.tailText)
|
||||
}
|
||||
item.moduleName?.let {
|
||||
map.put(CompletionProposal.MODULE_NAME, it)
|
||||
}
|
||||
|
||||
result.add(ExpectedCompletionUtils.CompletionProposal(map))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
private val LookupElement.moduleName: String?
|
||||
get() {
|
||||
return (`object` as? DeclarationLookupObject)?.psiElement?.module?.name
|
||||
}
|
||||
|
||||
private fun textAttributes(presentation: LookupElementPresentation): String {
|
||||
return buildString {
|
||||
if (presentation.isItemTextBold) {
|
||||
|
||||
+4
@@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.startup.StartupManager
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import com.intellij.openapi.vfs.VfsUtilCore
|
||||
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess
|
||||
import com.intellij.psi.PsiManager
|
||||
import com.intellij.psi.search.FileTypeIndex
|
||||
@@ -201,3 +202,6 @@ fun Project.allKotlinFiles(): List<KtFile> {
|
||||
.map { PsiManager.getInstance(this).findFile(it) }
|
||||
.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.openapi.editor.Editor
|
||||
import com.intellij.openapi.editor.EditorFactory
|
||||
import com.intellij.openapi.vfs.VfsUtilCore
|
||||
import com.intellij.psi.PsiDocumentManager
|
||||
import com.intellij.psi.PsiFile
|
||||
import org.jetbrains.kotlin.idea.codeInsight.GotoSuperActionHandler
|
||||
import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure
|
||||
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
|
||||
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.findFileWithCaret
|
||||
import java.io.File
|
||||
|
||||
abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest() {
|
||||
@@ -25,7 +24,7 @@ abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest
|
||||
|
||||
protected fun doTest(testDataDir: String) {
|
||||
setupMppProjectFromDirStructure(File(testDataDir))
|
||||
val file = findFileWithCaret()
|
||||
val file = project.findFileWithCaret()
|
||||
val doc = PsiDocumentManager.getInstance(myProject).getDocument(file)!!
|
||||
val offset = doc.extractMarkerOffset(project, "<caret>")
|
||||
val editor = EditorFactory.getInstance().createEditor(doc, myProject)
|
||||
@@ -37,9 +36,6 @@ abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest
|
||||
EditorFactory.getInstance().releaseEditor(editor)
|
||||
}
|
||||
}
|
||||
|
||||
private fun findFileWithCaret() =
|
||||
project.allKotlinFiles().single { "<caret>" in VfsUtilCore.loadText(it.virtualFile) }
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user