Cleanup in idea plugin modules, idea-completion
This commit is contained in:
+1
-1
@@ -88,6 +88,6 @@ class AllClassesCompletion(private val parameters: CompletionParameters,
|
||||
|
||||
private fun PsiClass.isSyntheticKotlinClass(): Boolean {
|
||||
if (!getName()!!.contains('$')) return false // optimization to not analyze annotations of all classes
|
||||
return getModifierList()?.findAnnotation(javaClass<kotlin.jvm.internal.KotlinSyntheticClass>().getName()) != null
|
||||
return getModifierList()?.findAnnotation(kotlin.jvm.internal.KotlinSyntheticClass::class.java.getName()) != null
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -45,14 +45,14 @@ class InsertHandlerProvider(
|
||||
CallType.DEFAULT, CallType.DOT, CallType.SAFE, CallType.SUPER_MEMBERS -> {
|
||||
val needTypeArguments = needTypeArguments(descriptor)
|
||||
val parameters = descriptor.valueParameters
|
||||
when (parameters.size()) {
|
||||
when (parameters.size) {
|
||||
0 -> KotlinFunctionInsertHandler.Normal(needTypeArguments, inputValueArguments = false)
|
||||
|
||||
1 -> {
|
||||
if (callType != CallType.SUPER_MEMBERS) { // for super call we don't suggest to generate "super.foo { ... }" (seems to be non-typical use)
|
||||
val parameterType = parameters.single().getType()
|
||||
if (KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(parameterType)) {
|
||||
val parameterCount = KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(parameterType).size()
|
||||
val parameterCount = KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(parameterType).size
|
||||
if (parameterCount <= 1) {
|
||||
// otherwise additional item with lambda template is to be added
|
||||
return KotlinFunctionInsertHandler.Normal(needTypeArguments, inputValueArguments = false, lambdaInfo = GenerateLambdaInfo(parameterType, false))
|
||||
@@ -96,7 +96,7 @@ class InsertHandlerProvider(
|
||||
potentiallyInferred.add(descriptor)
|
||||
}
|
||||
|
||||
if (KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(type) && KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(type).size() <= 1) {
|
||||
if (KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(type) && KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(type).size <= 1) {
|
||||
// do not rely on inference from input of function type with one or no arguments - use only return type of functional type
|
||||
addPotentiallyInferred(KotlinBuiltIns.getReturnTypeFromFunctionType(type))
|
||||
return
|
||||
|
||||
+4
-4
@@ -44,8 +44,8 @@ import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy
|
||||
|
||||
class KDocCompletionContributor(): CompletionContributor() {
|
||||
init {
|
||||
extend(CompletionType.BASIC, psiElement().inside(javaClass<KDocName>()),
|
||||
KDocNameCompletionProvider)
|
||||
extend(CompletionType.BASIC, psiElement().inside(KDocName::class.java),
|
||||
KDocNameCompletionProvider)
|
||||
|
||||
extend(CompletionType.BASIC,
|
||||
psiElement().afterLeaf(
|
||||
@@ -128,12 +128,12 @@ object KDocTagCompletionProvider: CompletionProvider<CompletionParameters>() {
|
||||
StandardPatterns.character().javaIdentifierPart() or singleCharPattern('@'),
|
||||
StandardPatterns.character().javaIdentifierStart() or singleCharPattern('@'))
|
||||
|
||||
if (prefix.length() > 0 && !prefix.startsWith('@')) {
|
||||
if (prefix.length > 0 && !prefix.startsWith('@')) {
|
||||
return
|
||||
}
|
||||
val resultWithPrefix = result.withPrefixMatcher(prefix)
|
||||
KDocKnownTag.values().forEach {
|
||||
resultWithPrefix.addElement(LookupElementBuilder.create("@" + it.name().toLowerCase()))
|
||||
resultWithPrefix.addElement(LookupElementBuilder.create("@" + it.name.toLowerCase()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,8 +108,8 @@ object KeywordCompletion {
|
||||
|
||||
private val GENERAL_FILTER = NotFilter(OrFilter(
|
||||
CommentFilter(),
|
||||
ParentFilter(ClassFilter(javaClass<KtLiteralStringTemplateEntry>())),
|
||||
ParentFilter(ClassFilter(javaClass<KtConstantExpression>())),
|
||||
ParentFilter(ClassFilter(KtLiteralStringTemplateEntry::class.java)),
|
||||
ParentFilter(ClassFilter(KtConstantExpression::class.java)),
|
||||
LeftNeighbour(TextFilter(".")),
|
||||
LeftNeighbour(TextFilter("?."))
|
||||
))
|
||||
@@ -202,7 +202,7 @@ object KeywordCompletion {
|
||||
return fun (keywordTokenType): Boolean {
|
||||
val postfix = if (prefixText.endsWith("@")) ":X" else " X"
|
||||
val file = psiFactory.createFile(prefixText + keywordTokenType.getValue() + postfix)
|
||||
val elementAt = file.findElementAt(prefixText.length())!!
|
||||
val elementAt = file.findElementAt(prefixText.length)!!
|
||||
|
||||
when {
|
||||
!elementAt.getNode()!!.getElementType().matchesKeyword(keywordTokenType) -> return false
|
||||
|
||||
+3
-3
@@ -220,7 +220,7 @@ public class KotlinCompletionContributor : CompletionContributor() {
|
||||
val text = builder.toString()
|
||||
val file = KtPsiFactory(tokenBefore.getProject()).createFile(text)
|
||||
val declaration = file.getDeclarations().singleOrNull() ?: return null
|
||||
if (declaration.getTextLength() != text.length()) return null
|
||||
if (declaration.getTextLength() != text.length) return null
|
||||
val containsErrorElement = !PsiTreeUtil.processElements(file, PsiElementProcessor<PsiElement>{ it !is PsiErrorElement })
|
||||
return if (containsErrorElement) null else tail + "$"
|
||||
}
|
||||
@@ -395,8 +395,8 @@ public class KotlinCompletionContributor : CompletionContributor() {
|
||||
private fun isAtEndOfLine(offset: Int, document: Document): Boolean {
|
||||
var i = offset
|
||||
val chars = document.getCharsSequence()
|
||||
while (i < chars.length()) {
|
||||
val c = chars.charAt(i)
|
||||
while (i < chars.length) {
|
||||
val c = chars[i]
|
||||
if (c == '\n') return true
|
||||
if (!Character.isWhitespace(c)) return false
|
||||
i++
|
||||
|
||||
@@ -31,6 +31,6 @@ public class LeafElementFilter(private val elementType: IElementType) : ElementF
|
||||
= LEAF_CLASS_FILTER.isClassAcceptable(hintClass)
|
||||
|
||||
companion object {
|
||||
private val LEAF_CLASS_FILTER = ClassFilter(javaClass<LeafPsiElement>())
|
||||
private val LEAF_CLASS_FILTER = ClassFilter(LeafPsiElement::class.java)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -66,7 +66,7 @@ class LookupCancelWatcher(project: Project) : AbstractProjectComponent(project)
|
||||
private var lastReminiscence: Reminiscence? = null
|
||||
|
||||
companion object {
|
||||
fun getInstance(project: Project): LookupCancelWatcher = project.getComponent(javaClass<LookupCancelWatcher>())!!
|
||||
fun getInstance(project: Project): LookupCancelWatcher = project.getComponent(LookupCancelWatcher::class.java)!!
|
||||
|
||||
val AUTO_POPUP_AT = Key<Int>("LookupCancelWatcher.AUTO_POPUP_AT")
|
||||
}
|
||||
|
||||
+1
-1
@@ -136,7 +136,7 @@ class LookupElementFactory(
|
||||
|
||||
// render only the last parameter because all other should be optional and will be omitted
|
||||
var parametersRenderer = DescriptorRenderer.SHORT_NAMES_IN_TYPES
|
||||
if (descriptor.valueParameters.size() > 1) {
|
||||
if (descriptor.valueParameters.size > 1) {
|
||||
parametersRenderer = parametersRenderer.withOptions {
|
||||
valueParametersHandler = object: DescriptorRenderer.ValueParametersHandler by this.valueParametersHandler {
|
||||
override fun appendBeforeValueParameter(parameter: ValueParameterDescriptor, parameterIndex: Int, parameterCount: Int, builder: StringBuilder) {
|
||||
|
||||
+1
-1
@@ -73,7 +73,7 @@ object NamedArgumentCompletion {
|
||||
val editor = context.getEditor()
|
||||
val text = parameterName.render()
|
||||
editor.getDocument().replaceString(context.getStartOffset(), context.getTailOffset(), text)
|
||||
editor.getCaretModel().moveToOffset(context.getStartOffset() + text.length())
|
||||
editor.getCaretModel().moveToOffset(context.getStartOffset() + text.length)
|
||||
|
||||
WithTailInsertHandler.EQ.postHandleInsert(context, item)
|
||||
}
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
*/
|
||||
object PackageDirectiveCompletion {
|
||||
val DUMMY_IDENTIFIER = "___package___"
|
||||
val ACTIVATION_PATTERN = PlatformPatterns.psiElement().inside(javaClass<KtPackageDirective>())
|
||||
val ACTIVATION_PATTERN = PlatformPatterns.psiElement().inside(KtPackageDirective::class.java)
|
||||
|
||||
fun perform(parameters: CompletionParameters, result: CompletionResultSet): Boolean {
|
||||
val position = parameters.getPosition()
|
||||
|
||||
+2
-2
@@ -144,7 +144,7 @@ class ParameterNameAndTypeCompletion(
|
||||
if (prefixMatcher.isStartMatch(parameterName)) {
|
||||
val lookupElement = MyLookupElement.create(parameterName, type, lookupElementFactory)
|
||||
if (lookupElement != null) {
|
||||
lookupElement.putUserData(PRIORITY_KEY, userPrefix.length()) // suggestions with longer user prefix get lower priority
|
||||
lookupElement.putUserData(PRIORITY_KEY, userPrefix.length) // suggestions with longer user prefix get lower priority
|
||||
collector.addElement(lookupElement, notImported)
|
||||
suggestionsByTypesAdded.add(type)
|
||||
}
|
||||
@@ -214,7 +214,7 @@ class ParameterNameAndTypeCompletion(
|
||||
context.getDocument().insertString(startOffset, text)
|
||||
|
||||
// update start offset so that it does not include the text we inserted
|
||||
context.getOffsetMap().addOffset(CompletionInitializationContext.START_OFFSET, startOffset + text.length())
|
||||
context.getOffsetMap().addOffset(CompletionInitializationContext.START_OFFSET, startOffset + text.length)
|
||||
|
||||
super.handleInsert(context)
|
||||
}
|
||||
|
||||
+4
-4
@@ -38,8 +38,8 @@ class ToFromOriginalFileMapper(
|
||||
val syntheticText = syntheticFile.getText()
|
||||
assert(originalText.subSequence(0, completionOffset) == syntheticText.subSequence(0, completionOffset))
|
||||
|
||||
syntheticLength = syntheticText.length()
|
||||
originalLength = originalText.length()
|
||||
syntheticLength = syntheticText.length
|
||||
originalLength = originalText.length
|
||||
val minLength = Math.min(originalLength, syntheticLength)
|
||||
tailLength = (0..minLength-1).firstOrNull {
|
||||
syntheticText[syntheticLength - it - 1] != originalText[originalLength - it - 1]
|
||||
@@ -66,12 +66,12 @@ class ToFromOriginalFileMapper(
|
||||
public fun toOriginalFile(declaration: KtDeclaration): KtDeclaration? {
|
||||
if (declaration.getContainingFile() != syntheticFile) return declaration
|
||||
val offset = toOriginalFile(declaration.startOffset) ?: return null
|
||||
return PsiTreeUtil.findElementOfClassAtOffset(originalFile, offset, javaClass<KtDeclaration>(), true)
|
||||
return PsiTreeUtil.findElementOfClassAtOffset(originalFile, offset, KtDeclaration::class.java, true)
|
||||
}
|
||||
|
||||
public fun toSyntheticFile(declaration: KtDeclaration): KtDeclaration? {
|
||||
if (declaration.getContainingFile() != originalFile) return declaration
|
||||
val offset = toSyntheticFile(declaration.startOffset) ?: return null
|
||||
return PsiTreeUtil.findElementOfClassAtOffset(syntheticFile, offset, javaClass<KtDeclaration>(), true)
|
||||
return PsiTreeUtil.findElementOfClassAtOffset(syntheticFile, offset, KtDeclaration::class.java, true)
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -28,8 +28,8 @@ import org.jetbrains.kotlin.psi.*
|
||||
|
||||
object CastReceiverInsertHandler {
|
||||
fun postHandleInsert(context: InsertionContext, item: LookupElement) {
|
||||
val expression = PsiTreeUtil.findElementOfClassAtOffset(context.getFile(), context.getStartOffset(), javaClass<KtSimpleNameExpression>(), false)
|
||||
val qualifiedExpression = PsiTreeUtil.getParentOfType(expression, javaClass<KtQualifiedExpression>(), true)
|
||||
val expression = PsiTreeUtil.findElementOfClassAtOffset(context.getFile(), context.getStartOffset(), KtSimpleNameExpression::class.java, false)
|
||||
val qualifiedExpression = PsiTreeUtil.getParentOfType(expression, KtQualifiedExpression::class.java, true)
|
||||
if (qualifiedExpression != null) {
|
||||
val receiver = qualifiedExpression.getReceiverExpression()
|
||||
|
||||
|
||||
+5
-5
@@ -74,7 +74,7 @@ fun lambdaPresentation(lambdaType: KotlinType?): String {
|
||||
private fun needExplicitParameterTypes(context: InsertionContext, placeholderRange: TextRange, lambdaType: KotlinType): Boolean {
|
||||
PsiDocumentManager.getInstance(context.getProject()).commitAllDocuments()
|
||||
val file = context.getFile() as KtFile
|
||||
val expression = PsiTreeUtil.findElementOfClassAtRange(file, placeholderRange.getStartOffset(), placeholderRange.getEndOffset(), javaClass<KtExpression>())
|
||||
val expression = PsiTreeUtil.findElementOfClassAtRange(file, placeholderRange.getStartOffset(), placeholderRange.getEndOffset(), KtExpression::class.java)
|
||||
?: return false
|
||||
|
||||
val resolutionFacade = file.getResolutionFacade()
|
||||
@@ -85,10 +85,10 @@ private fun needExplicitParameterTypes(context: InsertionContext, placeholderRan
|
||||
.mapNotNull { it.fuzzyType?.type }
|
||||
.filter { KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(it) }
|
||||
.toSet()
|
||||
if (functionTypes.size() <= 1) return false
|
||||
if (functionTypes.size <= 1) return false
|
||||
|
||||
val lambdaParameterCount = KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(lambdaType).size()
|
||||
return functionTypes.filter { KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(it).size() == lambdaParameterCount }.size() > 1
|
||||
val lambdaParameterCount = KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(lambdaType).size
|
||||
return functionTypes.filter { KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(it).size() == lambdaParameterCount }.size > 1
|
||||
}
|
||||
|
||||
private fun buildTemplate(lambdaType: KotlinType, explicitParameterTypes: Boolean, project: Project): Template {
|
||||
@@ -124,7 +124,7 @@ private class ParameterNameExpression(val nameSuggestions: Array<String>) : Expr
|
||||
override fun calculateQuickResult(context: ExpressionContext?): Result? = null
|
||||
|
||||
override fun calculateLookupItems(context: ExpressionContext?)
|
||||
= Array<LookupElement>(nameSuggestions.size(), { LookupElementBuilder.create(nameSuggestions[it]) })
|
||||
= Array<LookupElement>(nameSuggestions.size, { LookupElementBuilder.create(nameSuggestions[it]) })
|
||||
}
|
||||
|
||||
fun functionParameterTypes(functionType: KotlinType): List<KotlinType>
|
||||
|
||||
+3
-3
@@ -76,10 +76,10 @@ object KotlinClassifierInsertHandler : BaseDeclarationInsertHandler() {
|
||||
|
||||
psiDocumentManager.commitAllDocuments()
|
||||
|
||||
val classNameStart = startOffset + tempPrefix.length()
|
||||
val classNameEnd = classNameStart + qualifiedName.length()
|
||||
val classNameStart = startOffset + tempPrefix.length
|
||||
val classNameEnd = classNameStart + qualifiedName.length
|
||||
val rangeMarker = document.createRangeMarker(classNameStart, classNameEnd)
|
||||
val wholeRangeMarker = document.createRangeMarker(startOffset, classNameEnd + tempSuffix.length())
|
||||
val wholeRangeMarker = document.createRangeMarker(startOffset, classNameEnd + tempSuffix.length)
|
||||
|
||||
ShortenReferences.DEFAULT.process(file, classNameStart, classNameEnd)
|
||||
psiDocumentManager.doPostponedOperationsAndUnblockDocument(document)
|
||||
|
||||
+3
-3
@@ -98,7 +98,7 @@ sealed class KotlinFunctionInsertHandler : KotlinCallableInsertHandler() {
|
||||
|
||||
if (completionChar == Lookup.REPLACE_SELECT_CHAR) {
|
||||
val offset1 = chars.skipSpaces(offset)
|
||||
if (offset1 < chars.length()) {
|
||||
if (offset1 < chars.length) {
|
||||
if (chars[offset1] == '<') {
|
||||
PsiDocumentManager.getInstance(project).commitDocument(document)
|
||||
val token = context.getFile().findElementAt(offset1)!!
|
||||
@@ -167,7 +167,7 @@ sealed class KotlinFunctionInsertHandler : KotlinCallableInsertHandler() {
|
||||
|
||||
document.insertString(openingBracketOffset + 1, argumentText)
|
||||
if (closeBracketOffset != null) {
|
||||
closeBracketOffset += argumentText.length()
|
||||
closeBracketOffset += argumentText.length
|
||||
}
|
||||
|
||||
if (!insertTypeArguments) {
|
||||
@@ -190,7 +190,7 @@ sealed class KotlinFunctionInsertHandler : KotlinCallableInsertHandler() {
|
||||
}
|
||||
|
||||
private fun isInsertSpacesInOneLineFunctionEnabled(project: Project)
|
||||
= CodeStyleSettingsManager.getSettings(project).getCustomSettings(javaClass<KotlinCodeStyleSettings>())!!.INSERT_WHITESPACES_IN_SIMPLE_ONE_LINE_METHOD
|
||||
= CodeStyleSettingsManager.getSettings(project).getCustomSettings(KotlinCodeStyleSettings::class.java)!!.INSERT_WHITESPACES_IN_SIMPLE_ONE_LINE_METHOD
|
||||
}
|
||||
|
||||
object Infix : KotlinFunctionInsertHandler() {
|
||||
|
||||
+2
-2
@@ -58,7 +58,7 @@ class WithTailInsertHandler(val tailText: String,
|
||||
var offset = document.charsSequence.skipSpacesAndLineBreaks(tailOffset)
|
||||
if (document.isTextAt(offset, tailText)) {
|
||||
insert = false
|
||||
offset += tailText.length()
|
||||
offset += tailText.length
|
||||
tailOffset = offset
|
||||
|
||||
if (spaceAfter && document.charsSequence.isCharAt(offset, ' ')) {
|
||||
@@ -77,7 +77,7 @@ class WithTailInsertHandler(val tailText: String,
|
||||
document.insertString(tailOffset, textToInsert)
|
||||
|
||||
if (moveCaret) {
|
||||
context.getEditor().getCaretModel().moveToOffset(tailOffset + textToInsert.length())
|
||||
context.getEditor().getCaretModel().moveToOffset(tailOffset + textToInsert.length)
|
||||
|
||||
if (tailText == ",") {
|
||||
AutoPopupController.getInstance(context.getProject())?.autoPopupParameterInfo(context.getEditor(), null)
|
||||
|
||||
+5
-5
@@ -44,7 +44,7 @@ fun surroundWithBracesIfInStringTemplate(context: InsertionContext) {
|
||||
}
|
||||
|
||||
fun CharSequence.indexOfSkippingSpace(c: Char, startIndex: Int): Int? {
|
||||
for (i in startIndex..this.length() - 1) {
|
||||
for (i in startIndex..this.length - 1) {
|
||||
val currentChar = this[i]
|
||||
if (c == currentChar) return i
|
||||
if (currentChar != ' ' && currentChar != '\t') return null
|
||||
@@ -53,11 +53,11 @@ fun CharSequence.indexOfSkippingSpace(c: Char, startIndex: Int): Int? {
|
||||
}
|
||||
|
||||
fun CharSequence.skipSpaces(index: Int): Int
|
||||
= (index..length() - 1).firstOrNull { val c = this[it]; c != ' ' && c != '\t' } ?: this.length()
|
||||
= (index..length - 1).firstOrNull { val c = this[it]; c != ' ' && c != '\t' } ?: this.length
|
||||
|
||||
fun CharSequence.skipSpacesAndLineBreaks(index: Int): Int
|
||||
= (index..length() - 1).firstOrNull { val c = this[it]; c != ' ' && c != '\t' && c != '\n' && c != '\r' } ?: this.length()
|
||||
= (index..length - 1).firstOrNull { val c = this[it]; c != ' ' && c != '\t' && c != '\n' && c != '\r' } ?: this.length
|
||||
|
||||
fun CharSequence.isCharAt(offset: Int, c: Char) = offset < length() && charAt(offset) == c
|
||||
fun CharSequence.isCharAt(offset: Int, c: Char) = offset < length && this[offset] == c
|
||||
|
||||
fun Document.isTextAt(offset: Int, text: String) = offset + text.length() <= getTextLength() && getText(TextRange(offset, offset + text.length())) == text
|
||||
fun Document.isTextAt(offset: Int, text: String) = offset + text.length <= getTextLength() && getText(TextRange(offset, offset + text.length)) == text
|
||||
|
||||
+1
-1
@@ -75,7 +75,7 @@ object ClassLiteralItems {
|
||||
super.handleInsert(context)
|
||||
val offset = context.tailOffset
|
||||
context.document.insertString(offset, suffix)
|
||||
context.editor.moveCaret(offset + suffix.length())
|
||||
context.editor.moveCaret(offset + suffix.length)
|
||||
}
|
||||
}
|
||||
lookupElement.assignSmartCompletionPriority(SmartCompletionItemPriority.CLASS_LITERAL)
|
||||
|
||||
@@ -42,8 +42,8 @@ object LambdaItems {
|
||||
.mapNotNull { it.fuzzyType?.type }
|
||||
.toSet()
|
||||
|
||||
val singleType = if (distinctTypes.size() == 1) distinctTypes.single() else null
|
||||
val singleSignatureLength = singleType?.let { KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(it).size() }
|
||||
val singleType = if (distinctTypes.size == 1) distinctTypes.single() else null
|
||||
val singleSignatureLength = singleType?.let { KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(it).size }
|
||||
val offerNoParametersLambda = singleSignatureLength == 0 || singleSignatureLength == 1
|
||||
if (offerNoParametersLambda) {
|
||||
val lookupElement = LookupElementBuilder.create(lambdaPresentation(null))
|
||||
@@ -62,7 +62,7 @@ object LambdaItems {
|
||||
val offset = context.getStartOffset()
|
||||
val placeholder = "{}"
|
||||
context.getDocument().replaceString(offset, context.getTailOffset(), placeholder)
|
||||
insertLambdaTemplate(context, TextRange(offset, offset + placeholder.length()), functionType)
|
||||
insertLambdaTemplate(context, TextRange(offset, offset + placeholder.length), functionType)
|
||||
})
|
||||
.suppressAutoInsertion()
|
||||
.assignSmartCompletionPriority(SmartCompletionItemPriority.LAMBDA)
|
||||
|
||||
+1
-1
@@ -58,7 +58,7 @@ class MultipleArgumentsItemProvider(
|
||||
val additionalData = expectedInfo.additionalData
|
||||
if (additionalData is ArgumentPositionData.Positional && additionalData.argumentIndex == 0) {
|
||||
val parameters = additionalData.function.valueParameters
|
||||
if (parameters.size() > 1) {
|
||||
if (parameters.size > 1) {
|
||||
val tail = when (additionalData.callType) {
|
||||
Call.CallType.ARRAY_GET_METHOD, Call.CallType.ARRAY_SET_METHOD -> Tail.RBRACKET
|
||||
else -> Tail.RPARENTH
|
||||
|
||||
+3
-3
@@ -49,10 +49,10 @@ private fun calcNameSimilarity(name: String, expectedName: String): Int {
|
||||
val nonNumberWords2 = words2.filter(::isNonNumber)
|
||||
|
||||
// count number of words matched at the end (but ignore number words - they are less important)
|
||||
val minWords = Math.min(nonNumberWords1.size(), nonNumberWords2.size())
|
||||
val minWords = Math.min(nonNumberWords1.size, nonNumberWords2.size)
|
||||
val matchedTailLength = (0..minWords-1).firstOrNull {
|
||||
i -> nonNumberWords1[nonNumberWords1.size() - i - 1] != nonNumberWords2[nonNumberWords2.size() - i - 1]
|
||||
i -> nonNumberWords1[nonNumberWords1.size - i - 1] != nonNumberWords2[nonNumberWords2.size - i - 1]
|
||||
} ?: minWords
|
||||
|
||||
return matchedWords.size() * 1000 + matchedTailLength
|
||||
return matchedWords.size * 1000 + matchedTailLength
|
||||
}
|
||||
|
||||
+1
-1
@@ -222,7 +222,7 @@ class SmartCompletion(
|
||||
val entry = whenCondition.parent as KtWhenEntry
|
||||
val whenExpression = entry.parent as KtWhenExpression
|
||||
val entries = whenExpression.entries
|
||||
if (whenExpression.elseExpression == null && entry == entries.last() && entries.size() != 1) {
|
||||
if (whenExpression.elseExpression == null && entry == entries.last() && entries.size != 1) {
|
||||
val lookupElement = LookupElementBuilder.create("else").bold().withTailText(" ->")
|
||||
items.add(object: LookupElementDecorator<LookupElement>(lookupElement) {
|
||||
override fun handleInsert(context: InsertionContext) {
|
||||
|
||||
+6
-6
@@ -182,16 +182,16 @@ class TypeInstantiationItems(
|
||||
context.document.replaceString(startOffset, context.tailOffset, text)
|
||||
|
||||
if (allTypeArgsKnown) {
|
||||
context.editor.caretModel.moveToOffset(startOffset + text.length() - 1)
|
||||
context.editor.caretModel.moveToOffset(startOffset + text.length - 1)
|
||||
|
||||
shortenReferences(context, startOffset, startOffset + text.length())
|
||||
shortenReferences(context, startOffset, startOffset + text.length)
|
||||
|
||||
ImplementMembersHandler().invoke(context.project, context.editor, context.file, true)
|
||||
}
|
||||
else {
|
||||
context.editor.caretModel.moveToOffset(startOffset + text1.length() + 1) // put caret into "<>"
|
||||
context.editor.caretModel.moveToOffset(startOffset + text1.length + 1) // put caret into "<>"
|
||||
|
||||
shortenReferences(context, startOffset, startOffset + text.length())
|
||||
shortenReferences(context, startOffset, startOffset + text.length)
|
||||
}
|
||||
}
|
||||
lookupElement = lookupElement.suppressAutoInsertion()
|
||||
@@ -199,7 +199,7 @@ class TypeInstantiationItems(
|
||||
}
|
||||
else {
|
||||
//TODO: when constructor has one parameter of lambda type with more than one parameter, generate special additional item
|
||||
signatureText = when (visibleConstructors.size()) {
|
||||
signatureText = when (visibleConstructors.size) {
|
||||
0 -> "()"
|
||||
1 -> DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderFunctionParameters(visibleConstructors.single())
|
||||
else -> "(...)"
|
||||
@@ -217,7 +217,7 @@ class TypeInstantiationItems(
|
||||
insertHandler = object : InsertHandler<LookupElement> {
|
||||
override fun handleInsert(context: InsertionContext, item: LookupElement) {
|
||||
context.getDocument().replaceString(context.getStartOffset(), context.getTailOffset(), typeText)
|
||||
context.setTailOffset(context.getStartOffset() + typeText.length())
|
||||
context.setTailOffset(context.getStartOffset() + typeText.length)
|
||||
|
||||
baseInsertHandler.handleInsert(context, item)
|
||||
|
||||
|
||||
@@ -45,13 +45,13 @@ class ArtificialElementInsertHandler(
|
||||
val textBeforeCaret: String, val textAfterCaret: String, val shortenRefs: Boolean) : InsertHandler<LookupElement>{
|
||||
override fun handleInsert(context: InsertionContext, item: LookupElement) {
|
||||
val offset = context.getEditor().getCaretModel().getOffset()
|
||||
val startOffset = offset - item.getLookupString().length()
|
||||
val startOffset = offset - item.getLookupString().length
|
||||
context.getDocument().deleteString(startOffset, offset) // delete inserted lookup string
|
||||
context.getDocument().insertString(startOffset, textBeforeCaret + textAfterCaret)
|
||||
context.getEditor().getCaretModel().moveToOffset(startOffset + textBeforeCaret.length())
|
||||
context.getEditor().getCaretModel().moveToOffset(startOffset + textBeforeCaret.length)
|
||||
|
||||
if (shortenRefs) {
|
||||
shortenReferences(context, startOffset, startOffset + textBeforeCaret.length() + textAfterCaret.length())
|
||||
shortenReferences(context, startOffset, startOffset + textBeforeCaret.length + textAfterCaret.length)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -40,13 +40,13 @@ fun testCompletion(fileText: String, platform: TargetPlatform?, complete: (Compl
|
||||
val itemsNumber = ExpectedCompletionUtils.getExpectedNumber(fileText, platform)
|
||||
val nothingElse = ExpectedCompletionUtils.isNothingElseExpected(fileText)
|
||||
|
||||
Assert.assertTrue("Should be some assertions about completion", expected.size() != 0 || unexpected.size() != 0 || itemsNumber != null || nothingElse)
|
||||
Assert.assertTrue("Should be some assertions about completion", expected.size != 0 || unexpected.size != 0 || itemsNumber != null || nothingElse)
|
||||
ExpectedCompletionUtils.assertContainsRenderedItems(expected, items, ExpectedCompletionUtils.isWithOrder(fileText), nothingElse)
|
||||
ExpectedCompletionUtils.assertNotContainsRenderedItems(unexpected, items)
|
||||
|
||||
if (itemsNumber != null) {
|
||||
val expectedItems = ExpectedCompletionUtils.listToString(ExpectedCompletionUtils.getItemsInformation(items))
|
||||
Assert.assertEquals("Invalid number of completion items: ${expectedItems}", itemsNumber, items.size())
|
||||
Assert.assertEquals("Invalid number of completion items: ${expectedItems}", itemsNumber, items.size)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+11
-11
@@ -51,7 +51,7 @@ public object ExpectedCompletionUtils {
|
||||
|
||||
public constructor(map: MutableMap<String, String?>) {
|
||||
this.map = map
|
||||
for (key in map.keySet()) {
|
||||
for (key in map.keys) {
|
||||
if (key !in validKeys) {
|
||||
throw RuntimeException("Invalid key '$key'")
|
||||
}
|
||||
@@ -61,7 +61,7 @@ public object ExpectedCompletionUtils {
|
||||
public constructor(json: JsonObject) {
|
||||
map = HashMap<String, String?>()
|
||||
for (entry in json.entrySet()) {
|
||||
val key = entry.getKey()
|
||||
val key = entry.key
|
||||
if (key !in validKeys) {
|
||||
throw RuntimeException("Invalid json property '$key'")
|
||||
}
|
||||
@@ -71,7 +71,7 @@ public object ExpectedCompletionUtils {
|
||||
}
|
||||
|
||||
public fun matches(expectedProposal: CompletionProposal): Boolean
|
||||
= expectedProposal.map.entrySet().none { it.value != map[it.key] }
|
||||
= expectedProposal.map.entries.none { it.value != map[it.key] }
|
||||
|
||||
override fun toString(): String {
|
||||
val jsonObject = JsonObject()
|
||||
@@ -168,7 +168,7 @@ public object ExpectedCompletionUtils {
|
||||
proposals.add(CompletionProposal(json as JsonObject))
|
||||
}
|
||||
else if (proposalStr.startsWith("\"") && proposalStr.endsWith("\"")) {
|
||||
proposals.add(CompletionProposal(proposalStr.substring(1, proposalStr.length() - 1)))
|
||||
proposals.add(CompletionProposal(proposalStr.substring(1, proposalStr.length - 1)))
|
||||
}
|
||||
else {
|
||||
for (item in proposalStr.split(",")) {
|
||||
@@ -177,7 +177,7 @@ public object ExpectedCompletionUtils {
|
||||
}
|
||||
}
|
||||
|
||||
return ArrayUtil.toObjectArray(proposals, javaClass<CompletionProposal>())
|
||||
return ArrayUtil.toObjectArray(proposals, CompletionProposal::class.java)
|
||||
}
|
||||
|
||||
public fun getExpectedNumber(fileText: String, platform: TargetPlatform?): Int? {
|
||||
@@ -287,7 +287,7 @@ public object ExpectedCompletionUtils {
|
||||
public fun getItemsInformation(items: Array<LookupElement>): List<CompletionProposal> {
|
||||
val presentation = LookupElementPresentation()
|
||||
|
||||
val result = ArrayList<CompletionProposal>(items.size())
|
||||
val result = ArrayList<CompletionProposal>(items.size)
|
||||
for (item in items) {
|
||||
item.renderElement(presentation)
|
||||
|
||||
@@ -315,25 +315,25 @@ public object ExpectedCompletionUtils {
|
||||
}
|
||||
|
||||
private fun textAttributes(presentation: LookupElementPresentation): String {
|
||||
return StringBuilder {
|
||||
return buildString {
|
||||
if (presentation.isItemTextBold) {
|
||||
append("bold")
|
||||
}
|
||||
if (presentation.isItemTextUnderlined) {
|
||||
if (length() > 0) append(" ")
|
||||
if (length > 0) append(" ")
|
||||
append("underlined")
|
||||
}
|
||||
val foreground = presentation.itemTextForeground
|
||||
if (foreground != JBColor.foreground()) {
|
||||
assert(foreground == LookupCellRenderer.getGrayedForeground(false))
|
||||
if (length() > 0) append(" ")
|
||||
if (length > 0) append(" ")
|
||||
append("grayed")
|
||||
}
|
||||
if (presentation.isStrikeout) {
|
||||
if (length() > 0) append(" ")
|
||||
if (length > 0) append(" ")
|
||||
append("strikeout")
|
||||
}
|
||||
}.toString()
|
||||
}
|
||||
}
|
||||
|
||||
public fun listToString(items: Collection<CompletionProposal>): String = items.joinToString("\n")
|
||||
|
||||
+1
-1
@@ -44,7 +44,7 @@ public class SmartCompletionMultifileHandlerTest : KotlinCompletionTestCase() {
|
||||
|
||||
complete(1)
|
||||
if (myItems != null) {
|
||||
assertTrue(myItems.size() == 1, "Multiple items in completion")
|
||||
assertTrue(myItems.size == 1, "Multiple items in completion")
|
||||
selectItem(myItems[0])
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user