Corrected parser: incomplete code should never cause brace disbalance
Fixed KT-7539 fq name inserted when completing nested traits name #KT-7539
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
package a.b.c.d
|
||||
|
||||
class B {
|
||||
public val mark: M<caret> = run {
|
||||
|
||||
}
|
||||
|
||||
interface Mark {
|
||||
}
|
||||
}
|
||||
|
||||
// EXIST: { itemText: "Mark", tailText: " (a.b.c.d.B)" }
|
||||
@@ -0,0 +1,12 @@
|
||||
package a.b.c.d
|
||||
|
||||
class B {
|
||||
public val mark: M<caret> = run {
|
||||
|
||||
}
|
||||
|
||||
interface Mark {
|
||||
}
|
||||
}
|
||||
|
||||
// ELEMENT: Mark
|
||||
@@ -0,0 +1,12 @@
|
||||
package a.b.c.d
|
||||
|
||||
class B {
|
||||
public val mark: Mark<caret> = run {
|
||||
|
||||
}
|
||||
|
||||
interface Mark {
|
||||
}
|
||||
}
|
||||
|
||||
// ELEMENT: Mark
|
||||
+6
@@ -643,6 +643,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("InterfaceNameBeforeRunBug.kt")
|
||||
public void testInterfaceNameBeforeRunBug() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/InterfaceNameBeforeRunBug.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("JavaPackage.kt")
|
||||
public void testJavaPackage() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/JavaPackage.kt");
|
||||
|
||||
+6
@@ -643,6 +643,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("InterfaceNameBeforeRunBug.kt")
|
||||
public void testInterfaceNameBeforeRunBug() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/InterfaceNameBeforeRunBug.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("JavaPackage.kt")
|
||||
public void testJavaPackage() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/JavaPackage.kt");
|
||||
|
||||
+6
@@ -95,6 +95,12 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("InterfaceNameBeforeRunBug.kt")
|
||||
public void testInterfaceNameBeforeRunBug() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/InterfaceNameBeforeRunBug.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("NestedTypeArg.kt")
|
||||
public void testNestedTypeArg() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/NestedTypeArg.kt");
|
||||
|
||||
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.intention.HighPriorityAction
|
||||
import com.intellij.openapi.editor.Editor
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiModifier
|
||||
import org.jetbrains.kotlin.lexer.JetModifierKeywordToken
|
||||
import org.jetbrains.kotlin.lexer.JetTokens
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
@@ -79,7 +78,7 @@ public open class ChangeVisibilityModifierIntention protected(
|
||||
private fun canAddVisibilityModifier(declaration: JetDeclaration): TextRange? {
|
||||
if (JetPsiUtil.isLocal(declaration)) return null
|
||||
return when (declaration) {
|
||||
is JetNamedFunction -> declaration.getFunKeyword().getTextRange()
|
||||
is JetNamedFunction -> declaration.getFunKeyword()?.getTextRange()
|
||||
is JetProperty -> declaration.getValOrVarNode().getTextRange()
|
||||
is JetClass -> declaration.getClassOrTraitKeyword()?.getTextRange()
|
||||
is JetObjectDeclaration -> declaration.getObjectKeyword().getTextRange()
|
||||
|
||||
+29
-39
@@ -16,50 +16,40 @@
|
||||
|
||||
package org.jetbrains.kotlin.idea.intentions
|
||||
|
||||
import org.jetbrains.kotlin.psi.JetNamedFunction
|
||||
import com.intellij.openapi.editor.Editor
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.idea.refactoring.CallableRefactoring
|
||||
import org.jetbrains.kotlin.idea.refactoring.getAffectedCallables
|
||||
import com.intellij.util.containers.MultiMap
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.DefaultSearchHelper
|
||||
import com.intellij.psi.PsiNamedElement
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchTarget
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.search
|
||||
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch
|
||||
import org.jetbrains.kotlin.psi.JetCallElement
|
||||
import java.util.ArrayList
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import org.jetbrains.kotlin.psi.JetPsiFactory
|
||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||
import com.intellij.psi.PsiMethod
|
||||
import org.jetbrains.kotlin.codegen.PropertyCodegen
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.PsiWhiteSpace
|
||||
import org.jetbrains.kotlin.psi.psiUtil.siblings
|
||||
import com.intellij.psi.PsiReference
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
|
||||
import org.jetbrains.kotlin.psi.JetElement
|
||||
import org.jetbrains.kotlin.psi.UserDataProperty
|
||||
import com.intellij.openapi.util.Key
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.idea.util.supertypes
|
||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||
import org.jetbrains.kotlin.psi.JetProperty
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.util.containers.MultiMap
|
||||
import org.jetbrains.kotlin.asJava.namedUnwrappedElement
|
||||
import org.jetbrains.kotlin.idea.refactoring.getContainingScope
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.codegen.PropertyCodegen
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.idea.core.refactoring.checkConflictsInteractively
|
||||
import org.jetbrains.kotlin.idea.core.refactoring.reportDeclarationConflict
|
||||
import org.jetbrains.kotlin.idea.refactoring.CallableRefactoring
|
||||
import org.jetbrains.kotlin.idea.refactoring.getAffectedCallables
|
||||
import org.jetbrains.kotlin.idea.refactoring.getContainingScope
|
||||
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.DefaultSearchHelper
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchTarget
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.search
|
||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||
import org.jetbrains.kotlin.idea.util.ShortenReferences
|
||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||
import org.jetbrains.kotlin.idea.util.supertypes
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch
|
||||
import org.jetbrains.kotlin.psi.psiUtil.siblings
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||
import java.util.ArrayList
|
||||
|
||||
public class ConvertFunctionToPropertyIntention : JetSelfTargetingIntention<JetNamedFunction>(javaClass(), "Convert function to property") {
|
||||
private var JetNamedFunction.typeFqNameToAdd: String? by UserDataProperty(Key.create("TYPE_FQ_NAME_TO_ADD"))
|
||||
@@ -71,7 +61,7 @@ public class ConvertFunctionToPropertyIntention : JetSelfTargetingIntention<JetN
|
||||
): CallableRefactoring<FunctionDescriptor>(project, descriptor, context, getText()) {
|
||||
private val elementsToShorten = ArrayList<JetElement>()
|
||||
|
||||
private fun convertJetFunction(originalFunction: JetNamedFunction, psiFactory: JetPsiFactory) {
|
||||
private fun convertFunction(originalFunction: JetNamedFunction, psiFactory: JetPsiFactory) {
|
||||
val function = originalFunction.copy() as JetNamedFunction
|
||||
|
||||
val propertySample = psiFactory.createProperty("val foo: Int get() = 1")
|
||||
@@ -81,7 +71,7 @@ public class ConvertFunctionToPropertyIntention : JetSelfTargetingIntention<JetN
|
||||
originalFunction.typeFqNameToAdd?.let { function.setTypeReference(psiFactory.createType(it)) }
|
||||
}
|
||||
|
||||
function.getFunKeyword().replace(propertySample.getValOrVarNode().getPsi())
|
||||
function.getFunKeyword()!!.replace(propertySample.getValOrVarNode().getPsi())
|
||||
function.getValueParameterList()?.delete()
|
||||
val insertAfter = (function.getEqualsToken() ?: function.getBodyExpression())
|
||||
?.siblings(forward = false, withItself = false)
|
||||
@@ -172,7 +162,7 @@ public class ConvertFunctionToPropertyIntention : JetSelfTargetingIntention<JetN
|
||||
|
||||
callables.forEach {
|
||||
when (it) {
|
||||
is JetNamedFunction -> convertJetFunction(it, psiFactory)
|
||||
is JetNamedFunction -> convertFunction(it, psiFactory)
|
||||
is PsiMethod -> it.setName(getterName)
|
||||
}
|
||||
}
|
||||
|
||||
+23
-32
@@ -17,42 +17,33 @@
|
||||
package org.jetbrains.kotlin.idea.intentions
|
||||
|
||||
import com.intellij.openapi.editor.Editor
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.idea.refactoring.CallableRefactoring
|
||||
import com.intellij.psi.PsiWhiteSpace
|
||||
import org.jetbrains.kotlin.psi.psiUtil.siblings
|
||||
import com.intellij.util.containers.MultiMap
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.idea.refactoring.getAffectedCallables
|
||||
import java.util.ArrayList
|
||||
import com.intellij.psi.PsiReference
|
||||
import com.intellij.psi.PsiNamedElement
|
||||
import com.intellij.refactoring.util.RefactoringUIUtil
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.DefaultSearchHelper
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchTarget
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.search
|
||||
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getCall
|
||||
import org.jetbrains.kotlin.idea.references.JetReference
|
||||
import com.intellij.psi.PsiMethod
|
||||
import com.intellij.psi.PsiField
|
||||
import com.intellij.psi.PsiReferenceExpression
|
||||
import com.intellij.psi.PsiElementFactory
|
||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||
import com.intellij.psi.PsiJavaReference
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
|
||||
import org.jetbrains.kotlin.codegen.PropertyCodegen
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.refactoring.util.RefactoringUIUtil
|
||||
import com.intellij.util.containers.MultiMap
|
||||
import org.jetbrains.kotlin.asJava.namedUnwrappedElement
|
||||
import org.jetbrains.kotlin.idea.refactoring.getContainingScope
|
||||
import org.jetbrains.kotlin.codegen.PropertyCodegen
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.idea.core.refactoring.checkConflictsInteractively
|
||||
import org.jetbrains.kotlin.idea.core.refactoring.reportDeclarationConflict
|
||||
import org.jetbrains.kotlin.idea.refactoring.CallableRefactoring
|
||||
import org.jetbrains.kotlin.idea.refactoring.getAffectedCallables
|
||||
import org.jetbrains.kotlin.idea.refactoring.getContainingScope
|
||||
import org.jetbrains.kotlin.idea.references.JetReference
|
||||
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.DefaultSearchHelper
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchTarget
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.search
|
||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||
import org.jetbrains.kotlin.psi.psiUtil.siblings
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getCall
|
||||
import java.util.ArrayList
|
||||
|
||||
public class ConvertPropertyToFunctionIntention : JetSelfTargetingIntention<JetProperty>(javaClass(), "Convert property to function") {
|
||||
private inner class Converter(
|
||||
@@ -61,13 +52,13 @@ public class ConvertPropertyToFunctionIntention : JetSelfTargetingIntention<JetP
|
||||
context: BindingContext
|
||||
): CallableRefactoring<CallableDescriptor>(project, descriptor, context, getText()) {
|
||||
|
||||
private fun convertJetProperty(originalProperty: JetProperty, psiFactory: JetPsiFactory) {
|
||||
private fun convertProperty(originalProperty: JetProperty, psiFactory: JetPsiFactory) {
|
||||
val property = originalProperty.copy() as JetProperty;
|
||||
val getter = property.getGetter();
|
||||
|
||||
val sampleFunction = psiFactory.createFunction("fun foo() {\n\n}");
|
||||
|
||||
property.getValOrVarNode().getPsi().replace(sampleFunction.getFunKeyword());
|
||||
property.getValOrVarNode().getPsi().replace(sampleFunction.getFunKeyword()!!);
|
||||
property.addAfter(psiFactory.createParameterList("()"), property.getNameIdentifier());
|
||||
if (property.getInitializer() == null) {
|
||||
if (getter != null) {
|
||||
@@ -164,7 +155,7 @@ public class ConvertPropertyToFunctionIntention : JetSelfTargetingIntention<JetP
|
||||
|
||||
callables.forEach {
|
||||
when (it) {
|
||||
is JetProperty -> convertJetProperty(it, kotlinPsiFactory)
|
||||
is JetProperty -> convertProperty(it, kotlinPsiFactory)
|
||||
is PsiMethod -> it.setName(propertyName)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fun main(args: Array<String>) {
|
||||
String.class
|
||||
<error descr="Name expected">}</error><EOLError descr="Expecting '}'"></EOLError>
|
||||
String.class<EOLError descr="Name expected"></EOLError>
|
||||
}
|
||||
|
||||
// EA-56152: An attempt to build light class in checker to get diagnotics
|
||||
@@ -1,5 +1,5 @@
|
||||
// "Add function body" "true"
|
||||
package a {
|
||||
fun <caret>foo() {
|
||||
}
|
||||
fun foo() {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user