Disable completion binding context caching by default
Now it opt-in in internal mode, due duplication problems #KT-19191 fixed
This commit is contained in:
+11
@@ -58,6 +58,8 @@ class CompletionBindingContextProvider(project: Project) {
|
||||
companion object {
|
||||
fun getInstance(project: Project): CompletionBindingContextProvider
|
||||
= project.getComponent(CompletionBindingContextProvider::class.java)
|
||||
|
||||
var ENABLED = false
|
||||
}
|
||||
|
||||
private class CompletionData(
|
||||
@@ -86,6 +88,15 @@ class CompletionBindingContextProvider(project: Project) {
|
||||
|
||||
|
||||
fun getBindingContext(position: PsiElement, resolutionFacade: ResolutionFacade): BindingContext {
|
||||
return if (ENABLED) {
|
||||
_getBindingContext(position, resolutionFacade)
|
||||
}
|
||||
else {
|
||||
resolutionFacade.analyze(position.parentsWithSelf.firstIsInstance<KtElement>(), BodyResolveMode.PARTIAL_FOR_COMPLETION)
|
||||
}
|
||||
}
|
||||
|
||||
private fun _getBindingContext(position: PsiElement, resolutionFacade: ResolutionFacade): BindingContext {
|
||||
assert(!position.isPhysical) // position is in synthetic file
|
||||
|
||||
val inStatement = position.findStatementInBlock()
|
||||
|
||||
+54
-49
@@ -37,64 +37,69 @@ abstract class AbstractCompletionIncrementalResolveTest : KotlinLightCodeInsight
|
||||
override fun getProjectDescriptor() = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
|
||||
|
||||
protected fun doTest(testPath: String) {
|
||||
val file = File(testPath)
|
||||
val hasCaretMarker = FileUtil.loadFile(file, true).contains("<caret>")
|
||||
myFixture.configureByFile(testPath)
|
||||
CompletionBindingContextProvider.ENABLED = true
|
||||
try {
|
||||
val file = File(testPath)
|
||||
val hasCaretMarker = FileUtil.loadFile(file, true).contains("<caret>")
|
||||
myFixture.configureByFile(testPath)
|
||||
|
||||
val document = myFixture.editor.document
|
||||
val beforeMarkerOffset = document.text.indexOf(BEFORE_MARKER)
|
||||
assertTrue("\"$BEFORE_MARKER\" is missing in file \"$testPath\"", beforeMarkerOffset >= 0)
|
||||
val document = myFixture.editor.document
|
||||
val beforeMarkerOffset = document.text.indexOf(BEFORE_MARKER)
|
||||
assertTrue("\"$BEFORE_MARKER\" is missing in file \"$testPath\"", beforeMarkerOffset >= 0)
|
||||
|
||||
val changeMarkerOffset = document.text.indexOf(CHANGE_MARKER)
|
||||
assertTrue("\"$CHANGE_MARKER\" is missing in file \"$testPath\"", changeMarkerOffset >= 0)
|
||||
val changeMarkerOffset = document.text.indexOf(CHANGE_MARKER)
|
||||
assertTrue("\"$CHANGE_MARKER\" is missing in file \"$testPath\"", changeMarkerOffset >= 0)
|
||||
|
||||
val textToType = InTextDirectivesUtils.findArrayWithPrefixes(document.text, TYPE_DIRECTIVE_PREFIX).singleOrNull()
|
||||
?.let { StringUtil.unquoteString(it) }
|
||||
val backspaceCount = InTextDirectivesUtils.getPrefixedInt(document.text, BACKSPACES_DIRECTIVE_PREFIX)
|
||||
assertTrue("At least one of \"$TYPE_DIRECTIVE_PREFIX\" and \"$BACKSPACES_DIRECTIVE_PREFIX\" should be defined",
|
||||
textToType != null || backspaceCount != null)
|
||||
val textToType = InTextDirectivesUtils.findArrayWithPrefixes(document.text, TYPE_DIRECTIVE_PREFIX).singleOrNull()
|
||||
?.let { StringUtil.unquoteString(it) }
|
||||
val backspaceCount = InTextDirectivesUtils.getPrefixedInt(document.text, BACKSPACES_DIRECTIVE_PREFIX)
|
||||
assertTrue("At least one of \"$TYPE_DIRECTIVE_PREFIX\" and \"$BACKSPACES_DIRECTIVE_PREFIX\" should be defined",
|
||||
textToType != null || backspaceCount != null)
|
||||
|
||||
val beforeMarker = document.createRangeMarker(beforeMarkerOffset, beforeMarkerOffset + BEFORE_MARKER.length)
|
||||
val changeMarker = document.createRangeMarker(changeMarkerOffset, changeMarkerOffset + CHANGE_MARKER.length)
|
||||
changeMarker.isGreedyToRight = true
|
||||
val beforeMarker = document.createRangeMarker(beforeMarkerOffset, beforeMarkerOffset + BEFORE_MARKER.length)
|
||||
val changeMarker = document.createRangeMarker(changeMarkerOffset, changeMarkerOffset + CHANGE_MARKER.length)
|
||||
changeMarker.isGreedyToRight = true
|
||||
|
||||
project.executeWriteCommand("") {
|
||||
document.deleteString(beforeMarker.startOffset, beforeMarker.endOffset)
|
||||
document.deleteString(changeMarker.startOffset, changeMarker.endOffset)
|
||||
}
|
||||
|
||||
val caretMarker = if (hasCaretMarker)
|
||||
document.createRangeMarker(editor.caretModel.offset, editor.caretModel.offset)
|
||||
else
|
||||
null
|
||||
editor.caretModel.moveToOffset(beforeMarker.startOffset)
|
||||
|
||||
val testLog = StringBuilder()
|
||||
CompletionBindingContextProvider.getInstance(project).TEST_LOG = testLog
|
||||
|
||||
myFixture.complete(CompletionType.BASIC)
|
||||
|
||||
project.executeWriteCommand("") {
|
||||
if (backspaceCount != null) {
|
||||
document.deleteString(changeMarker.startOffset - backspaceCount, changeMarker.startOffset)
|
||||
project.executeWriteCommand("") {
|
||||
document.deleteString(beforeMarker.startOffset, beforeMarker.endOffset)
|
||||
document.deleteString(changeMarker.startOffset, changeMarker.endOffset)
|
||||
}
|
||||
if (textToType != null) {
|
||||
document.insertString(changeMarker.startOffset, textToType)
|
||||
|
||||
val caretMarker = if (hasCaretMarker)
|
||||
document.createRangeMarker(editor.caretModel.offset, editor.caretModel.offset)
|
||||
else
|
||||
null
|
||||
editor.caretModel.moveToOffset(beforeMarker.startOffset)
|
||||
|
||||
val testLog = StringBuilder()
|
||||
CompletionBindingContextProvider.getInstance(project).TEST_LOG = testLog
|
||||
|
||||
myFixture.complete(CompletionType.BASIC)
|
||||
|
||||
project.executeWriteCommand("") {
|
||||
if (backspaceCount != null) {
|
||||
document.deleteString(changeMarker.startOffset - backspaceCount, changeMarker.startOffset)
|
||||
}
|
||||
if (textToType != null) {
|
||||
document.insertString(changeMarker.startOffset, textToType)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (caretMarker != null) {
|
||||
editor.caretModel.moveToOffset(caretMarker.startOffset)
|
||||
}
|
||||
else {
|
||||
editor.caretModel.moveToOffset(changeMarker.endOffset)
|
||||
}
|
||||
if (caretMarker != null) {
|
||||
editor.caretModel.moveToOffset(caretMarker.startOffset)
|
||||
}
|
||||
else {
|
||||
editor.caretModel.moveToOffset(changeMarker.endOffset)
|
||||
}
|
||||
|
||||
testCompletion(FileUtil.loadFile(file, true),
|
||||
JvmPlatform,
|
||||
{ completionType, count -> myFixture.complete(completionType, count) },
|
||||
additionalValidDirectives = listOf(TYPE_DIRECTIVE_PREFIX, BACKSPACES_DIRECTIVE_PREFIX))
|
||||
testCompletion(FileUtil.loadFile(file, true),
|
||||
JvmPlatform,
|
||||
{ completionType, count -> myFixture.complete(completionType, count) },
|
||||
additionalValidDirectives = listOf(TYPE_DIRECTIVE_PREFIX, BACKSPACES_DIRECTIVE_PREFIX))
|
||||
|
||||
KotlinTestUtils.assertEqualsToFile(File(file.parent, file.nameWithoutExtension + ".log"), testLog.toString())
|
||||
KotlinTestUtils.assertEqualsToFile(File(file.parent, file.nameWithoutExtension + ".log"), testLog.toString())
|
||||
} finally {
|
||||
CompletionBindingContextProvider.ENABLED = false
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user