Create From Usage: Create package by reference expression/type reference
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
package org.jetbrains.jet.plugin.quickfix
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.intention.IntentionAction
|
||||||
|
|
||||||
|
public open class DelegatingIntentionAction(val delegate: IntentionAction): IntentionAction by delegate
|
||||||
+9
-2
@@ -23,6 +23,11 @@ import org.jetbrains.jet.lang.psi.JetReferenceExpression
|
|||||||
import java.util.Arrays
|
import java.util.Arrays
|
||||||
import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression
|
import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression
|
||||||
import org.jetbrains.jet.lang.psi.psiUtil.isDotReceiver
|
import org.jetbrains.jet.lang.psi.psiUtil.isDotReceiver
|
||||||
|
import com.intellij.codeInsight.daemon.quickFix.CreateClassOrPackageFix
|
||||||
|
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||||
|
import java.util.ArrayList
|
||||||
|
import org.jetbrains.jet.utils.addToStdlib.singletonOrEmptyList
|
||||||
|
|
||||||
public object CreateClassFromReferenceExpressionActionFactory : JetIntentionActionsFactory() {
|
public object CreateClassFromReferenceExpressionActionFactory : JetIntentionActionsFactory() {
|
||||||
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
|
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
|
||||||
@@ -32,7 +37,6 @@ public object CreateClassFromReferenceExpressionActionFactory : JetIntentionActi
|
|||||||
val file = refExpr.getContainingFile() as? JetFile ?: return Collections.emptyList()
|
val file = refExpr.getContainingFile() as? JetFile ?: return Collections.emptyList()
|
||||||
|
|
||||||
val name = refExpr.getReferencedName()
|
val name = refExpr.getReferencedName()
|
||||||
if (!name.checkClassName()) return Collections.emptyList()
|
|
||||||
|
|
||||||
val exhaust = refExpr.getAnalysisResults()
|
val exhaust = refExpr.getAnalysisResults()
|
||||||
val context = exhaust.getBindingContext()
|
val context = exhaust.getBindingContext()
|
||||||
@@ -56,7 +60,10 @@ public object CreateClassFromReferenceExpressionActionFactory : JetIntentionActi
|
|||||||
getTargetParentByQualifier(refExpr.getContainingJetFile(), receiverSelector != null, qualifierDescriptor)
|
getTargetParentByQualifier(refExpr.getContainingJetFile(), receiverSelector != null, qualifierDescriptor)
|
||||||
?: return Collections.emptyList()
|
?: return Collections.emptyList()
|
||||||
|
|
||||||
return ClassKind.values()
|
val createPackageAction = refExpr.getCreatePackageFixIfApplicable(targetParent)
|
||||||
|
if (createPackageAction != null) return Collections.singletonList(createPackageAction)
|
||||||
|
|
||||||
|
return (if (name.checkClassName()) ClassKind.values() else array())
|
||||||
.filter {
|
.filter {
|
||||||
when (it) {
|
when (it) {
|
||||||
ClassKind.ANNOTATION_CLASS -> inImport
|
ClassKind.ANNOTATION_CLASS -> inImport
|
||||||
|
|||||||
+6
-6
@@ -8,22 +8,20 @@ import java.util.Collections
|
|||||||
import org.jetbrains.jet.lang.psi.JetUserType
|
import org.jetbrains.jet.lang.psi.JetUserType
|
||||||
import org.jetbrains.jet.lang.psi.JetFile
|
import org.jetbrains.jet.lang.psi.JetFile
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext
|
import org.jetbrains.jet.lang.resolve.BindingContext
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.getAnalysisResults
|
|
||||||
import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.TypeInfo
|
import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.TypeInfo
|
||||||
import org.jetbrains.jet.lang.types.Variance
|
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.JetDelegatorToSuperClass
|
||||||
import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall
|
|
||||||
import org.jetbrains.jet.lang.psi.JetConstructorCalleeExpression
|
import org.jetbrains.jet.lang.psi.JetConstructorCalleeExpression
|
||||||
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
|
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
|
||||||
|
import org.jetbrains.jet.utils.addToStdlib.singletonOrEmptyList
|
||||||
|
|
||||||
public object CreateClassFromTypeReferenceActionFactory: JetIntentionActionsFactory() {
|
public object CreateClassFromTypeReferenceActionFactory: JetIntentionActionsFactory() {
|
||||||
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
|
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
|
||||||
val userType = QuickFixUtil.getParentElementOfType(diagnostic, javaClass<JetUserType>()) ?: return Collections.emptyList()
|
val userType = QuickFixUtil.getParentElementOfType(diagnostic, javaClass<JetUserType>()) ?: return Collections.emptyList()
|
||||||
val typeArguments = userType.getTypeArgumentsAsTypes()
|
val typeArguments = userType.getTypeArgumentsAsTypes()
|
||||||
|
|
||||||
val name = userType.getReferencedName() ?: return Collections.emptyList()
|
val refExpr = userType.getReferenceExpression() ?: return Collections.emptyList()
|
||||||
|
val name = refExpr.getReferencedName()
|
||||||
|
|
||||||
val typeRefParent = userType.getParent()?.getParent()
|
val typeRefParent = userType.getParent()?.getParent()
|
||||||
if (typeRefParent is JetConstructorCalleeExpression) return Collections.emptyList()
|
if (typeRefParent is JetConstructorCalleeExpression) return Collections.emptyList()
|
||||||
@@ -54,7 +52,8 @@ public object CreateClassFromTypeReferenceActionFactory: JetIntentionActionsFact
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return possibleKinds.map {
|
val createPackageAction = refExpr.getCreatePackageFixIfApplicable(targetParent)
|
||||||
|
val createClassActions = possibleKinds.map {
|
||||||
val classInfo = ClassInfo(
|
val classInfo = ClassInfo(
|
||||||
kind = it,
|
kind = it,
|
||||||
name = name,
|
name = name,
|
||||||
@@ -64,5 +63,6 @@ public object CreateClassFromTypeReferenceActionFactory: JetIntentionActionsFact
|
|||||||
)
|
)
|
||||||
CreateClassFromUsageFix(userType, classInfo)
|
CreateClassFromUsageFix(userType, classInfo)
|
||||||
}
|
}
|
||||||
|
return createPackageAction.singletonOrEmptyList() + createClassActions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+31
-4
@@ -6,9 +6,7 @@ import com.intellij.psi.PsiElement
|
|||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor
|
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor
|
||||||
import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil
|
import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil
|
||||||
import com.intellij.openapi.module.ModuleUtilCore
|
|
||||||
import com.intellij.psi.JavaPsiFacade
|
import com.intellij.psi.JavaPsiFacade
|
||||||
import org.jetbrains.jet.lang.psi.JetElement
|
|
||||||
import org.jetbrains.jet.lang.psi.JetExpression
|
import org.jetbrains.jet.lang.psi.JetExpression
|
||||||
import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.guessTypes
|
import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.guessTypes
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext
|
import org.jetbrains.jet.lang.resolve.BindingContext
|
||||||
@@ -21,16 +19,23 @@ import org.jetbrains.jet.lang.types.Variance
|
|||||||
import org.jetbrains.jet.lang.psi.Call
|
import org.jetbrains.jet.lang.psi.Call
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.Qualifier
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.Qualifier
|
||||||
import org.jetbrains.jet.plugin.util.ProjectRootsUtil
|
|
||||||
import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.noSubstitutions
|
import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.noSubstitutions
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
|
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
|
||||||
|
import com.intellij.codeInsight.intention.IntentionAction
|
||||||
|
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
|
||||||
|
import com.intellij.codeInsight.daemon.quickFix.CreateClassOrPackageFix
|
||||||
|
import org.jetbrains.jet.plugin.quickfix.DelegatingIntentionAction
|
||||||
|
import org.jetbrains.jet.plugin.JetBundle
|
||||||
import com.intellij.psi.PsiPackage
|
import com.intellij.psi.PsiPackage
|
||||||
import org.jetbrains.jet.plugin.quickfix.createFromUsage.createClass.canRefactor
|
|
||||||
import com.intellij.psi.PsiDirectory
|
import com.intellij.psi.PsiDirectory
|
||||||
|
import org.jetbrains.jet.lang.psi.JetElement
|
||||||
|
import org.jetbrains.jet.plugin.util.ProjectRootsUtil
|
||||||
|
|
||||||
private fun String.checkClassName(): Boolean = isNotEmpty() && Character.isUpperCase(first())
|
private fun String.checkClassName(): Boolean = isNotEmpty() && Character.isUpperCase(first())
|
||||||
|
|
||||||
|
private fun String.checkPackageName(): Boolean = isNotEmpty() && Character.isLowerCase(first())
|
||||||
|
|
||||||
private fun getTargetParentByQualifier(
|
private fun getTargetParentByQualifier(
|
||||||
file: JetFile,
|
file: JetFile,
|
||||||
isQualified: Boolean,
|
isQualified: Boolean,
|
||||||
@@ -100,3 +105,25 @@ private fun PsiElement.canRefactor(): Boolean {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun JetSimpleNameExpression.getCreatePackageFixIfApplicable(targetParent: PsiElement): IntentionAction? {
|
||||||
|
val name = getReferencedName()
|
||||||
|
if (!name.checkPackageName()) return null
|
||||||
|
|
||||||
|
val basePackage: PsiPackage = when (targetParent) {
|
||||||
|
is JetFile -> JavaPsiFacade.getInstance(targetParent.getProject()).findPackage(targetParent.getPackageFqName().asString())
|
||||||
|
is PsiPackage -> targetParent : PsiPackage
|
||||||
|
else -> null
|
||||||
|
} ?: return null
|
||||||
|
|
||||||
|
val baseName = basePackage.getQualifiedName()
|
||||||
|
val fullName = if (baseName.isNotEmpty()) "$baseName.$name" else name
|
||||||
|
|
||||||
|
val javaFix = CreateClassOrPackageFix.createFix(fullName, getResolveScope(), this, basePackage, null, null, null) ?: return null
|
||||||
|
|
||||||
|
return object: DelegatingIntentionAction(javaFix) {
|
||||||
|
override fun getFamilyName(): String = JetBundle.message("create.from.usage.family")
|
||||||
|
|
||||||
|
override fun getText(): String = JetBundle.message("create.0.from.usage", "package '${fullName}'")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user