From b8f68acdbbcbf25740faabfb1089a1fd1c81363d Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 6 Nov 2014 21:19:33 +0300 Subject: [PATCH] Create From Usage: Create class by reference expression --- .../jet/lang/psi/psiUtil/jetPsiUtil.kt | 2 + .../plugin/quickfix/QuickFixRegistrar.java | 2 + ...assFromReferenceExpressionActionFactory.kt | 104 +++++++ ...eateClassFromTypeReferenceActionFactory.kt | 39 +-- .../createClass/createClassUtils.kt | 99 +++++++ .../noImportForPrivateClass.before.Main.kt | 1 + .../noImportInImports.before.Main.kt | 5 + .../afterAnnotationInPackage.kt | 6 + .../afterAnnotationWithQualifier.kt | 10 + .../importDirective/afterClassInPackage.kt | 8 + .../afterClassWithQualifier.kt | 12 + .../importDirective/afterEnumEntryInEnum.kt | 10 + .../importDirective/afterEnumInPackage.kt | 8 + .../importDirective/afterEnumWithQualifier.kt | 12 + .../importDirective/afterObjectInPackage.kt | 8 + .../afterObjectWithQualifier.kt | 12 + .../importDirective/afterTraitInPackage.kt | 8 + .../afterTraitWithQualifier.kt | 12 + .../beforeAnnotationInPackage.kt | 4 + .../beforeAnnotationWithQualifier.kt | 8 + .../importDirective/beforeClassInPackage.kt | 4 + .../beforeClassWithQualifier.kt | 8 + .../importDirective/beforeEnumEntryInEnum.kt | 8 + .../beforeEnumEntryInPackage.kt | 10 + .../beforeEnumEntryWithQualifier.kt | 14 + .../importDirective/beforeEnumInPackage.kt | 4 + .../beforeEnumWithQualifier.kt | 8 + .../importDirective/beforeObjectInPackage.kt | 4 + .../beforeObjectWithQualifier.kt | 8 + .../importDirective/beforeTraitInPackage.kt | 4 + .../beforeTraitWithQualifier.kt | 8 + .../afterClassByNestedQualifier.kt | 13 + .../afterClassByQualifier.kt | 9 + .../afterEnumByQualifier.kt | 9 + .../afterEnumEntryWithEnumQualifier.kt | 10 + ...fterEnumEntryWithEnumQualifierAndParams.kt | 11 + .../afterEnumEntryWithEnumSuperclass.kt | 10 + .../afterObjectByQualifier.kt | 9 + .../afterObjectInPackage.kt | 8 + .../afterObjectNoReceiver.kt | 8 + .../afterObjectWithQualifier.kt | 12 + .../afterObjectWithSuperclass.kt | 12 + .../afterObjectWithSupertrait.kt | 12 + .../afterTraitByQualifier.kt | 9 + .../afterUnusedReference.kt | 9 + .../afterValDelegateExpressionRuntime.kt | 14 + .../afterVarDelegateExpressionRuntime.kt | 14 + .../beforeAnnotationNoReceiver.kt | 9 + .../beforeClassByNestedQualifier.kt | 9 + .../beforeClassByQualifier.kt | 5 + .../beforeClassInPackage.kt | 6 + .../beforeClassNoReceiver.kt | 9 + .../beforeClassWithQualifier.kt | 10 + .../beforeClassWithReceiver.kt | 10 + .../beforeEnumByQualifier.kt | 5 + .../beforeEnumEntryNoReceiver.kt | 9 + .../beforeEnumEntryWithEnumQualifier.kt | 8 + ...foreEnumEntryWithEnumQualifierAndParams.kt | 9 + .../beforeEnumEntryWithEnumSuperclass.kt | 8 + .../beforeEnumEntryWithQualifier.kt | 10 + .../beforeEnumEntryWithReceiver.kt | 10 + .../beforeEnumEntryWithSuperclass.kt | 15 + .../beforeEnumNoReceiver.kt | 9 + .../beforeObjectByQualifier.kt | 5 + .../beforeObjectInPackage.kt | 4 + .../beforeObjectNoReceiver.kt | 4 + .../beforeObjectWithQualifier.kt | 8 + .../beforeObjectWithReceiver.kt | 10 + .../beforeObjectWithSuperclass.kt | 8 + .../beforeObjectWithSupertrait.kt | 8 + .../beforeTraitByQualifier.kt | 5 + .../beforeTraitNoReceiver.kt | 9 + .../beforeUnusedReference.kt | 5 + .../beforeValDelegateExpressionRuntime.kt | 8 + .../beforeVarDelegateExpressionRuntime.kt | 8 + .../quickfix/QuickFixTestGenerated.java | 266 +++++++++++++++++- 76 files changed, 1072 insertions(+), 36 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/CreateClassFromReferenceExpressionActionFactory.kt create mode 100644 idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/createClassUtils.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterAnnotationInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterAnnotationWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterClassInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterClassWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumEntryInEnum.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterObjectInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterObjectWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterTraitInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/afterTraitWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeAnnotationInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeAnnotationWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeClassInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeClassWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInEnum.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeObjectInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeObjectWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeTraitInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeTraitWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterClassByNestedQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterClassByQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumByQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumQualifierAndParams.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumSuperclass.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectByQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectNoReceiver.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithSuperclass.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithSupertrait.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterTraitByQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterUnusedReference.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterValDelegateExpressionRuntime.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterVarDelegateExpressionRuntime.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeAnnotationNoReceiver.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassByNestedQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassByQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassNoReceiver.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassWithReceiver.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumByQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryNoReceiver.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumQualifierAndParams.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumSuperclass.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithReceiver.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithSuperclass.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumNoReceiver.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectByQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectInPackage.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectNoReceiver.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithReceiver.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithSuperclass.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithSupertrait.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeTraitByQualifier.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeTraitNoReceiver.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeUnusedReference.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeValDelegateExpressionRuntime.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeVarDelegateExpressionRuntime.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt index 60fd6e2fe09..8ec3d374097 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt @@ -376,3 +376,5 @@ public fun PsiElement.nextLeafSkipWhitespacesAndComments(): PsiElement? { return leaf } +public fun JetExpression.isDotReceiver(): Boolean = + (getParent() as? JetDotQualifiedExpression)?.getReceiverExpression() == this \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java index 0c03b55dde7..2830e6ee334 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.plugin.quickfix; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.plugin.codeInsight.ImplementMethodsHandler; import org.jetbrains.jet.plugin.quickfix.createFromUsage.createClass.CreateClassFromTypeReferenceActionFactory; +import org.jetbrains.jet.plugin.quickfix.createFromUsage.createClass.CreateClassFromReferenceExpressionActionFactory; import org.jetbrains.jet.plugin.quickfix.createFromUsage.createFunction.*; import org.jetbrains.jet.plugin.quickfix.createFromUsage.createVariable.*; @@ -270,5 +271,6 @@ public class QuickFixRegistrar { QuickFixes.factories.put(DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE, CreatePropertyDelegateAccessorsActionFactory.INSTANCE$); QuickFixes.factories.put(UNRESOLVED_REFERENCE, CreateClassFromTypeReferenceActionFactory.INSTANCE$); + QuickFixes.factories.put(UNRESOLVED_REFERENCE, CreateClassFromReferenceExpressionActionFactory.INSTANCE$); } } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/CreateClassFromReferenceExpressionActionFactory.kt b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/CreateClassFromReferenceExpressionActionFactory.kt new file mode 100644 index 00000000000..afb205661f6 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/CreateClassFromReferenceExpressionActionFactory.kt @@ -0,0 +1,104 @@ +package org.jetbrains.jet.plugin.quickfix.createFromUsage.createClass + +import org.jetbrains.jet.lang.diagnostics.Diagnostic +import com.intellij.codeInsight.intention.IntentionAction +import org.jetbrains.jet.lang.psi.JetSimpleNameExpression +import org.jetbrains.jet.lang.psi.JetExpression +import org.jetbrains.jet.lang.psi.psiUtil.getParentByType +import org.jetbrains.jet.lang.psi.JetTypeReference +import java.util.Collections +import org.jetbrains.jet.plugin.quickfix.JetIntentionActionsFactory +import org.jetbrains.jet.lang.psi.JetClass +import org.jetbrains.jet.lang.psi.JetQualifiedExpression +import org.jetbrains.jet.lang.psi.psiUtil.getAssignmentByLHS +import org.jetbrains.jet.lang.psi.JetCallExpression +import org.jetbrains.jet.lang.psi.JetImportDirective +import org.jetbrains.jet.plugin.caches.resolve.getAnalysisResults +import org.jetbrains.jet.lang.resolve.calls.callUtil.getCall +import org.jetbrains.jet.lang.psi.JetFile +import org.jetbrains.jet.lang.resolve.BindingContext +import org.jetbrains.jet.lang.psi.psiUtil.getQualifiedElementSelector +import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.TypeInfo +import org.jetbrains.jet.lang.psi.JetReferenceExpression +import java.util.Arrays +import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression +import org.jetbrains.jet.lang.psi.psiUtil.isDotReceiver + +public object CreateClassFromReferenceExpressionActionFactory : JetIntentionActionsFactory() { + override fun doCreateActions(diagnostic: Diagnostic): List { + val refExpr = diagnostic.getPsiElement() as? JetSimpleNameExpression ?: return Collections.emptyList() + if (refExpr.getParentByType(javaClass()) != null) return Collections.emptyList() + + val file = refExpr.getContainingFile() as? JetFile ?: return Collections.emptyList() + + val name = refExpr.getReferencedName() + if (!name.checkClassName()) return Collections.emptyList() + + val exhaust = refExpr.getAnalysisResults() + val context = exhaust.getBindingContext() + + val fullCallExpr = refExpr.getParent()?.let { + when { + it is JetCallExpression && it.getCalleeExpression() == refExpr -> return Collections.emptyList() + it is JetQualifiedExpression && it.getSelectorExpression() == refExpr -> it + else -> refExpr + } + } as? JetExpression ?: return Collections.emptyList() + + val inImport = refExpr.getParentByType(javaClass()) != null + val qualifierExpected = refExpr.isDotReceiver() || ((refExpr.getParent() as? JetDotQualifiedExpression)?.isDotReceiver() ?: false) + + if (inImport || qualifierExpected) { + val receiverSelector = (fullCallExpr as? JetQualifiedExpression)?.getReceiverExpression()?.getQualifiedElementSelector() as? JetReferenceExpression + val qualifierDescriptor = receiverSelector?.let { context[BindingContext.REFERENCE_TARGET, it] } + + val targetParent = + getTargetParentByQualifier(refExpr.getContainingJetFile(), receiverSelector != null, qualifierDescriptor) + ?: return Collections.emptyList() + + return ClassKind.values() + .filter { + when (it) { + ClassKind.ANNOTATION_CLASS -> inImport + ClassKind.ENUM_ENTRY -> inImport && targetParent is JetClass && targetParent.isEnum() + else -> true + } + } + .map { + val classInfo = ClassInfo( + kind = it, + name = name, + targetParent = targetParent, + expectedTypeInfo = TypeInfo.Empty + ) + CreateClassFromUsageFix(refExpr, classInfo) + } + } + + if (fullCallExpr.getAssignmentByLHS() != null) return Collections.emptyList() + + val call = refExpr.getCall(context) ?: return Collections.emptyList() + val targetParent = getTargetParentByCall(call, file) ?: return Collections.emptyList() + if (isInnerClassExpected(call)) return Collections.emptyList() + + val (expectedTypeInfo, filter) = fullCallExpr.getInheritableTypeInfo(context, exhaust.getModuleDescriptor(), targetParent) + + return Arrays.asList(ClassKind.OBJECT, ClassKind.ENUM_ENTRY) + .filter { + filter(it) && when (it) { + ClassKind.OBJECT -> true + ClassKind.ENUM_ENTRY -> targetParent is JetClass && targetParent.isEnum() + else -> false + } + } + .map { + val classInfo = ClassInfo( + kind = it, + name = name, + targetParent = targetParent, + expectedTypeInfo = expectedTypeInfo + ) + CreateClassFromUsageFix(refExpr, classInfo) + } + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/CreateClassFromTypeReferenceActionFactory.kt b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/CreateClassFromTypeReferenceActionFactory.kt index ed7e7315977..8b306cd1190 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/CreateClassFromTypeReferenceActionFactory.kt +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/CreateClassFromTypeReferenceActionFactory.kt @@ -8,28 +8,21 @@ import java.util.Collections import org.jetbrains.jet.lang.psi.JetUserType import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.lang.resolve.BindingContext -import org.jetbrains.jet.lang.descriptors.ClassDescriptor -import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor import org.jetbrains.jet.plugin.caches.resolve.getAnalysisResults -import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil -import com.intellij.psi.JavaPsiFacade -import com.intellij.openapi.module.ModuleUtilCore -import com.intellij.psi.PsiDirectory -import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.TypeInfo import org.jetbrains.jet.lang.types.Variance +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor +import com.intellij.psi.PsiElement import org.jetbrains.jet.lang.psi.JetDelegatorToSuperClass +import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall import org.jetbrains.jet.lang.psi.JetConstructorCalleeExpression import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache -import org.jetbrains.jet.plugin.util.ProjectRootsUtil public object CreateClassFromTypeReferenceActionFactory: JetIntentionActionsFactory() { override fun doCreateActions(diagnostic: Diagnostic): List { val userType = QuickFixUtil.getParentElementOfType(diagnostic, javaClass()) ?: return Collections.emptyList() val typeArguments = userType.getTypeArgumentsAsTypes() - val project = userType.getProject() - val name = userType.getReferencedName() ?: return Collections.emptyList() val typeRefParent = userType.getParent()?.getParent() @@ -45,31 +38,7 @@ public object CreateClassFromTypeReferenceActionFactory: JetIntentionActionsFact val qualifier = userType.getQualifier()?.getReferenceExpression() val qualifierDescriptor = qualifier?.let { context[BindingContext.REFERENCE_TARGET, it] } - val targetParent = - when { - qualifier == null -> file - - qualifierDescriptor is ClassDescriptor -> { - DescriptorToDeclarationUtil.getDeclaration(project, qualifierDescriptor) - } - - qualifierDescriptor is PackageViewDescriptor -> { - val currentModule = ModuleUtilCore.findModuleForPsiElement(file) - val targetFqName = qualifierDescriptor.getFqName() - if (targetFqName != file.getPackageFqName()) { - JavaPsiFacade.getInstance(project) - .findPackage(targetFqName.asString()) - ?.getDirectories() - ?.firstOrNull { ModuleUtilCore.findModuleForPsiElement(it) == currentModule } - } - else file - } - - else -> null - } ?: return Collections.emptyList() - - if (!ProjectRootsUtil.isInProjectOrLibSource(targetParent)) return Collections.emptyList() - if (!(targetParent.isWritable() && (targetParent is PsiDirectory || targetParent is JetElement))) return Collections.emptyList() + val targetParent = getTargetParentByQualifier(file, qualifier != null, qualifierDescriptor) ?: return Collections.emptyList() val possibleKinds = when { traitExpected -> Collections.singletonList(ClassKind.TRAIT) diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/createClassUtils.kt b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/createClassUtils.kt new file mode 100644 index 00000000000..d6c241b21c0 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createClass/createClassUtils.kt @@ -0,0 +1,99 @@ +package org.jetbrains.jet.plugin.quickfix.createFromUsage.createClass + +import org.jetbrains.jet.lang.psi.JetFile +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor +import com.intellij.psi.PsiElement +import org.jetbrains.jet.lang.descriptors.ClassDescriptor +import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor +import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil +import com.intellij.openapi.module.ModuleUtilCore +import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiDirectory +import org.jetbrains.jet.lang.psi.JetElement +import org.jetbrains.jet.lang.psi.JetExpression +import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.guessTypes +import org.jetbrains.jet.lang.resolve.BindingContext +import org.jetbrains.jet.lang.descriptors.ModuleDescriptor +import org.jetbrains.jet.lang.types.TypeUtils +import org.jetbrains.jet.lang.types.checker.JetTypeChecker +import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor +import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.TypeInfo +import org.jetbrains.jet.lang.types.Variance +import org.jetbrains.jet.lang.psi.Call +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue +import org.jetbrains.jet.lang.resolve.scopes.receivers.Qualifier +import org.jetbrains.jet.plugin.util.ProjectRootsUtil +import org.jetbrains.jet.lang.resolve.DescriptorUtils +import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils + +private fun String.checkClassName(): Boolean = isNotEmpty() && Character.isUpperCase(first()) + +private fun getTargetParentByQualifier( + file: JetFile, + isQualified: Boolean, + qualifierDescriptor: DeclarationDescriptor?): PsiElement? { + val project = file.getProject() + + val targetParent = when { + !isQualified -> file + + qualifierDescriptor is ClassDescriptor -> { + DescriptorToDeclarationUtil.getDeclaration(project, qualifierDescriptor) + } + + qualifierDescriptor is PackageViewDescriptor -> { + val currentModule = ModuleUtilCore.findModuleForPsiElement(file) + val targetFqName = qualifierDescriptor.getFqName() + if (targetFqName != file.getPackageFqName()) { + JavaPsiFacade.getInstance(project) + .findPackage(targetFqName.asString()) + ?.getDirectories() + ?.firstOrNull { ModuleUtilCore.findModuleForPsiElement(it) == currentModule } + } + else file + } + + else -> null + } ?: return null + return if (targetParent.isWritable() + && ProjectRootsUtil.isInProjectOrLibSource(targetParent) + && (targetParent is PsiDirectory || targetParent is JetElement)) return targetParent else null +} + +private fun getTargetParentByCall(call: Call, file: JetFile): PsiElement? { + val receiver = call.getExplicitReceiver() + return when (receiver) { + ReceiverValue.NO_RECEIVER -> getTargetParentByQualifier(file, false, null) + is Qualifier -> getTargetParentByQualifier(file, true, receiver.resultingDescriptor) + else -> getTargetParentByQualifier(file, true, receiver.getType().getConstructor().getDeclarationDescriptor()) + } +} + +private fun isInnerClassExpected(call: Call): Boolean { + val receiver = call.getExplicitReceiver() + return receiver != ReceiverValue.NO_RECEIVER && receiver !is Qualifier +} + +private fun JetExpression.getInheritableTypeInfo( + context: BindingContext, + moduleDescriptor: ModuleDescriptor, + containingDeclaration: PsiElement): Pair Boolean> { + val types = guessTypes(context, moduleDescriptor, false) + if (types.size != 1) return TypeInfo.Empty to { classKind -> true } + + val type = types.first() + val descriptor = type.getConstructor().getDeclarationDescriptor() + + val canHaveSubtypes = TypeUtils.canHaveSubtypes(JetTypeChecker.DEFAULT, type) + val isEnum = DescriptorUtils.isEnumClass(descriptor) + + if (!(canHaveSubtypes || isEnum) + || descriptor is TypeParameterDescriptor) return TypeInfo.Empty to { classKind -> false } + + return TypeInfo.ByType(type, Variance.OUT_VARIANCE) to { classKind -> + when (classKind) { + ClassKind.ENUM_ENTRY -> isEnum && containingDeclaration == DescriptorToSourceUtils.descriptorToDeclaration(descriptor) + else -> canHaveSubtypes + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/noImportForPrivateClass.before.Main.kt b/idea/testData/quickfix/autoImports/noImportForPrivateClass.before.Main.kt index 274d91ec13b..7917ef8aec0 100644 --- a/idea/testData/quickfix/autoImports/noImportForPrivateClass.before.Main.kt +++ b/idea/testData/quickfix/autoImports/noImportForPrivateClass.before.Main.kt @@ -1,5 +1,6 @@ // "class com.intellij.codeInsight.daemon.impl.quickfix.ImportClassFixBase" "false" // ACTION: Create local variable 'PrivateClass' +// ACTION: Create object 'PrivateClass' // ACTION: Create parameter 'PrivateClass' // ACTION: Create property 'PrivateClass' // ERROR: Unresolved reference: PrivateClass diff --git a/idea/testData/quickfix/autoImports/noImportInImports.before.Main.kt b/idea/testData/quickfix/autoImports/noImportInImports.before.Main.kt index c2879907b39..de5cb10351f 100644 --- a/idea/testData/quickfix/autoImports/noImportInImports.before.Main.kt +++ b/idea/testData/quickfix/autoImports/noImportInImports.before.Main.kt @@ -1,4 +1,9 @@ // "class com.intellij.codeInsight.daemon.impl.quickfix.ImportClassFixBase" "false" +// ACTION: Create annotation 'SomeTest' +// ACTION: Create class 'SomeTest' +// ACTION: Create enum 'SomeTest' +// ACTION: Create object 'SomeTest' +// ACTION: Create trait 'SomeTest' // ERROR: Unresolved reference: SomeTest package testing diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterAnnotationInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterAnnotationInPackage.kt new file mode 100644 index 00000000000..7ae14f93909 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterAnnotationInPackage.kt @@ -0,0 +1,6 @@ +// "Create annotation 'A'" "true" +package p + +import p.A + +annotation class A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterAnnotationWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterAnnotationWithQualifier.kt new file mode 100644 index 00000000000..97067a59492 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterAnnotationWithQualifier.kt @@ -0,0 +1,10 @@ +// "Create annotation 'A'" "true" +package p + +import p.X.A + +class X { + + annotation class A + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterClassInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterClassInPackage.kt new file mode 100644 index 00000000000..79e9a8d38b6 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterClassInPackage.kt @@ -0,0 +1,8 @@ +// "Create class 'A'" "true" +package p + +import p.A + +class A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterClassWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterClassWithQualifier.kt new file mode 100644 index 00000000000..ad0e930faec --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterClassWithQualifier.kt @@ -0,0 +1,12 @@ +// "Create class 'A'" "true" +package p + +import p.X.A + +class X { + + class A { + + } + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumEntryInEnum.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumEntryInEnum.kt new file mode 100644 index 00000000000..bbf1f263063 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumEntryInEnum.kt @@ -0,0 +1,10 @@ +// "Create enum constant 'A'" "true" +package p + +import p.E.A + +enum class E { + + A + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumInPackage.kt new file mode 100644 index 00000000000..a3713b9d9f9 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumInPackage.kt @@ -0,0 +1,8 @@ +// "Create enum 'A'" "true" +package p + +import p.A + +enum class A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumWithQualifier.kt new file mode 100644 index 00000000000..9b6a8aa061e --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterEnumWithQualifier.kt @@ -0,0 +1,12 @@ +// "Create enum 'A'" "true" +package p + +import p.X.A + +class X { + + enum class A { + + } + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterObjectInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterObjectInPackage.kt new file mode 100644 index 00000000000..30bd93957a0 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterObjectInPackage.kt @@ -0,0 +1,8 @@ +// "Create object 'A'" "true" +package p + +import p.A + +object A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterObjectWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterObjectWithQualifier.kt new file mode 100644 index 00000000000..d7deede0288 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterObjectWithQualifier.kt @@ -0,0 +1,12 @@ +// "Create object 'A'" "true" +package p + +import p.X.A + +class X { + + object A { + + } + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterTraitInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterTraitInPackage.kt new file mode 100644 index 00000000000..b1b2359f011 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterTraitInPackage.kt @@ -0,0 +1,8 @@ +// "Create trait 'A'" "true" +package p + +import p.A + +trait A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterTraitWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterTraitWithQualifier.kt new file mode 100644 index 00000000000..23a1da45870 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/afterTraitWithQualifier.kt @@ -0,0 +1,12 @@ +// "Create trait 'A'" "true" +package p + +import p.X.A + +class X { + + trait A { + + } + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeAnnotationInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeAnnotationInPackage.kt new file mode 100644 index 00000000000..070d4c54091 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeAnnotationInPackage.kt @@ -0,0 +1,4 @@ +// "Create annotation 'A'" "true" +package p + +import p.A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeAnnotationWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeAnnotationWithQualifier.kt new file mode 100644 index 00000000000..a603a9373c8 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeAnnotationWithQualifier.kt @@ -0,0 +1,8 @@ +// "Create annotation 'A'" "true" +package p + +import p.X.A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeClassInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeClassInPackage.kt new file mode 100644 index 00000000000..dc853f08399 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeClassInPackage.kt @@ -0,0 +1,4 @@ +// "Create class 'A'" "true" +package p + +import p.A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeClassWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeClassWithQualifier.kt new file mode 100644 index 00000000000..44405560847 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeClassWithQualifier.kt @@ -0,0 +1,8 @@ +// "Create class 'A'" "true" +package p + +import p.X.A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInEnum.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInEnum.kt new file mode 100644 index 00000000000..a7e6426ca8e --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInEnum.kt @@ -0,0 +1,8 @@ +// "Create enum constant 'A'" "true" +package p + +import p.E.A + +enum class E { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInPackage.kt new file mode 100644 index 00000000000..76bf8af903f --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInPackage.kt @@ -0,0 +1,10 @@ +// "Create enum constant 'A'" "false" +// ACTION: Create class 'A' +// ACTION: Create trait 'A' +// ACTION: Create object 'A' +// ACTION: Create enum 'A' +// ACTION: Create annotation 'A' +// ERROR: Unresolved reference: A +package p + +import p.A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryWithQualifier.kt new file mode 100644 index 00000000000..82f94fde623 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryWithQualifier.kt @@ -0,0 +1,14 @@ +// "Create enum constant 'A'" "false" +// ACTION: Create class 'A' +// ACTION: Create trait 'A' +// ACTION: Create object 'A' +// ACTION: Create enum 'A' +// ACTION: Create annotation 'A' +// ERROR: Unresolved reference: A +package p + +import p.X.A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumInPackage.kt new file mode 100644 index 00000000000..c7411e09c4c --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumInPackage.kt @@ -0,0 +1,4 @@ +// "Create enum 'A'" "true" +package p + +import p.A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumWithQualifier.kt new file mode 100644 index 00000000000..18b424ff761 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumWithQualifier.kt @@ -0,0 +1,8 @@ +// "Create enum 'A'" "true" +package p + +import p.X.A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeObjectInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeObjectInPackage.kt new file mode 100644 index 00000000000..317c7fa2e2b --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeObjectInPackage.kt @@ -0,0 +1,4 @@ +// "Create object 'A'" "true" +package p + +import p.A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeObjectWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeObjectWithQualifier.kt new file mode 100644 index 00000000000..dfc7c3d6dab --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeObjectWithQualifier.kt @@ -0,0 +1,8 @@ +// "Create object 'A'" "true" +package p + +import p.X.A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeTraitInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeTraitInPackage.kt new file mode 100644 index 00000000000..a3198c9518f --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeTraitInPackage.kt @@ -0,0 +1,4 @@ +// "Create trait 'A'" "true" +package p + +import p.A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeTraitWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeTraitWithQualifier.kt new file mode 100644 index 00000000000..cc8f3302836 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeTraitWithQualifier.kt @@ -0,0 +1,8 @@ +// "Create trait 'A'" "true" +package p + +import p.X.A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterClassByNestedQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterClassByNestedQualifier.kt new file mode 100644 index 00000000000..ac781c1701f --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterClassByNestedQualifier.kt @@ -0,0 +1,13 @@ +// "Create class 'B'" "true" +// ERROR: Unresolved reference: C +package p + +fun foo() = A.B.C + +class A { + + class B { + + } + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterClassByQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterClassByQualifier.kt new file mode 100644 index 00000000000..680ac2ef8a0 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterClassByQualifier.kt @@ -0,0 +1,9 @@ +// "Create class 'A'" "true" +// ERROR: Unresolved reference: B +package p + +fun foo() = A.B + +class A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumByQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumByQualifier.kt new file mode 100644 index 00000000000..4633186a4bb --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumByQualifier.kt @@ -0,0 +1,9 @@ +// "Create enum 'A'" "true" +// ERROR: Unresolved reference: B +package p + +fun foo() = A.B + +enum class A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumQualifier.kt new file mode 100644 index 00000000000..f2025242dcc --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumQualifier.kt @@ -0,0 +1,10 @@ +// "Create enum constant 'A'" "true" +package p + +fun foo() = X.A + +enum class X { + + A + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumQualifierAndParams.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumQualifierAndParams.kt new file mode 100644 index 00000000000..973c8cbbca9 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumQualifierAndParams.kt @@ -0,0 +1,11 @@ +// "Create enum constant 'A'" "true" +// ERROR: No value passed for parameter n +package p + +fun foo() = X.A + +enum class X(n: Int) { + + A : X() + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumSuperclass.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumSuperclass.kt new file mode 100644 index 00000000000..bf45c4f1739 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterEnumEntryWithEnumSuperclass.kt @@ -0,0 +1,10 @@ +// "Create enum constant 'A'" "true" +package p + +fun foo(): E = E.A + +enum class E { + + A + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectByQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectByQualifier.kt new file mode 100644 index 00000000000..d2865d49a9b --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectByQualifier.kt @@ -0,0 +1,9 @@ +// "Create object 'A'" "true" +// ERROR: Unresolved reference: B +package p + +fun foo() = A.B + +object A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectInPackage.kt new file mode 100644 index 00000000000..2e0dd11081e --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectInPackage.kt @@ -0,0 +1,8 @@ +// "Create object 'A'" "true" +package p + +fun foo() = p.A + +object A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectNoReceiver.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectNoReceiver.kt new file mode 100644 index 00000000000..1d7e0025960 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectNoReceiver.kt @@ -0,0 +1,8 @@ +// "Create object 'A'" "true" +package p + +fun foo() = A + +object A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithQualifier.kt new file mode 100644 index 00000000000..58330c54a6d --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithQualifier.kt @@ -0,0 +1,12 @@ +// "Create object 'A'" "true" +package p + +fun foo() = X.A + +class X { + + object A { + + } + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithSuperclass.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithSuperclass.kt new file mode 100644 index 00000000000..ed5bf9e66cc --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithSuperclass.kt @@ -0,0 +1,12 @@ +// "Create object 'A'" "true" +package p + +fun foo(): X = A + +open class X { + +} + +object A : X() { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithSupertrait.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithSupertrait.kt new file mode 100644 index 00000000000..33ba0cb0d4c --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterObjectWithSupertrait.kt @@ -0,0 +1,12 @@ +// "Create object 'A'" "true" +package p + +fun foo(): X = A + +trait X { + +} + +object A : X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterTraitByQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterTraitByQualifier.kt new file mode 100644 index 00000000000..12ae81ba209 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterTraitByQualifier.kt @@ -0,0 +1,9 @@ +// "Create trait 'A'" "true" +// ERROR: Unresolved reference: B +package p + +fun foo() = A.B + +trait A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterUnusedReference.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterUnusedReference.kt new file mode 100644 index 00000000000..3b2ab778109 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterUnusedReference.kt @@ -0,0 +1,9 @@ +// "Create object 'Foo'" "true" + +fun test() { + Foo +} + +object Foo { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterValDelegateExpressionRuntime.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterValDelegateExpressionRuntime.kt new file mode 100644 index 00000000000..23aed189f38 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterValDelegateExpressionRuntime.kt @@ -0,0 +1,14 @@ +// "Create object 'Foo'" "true" +// DISABLE-ERRORS + +import kotlin.properties.ReadOnlyProperty + +open class B + +class A { + val x: B by Foo +} + +object Foo : ReadOnlyProperty { + +} diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterVarDelegateExpressionRuntime.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterVarDelegateExpressionRuntime.kt new file mode 100644 index 00000000000..9fe3307bd8b --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/afterVarDelegateExpressionRuntime.kt @@ -0,0 +1,14 @@ +// "Create object 'Foo'" "true" +// DISABLE-ERRORS + +import kotlin.properties.ReadWriteProperty + +open class B + +class A { + var x: B by Foo +} + +object Foo : ReadWriteProperty { + +} diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeAnnotationNoReceiver.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeAnnotationNoReceiver.kt new file mode 100644 index 00000000000..c17b71ef7df --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeAnnotationNoReceiver.kt @@ -0,0 +1,9 @@ +// "Create annotation 'A'" "false" +// ACTION: Create object 'A' +// ACTION: Create local variable 'A' +// ACTION: Create parameter 'A' +// ACTION: Create property 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassByNestedQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassByNestedQualifier.kt new file mode 100644 index 00000000000..5077cde8148 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassByNestedQualifier.kt @@ -0,0 +1,9 @@ +// "Create class 'B'" "true" +// ERROR: Unresolved reference: C +package p + +fun foo() = A.B.C + +class A { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassByQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassByQualifier.kt new file mode 100644 index 00000000000..fa3fef3a47f --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassByQualifier.kt @@ -0,0 +1,5 @@ +// "Create class 'A'" "true" +// ERROR: Unresolved reference: B +package p + +fun foo() = A.B \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassInPackage.kt new file mode 100644 index 00000000000..df46597fd20 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassInPackage.kt @@ -0,0 +1,6 @@ +// "Create class 'A'" "false" +// ACTION: Create object 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = p.A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassNoReceiver.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassNoReceiver.kt new file mode 100644 index 00000000000..962513e01b8 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassNoReceiver.kt @@ -0,0 +1,9 @@ +// "Create class 'A'" "false" +// ACTION: Create object 'A' +// ACTION: Create local variable 'A' +// ACTION: Create parameter 'A' +// ACTION: Create property 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassWithQualifier.kt new file mode 100644 index 00000000000..a1b41aacd93 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassWithQualifier.kt @@ -0,0 +1,10 @@ +// "Create class 'A'" "false" +// ACTION: Create object 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = X.A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassWithReceiver.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassWithReceiver.kt new file mode 100644 index 00000000000..43e90fe9710 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassWithReceiver.kt @@ -0,0 +1,10 @@ +// "Create class 'A'" "false" +// ACTION: Create property 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = X().A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumByQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumByQualifier.kt new file mode 100644 index 00000000000..a1b6cf4ea80 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumByQualifier.kt @@ -0,0 +1,5 @@ +// "Create enum 'A'" "true" +// ERROR: Unresolved reference: B +package p + +fun foo() = A.B \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryNoReceiver.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryNoReceiver.kt new file mode 100644 index 00000000000..511fd011189 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryNoReceiver.kt @@ -0,0 +1,9 @@ +// "Create enum constant 'A'" "false" +// ACTION: Create object 'A' +// ACTION: Create local variable 'A' +// ACTION: Create parameter 'A' +// ACTION: Create property 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumQualifier.kt new file mode 100644 index 00000000000..8d776b13ff7 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumQualifier.kt @@ -0,0 +1,8 @@ +// "Create enum constant 'A'" "true" +package p + +fun foo() = X.A + +enum class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumQualifierAndParams.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumQualifierAndParams.kt new file mode 100644 index 00000000000..753ddd026dc --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumQualifierAndParams.kt @@ -0,0 +1,9 @@ +// "Create enum constant 'A'" "true" +// ERROR: No value passed for parameter n +package p + +fun foo() = X.A + +enum class X(n: Int) { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumSuperclass.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumSuperclass.kt new file mode 100644 index 00000000000..c8941c3aff4 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumSuperclass.kt @@ -0,0 +1,8 @@ +// "Create enum constant 'A'" "true" +package p + +fun foo(): E = E.A + +enum class E { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithQualifier.kt new file mode 100644 index 00000000000..cf05b419cb8 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithQualifier.kt @@ -0,0 +1,10 @@ +// "Create enum constant 'A'" "false" +// ACTION: Create object 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = X.A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithReceiver.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithReceiver.kt new file mode 100644 index 00000000000..cb36a8a3319 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithReceiver.kt @@ -0,0 +1,10 @@ +// "Create enum constant 'A'" "false" +// ACTION: Create property 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = X().A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithSuperclass.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithSuperclass.kt new file mode 100644 index 00000000000..e990263f6f3 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithSuperclass.kt @@ -0,0 +1,15 @@ +// "Create enum constant 'A'" "false" +// ACTION: Convert to block body +// ACTION: Create object 'A' +// ERROR: Unresolved reference: A +package p + +fun foo(): X = E.A + +enum class E { + +} + +open class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumNoReceiver.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumNoReceiver.kt new file mode 100644 index 00000000000..9eb038cafb4 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumNoReceiver.kt @@ -0,0 +1,9 @@ +// "Create enum 'A'" "false" +// ACTION: Create object 'A' +// ACTION: Create local variable 'A' +// ACTION: Create parameter 'A' +// ACTION: Create property 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectByQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectByQualifier.kt new file mode 100644 index 00000000000..78f2614754a --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectByQualifier.kt @@ -0,0 +1,5 @@ +// "Create object 'A'" "true" +// ERROR: Unresolved reference: B +package p + +fun foo() = A.B \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectInPackage.kt new file mode 100644 index 00000000000..08e1eb8e74d --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectInPackage.kt @@ -0,0 +1,4 @@ +// "Create object 'A'" "true" +package p + +fun foo() = p.A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectNoReceiver.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectNoReceiver.kt new file mode 100644 index 00000000000..8d046abd31e --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectNoReceiver.kt @@ -0,0 +1,4 @@ +// "Create object 'A'" "true" +package p + +fun foo() = A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithQualifier.kt new file mode 100644 index 00000000000..100cc437d6a --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithQualifier.kt @@ -0,0 +1,8 @@ +// "Create object 'A'" "true" +package p + +fun foo() = X.A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithReceiver.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithReceiver.kt new file mode 100644 index 00000000000..04559204731 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithReceiver.kt @@ -0,0 +1,10 @@ +// "Create object 'A'" "false" +// ACTION: Create property 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = X().A + +class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithSuperclass.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithSuperclass.kt new file mode 100644 index 00000000000..5ee61b7face --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithSuperclass.kt @@ -0,0 +1,8 @@ +// "Create object 'A'" "true" +package p + +fun foo(): X = A + +open class X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithSupertrait.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithSupertrait.kt new file mode 100644 index 00000000000..fc7906503eb --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithSupertrait.kt @@ -0,0 +1,8 @@ +// "Create object 'A'" "true" +package p + +fun foo(): X = A + +trait X { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeTraitByQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeTraitByQualifier.kt new file mode 100644 index 00000000000..e2e61303cd3 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeTraitByQualifier.kt @@ -0,0 +1,5 @@ +// "Create trait 'A'" "true" +// ERROR: Unresolved reference: B +package p + +fun foo() = A.B \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeTraitNoReceiver.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeTraitNoReceiver.kt new file mode 100644 index 00000000000..ba093e03389 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeTraitNoReceiver.kt @@ -0,0 +1,9 @@ +// "Create trait 'A'" "false" +// ACTION: Create object 'A' +// ACTION: Create local variable 'A' +// ACTION: Create parameter 'A' +// ACTION: Create property 'A' +// ERROR: Unresolved reference: A +package p + +fun foo() = A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeUnusedReference.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeUnusedReference.kt new file mode 100644 index 00000000000..d713a9cda41 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeUnusedReference.kt @@ -0,0 +1,5 @@ +// "Create object 'Foo'" "true" + +fun test() { + Foo +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeValDelegateExpressionRuntime.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeValDelegateExpressionRuntime.kt new file mode 100644 index 00000000000..874b77d1508 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeValDelegateExpressionRuntime.kt @@ -0,0 +1,8 @@ +// "Create object 'Foo'" "true" +// DISABLE-ERRORS + +open class B + +class A { + val x: B by Foo +} diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeVarDelegateExpressionRuntime.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeVarDelegateExpressionRuntime.kt new file mode 100644 index 00000000000..e87fb217887 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeVarDelegateExpressionRuntime.kt @@ -0,0 +1,8 @@ +// "Create object 'Foo'" "true" +// DISABLE-ERRORS + +open class B + +class A { + var x: B by Foo +} diff --git a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java index 404260e9516..4de22d69d64 100644 --- a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java @@ -628,7 +628,7 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { @TestMetadata("idea/testData/quickfix/createFromUsage/createClass") @TestDataPath("$PROJECT_ROOT") - @InnerTestClasses({CreateClass.DelegationSpecifier.class, CreateClass.TypeReference.class}) + @InnerTestClasses({CreateClass.DelegationSpecifier.class, CreateClass.ImportDirective.class, CreateClass.ReferenceExpression.class, CreateClass.TypeReference.class}) @RunWith(JUnit3RunnerWithInners.class) public static class CreateClass extends AbstractQuickFixTest { public void testAllFilesPresentInCreateClass() throws Exception { @@ -656,6 +656,270 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ImportDirective extends AbstractQuickFixTest { + public void testAllFilesPresentInImportDirective() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/createFromUsage/createClass/importDirective"), Pattern.compile("^before(\\w+)\\.kt$"), true); + } + + @TestMetadata("beforeAnnotationInPackage.kt") + public void testAnnotationInPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeAnnotationInPackage.kt"); + doTest(fileName); + } + + @TestMetadata("beforeAnnotationWithQualifier.kt") + public void testAnnotationWithQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeAnnotationWithQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeClassInPackage.kt") + public void testClassInPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeClassInPackage.kt"); + doTest(fileName); + } + + @TestMetadata("beforeClassWithQualifier.kt") + public void testClassWithQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeClassWithQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumEntryInEnum.kt") + public void testEnumEntryInEnum() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInEnum.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumEntryInPackage.kt") + public void testEnumEntryInPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInPackage.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumEntryWithQualifier.kt") + public void testEnumEntryWithQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryWithQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumInPackage.kt") + public void testEnumInPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumInPackage.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumWithQualifier.kt") + public void testEnumWithQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumWithQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeObjectInPackage.kt") + public void testObjectInPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeObjectInPackage.kt"); + doTest(fileName); + } + + @TestMetadata("beforeObjectWithQualifier.kt") + public void testObjectWithQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeObjectWithQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeTraitInPackage.kt") + public void testTraitInPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeTraitInPackage.kt"); + doTest(fileName); + } + + @TestMetadata("beforeTraitWithQualifier.kt") + public void testTraitWithQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeTraitWithQualifier.kt"); + doTest(fileName); + } + } + + @TestMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ReferenceExpression extends AbstractQuickFixTest { + public void testAllFilesPresentInReferenceExpression() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/createFromUsage/createClass/referenceExpression"), Pattern.compile("^before(\\w+)\\.kt$"), true); + } + + @TestMetadata("beforeAnnotationNoReceiver.kt") + public void testAnnotationNoReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeAnnotationNoReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("beforeClassByNestedQualifier.kt") + public void testClassByNestedQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassByNestedQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeClassByQualifier.kt") + public void testClassByQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassByQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeClassInPackage.kt") + public void testClassInPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassInPackage.kt"); + doTest(fileName); + } + + @TestMetadata("beforeClassNoReceiver.kt") + public void testClassNoReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassNoReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("beforeClassWithQualifier.kt") + public void testClassWithQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassWithQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeClassWithReceiver.kt") + public void testClassWithReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeClassWithReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumByQualifier.kt") + public void testEnumByQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumByQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumEntryNoReceiver.kt") + public void testEnumEntryNoReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryNoReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumEntryWithEnumQualifier.kt") + public void testEnumEntryWithEnumQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumEntryWithEnumQualifierAndParams.kt") + public void testEnumEntryWithEnumQualifierAndParams() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumQualifierAndParams.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumEntryWithEnumSuperclass.kt") + public void testEnumEntryWithEnumSuperclass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithEnumSuperclass.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumEntryWithQualifier.kt") + public void testEnumEntryWithQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumEntryWithReceiver.kt") + public void testEnumEntryWithReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumEntryWithSuperclass.kt") + public void testEnumEntryWithSuperclass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumEntryWithSuperclass.kt"); + doTest(fileName); + } + + @TestMetadata("beforeEnumNoReceiver.kt") + public void testEnumNoReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeEnumNoReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("beforeObjectByQualifier.kt") + public void testObjectByQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectByQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeObjectInPackage.kt") + public void testObjectInPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectInPackage.kt"); + doTest(fileName); + } + + @TestMetadata("beforeObjectNoReceiver.kt") + public void testObjectNoReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectNoReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("beforeObjectWithQualifier.kt") + public void testObjectWithQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeObjectWithReceiver.kt") + public void testObjectWithReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("beforeObjectWithSuperclass.kt") + public void testObjectWithSuperclass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithSuperclass.kt"); + doTest(fileName); + } + + @TestMetadata("beforeObjectWithSupertrait.kt") + public void testObjectWithSupertrait() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeObjectWithSupertrait.kt"); + doTest(fileName); + } + + @TestMetadata("beforeTraitByQualifier.kt") + public void testTraitByQualifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeTraitByQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeTraitNoReceiver.kt") + public void testTraitNoReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeTraitNoReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("beforeUnusedReference.kt") + public void testUnusedReference() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeUnusedReference.kt"); + doTest(fileName); + } + + @TestMetadata("beforeValDelegateExpressionRuntime.kt") + public void testValDelegateExpressionRuntime() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeValDelegateExpressionRuntime.kt"); + doTest(fileName); + } + + @TestMetadata("beforeVarDelegateExpressionRuntime.kt") + public void testVarDelegateExpressionRuntime() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/beforeVarDelegateExpressionRuntime.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/createFromUsage/createClass/typeReference") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)