@@ -6,10 +6,8 @@ import com.intellij.openapi.components.ServiceManager
66import com.intellij.openapi.editor.Editor
77import com.intellij.openapi.project.Project
88import com.intellij.psi.PsiElement
9- import com.intellij.psi.PsiWhiteSpace
109import com.intellij.psi.util.PsiTreeUtil
1110import com.intellij.util.IncorrectOperationException
12- import com.jetbrains.php.lang.psi.PhpPsiElementFactory
1311import com.jetbrains.php.lang.psi.elements.*
1412import de.cawolf.quickmock.Settings
1513import de.cawolf.quickmock.intention.service.*
@@ -22,19 +20,15 @@ class QuickMockCreator : PsiElementBaseIntentionAction(), IntentionAction {
2220 override fun getFamilyName (): String = text
2321
2422 override fun isAvailable (project : Project , editor : Editor , psiElement : PsiElement ): Boolean {
23+ val constructorParameters = ServiceManager .getService(project, ConstructorParameters ::class .java)
2524 val newExpression = PsiTreeUtil .getParentOfType(psiElement, NewExpression ::class .java)
2625 return newExpression is NewExpression
2726 && newExpression.classReference?.resolve() is Method
28- && ( newExpression.parameterList? .children?.isEmpty() ? : false )
27+ && constructorParameters.get(psiElement).count() != newExpression.parameterList!! .children.count( )
2928 }
3029
3130 @Throws(IncorrectOperationException ::class )
3231 override fun invoke (project : Project , editor : Editor , psiElement : PsiElement ) {
33- val parameters = getConstructorParameters(psiElement)
34- if (parameters.size == 0 ) {
35- return // simple constructor without parameters - nothing to do
36- }
37-
3832 // init and safeguards: do not proceed if the current edited test class is not parsing correctly
3933 val namespace = PsiTreeUtil .getParentOfType(psiElement, PhpNamespace ::class .java)
4034 ? : return
@@ -54,13 +48,21 @@ class QuickMockCreator : PsiElementBaseIntentionAction(), IntentionAction {
5448 val addProperty = ServiceManager .getService(project, AddProperty ::class .java)
5549 val reformatTestcase = ServiceManager .getService(project, ReformatTestcase ::class .java)
5650 val removeSurroundingWhitespaces = ServiceManager .getService(project, RemoveSurroundingWhitespaces ::class .java)
51+ val constructorParameters = ServiceManager .getService(project, ConstructorParameters ::class .java)
52+ val addNewlineBefore = ServiceManager .getService(project, AddNewlineBefore ::class .java)
53+ val removeWhitespaceBeforeConstruct = ServiceManager .getService(project, RemoveWhitespaceBeforeConstruct ::class .java)
54+ val existingMocks = ServiceManager .getService(project, ExistingMocks ::class .java)
5755 val settings = ServiceManager .getService(Settings ::class .java)
5856
5957 // actually create mocks
6058 var currentAnchor = beginningOfClass
6159 var nonPrimitiveMocked = false
60+ val allParameters = constructorParameters.get(psiElement)
61+ val parametersWithoutMocks = allParameters.filter { parameter -> existingMocks.filter(parameter, clazz) }
6262
63- for (parameter in parameters) {
63+ removeWhitespaceBeforeConstruct.invoke(constructStatement)
64+
65+ for (parameter in parametersWithoutMocks) {
6466 nonPrimitiveMocked = addMissingUseStatements.invoke(namespace, parameter.type.toString()) || nonPrimitiveMocked
6567 addMockAssignment.invoke(project, constructStatement, parameter)
6668
@@ -71,21 +73,9 @@ class QuickMockCreator : PsiElementBaseIntentionAction(), IntentionAction {
7173 addMissingUseStatements.invoke(namespace, " \\ Prophecy\\ Prophecy\\ ObjectProphecy" )
7274 }
7375
74- addWhitespaceBetweenMockAssignmentsAnConstructor (constructStatement, project)
76+ addNewlineBefore.invoke (constructStatement, project)
7577 removeSurroundingWhitespaces.invoke(parameterList)
76- addArguments.invoke(parameterList, parameters , project)
78+ addArguments.invoke(parameterList, allParameters , project)
7779 reformatTestcase.invoke(project, currentAnchor, clazz)
7880 }
79-
80- private fun addWhitespaceBetweenMockAssignmentsAnConstructor (constructStatement : PsiElement , project : Project ) {
81- val currentMethod = constructStatement.parent
82- currentMethod.addBefore(PhpPsiElementFactory .createFromText(project, PsiWhiteSpace ::class .java, " \n " )!! , constructStatement)
83- }
84-
85- private fun getConstructorParameters (psiElementAtCursor : PsiElement ): MutableList <Parameter > {
86- val newExpression = PsiTreeUtil .getParentOfType(psiElementAtCursor, NewExpression ::class .java) as NewExpression
87- val classReference = newExpression.classReference
88- val method = classReference?.resolve() as Method
89- return method.parameters.toMutableList()
90- }
9181}
0 commit comments