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:
Valentin Kipyatkov
2015-05-15 01:08:18 +03:00
parent c8b1dd6425
commit 60b0236101
66 changed files with 1335 additions and 402 deletions
@@ -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
@@ -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");
@@ -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");
@@ -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()
@@ -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)
}
}
@@ -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() {
}
}