Add replacement intentions for operator functions
Add intentions for replacing attribute calls that correspond to overloadable operators with their respective operators. This commit includes call replacements for: * Binary Infix Operators: plus, minus, times, rangeTo, mod, div * Unary Prefix Operators: plus, minus, not * Array Index Operator: get * In Operator: contains
This commit is contained in:
@@ -379,6 +379,11 @@ fun main(args: Array<String>) {
|
|||||||
model("intentions/replaceItWithExplicitFunctionLiteralParam", testMethod = "doTestReplaceItWithExplicitFunctionLiteralParam")
|
model("intentions/replaceItWithExplicitFunctionLiteralParam", testMethod = "doTestReplaceItWithExplicitFunctionLiteralParam")
|
||||||
model("intentions/removeBraces", testMethod = "doTestRemoveBraces")
|
model("intentions/removeBraces", testMethod = "doTestRemoveBraces")
|
||||||
model("intentions/addBraces", testMethod = "doTestAddBraces")
|
model("intentions/addBraces", testMethod = "doTestAddBraces")
|
||||||
|
model("intentions/attributeCallReplacements/replaceGetIntention", testMethod = "doTestReplaceGetIntention")
|
||||||
|
model("intentions/attributeCallReplacements/replaceContainsIntention", testMethod = "doTestReplaceContainsIntention")
|
||||||
|
model("intentions/attributeCallReplacements/replaceBinaryInfixIntention", testMethod = "doTestReplaceBinaryInfixIntention")
|
||||||
|
model("intentions/attributeCallReplacements/replaceUnaryPrefixIntention", testMethod = "doTestReplaceUnaryPrefixIntention")
|
||||||
|
model("intentions/attributeCallReplacements/replaceInvokeIntention", testMethod = "doTestReplaceInvokeIntention")
|
||||||
}
|
}
|
||||||
|
|
||||||
testClass(javaClass<AbstractHierarchyTest>()) {
|
testClass(javaClass<AbstractHierarchyTest>()) {
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
a + b
|
||||||
|
a - b
|
||||||
|
a * b
|
||||||
|
a / b
|
||||||
|
a % b
|
||||||
|
a .. b
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
a.plus(b)
|
||||||
|
a.minus(b)
|
||||||
|
a.times(b)
|
||||||
|
a.div(b)
|
||||||
|
a.mod(b)
|
||||||
|
a.rangeTo(b)
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
This intention replaces any calls to infix operators
|
||||||
|
(<code>plus</code>, <code>minus</code>, <code>div</code>, <code>times</code>, <code>mod</code>, <code>rangeTo</code>) with their respective infixes.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
b in a
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a.contains(b)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
This intention replaces <code>contains</code> member calls with the <code>in</code> operator.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
inst[a, b]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
inst.get(a, b)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
This intention replaces <code>get</code> member calls with the array index operator (<code>[]</code>).
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
inst(a, b)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
inst.invoke(a, b)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
This intention replaces <code>invoke</code> member calls with a receiver call.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
!inst
|
||||||
|
+inst
|
||||||
|
-inst
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
inst.not()
|
||||||
|
inst.plus()
|
||||||
|
inst.minus()
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
This intention replaces prefix member calls (<code>plus</code>, <code>minus</code>, <code>not</code>) with their respective prefixes.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -399,6 +399,31 @@
|
|||||||
<category>Kotlin</category>
|
<category>Kotlin</category>
|
||||||
</intentionAction>
|
</intentionAction>
|
||||||
|
|
||||||
|
<intentionAction>
|
||||||
|
<className>org.jetbrains.jet.plugin.intentions.attributeCallReplacements.ReplaceGetIntention</className>
|
||||||
|
<category>Kotlin</category>
|
||||||
|
</intentionAction>
|
||||||
|
|
||||||
|
<intentionAction>
|
||||||
|
<className>org.jetbrains.jet.plugin.intentions.attributeCallReplacements.ReplaceContainsIntention</className>
|
||||||
|
<category>Kotlin</category>
|
||||||
|
</intentionAction>
|
||||||
|
|
||||||
|
<intentionAction>
|
||||||
|
<className>org.jetbrains.jet.plugin.intentions.attributeCallReplacements.ReplaceInvokeIntention</className>
|
||||||
|
<category>Kotlin</category>
|
||||||
|
</intentionAction>
|
||||||
|
|
||||||
|
<intentionAction>
|
||||||
|
<className>org.jetbrains.jet.plugin.intentions.attributeCallReplacements.ReplaceUnaryPrefixIntention</className>
|
||||||
|
<category>Kotlin</category>
|
||||||
|
</intentionAction>
|
||||||
|
|
||||||
|
<intentionAction>
|
||||||
|
<className>org.jetbrains.jet.plugin.intentions.attributeCallReplacements.ReplaceBinaryInfixIntention</className>
|
||||||
|
<category>Kotlin</category>
|
||||||
|
</intentionAction>
|
||||||
|
|
||||||
<intentionAction>
|
<intentionAction>
|
||||||
<className>org.jetbrains.jet.plugin.intentions.branchedTransformations.intentions.FoldIfToReturnAsymmetricallyIntention</className>
|
<className>org.jetbrains.jet.plugin.intentions.branchedTransformations.intentions.FoldIfToReturnAsymmetricallyIntention</className>
|
||||||
<category>Kotlin</category>
|
<category>Kotlin</category>
|
||||||
|
|||||||
@@ -82,6 +82,30 @@ change.signature.family=Change signature of function/constructor
|
|||||||
cast.expression.to.type=Cast expression ''{0}'' to ''{1}''
|
cast.expression.to.type=Cast expression ''{0}'' to ''{1}''
|
||||||
cast.expression.family=Cast Expression
|
cast.expression.family=Cast Expression
|
||||||
|
|
||||||
|
replace.call.error.skipped.defaults=Cannot skip default arguments.
|
||||||
|
replace.call.error.undefined.returntype=Unable to determine the return type.
|
||||||
|
replace.call.error.duplicate.or.missing.arguments=Duplicate or missing arguments.
|
||||||
|
replace.call.error.invalid.arguments=Invalid arguments included.
|
||||||
|
|
||||||
|
replace.call.error.vararg.not.last=Cannot handle named arguments after a vararg.
|
||||||
|
replace.call.error.contains.returns_boolean=Contains must return a Boolean.
|
||||||
|
|
||||||
|
replace.get.with.index=Replace 'get' call with index operator
|
||||||
|
replace.get.with.index.family=Replace Get
|
||||||
|
|
||||||
|
replace.contains.with.in=Replace 'contains' call with in operator
|
||||||
|
replace.contains.with.in.family=Replace Contains
|
||||||
|
|
||||||
|
replace.invoke.with.call=Replace 'invoke' with direct call
|
||||||
|
replace.invoke.with.call.family=Replace Invoke
|
||||||
|
|
||||||
|
replace.unary.operator.with.prefix=Replace with ''{0}'' prefix
|
||||||
|
replace.unary.operator.with.prefix.family=Replace Unary Operator
|
||||||
|
|
||||||
|
replace.binary.operator.with.infix=Replace with ''{0}'' operator
|
||||||
|
replace.binary.operator.with.infix.family=Replace Binary Operator
|
||||||
|
|
||||||
|
|
||||||
add.kotlin.signature.action.family.name=Specify Custom Kotlin Signature
|
add.kotlin.signature.action.family.name=Specify Custom Kotlin Signature
|
||||||
add.kotlin.signature.action.text=Specify custom Kotlin signature
|
add.kotlin.signature.action.text=Specify custom Kotlin signature
|
||||||
edit.kotlin.signature.action.text=Edit custom Kotlin signature
|
edit.kotlin.signature.action.text=Edit custom Kotlin signature
|
||||||
|
|||||||
+140
@@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.plugin.intentions.attributeCallReplacements
|
||||||
|
|
||||||
|
import org.jetbrains.jet.lang.psi.JetCallExpression
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.jet.lang.psi.JetQualifiedExpression
|
||||||
|
import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression
|
||||||
|
import org.jetbrains.jet.plugin.intentions.JetSelfTargetingIntention
|
||||||
|
import com.intellij.openapi.ui.popup.JBPopupFactory
|
||||||
|
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall
|
||||||
|
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
|
||||||
|
import org.jetbrains.jet.lang.descriptors.CallableDescriptor
|
||||||
|
import org.jetbrains.jet.lang.resolve.BindingContext
|
||||||
|
import org.jetbrains.jet.lang.psi.ValueArgument
|
||||||
|
import org.jetbrains.jet.plugin.JetBundle
|
||||||
|
import org.jetbrains.jet.lang.resolve.calls.model.DefaultValueArgument
|
||||||
|
import org.jetbrains.jet.lang.resolve.calls.model.VarargValueArgument
|
||||||
|
|
||||||
|
abstract class Maybe<out V, out E>
|
||||||
|
public class Value<V, E>(public val value: V) : Maybe<V, E>()
|
||||||
|
public class Error<V, E>(public val error: E) : Maybe<V, E>()
|
||||||
|
|
||||||
|
// Internal because you shouldn't construct this manually. You can end up with an inconsistant CallDescription.
|
||||||
|
public class CallDescription internal (
|
||||||
|
public val element: JetQualifiedExpression,
|
||||||
|
public val callElement: JetCallExpression,
|
||||||
|
public val resolved: ResolvedCall<out CallableDescriptor>
|
||||||
|
) {
|
||||||
|
public val functionName: String?
|
||||||
|
get() = callElement.getCalleeExpression()?.getText()
|
||||||
|
|
||||||
|
public val argumentCount: Int
|
||||||
|
get() = callElement.getValueArguments().size + callElement.getFunctionLiteralArguments().size
|
||||||
|
|
||||||
|
public val hasTypeArguments: Boolean
|
||||||
|
get() = callElement.getTypeArgumentList() != null
|
||||||
|
|
||||||
|
public val hasEmptyArguments: Boolean
|
||||||
|
get() = callElement.getValueArguments().any { it?.getArgumentExpression() == null }
|
||||||
|
|
||||||
|
public fun getPositionalArguments(): Maybe<List<ValueArgument>, String> {
|
||||||
|
|
||||||
|
val resolvedValueArguments = resolved.getValueArgumentsByIndex()
|
||||||
|
?: return Error("duplicate.or.missing.arguments")
|
||||||
|
|
||||||
|
// Check for mixed default and passed arguments and return the passed parameters (or fail)
|
||||||
|
val indexOfFirstDefaultArgument = resolvedValueArguments.indexOf(DefaultValueArgument.DEFAULT)
|
||||||
|
val valueArgumentGroups = if (indexOfFirstDefaultArgument >= 0) {
|
||||||
|
if (resolvedValueArguments.listIterator(indexOfFirstDefaultArgument).any { it != DefaultValueArgument.DEFAULT }) {
|
||||||
|
return Error("skipped.defaults")
|
||||||
|
}
|
||||||
|
resolvedValueArguments.subList(0, indexOfFirstDefaultArgument)
|
||||||
|
} else {
|
||||||
|
resolvedValueArguments
|
||||||
|
}
|
||||||
|
|
||||||
|
// The vararg must be the last (passed) argument
|
||||||
|
if (valueArgumentGroups.size > 0) {
|
||||||
|
val vararg = valueArgumentGroups.find { it is VarargValueArgument }
|
||||||
|
if (vararg != null && vararg != valueArgumentGroups.last) {
|
||||||
|
return Error("vararg.not.last")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val valueArguments = valueArgumentGroups.flatMap { it.getArguments() }
|
||||||
|
if (valueArguments.size < argumentCount) {
|
||||||
|
// Only happens if invalid arguments were thrown away.
|
||||||
|
return Error("invalid.arguments")
|
||||||
|
}
|
||||||
|
|
||||||
|
return Value(valueArguments)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun JetQualifiedExpression.toCallDescription(): CallDescription? {
|
||||||
|
val call = getSelectorExpression()
|
||||||
|
if (call !is JetCallExpression) return null
|
||||||
|
|
||||||
|
val bindingContext = AnalyzerFacadeWithCache.getContextForElement(call)
|
||||||
|
// This should work. Nothing that returns a CallableDescriptor returns null and (out T is T)
|
||||||
|
val resolvedCall = bindingContext[BindingContext.RESOLVED_CALL, call.getCalleeExpression()] ?:
|
||||||
|
return null
|
||||||
|
|
||||||
|
return CallDescription(this, call, resolvedCall)
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class AttributeCallReplacementIntention(name: String) : JetSelfTargetingIntention<JetDotQualifiedExpression>(name, javaClass()) {
|
||||||
|
|
||||||
|
protected abstract fun isApplicableToCall(call: CallDescription): Boolean
|
||||||
|
|
||||||
|
protected abstract fun replaceCall(call: CallDescription, editor: Editor): Unit
|
||||||
|
protected open fun formatArgumentsFor(call: CallDescription): Array<Any?> = array()
|
||||||
|
|
||||||
|
final override fun isApplicableTo(element: JetDotQualifiedExpression): Boolean {
|
||||||
|
val callDescription = element.toCallDescription()
|
||||||
|
if (callDescription != null && isApplicableToCall(callDescription)) {
|
||||||
|
setText(JetBundle.message(key, *formatArgumentsFor(callDescription)))
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final override fun applyTo(element: JetDotQualifiedExpression, editor: Editor) {
|
||||||
|
// If this doesn't work, something is very wrong (isApplicableTo failed).
|
||||||
|
replaceCall(element.toCallDescription()!!, editor)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected open fun intentionFailed(editor: Editor, messageId: String, vararg values: Any?) {
|
||||||
|
JBPopupFactory.getInstance()!!
|
||||||
|
.createMessage("Intention Failed: ${JetBundle.message("replace.call.error.${messageId}", *values)}")
|
||||||
|
.showInBestPositionFor(editor)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun handleErrors<V: Any>(editor: Editor, maybeValue: Maybe<V, String>): V? {
|
||||||
|
return when (maybeValue) {
|
||||||
|
is Value -> maybeValue.value
|
||||||
|
is Error -> {
|
||||||
|
intentionFailed(editor, maybeValue.error)
|
||||||
|
null
|
||||||
|
}
|
||||||
|
else -> throw NoWhenBranchMatchedException()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+61
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.plugin.intentions.attributeCallReplacements
|
||||||
|
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.jet.lang.psi.JetPsiFactory
|
||||||
|
|
||||||
|
public open class ReplaceBinaryInfixIntention : AttributeCallReplacementIntention("replace.binary.operator.with.infix") {
|
||||||
|
|
||||||
|
private fun lookup(name: String?): String? {
|
||||||
|
return when (name) {
|
||||||
|
"plus" -> "+"
|
||||||
|
"minus" -> "-"
|
||||||
|
"div" -> "/"
|
||||||
|
"times" -> "*"
|
||||||
|
"mod" -> "%"
|
||||||
|
"rangeTo" -> ".."
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun formatArgumentsFor(call: CallDescription): Array<Any?> {
|
||||||
|
return array(lookup(call.functionName))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isApplicableToCall(call: CallDescription): Boolean {
|
||||||
|
return (
|
||||||
|
lookup(call.functionName) != null &&
|
||||||
|
call.argumentCount == 1 &&
|
||||||
|
!call.hasTypeArguments &&
|
||||||
|
!call.hasEmptyArguments
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceCall(call: CallDescription, editor: Editor) {
|
||||||
|
val argument = (handleErrors(editor, call.getPositionalArguments()) ?: return)[0].getArgumentExpression()
|
||||||
|
|
||||||
|
call.element.replace(
|
||||||
|
JetPsiFactory.createBinaryExpression(
|
||||||
|
call.element.getProject(),
|
||||||
|
call.element.getReceiverExpression(),
|
||||||
|
lookup(call.functionName)!!, // Lookup must succeed
|
||||||
|
argument
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
+63
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.plugin.intentions.attributeCallReplacements
|
||||||
|
|
||||||
|
import org.jetbrains.jet.lang.psi.JetExpression
|
||||||
|
import org.jetbrains.jet.lexer.JetTokens
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker
|
||||||
|
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
|
||||||
|
import org.jetbrains.jet.lang.psi.JetPsiFactory
|
||||||
|
import org.jetbrains.jet.lang.psi.JetPsiUtil
|
||||||
|
import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression
|
||||||
|
|
||||||
|
public open class ReplaceContainsIntention : AttributeCallReplacementIntention("replace.contains.with.in") {
|
||||||
|
|
||||||
|
override fun isApplicableToCall(call: CallDescription): Boolean {
|
||||||
|
return call.functionName == "contains" && call.argumentCount == 1 && !call.hasEmptyArguments
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceCall(call: CallDescription, editor: Editor) {
|
||||||
|
val ret = call.resolved.getResultingDescriptor().getReturnType()
|
||||||
|
?: return intentionFailed(editor, "undefined.returntype")
|
||||||
|
|
||||||
|
if (!JetTypeChecker.INSTANCE.isSubtypeOf(ret, KotlinBuiltIns.getInstance().getBooleanType())) {
|
||||||
|
return intentionFailed(editor, "contains.returns.boolean")
|
||||||
|
}
|
||||||
|
|
||||||
|
val argument = (handleErrors(editor, call.getPositionalArguments()) ?: return)[0].getArgumentExpression()
|
||||||
|
|
||||||
|
// Append semicolon to previous statement if needed
|
||||||
|
if (argument is JetFunctionLiteralExpression) {
|
||||||
|
val previousElement = JetPsiUtil.skipSiblingsBackwardByPredicate(call.element) {
|
||||||
|
// I checked, it can't be null.
|
||||||
|
it!!.getNode()?.getElementType() in JetTokens.WHITE_SPACE_OR_COMMENT_BIT_SET
|
||||||
|
}
|
||||||
|
if (previousElement != null && previousElement is JetExpression) {
|
||||||
|
// If the parent is null, something is very wrong.
|
||||||
|
previousElement.getParent()!!.addAfter(JetPsiFactory.createSemicolon(call.element.getProject()), previousElement)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
call.element.replace(JetPsiFactory.createBinaryExpression(
|
||||||
|
call.element.getProject(),
|
||||||
|
argument,
|
||||||
|
"in",
|
||||||
|
call.element.getReceiverExpression()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 JetBrains s.r.o.
|
||||||
|
* * Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.plugin.intentions.attributeCallReplacements
|
||||||
|
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.jet.lang.psi.JetPsiFactory
|
||||||
|
|
||||||
|
public open class ReplaceGetIntention : AttributeCallReplacementIntention("replace.get.with.index") {
|
||||||
|
|
||||||
|
override fun isApplicableToCall(call: CallDescription): Boolean {
|
||||||
|
return (call.functionName == "get" && !call.hasTypeArguments && call.argumentCount > 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceCall(call: CallDescription, editor: Editor) {
|
||||||
|
val argumentString = (handleErrors(editor, call.getPositionalArguments()) ?: return).map {
|
||||||
|
it.getArgumentExpression()?.getText() ?: ""
|
||||||
|
}.makeString(", ")
|
||||||
|
|
||||||
|
call.element.replace(JetPsiFactory.createExpression(
|
||||||
|
call.element.getProject(),
|
||||||
|
"${call.element.getReceiverExpression().getText()}[${argumentString}]"
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.plugin.intentions.attributeCallReplacements
|
||||||
|
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.jet.lang.psi.JetPsiFactory
|
||||||
|
|
||||||
|
public open class ReplaceInvokeIntention : AttributeCallReplacementIntention("replace.invoke.with.call") {
|
||||||
|
|
||||||
|
override fun isApplicableToCall(call: CallDescription): Boolean {
|
||||||
|
return call.functionName == "invoke"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceCall(call: CallDescription, editor: Editor) {
|
||||||
|
call.element.replace(JetPsiFactory.createExpression(
|
||||||
|
call.element.getProject(),
|
||||||
|
call.element.getReceiverExpression().getText() +
|
||||||
|
(call.callElement.getTypeArgumentList()?.getText() ?: "") +
|
||||||
|
(call.callElement.getValueArgumentList()?.getText() ?: "") +
|
||||||
|
(call.callElement.getFunctionLiteralArguments().fold("") { a, b -> a + " " + b.getText() })
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.plugin.intentions.attributeCallReplacements
|
||||||
|
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.jet.lang.psi.JetPsiFactory
|
||||||
|
|
||||||
|
public open class ReplaceUnaryPrefixIntention : AttributeCallReplacementIntention("replace.unary.operator.with.prefix") {
|
||||||
|
|
||||||
|
private fun lookup(name: String?) : String? {
|
||||||
|
return when (name) {
|
||||||
|
"plus" -> "+"
|
||||||
|
"minus" -> "-"
|
||||||
|
"not" -> "!"
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun formatArgumentsFor(call: CallDescription): Array<Any?> {
|
||||||
|
return array(lookup(call.functionName))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isApplicableToCall(call: CallDescription): Boolean {
|
||||||
|
return (
|
||||||
|
lookup(call.functionName) != null &&
|
||||||
|
!call.hasTypeArguments &&
|
||||||
|
call.argumentCount == 0 &&
|
||||||
|
call.callElement.getValueArgumentList() != null // Has argument expression
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceCall(call: CallDescription, editor: Editor) {
|
||||||
|
call.element.replace(JetPsiFactory.createExpression(
|
||||||
|
call.element.getProject(),
|
||||||
|
lookup(call.functionName)!! + call.element.getReceiverExpression().getText()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun plus(a: Int, vararg b: Int, c: Int = 0) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.p<caret>lus(1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun plus(a: Int, vararg b: Int, c: Int = 0) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test + 1
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun plus(vararg b: Int, c: Int = 0) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.p<caret>lus(1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun plus(vararg b: Int, c: Int = 0) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test + 1
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun plus(a: Int, b: Int=5): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.pl<caret>us(1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun plus(a: Int, b: Int=5): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test + 1
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '/' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun div(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.div<caret>(1)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '/' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun div(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test / 1
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test()
|
||||||
|
fun Test.div(a: Int): Test = Test()
|
||||||
|
val test = Test()
|
||||||
|
test.div<caret>(1)
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test()
|
||||||
|
fun Test.div(a: Int): Test = Test()
|
||||||
|
val test = Test()
|
||||||
|
test / 1
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun plus(fn: () -> Test): Test = fn()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.pl<caret>us {
|
||||||
|
Test()
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun plus(fn: () -> Test): Test = fn()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test + {
|
||||||
|
Test()
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '-' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun minus(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.min<caret>us(1)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '-' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun minus(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test - 1
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// SHOULD_FAIL_WITH: skipped.defaults
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun plus(a: Int=1, b: Int=2) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.p<caret>lus(b=3)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '%' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun mod(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.mod<caret>(1)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '%' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun mod(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test % 1
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun plus(a: Int, b: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.pl<caret>us(1, 2)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '+' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun plus(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.pl<caret>us(1)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '+' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun plus(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test + 1
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '..' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun rangeTo(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.rangeTo<caret>(1)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '..' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun rangeTo(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test..1
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '*' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun times(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.time<caret>s(1)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// INTENTION_TEXT: Replace with '*' operator
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun times(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test * 1
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun div<T>(a: Test): T? = a as? T
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.div<caret><Int>(Test())
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// SHOULD_FAIL_WITH: vararg.not.last
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun plus(vararg b: Int, c: Int = 0): Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.plus<caret>(c=5)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun plus(vararg b: Int, c: Int = 0): Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.plus<caret>(0, 1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun plus(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.pl<caret>us(a=1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test {
|
||||||
|
fun plus(a: Int): Test = Test()
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test + 1
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(vararg a: Int, b: Int = 0): Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.contai<caret>ns(1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(vararg a: Int, b: Int = 0): Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
1 in test
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(c: Int, vararg a: Int, b: Int = 0): Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.contai<caret>ns(1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(c: Int, vararg a: Int, b: Int = 0): Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
1 in test
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int, b: Int=5) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.c<caret>ontains(1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int, b: Int=5) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
1 in test
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
println(test.c<caret>ontains(0).toString())
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
println((0 in test).toString())
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test()
|
||||||
|
fun Test.contains(a: Int) : Boolean = true
|
||||||
|
val test = Test()
|
||||||
|
test.c<caret>ontains(1)
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test()
|
||||||
|
fun Test.contains(a: Int) : Boolean = true
|
||||||
|
val test = Test()
|
||||||
|
1 in test
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(fn: () -> Boolean) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.c<caret>ontains {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(fn: () -> Boolean) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test();
|
||||||
|
{
|
||||||
|
true
|
||||||
|
} in test
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(fn: () -> Boolean) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test();
|
||||||
|
test.c<caret>ontains {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(fn: () -> Boolean) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test();
|
||||||
|
{
|
||||||
|
true
|
||||||
|
} in test
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(fn: () -> Boolean) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
if (true) {
|
||||||
|
test.c<caret>ontains {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(fn: () -> Boolean) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
if (true) {
|
||||||
|
{
|
||||||
|
true
|
||||||
|
} in test
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(fn: () -> Boolean) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
println(test.c<caret>ontains { true }.toString())
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(fn: () -> Boolean) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
println(({ true } in test).toString())
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// SHOULD_FAIL_WITH: invalid.arguments
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int=1, b: Int=2): Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.c<caret>ontains(c=3)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// SHOULD_FAIL_WITH: duplicate.or.missing.arguments
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int, b: Int): Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.cont<caret>ains(0)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// SHOULD_FAIL_WITH: skipped.defaults
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int=1, b: Int=2) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.contai<caret>ns(b=3)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int, b: Int) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.c<caret>ontains(1, 2)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.c<caret>ontains(1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
1 in test
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains<T>(a: T): Boolean = false
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.contai<caret>ns<Int>(1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains<T>(a: T): Boolean = false
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
1 in test
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// SHOULD_FAIL_WITH: vararg.not.last
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(vararg b: Int, c: Int = 0): Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.contains<caret>(c=5)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(vararg b: Int, c: Int = 0): Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.contains<caret>(0, 1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int=1, b: Int=2) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.c<caret>ontains(a=5)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun contains(a: Int=1, b: Int=2) : Boolean = true
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
5 in test
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int, vararg b: Int, c: Int = 0) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et(1, 3, 4, 5)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int, vararg b: Int, c: Int = 0) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test[1, 3, 4, 5]
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int, b: Int, fn: (i: Int) -> Int) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et(1, 2) { i ->
|
||||||
|
i
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int, b: Int, fn: (i: Int) -> Int) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test[1, 2, { i ->
|
||||||
|
i
|
||||||
|
}]
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// SHOULD_FAIL_WITH: duplicate.or.missing.arguments
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int, b: Int) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et(a=0, a=1)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test()
|
||||||
|
|
||||||
|
fun Test.get(i: Int) : Int = 0
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et(0)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test()
|
||||||
|
|
||||||
|
fun Test.get(i: Int) : Int = 0
|
||||||
|
val test = Test()
|
||||||
|
test[0]
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(fn: (i: Int) -> Int) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et() { i ->
|
||||||
|
i
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(fn: (i: Int) -> Int) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test[{ i ->
|
||||||
|
i
|
||||||
|
}]
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// SHOULD_FAIL_WITH: invalid.arguments
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int=1, b: Int=2) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et(c=3)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// SHOULD_FAIL_WITH: duplicate.or.missing.arguments
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int, b: Int) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et(0)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// SHOULD_FAIL_WITH: skipped.defaults
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int=1, b: Int=2) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et(b=3)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int, b: Int) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et(1, 2)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int, b: Int) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test[1, 2]
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int, b: Int, c: Int = 1, d: Int = 1 fn: (i: Int) -> Int) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et(1, c=3, b=2) { i ->
|
||||||
|
i
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get(a: Int, b: Int, c: Int = 1, d: Int = 1 fn: (i: Int) -> Int) : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test[1, 2, 3, { i ->
|
||||||
|
i
|
||||||
|
}]
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
fun test() {
|
||||||
|
class Test{
|
||||||
|
fun get() : Int = 0
|
||||||
|
}
|
||||||
|
val test = Test()
|
||||||
|
test.g<caret>et()
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user