Code Insight: Suppress file reference completion on typing. Disable file references on string literals with escape sequences

This commit is contained in:
Alexey Sedunov
2016-05-13 16:41:31 +03:00
parent edb3fd8f00
commit 29310b5ca8
2 changed files with 23 additions and 3 deletions
+1 -1
View File
@@ -42,7 +42,7 @@
<orderEntry type="module" module-name="android-extensions-compiler" scope="TEST" />
<orderEntry type="module" module-name="android-extensions-idea" scope="TEST" />
<orderEntry type="library" name="markdown" level="project" />
<orderEntry type="module" module-name="idea-completion" scope="TEST" />
<orderEntry type="module" module-name="idea-completion" />
<orderEntry type="module" module-name="idea-test-framework" scope="TEST" />
<orderEntry type="module" module-name="js.serializer" />
<orderEntry type="module" module-name="daemon-client" />
@@ -16,23 +16,43 @@
package org.jetbrains.kotlin.idea.references
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.patterns.PlatformPatterns
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReference
import com.intellij.psi.PsiReferenceRegistrar
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FilePathReferenceProvider
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference
import com.intellij.util.ProcessingContext
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
import org.jetbrains.kotlin.psi.psiUtil.getContentRange
import org.jetbrains.kotlin.psi.psiUtil.isPlainWithEscapes
import org.jetbrains.kotlin.psi.psiUtil.isPlain
import org.jetbrains.kotlin.psi.psiUtil.plainContent
import org.jetbrains.kotlin.idea.completion.KotlinCompletionCharFilter
class KotlinFilePathReferenceContributor : AbstractKotlinReferenceContributor() {
object KotlinFilePathReferenceProvider : FilePathReferenceProvider() {
override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<out PsiReference> {
if (element !is KtStringTemplateExpression) return PsiReference.EMPTY_ARRAY
if (!element.isPlainWithEscapes()) return PsiReference.EMPTY_ARRAY
if (!element.isPlain()) return PsiReference.EMPTY_ARRAY
return getReferencesByElement(element, element.plainContent, element.getContentRange().startOffset, true)
.map {
if (it is FileReference) {
object: FileReference(it.fileReferenceSet, it.rangeInElement, it.index, it.text) {
override fun getVariants(): Array<out Any> {
return super.getVariants()
.map {
(it as? LookupElement)?.apply {
putUserData(KotlinCompletionCharFilter.SUPPRESS_ITEM_SELECTION_BY_CHARS_ON_TYPING, Unit)
} ?: it
}
.toTypedArray()
}
}
}
else it
}
.toTypedArray()
}
}