Skip to content

Commit fa88fb7

Browse files
committed
Disable completion binding context caching by default
Now it opt-in in internal mode, due duplication problems #KT-19191 fixed
1 parent 094125c commit fa88fb7

File tree

4 files changed

+106
-51
lines changed

4 files changed

+106
-51
lines changed

idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionBindingContextProvider.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ class CompletionBindingContextProvider(project: Project) {
5858
companion object {
5959
fun getInstance(project: Project): CompletionBindingContextProvider
6060
= project.getComponent(CompletionBindingContextProvider::class.java)
61+
62+
var ENABLED = false
6163
}
6264

6365
private class CompletionData(
@@ -86,6 +88,15 @@ class CompletionBindingContextProvider(project: Project) {
8688

8789

8890
fun getBindingContext(position: PsiElement, resolutionFacade: ResolutionFacade): BindingContext {
91+
return if (ENABLED) {
92+
_getBindingContext(position, resolutionFacade)
93+
}
94+
else {
95+
resolutionFacade.analyze(position.parentsWithSelf.firstIsInstance<KtElement>(), BodyResolveMode.PARTIAL_FOR_COMPLETION)
96+
}
97+
}
98+
99+
private fun _getBindingContext(position: PsiElement, resolutionFacade: ResolutionFacade): BindingContext {
89100
assert(!position.isPhysical) // position is in synthetic file
90101

91102
val inStatement = position.findStatementInBlock()

idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/AbstractCompletionIncrementalResolveTest.kt

Lines changed: 56 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -37,64 +37,69 @@ abstract class AbstractCompletionIncrementalResolveTest : KotlinLightCodeInsight
3737
override fun getProjectDescriptor() = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
3838

3939
protected fun doTest(testPath: String) {
40-
val file = File(testPath)
41-
val hasCaretMarker = FileUtil.loadFile(file, true).contains("<caret>")
42-
myFixture.configureByFile(testPath)
43-
44-
val document = myFixture.editor.document
45-
val beforeMarkerOffset = document.text.indexOf(BEFORE_MARKER)
46-
assertTrue("\"$BEFORE_MARKER\" is missing in file \"$testPath\"", beforeMarkerOffset >= 0)
47-
48-
val changeMarkerOffset = document.text.indexOf(CHANGE_MARKER)
49-
assertTrue("\"$CHANGE_MARKER\" is missing in file \"$testPath\"", changeMarkerOffset >= 0)
50-
51-
val textToType = InTextDirectivesUtils.findArrayWithPrefixes(document.text, TYPE_DIRECTIVE_PREFIX).singleOrNull()
52-
?.let { StringUtil.unquoteString(it) }
53-
val backspaceCount = InTextDirectivesUtils.getPrefixedInt(document.text, BACKSPACES_DIRECTIVE_PREFIX)
54-
assertTrue("At least one of \"$TYPE_DIRECTIVE_PREFIX\" and \"$BACKSPACES_DIRECTIVE_PREFIX\" should be defined",
55-
textToType != null || backspaceCount != null)
56-
57-
val beforeMarker = document.createRangeMarker(beforeMarkerOffset, beforeMarkerOffset + BEFORE_MARKER.length)
58-
val changeMarker = document.createRangeMarker(changeMarkerOffset, changeMarkerOffset + CHANGE_MARKER.length)
59-
changeMarker.isGreedyToRight = true
60-
61-
project.executeWriteCommand("") {
62-
document.deleteString(beforeMarker.startOffset, beforeMarker.endOffset)
63-
document.deleteString(changeMarker.startOffset, changeMarker.endOffset)
64-
}
40+
CompletionBindingContextProvider.ENABLED = true
41+
try {
42+
val file = File(testPath)
43+
val hasCaretMarker = FileUtil.loadFile(file, true).contains("<caret>")
44+
myFixture.configureByFile(testPath)
45+
46+
val document = myFixture.editor.document
47+
val beforeMarkerOffset = document.text.indexOf(BEFORE_MARKER)
48+
assertTrue("\"$BEFORE_MARKER\" is missing in file \"$testPath\"", beforeMarkerOffset >= 0)
49+
50+
val changeMarkerOffset = document.text.indexOf(CHANGE_MARKER)
51+
assertTrue("\"$CHANGE_MARKER\" is missing in file \"$testPath\"", changeMarkerOffset >= 0)
52+
53+
val textToType = InTextDirectivesUtils.findArrayWithPrefixes(document.text, TYPE_DIRECTIVE_PREFIX).singleOrNull()
54+
?.let { StringUtil.unquoteString(it) }
55+
val backspaceCount = InTextDirectivesUtils.getPrefixedInt(document.text, BACKSPACES_DIRECTIVE_PREFIX)
56+
assertTrue("At least one of \"$TYPE_DIRECTIVE_PREFIX\" and \"$BACKSPACES_DIRECTIVE_PREFIX\" should be defined",
57+
textToType != null || backspaceCount != null)
58+
59+
val beforeMarker = document.createRangeMarker(beforeMarkerOffset, beforeMarkerOffset + BEFORE_MARKER.length)
60+
val changeMarker = document.createRangeMarker(changeMarkerOffset, changeMarkerOffset + CHANGE_MARKER.length)
61+
changeMarker.isGreedyToRight = true
62+
63+
project.executeWriteCommand("") {
64+
document.deleteString(beforeMarker.startOffset, beforeMarker.endOffset)
65+
document.deleteString(changeMarker.startOffset, changeMarker.endOffset)
66+
}
6567

66-
val caretMarker = if (hasCaretMarker)
67-
document.createRangeMarker(editor.caretModel.offset, editor.caretModel.offset)
68-
else
69-
null
70-
editor.caretModel.moveToOffset(beforeMarker.startOffset)
68+
val caretMarker = if (hasCaretMarker)
69+
document.createRangeMarker(editor.caretModel.offset, editor.caretModel.offset)
70+
else
71+
null
72+
editor.caretModel.moveToOffset(beforeMarker.startOffset)
7173

72-
val testLog = StringBuilder()
73-
CompletionBindingContextProvider.getInstance(project).TEST_LOG = testLog
74+
val testLog = StringBuilder()
75+
CompletionBindingContextProvider.getInstance(project).TEST_LOG = testLog
7476

75-
myFixture.complete(CompletionType.BASIC)
77+
myFixture.complete(CompletionType.BASIC)
7678

77-
project.executeWriteCommand("") {
78-
if (backspaceCount != null) {
79-
document.deleteString(changeMarker.startOffset - backspaceCount, changeMarker.startOffset)
80-
}
81-
if (textToType != null) {
82-
document.insertString(changeMarker.startOffset, textToType)
79+
project.executeWriteCommand("") {
80+
if (backspaceCount != null) {
81+
document.deleteString(changeMarker.startOffset - backspaceCount, changeMarker.startOffset)
82+
}
83+
if (textToType != null) {
84+
document.insertString(changeMarker.startOffset, textToType)
85+
}
8386
}
84-
}
8587

86-
if (caretMarker != null) {
87-
editor.caretModel.moveToOffset(caretMarker.startOffset)
88-
}
89-
else {
90-
editor.caretModel.moveToOffset(changeMarker.endOffset)
91-
}
88+
if (caretMarker != null) {
89+
editor.caretModel.moveToOffset(caretMarker.startOffset)
90+
}
91+
else {
92+
editor.caretModel.moveToOffset(changeMarker.endOffset)
93+
}
9294

93-
testCompletion(FileUtil.loadFile(file, true),
94-
JvmPlatform,
95-
{ completionType, count -> myFixture.complete(completionType, count) },
96-
additionalValidDirectives = listOf(TYPE_DIRECTIVE_PREFIX, BACKSPACES_DIRECTIVE_PREFIX))
95+
testCompletion(FileUtil.loadFile(file, true),
96+
JvmPlatform,
97+
{ completionType, count -> myFixture.complete(completionType, count) },
98+
additionalValidDirectives = listOf(TYPE_DIRECTIVE_PREFIX, BACKSPACES_DIRECTIVE_PREFIX))
9799

98-
KotlinTestUtils.assertEqualsToFile(File(file.parent, file.nameWithoutExtension + ".log"), testLog.toString())
100+
KotlinTestUtils.assertEqualsToFile(File(file.parent, file.nameWithoutExtension + ".log"), testLog.toString())
101+
} finally {
102+
CompletionBindingContextProvider.ENABLED = false
103+
}
99104
}
100105
}

idea/src/META-INF/plugin.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@
146146
text="Local scenario"/>
147147
</group>
148148

149+
<action id="CompletionBindingContextCachingToggleAction"
150+
class="org.jetbrains.kotlin.idea.actions.internal.CompletionBindingContextCachingToggleAction"
151+
text="Enable completion binding context caching"/>
152+
149153
<action id="CheckComponentsUsageSearchAction" class="org.jetbrains.kotlin.idea.actions.internal.CheckComponentsUsageSearchAction"
150154
text="Check Component Functions Usage Search"/>
151155

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright 2010-2017 JetBrains s.r.o.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.jetbrains.kotlin.idea.actions.internal
18+
19+
import com.intellij.openapi.actionSystem.AnActionEvent
20+
import com.intellij.openapi.actionSystem.ToggleAction
21+
import org.jetbrains.kotlin.idea.completion.CompletionBindingContextProvider
22+
23+
class CompletionBindingContextCachingToggleAction : ToggleAction() {
24+
override fun isSelected(e: AnActionEvent?): Boolean =
25+
CompletionBindingContextProvider.ENABLED
26+
27+
28+
override fun setSelected(e: AnActionEvent?, state: Boolean) {
29+
CompletionBindingContextProvider.ENABLED = state
30+
}
31+
32+
override fun update(e: AnActionEvent) {
33+
e.presentation.isEnabledAndVisible = KotlinInternalMode.enabled
34+
}
35+
}

0 commit comments

Comments
 (0)