Introduced shortcut properties + getArrowNode -> getArrow

This commit is contained in:
Valentin Kipyatkov
2015-05-11 19:48:01 +03:00
parent d86e142366
commit a3bd6ca017
39 changed files with 129 additions and 88 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.JetNodeTypes
import org.jetbrains.kotlin.lexer.JetKeywordToken
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.getCalleeHighlightingRange
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.utils.sure
@@ -387,7 +388,7 @@ public object PositioningStrategies {
override fun mark(element: JetElement): List<TextRange> {
if (element is JetConstantExpression) {
if (element.getNode().getElementType() == JetNodeTypes.INTEGER_CONSTANT) {
val endOffset = element.getTextRange().getEndOffset()
val endOffset = element.endOffset
return listOf(TextRange.create(endOffset - 1, endOffset))
}
}
@@ -22,6 +22,8 @@ import com.intellij.psi.PsiComment
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiErrorElement
import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public open class PositioningStrategy<E : PsiElement> {
public open fun markDiagnostic(diagnostic: ParametrizedDiagnostic<out E>): List<TextRange> {
@@ -57,26 +59,26 @@ private fun getStartOffset(element: PsiElement): Int {
var child = element.getFirstChild()
if (child != null) {
while (child is PsiComment || child is PsiWhiteSpace) {
child = child!!.getNextSibling()
child = child.getNextSibling()
}
if (child != null) {
return getStartOffset(child!!)
return getStartOffset(child)
}
}
return element.getTextRange().getStartOffset()
return element.startOffset
}
private fun getEndOffset(element: PsiElement): Int {
var child = element.getLastChild()
if (child != null) {
while (child is PsiComment || child is PsiWhiteSpace) {
child = child!!.getPrevSibling()
child = child.getPrevSibling()
}
if (child != null) {
return getEndOffset(child!!)
return getEndOffset(child)
}
}
return element.getTextRange().getEndOffset()
return element.endOffset
}
fun hasSyntaxErrors(psiElement: PsiElement): Boolean {
@@ -70,8 +70,8 @@ public class JetFunctionLiteral extends JetFunctionNotStubbed {
}
@Nullable
public ASTNode getArrowNode() {
return getNode().findChildByType(JetTokens.ARROW);
public PsiElement getArrow() {
return findChildByType(JetTokens.ARROW);
}
@Nullable
@@ -22,7 +22,9 @@ import com.intellij.psi.SmartPointerManager
import com.intellij.psi.SmartPsiElementPointer
import com.intellij.psi.codeStyle.CodeStyleManager
import com.intellij.psi.impl.source.codeStyle.CodeEditUtil
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.parents
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import java.util.ArrayList
import java.util.HashMap
@@ -34,7 +36,7 @@ public fun JetPsiFactory.createExpressionByPattern(pattern: String, vararg args:
var expression = createExpression(processedText)
val project = expression.getProject()
val start = expression.getTextRange().getStartOffset()
val start = expression.startOffset
val pointerManager = SmartPointerManager.getInstance(project)
@@ -80,7 +82,7 @@ public fun JetPsiFactory.createExpressionByPattern(pattern: String, vararg args:
expression = codeStyleManager.reformat(expression, true) as JetExpression
}
else {
var bound = expression.getTextRange().getEndOffset() - 1
var bound = expression.endOffset - 1
for (range in stringPlaceholderRanges) {
// we extend reformatting range by 1 to the right because otherwise some of spaces are not reformatted
expression = codeStyleManager.reformatRange(expression, range.getEndOffset() + start, bound + 1, true) as JetExpression
@@ -473,7 +473,7 @@ public fun PsiFile.elementsInRange(range: TextRange): List<PsiElement> {
}
result.add(element)
offset = element.getTextRange().getEndOffset()
offset = element.endOffset
}
return result
}
@@ -510,7 +510,7 @@ public fun PsiElement.getElementTextWithContext(): String {
val topLevelElement = PsiTreeUtil.findFirstParent(this, { it.getParent() is PsiFile }) ?:
throw AssertionError("For non-file element we should always be able to find parent in file children")
val startContextOffset = topLevelElement.getTextRange().getStartOffset()
val startContextOffset = topLevelElement.startOffset
val elementContextOffset = getTextRange().getStartOffset()
val inFileParentOffset = elementContextOffset - startContextOffset
@@ -583,7 +583,13 @@ public fun JetElement.getCalleeHighlightingRange(): TextRange {
) ?: return getTextRange()
val startOffset = annotationEntry.getAtSymbol()?.getTextRange()?.getStartOffset()
?: annotationEntry.getCalleeExpression().getTextRange().getStartOffset()
?: annotationEntry.getCalleeExpression().startOffset
return TextRange(startOffset, annotationEntry.getCalleeExpression().getTextRange().getEndOffset())
return TextRange(startOffset, annotationEntry.getCalleeExpression().endOffset)
}
public val PsiElement.startOffset: Int
get() = getTextRange().getStartOffset()
public val PsiElement.endOffset: Int
get() = getTextRange().getEndOffset()
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.idea.highlighter;
import com.intellij.lang.ASTNode;
import com.intellij.lang.annotation.AnnotationHolder;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.colors.TextAttributesKey;
@@ -59,9 +58,9 @@ class SoftKeywordsHighlightingVisitor extends HighlightingVisitor {
if (closingBrace != null) {
holder.createInfoAnnotation(closingBrace, null).setTextAttributes(JetHighlightingColors.FUNCTION_LITERAL_BRACES_AND_ARROW);
}
ASTNode arrowNode = functionLiteral.getArrowNode();
if (arrowNode != null) {
holder.createInfoAnnotation(arrowNode, null).setTextAttributes(JetHighlightingColors.FUNCTION_LITERAL_BRACES_AND_ARROW);
PsiElement arrow = functionLiteral.getArrow();
if (arrow != null) {
holder.createInfoAnnotation(arrow, null).setTextAttributes(JetHighlightingColors.FUNCTION_LITERAL_BRACES_AND_ARROW);
}
}
}
@@ -63,7 +63,7 @@ public class JetSimpleNameReference(
override fun getRangeInElement(): TextRange {
val element = getElement().getReferencedNameElement()
val startOffset = getElement().getTextRange().getStartOffset()
val startOffset = getElement().startOffset
return element.getTextRange().shiftRight(-startOffset)
}
@@ -37,10 +37,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.completion.smart.SmartCompletion
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.psi.psiUtil.parents
import org.jetbrains.kotlin.psi.psiUtil.prevLeaf
import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
@@ -108,12 +105,12 @@ public class KotlinCompletionContributor : CompletionContributor() {
context.setReplacementOffset(suggestedReplacementOffset)
}
context.getOffsetMap().addOffset(SmartCompletion.OLD_ARGUMENTS_REPLACEMENT_OFFSET, expression.getTextRange().getEndOffset())
context.getOffsetMap().addOffset(SmartCompletion.OLD_ARGUMENTS_REPLACEMENT_OFFSET, expression.endOffset)
val argumentList = (expression.getParent() as? JetValueArgument)?.getParent() as? JetValueArgumentList
if (argumentList != null) {
context.getOffsetMap().addOffset(SmartCompletion.MULTIPLE_ARGUMENTS_REPLACEMENT_OFFSET,
argumentList.getRightParenthesis()?.getTextRange()?.getStartOffset() ?: argumentList.getTextRange().getEndOffset())
argumentList.getRightParenthesis()?.getTextRange()?.getStartOffset() ?: argumentList.endOffset)
}
}
}
@@ -149,8 +146,8 @@ public class KotlinCompletionContributor : CompletionContributor() {
val classOrObject = tokenBefore?.parents(false)?.firstIsInstanceOrNull<JetClassOrObject>() ?: return false
val name = classOrObject.getNameIdentifier() ?: return false
val body = classOrObject.getBody() ?: return false
val offset = tokenBefore!!.getTextRange().getStartOffset()
return name.getTextRange().getEndOffset() <= offset && offset <= body.getTextRange().getStartOffset()
val offset = tokenBefore!!.startOffset
return name.endOffset <= offset && offset <= body.startOffset
}
private val declarationKeywords = TokenSet.create(JetTokens.FUN_KEYWORD, JetTokens.VAL_KEYWORD, JetTokens.VAR_KEYWORD)
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.completion
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.JetDeclaration
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.psi.psiUtil.startOffset
class ToFromOriginalFileMapper(
val originalFile: JetFile,
@@ -64,13 +65,13 @@ class ToFromOriginalFileMapper(
public fun toOriginalFile(declaration: JetDeclaration): JetDeclaration? {
if (declaration.getContainingFile() != syntheticFile) return declaration
val offset = toOriginalFile(declaration.getTextRange().getStartOffset()) ?: return null
val offset = toOriginalFile(declaration.startOffset) ?: return null
return PsiTreeUtil.findElementOfClassAtOffset(originalFile, offset, javaClass<JetDeclaration>(), true)
}
public fun toSyntheticFile(declaration: JetDeclaration): JetDeclaration? {
if (declaration.getContainingFile() != originalFile) return declaration
val offset = toSyntheticFile(declaration.getTextRange().getStartOffset()) ?: return null
val offset = toSyntheticFile(declaration.startOffset) ?: return null
return PsiTreeUtil.findElementOfClassAtOffset(syntheticFile, offset, javaClass<JetDeclaration>(), true)
}
}
@@ -37,6 +37,7 @@ import org.jetbrains.kotlin.idea.util.ShortenReferences
import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.types.JetType
@@ -150,7 +151,7 @@ public class KotlinFunctionInsertHandler(val caretPosition : CaretPosition, val
if (token.getNode().getElementType() == JetTokens.LT) {
val parent = token.getParent()
if (parent is JetTypeArgumentList && parent.getText().indexOf('\n') < 0/* if type argument list is on multiple lines this is more likely wrong parsing*/) {
offset = parent.getTextRange().getEndOffset()
offset = parent.endOffset
}
}
}
@@ -32,6 +32,8 @@ import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.JetFunctionLiteral
import org.jetbrains.kotlin.psi.JetImportList
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware {
override fun buildLanguageFoldRegions(descriptors: MutableList<FoldingDescriptor>,
@@ -42,11 +44,11 @@ public class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware {
val imports = root.getImportDirectives()
if (imports.size() > 1) {
val importKeyword = imports.get(0).getFirstChild()
val startOffset = importKeyword.getTextRange().getEndOffset() + 1
val startOffset = importKeyword.endOffset + 1
val importList = root.getImportList()
if (importList != null) {
val endOffset = importList.getTextRange().getEndOffset()
val endOffset = importList.endOffset
val range = TextRange(startOffset, endOffset)
descriptors.add(FoldingDescriptor(importList, range))
@@ -85,7 +87,7 @@ public class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware {
val lbrace = psi?.getLBrace()
val rbrace = psi?.getRBrace()
if (lbrace != null && rbrace != null) {
return TextRange(lbrace.getTextRange().getStartOffset(), rbrace.getTextRange().getEndOffset())
return TextRange(lbrace.startOffset, rbrace.endOffset)
}
}
return node.getTextRange()
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.codeInsight.upDownMover;
import com.google.common.base.Predicate;
import com.intellij.codeInsight.editorActions.moveUpDown.LineRange;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.Pair;
@@ -259,9 +258,9 @@ public class JetExpressionMover extends AbstractJetUpDownMover {
newBlock = findClosestBlock(((JetFunctionLiteral) parent).getBodyExpression(), down, false);
if (!down) {
ASTNode arrow = ((JetFunctionLiteral) parent).getArrowNode();
PsiElement arrow = ((JetFunctionLiteral) parent).getArrow();
if (arrow != null) {
end = arrow.getPsi();
end = arrow;
}
}
} else {
@@ -306,9 +305,9 @@ public class JetExpressionMover extends AbstractJetUpDownMover {
if (down) {
end = JetPsiUtil.findChildByType(blockLikeElement, JetTokens.LBRACE);
if (blockLikeElement instanceof JetFunctionLiteral) {
ASTNode arrow = ((JetFunctionLiteral) blockLikeElement).getArrowNode();
PsiElement arrow = ((JetFunctionLiteral) blockLikeElement).getArrow();
if (arrow != null) {
end = arrow.getPsi();
end = arrow;
}
}
}
@@ -33,9 +33,7 @@ import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.isSingleQuoted
import org.jetbrains.kotlin.psi.psiUtil.*
public class KotlinEnterHandler: EnterHandlerDelegateAdapter() {
companion object {
@@ -110,8 +108,8 @@ public class KotlinEnterHandler: EnterHandlerDelegateAdapter() {
val doc = editor.getDocument()
var caretAdvance = 1
if (stringTemplate.getParent() is JetDotQualifiedExpression) {
doc.insertString(stringTemplate.getTextRange().getEndOffset(), ")")
doc.insertString(stringTemplate.getTextRange().getStartOffset(), "(")
doc.insertString(stringTemplate.endOffset, ")")
doc.insertString(stringTemplate.startOffset, "(")
caretOffset++
caretAdvance++
}
@@ -25,6 +25,8 @@ import java.util.ArrayList
import org.jetbrains.kotlin.psi.psiUtil.siblings
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class KotlinDeclarationSelectioner : ExtendWordSelectionHandlerBase() {
override fun canSelect(e: PsiElement)
@@ -44,8 +46,8 @@ public class KotlinDeclarationSelectioner : ExtendWordSelectionHandlerBase() {
.first { it !is PsiComment && it !is PsiWhiteSpace }
if (firstNonComment != firstChild || lastNonComment != lastChild) {
val start = firstNonComment.getTextRange().getStartOffset()
val end = lastNonComment.getTextRange().getEndOffset()
val start = firstNonComment.startOffset
val end = lastNonComment.endOffset
result.addAll(ExtendWordSelectionHandlerBase.expandToWholeLine(editorText, TextRange(start, end)))
}
@@ -21,6 +21,8 @@ import com.intellij.psi.PsiElement
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.psi.JetStringTemplateExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class KotlinStringLiteralSelectioner : ExtendWordSelectionHandlerBase() {
override fun canSelect(e: PsiElement) = e is JetStringTemplateExpression
@@ -28,8 +30,8 @@ public class KotlinStringLiteralSelectioner : ExtendWordSelectionHandlerBase() {
override fun select(e: PsiElement, editorText: CharSequence, cursorOffset: Int, editor: Editor): List<TextRange>? {
val entries = (e as JetStringTemplateExpression).getEntries()
if (entries.isEmpty()) return null
val start = entries.first().getTextRange().getStartOffset()
val end = entries.last().getTextRange().getEndOffset()
val start = entries.first().startOffset
val end = entries.last().endOffset
return listOf(TextRange(start, end))
}
}
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.intentions
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class AddBracesIntention : JetSelfTargetingIntention<JetExpression>(javaClass(), "Add braces") {
override fun isApplicableTo(element: JetExpression, caretOffset: Int): Boolean {
@@ -50,7 +51,7 @@ public class AddBracesIntention : JetSelfTargetingIntention<JetExpression>(javaC
is JetIfExpression -> {
val thenExpr = getThen() ?: return null
val elseExpr = getElse()
if (elseExpr != null && caretLocation >= getElseKeyword()!!.getTextRange().getStartOffset()) {
if (elseExpr != null && caretLocation >= getElseKeyword()!!.startOffset) {
return elseExpr
}
return thenExpr
@@ -27,6 +27,8 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsStatement
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
@@ -70,7 +72,7 @@ public class ConvertToExpressionBodyIntention : JetSelfTargetingOffsetIndependen
val typeRef = declaration.getTypeReference()!!
val colon = declaration.getColon()!!
if (editor != null) {
val range = TextRange(colon.getTextRange().getStartOffset(), typeRef.getTextRange().getEndOffset())
val range = TextRange(colon.startOffset, typeRef.endOffset)
editor.getSelectionModel().setSelection(range.getStartOffset(), range.getEndOffset())
editor.getCaretModel().moveToOffset(range.getEndOffset())
}
@@ -21,11 +21,12 @@ import org.jetbrains.kotlin.psi.JetBlockExpression
import org.jetbrains.kotlin.psi.JetForExpression
import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.createExpressionByPattern
import org.jetbrains.kotlin.psi.psiUtil.endOffset
public class ConvertToForEachFunctionCallIntention : JetSelfTargetingIntention<JetForExpression>(javaClass(), "Replace with a forEach function call") {
override fun isApplicableTo(element: JetForExpression, caretOffset: Int): Boolean {
val rParen = element.getRightParenthesis() ?: return false
if (caretOffset > rParen.getTextRange().getEndOffset()) return false // available only on the loop header, not in the body
if (caretOffset > rParen.endOffset) return false // available only on the loop header, not in the body
return element.getLoopRange() != null && element.getLoopParameter() != null && element.getBody() != null
}
@@ -26,8 +26,10 @@ import org.jetbrains.kotlin.idea.intentions.branchedTransformations.expressionCo
import org.jetbrains.kotlin.idea.util.isNothing
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.replaced
import org.jetbrains.kotlin.psi.psiUtil.siblings
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import java.util.ArrayList
@@ -39,7 +41,7 @@ public class IfNullToElvisIntention : JetSelfTargetingRangeIntention<JetIfExpres
if (!type.isNothing()) return null
val rParen = element.getRightParenthesis() ?: return null
return TextRange(element.getTextRange().getStartOffset(), rParen.getTextRange().getEndOffset())
return TextRange(element.startOffset, rParen.endOffset)
}
override fun applyTo(element: JetIfExpression, editor: Editor) {
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.intentions
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.util.psiModificationUtil.moveLambdaOutsideParentheses
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
public class MoveLambdaOutsideParenthesesIntention : JetSelfTargetingIntention<JetCallExpression>(javaClass(), "Move lambda argument out of parentheses") {
@@ -26,7 +27,7 @@ public class MoveLambdaOutsideParenthesesIntention : JetSelfTargetingIntention<J
val argument = element.getValueArgumentsInParentheses().lastOrNull() ?: return false
val expression = argument.getArgumentExpression() ?: return false
val functionLiteral = getFunctionLiteral(expression) ?: return false
if (caretOffset < argument.asElement().getTextRange().getStartOffset()) return false
if (caretOffset < argument.asElement().startOffset) return false
val bodyRange = functionLiteral.getBodyExpression()?.getTextRange() ?: return true
return !bodyRange.containsInside(caretOffset)
}
@@ -20,12 +20,13 @@ import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.psi.JetFunctionLiteralExpression
import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.psiUtil.endOffset
public class RemoveExplicitLambdaParameterTypesIntention : JetSelfTargetingIntention<JetFunctionLiteralExpression>(javaClass(), "Remove explicit lambda parameter types (may break code)") {
override fun isApplicableTo(element: JetFunctionLiteralExpression, caretOffset: Int): Boolean {
if (element.getValueParameters().none { it.getTypeReference() != null }) return false
val arrow = element.getFunctionLiteral().getArrowNode() ?: return false
return caretOffset <= arrow.getTextRange().getEndOffset()
val arrow = element.getFunctionLiteral().getArrow() ?: return false
return caretOffset <= arrow.endOffset
}
override fun applyTo(element: JetFunctionLiteralExpression, editor: Editor) {
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.references.JetReference
import org.jetbrains.kotlin.psi.JetFunctionLiteral
import org.jetbrains.kotlin.psi.JetSimpleNameExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
@@ -63,8 +64,8 @@ public class ReplaceExplicitFunctionLiteralParamWithItIntention() : PsiElementBa
}
val functionLiteral = element.getParentOfType<JetFunctionLiteral>(true) ?: return null
val arrow = functionLiteral.getArrowNode() ?: return null
if (caretOffset > arrow.getTextRange().getEndOffset()) return null
val arrow = functionLiteral.getArrow() ?: return null
if (caretOffset > arrow.endOffset) return null
return functionLiteral
}
@@ -81,7 +82,7 @@ public class ReplaceExplicitFunctionLiteralParamWithItIntention() : PsiElementBa
public override fun performRefactoring(usages: Array<out UsageInfo>) {
super.performRefactoring(usages)
functionLiteral.deleteChildRange(functionLiteral.getValueParameterList(), functionLiteral.getArrowNode()!!.getPsi())
functionLiteral.deleteChildRange(functionLiteral.getValueParameterList(), functionLiteral.getArrow()!!)
if (cursorWasInParameterList) {
editor.getCaretModel().moveToOffset(functionLiteral.getBodyExpression()!!.getTextOffset())
@@ -50,7 +50,7 @@ public class ReplaceItWithExplicitFunctionLiteralParamIntention() : JetSelfTarge
val newExpr = JetPsiFactory(element).createExpression("{ it -> }") as JetFunctionLiteralExpression
functionLiteral.addRangeAfter(
newExpr.getFunctionLiteral().getValueParameterList(),
newExpr.getFunctionLiteral().getArrowNode()!!.getPsi(),
newExpr.getFunctionLiteral().getArrow()!!,
functionLiteral.getLBrace())
PsiDocumentManager.getInstance(element.getProject()).doPostponedOperationsAndUnblockDocument(editor.getDocument())
@@ -25,13 +25,14 @@ import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.idea.util.ShortenReferences
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.psi.psiUtil.endOffset
public class SpecifyExplicitLambdaSignatureIntention : JetSelfTargetingIntention<JetFunctionLiteralExpression>(javaClass(), "Specify explicit lambda signature") {
override fun isApplicableTo(element: JetFunctionLiteralExpression, caretOffset: Int): Boolean {
val arrow = element.getFunctionLiteral().getArrowNode()
val arrow = element.getFunctionLiteral().getArrow()
if (arrow != null) {
if (caretOffset > arrow.getTextRange().getEndOffset()) return false
if (caretOffset > arrow.endOffset) return false
if (element.getValueParameters().all { it.getTypeReference() != null }) return false
}
else {
@@ -23,12 +23,13 @@ import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.JetSimpleNameExpression
import org.jetbrains.kotlin.psi.JetWhenExpression
import org.jetbrains.kotlin.psi.buildExpression
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class EliminateWhenSubjectIntention : JetSelfTargetingIntention<JetWhenExpression>(javaClass(), "Eliminate argument of 'when'") {
override fun isApplicableTo(element: JetWhenExpression, caretOffset: Int): Boolean {
if (element.getSubjectExpression() !is JetSimpleNameExpression) return false
val lBrace = element.getOpenBrace() ?: return false
return caretOffset <= lBrace.getTextRange().getStartOffset()
return caretOffset <= lBrace.startOffset
}
override fun applyTo(element: JetWhenExpression, editor: Editor) {
@@ -21,7 +21,9 @@ import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import org.jetbrains.kotlin.idea.quickfix.moveCaret
import org.jetbrains.kotlin.idea.util.psi.patternMatching.matches
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.replaced
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class FlattenWhenIntention : JetSelfTargetingIntention<JetWhenExpression>(javaClass(), "Flatten 'when' expression") {
override fun isApplicableTo(element: JetWhenExpression, caretOffset: Int): Boolean {
@@ -37,7 +39,7 @@ public class FlattenWhenIntention : JetSelfTargetingIntention<JetWhenExpression>
if (!subject.matches(innerWhen.getSubjectExpression())) return false
if (!JetPsiUtil.checkWhenExpressionHasSingleElse(innerWhen)) return false
return elseEntry.getTextRange().getStartOffset() <= caretOffset && caretOffset <= innerWhen.getWhenKeywordElement().getTextRange().getEndOffset()
return elseEntry.startOffset <= caretOffset && caretOffset <= innerWhen.getWhenKeywordElement().endOffset
}
override fun applyTo(element: JetWhenExpression, editor: Editor) {
@@ -23,6 +23,8 @@ import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingRangeIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsStatement
public class IfThenToDoubleBangIntention : JetSelfTargetingRangeIntention<JetIfExpression>(javaClass(), "Replace 'if' expression with '!!' expression") {
@@ -61,7 +63,7 @@ public class IfThenToDoubleBangIntention : JetSelfTargetingRangeIntention<JetIfE
setText(text)
val rParen = element.getRightParenthesis() ?: return null
return TextRange(element.getTextRange().getStartOffset(), rParen.getTextRange().getEndOffset())
return TextRange(element.startOffset, rParen.endOffset)
}
override fun applyTo(element: JetIfExpression, editor: Editor) {
@@ -23,13 +23,15 @@ import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedUnfo
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.psi.JetIfExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class UnfoldAssignmentToIfIntention : JetSelfTargetingRangeIntention<JetBinaryExpression>(javaClass(), "Replace assignment with 'if' expression") {
override fun applicabilityRange(element: JetBinaryExpression): TextRange? {
if (element.getOperationToken() !in JetTokens.ALL_ASSIGNMENTS) return null
if (element.getLeft() == null) return null
val right = element.getRight() as? JetIfExpression ?: return null
return TextRange(element.getTextRange().getStartOffset(), right.getIfKeyword().getTextRange().getEndOffset())
return TextRange(element.startOffset, right.getIfKeyword().endOffset)
}
override fun applyTo(element: JetBinaryExpression, editor: Editor) {
@@ -24,6 +24,8 @@ import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.psi.JetWhenExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class UnfoldAssignmentToWhenIntention : JetSelfTargetingRangeIntention<JetBinaryExpression>(javaClass(), "Replace assignment with 'when' expression" ) {
override fun applicabilityRange(element: JetBinaryExpression): TextRange? {
@@ -31,7 +33,7 @@ public class UnfoldAssignmentToWhenIntention : JetSelfTargetingRangeIntention<Je
if (element.getLeft() == null) return null
val right = element.getRight() as? JetWhenExpression ?: return null
if (!JetPsiUtil.checkWhenExpressionHasSingleElse(right)) return null
return TextRange(element.getTextRange().getStartOffset(), right.getWhenKeywordElement().getTextRange().getEndOffset())
return TextRange(element.startOffset, right.getWhenKeywordElement().endOffset)
}
override fun applyTo(element: JetBinaryExpression, editor: Editor) {
@@ -23,12 +23,14 @@ import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedUnfo
import org.jetbrains.kotlin.idea.intentions.splitPropertyDeclaration
import org.jetbrains.kotlin.psi.JetIfExpression
import org.jetbrains.kotlin.psi.JetProperty
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class UnfoldPropertyToIfIntention : JetSelfTargetingRangeIntention<JetProperty>(javaClass(), "Replace property initializer with 'if' expression") {
override fun applicabilityRange(element: JetProperty): TextRange? {
if (!element.isLocal()) return null
val initializer = element.getInitializer() as? JetIfExpression ?: return null
return TextRange(element.getTextRange().getStartOffset(), initializer.getIfKeyword().getTextRange().getEndOffset())
return TextRange(element.startOffset, initializer.getIfKeyword().endOffset)
}
override fun applyTo(element: JetProperty, editor: Editor) {
@@ -24,13 +24,15 @@ import org.jetbrains.kotlin.idea.intentions.splitPropertyDeclaration
import org.jetbrains.kotlin.psi.JetProperty
import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.psi.JetWhenExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class UnfoldPropertyToWhenIntention : JetSelfTargetingRangeIntention<JetProperty>(javaClass(), "Replace property initializer with 'when' expression") {
override fun applicabilityRange(element: JetProperty): TextRange? {
if (!element.isLocal()) return null
val initializer = element.getInitializer() as? JetWhenExpression ?: return null
if (!JetPsiUtil.checkWhenExpressionHasSingleElse(initializer)) return null
return TextRange(element.getTextRange().getStartOffset(), initializer.getWhenKeywordElement().getTextRange().getEndOffset())
return TextRange(element.startOffset, initializer.getWhenKeywordElement().endOffset)
}
override fun applyTo(element: JetProperty, editor: Editor) {
@@ -25,11 +25,13 @@ import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.JetReturnExpression
import org.jetbrains.kotlin.psi.createExpressionByPattern
import org.jetbrains.kotlin.psi.psiUtil.copied
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class UnfoldReturnToIfIntention : JetSelfTargetingRangeIntention<JetReturnExpression>(javaClass(), "Replace return with 'if' expression") {
override fun applicabilityRange(element: JetReturnExpression): TextRange? {
val ifExpression = element.getReturnedExpression() as? JetIfExpression ?: return null
return TextRange(element.getTextRange().getStartOffset(), ifExpression.getIfKeyword().getTextRange().getEndOffset())
return TextRange(element.startOffset, ifExpression.getIfKeyword().endOffset)
}
override fun applyTo(element: JetReturnExpression, editor: Editor) {
@@ -22,12 +22,14 @@ import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingRangeIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedUnfoldingUtils
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.copied
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class UnfoldReturnToWhenIntention : JetSelfTargetingRangeIntention<JetReturnExpression>(javaClass(), "Replace return with 'when' expression") {
override fun applicabilityRange(element: JetReturnExpression): TextRange? {
val whenExpr = element.getReturnedExpression() as? JetWhenExpression ?: return null
if (!JetPsiUtil.checkWhenExpressionHasSingleElse(whenExpr)) return null
return TextRange(element.getTextRange().getStartOffset(), whenExpr.getWhenKeywordElement().getTextRange().getEndOffset())
return TextRange(element.startOffset, whenExpr.getWhenKeywordElement().endOffset)
}
override fun applyTo(element: JetReturnExpression, editor: Editor) {
@@ -21,12 +21,13 @@ import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingRangeIntention
import org.jetbrains.kotlin.idea.intentions.splitPropertyDeclaration
import org.jetbrains.kotlin.psi.JetProperty
import org.jetbrains.kotlin.psi.psiUtil.startOffset
public class SplitPropertyDeclarationIntention : JetSelfTargetingRangeIntention<JetProperty>(javaClass(), "Split property declaration") {
override fun applicabilityRange(element: JetProperty): TextRange? {
if (!element.isLocal()) return null
val initializer = element.getInitializer() ?: return null
return TextRange(element.getTextRange().getStartOffset(), initializer.getTextRange().getStartOffset())
return TextRange(element.startOffset, initializer.startOffset)
}
override fun applyTo(element: JetProperty, editor: Editor) {
@@ -196,7 +196,7 @@ private class LambdaToFunctionExpression(
// many statements
if (returnType != null) statements.filterIsInstance<JetExpression>().lastOrNull()?.replaceWithReturn(psiFactory)
val fromElement = functionLiteral.getArrowNode()?.getPsi() ?: functionLiteral.getLBrace()
val fromElement = functionLiteral.getArrow() ?: functionLiteral.getLBrace()
val toElement = functionLiteral.getRBrace()
// to include comments in the start/end of the body
val bodyText = fromElement.siblings(withItself = false)
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.idea.core.isVisible
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.util.ShortenReferences
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.replaced
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.resolve.BindingContext
@@ -89,7 +90,7 @@ public object SuperClassNotInitialized : JetIntentionActionsFactory() {
if (putCaretIntoParenthesis) {
if (editor != null) {
val offset = newSpecifier.getValueArgumentList()!!.getLeftParenthesis()!!.getTextRange().getEndOffset()
val offset = newSpecifier.getValueArgumentList()!!.getLeftParenthesis()!!.endOffset
editor.moveCaret(offset)
if (!ApplicationManager.getApplication().isUnitTestMode()) {
ShowParameterInfoHandler.invoke(project, editor, file, offset - 1, null)
@@ -892,17 +892,17 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
when (newJavaMember) {
is PsiMethod -> CreateFromUsageUtils.setupEditor(newJavaMember, targetEditor)
is PsiField -> targetEditor.getCaretModel().moveToOffset(newJavaMember.getTextRange().getEndOffset() - 1)
is PsiField -> targetEditor.getCaretModel().moveToOffset(newJavaMember.endOffset - 1)
is PsiClass -> {
val constructor = newJavaMember.getConstructors().firstOrNull()
val superStatement = constructor?.getBody()?.getStatements()?.firstOrNull() as? PsiExpressionStatement
val superCall = superStatement?.getExpression() as? PsiMethodCallExpression
if (superCall != null) {
val lParen = superCall.getArgumentList().getFirstChild()
targetEditor.getCaretModel().moveToOffset(lParen.getTextRange().getEndOffset())
targetEditor.getCaretModel().moveToOffset(lParen.endOffset)
}
else {
targetEditor.getCaretModel().moveToOffset(newJavaMember.getTextRange().getStartOffset())
targetEditor.getCaretModel().moveToOffset(newJavaMember.startOffset)
}
}
}
@@ -916,17 +916,17 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
val selectionModel = containingFileEditor.getSelectionModel()
if (declaration is JetSecondaryConstructor) {
caretModel.moveToOffset(declaration.getConstructorKeyword().getTextRange().getEndOffset())
caretModel.moveToOffset(declaration.getConstructorKeyword().endOffset)
}
else {
caretModel.moveToOffset(declaration.getNameIdentifier()!!.getTextRange().getEndOffset())
caretModel.moveToOffset(declaration.getNameIdentifier()!!.endOffset)
}
fun positionBetween(left: PsiElement, right: PsiElement) {
val from = left.siblings(withItself = false, forward = true).firstOrNull { it !is PsiWhiteSpace } ?: return
val to = right.siblings(withItself = false, forward = false).firstOrNull { it !is PsiWhiteSpace } ?: return
val startOffset = from.getTextRange().getStartOffset()
val endOffset = to.getTextRange().getEndOffset()
val startOffset = from.startOffset
val endOffset = to.endOffset
caretModel.moveToOffset(endOffset)
selectionModel.setSelection(startOffset, endOffset)
}
@@ -938,7 +938,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
}
}
is JetClassOrObject -> {
caretModel.moveToOffset(declaration.getTextRange().getStartOffset())
caretModel.moveToOffset(declaration.startOffset)
}
is JetProperty -> {
if (!declaration.hasInitializer() && containingElement is JetBlockExpression) {
@@ -949,7 +949,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
val range = initializer.getTextRange()
selectionModel.setSelection(range.getStartOffset(), range.getEndOffset())
}
caretModel.moveToOffset(declaration.getTextRange().getEndOffset())
caretModel.moveToOffset(declaration.endOffset)
}
}
containingFileEditor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE)
@@ -248,9 +248,9 @@ public class JetFunctionDefinitionUsage<T extends PsiElement> extends JetUsageIn
if (parametersCount == 0 && ((JetFunctionLiteral) element).getTypeReference() == null) {
if (parameterList != null) {
parameterList.delete();
ASTNode arrowNode = ((JetFunctionLiteral)element).getArrowNode();
if (arrowNode != null) {
arrowNode.getPsi().delete();
PsiElement arrow = ((JetFunctionLiteral)element).getArrow();
if (arrow != null) {
arrow.delete();
}
parameterList = null;
}
@@ -298,7 +298,7 @@ public class JetFunctionDefinitionUsage<T extends PsiElement> extends JetUsageIn
JetFunctionLiteral functionLiteral = (JetFunctionLiteral) element;
PsiElement anchor = functionLiteral.getLBrace();
newParameterList = (JetParameterList) element.addAfter(newParameterList, anchor);
if (functionLiteral.getArrowNode() == null) {
if (functionLiteral.getArrow() == null) {
Pair<PsiElement, PsiElement> whitespaceAndArrow = psiFactory.createWhitespaceAndArrow();
element.addRangeAfter(whitespaceAndArrow.getFirst(), whitespaceAndArrow.getSecond(), newParameterList);
}
@@ -574,10 +574,10 @@ fun ExtractionGeneratorConfiguration.generateDeclaration(
anchorCandidates.add(targetSibling)
val marginalCandidate = if (insertBefore) {
anchorCandidates.minBy { it.getTextRange().getStartOffset() }!!
anchorCandidates.minBy { it.startOffset }!!
}
else {
anchorCandidates.maxBy { it.getTextRange().getStartOffset() }!!
anchorCandidates.maxBy { it.startOffset }!!
}
// Ascend to the level of targetSibling