Skip to content

Commit bdc5472

Browse files
authored
Merge pull request #20 from cawolf/fix-18-dont-regenerate
Fixes #18: do not regenerate existing mocks
2 parents eb7b52b + 2a3bb21 commit bdc5472

File tree

7 files changed

+71
-24
lines changed

7 files changed

+71
-24
lines changed

src/main/kotlin/de/cawolf/quickmock/intention/QuickMockCreator.kt

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@ import com.intellij.openapi.components.ServiceManager
66
import com.intellij.openapi.editor.Editor
77
import com.intellij.openapi.project.Project
88
import com.intellij.psi.PsiElement
9-
import com.intellij.psi.PsiWhiteSpace
109
import com.intellij.psi.util.PsiTreeUtil
1110
import com.intellij.util.IncorrectOperationException
12-
import com.jetbrains.php.lang.psi.PhpPsiElementFactory
1311
import com.jetbrains.php.lang.psi.elements.*
1412
import de.cawolf.quickmock.Settings
1513
import 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
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package de.cawolf.quickmock.intention.service
2+
3+
import com.intellij.openapi.project.Project
4+
import com.intellij.psi.PsiElement
5+
import com.intellij.psi.PsiWhiteSpace
6+
import com.jetbrains.php.lang.psi.PhpPsiElementFactory
7+
8+
class AddNewlineBefore {
9+
fun invoke(psiElement: PsiElement, project: Project) {
10+
val currentMethod = psiElement.parent
11+
currentMethod.addBefore(PhpPsiElementFactory.createFromText(project, PsiWhiteSpace::class.java, "\n")!!, psiElement)
12+
}
13+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package de.cawolf.quickmock.intention.service
2+
3+
import com.intellij.psi.PsiElement
4+
import com.intellij.psi.util.PsiTreeUtil
5+
import com.jetbrains.php.lang.psi.elements.Method
6+
import com.jetbrains.php.lang.psi.elements.NewExpression
7+
import com.jetbrains.php.lang.psi.elements.Parameter
8+
9+
class ConstructorParameters {
10+
fun get(psiElementAtCursor: PsiElement): MutableList<Parameter> {
11+
val newExpression = PsiTreeUtil.getParentOfType(psiElementAtCursor, NewExpression::class.java) as NewExpression
12+
val classReference = newExpression.classReference
13+
val method = classReference?.resolve() as Method
14+
return method.parameters.toMutableList()
15+
}
16+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package de.cawolf.quickmock.intention.service
2+
3+
import com.jetbrains.php.lang.psi.elements.Parameter
4+
import com.jetbrains.php.lang.psi.elements.PhpClass
5+
6+
class ExistingMocks {
7+
fun filter(parameter: Parameter, clazz: PhpClass): Boolean {
8+
val existingField = clazz.findFieldByName(parameter.name, false)
9+
val isPrivate = existingField?.modifier?.isPrivate
10+
return isPrivate == null || !isPrivate
11+
}
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package de.cawolf.quickmock.intention.service
2+
3+
import com.intellij.psi.PsiElement
4+
import com.intellij.psi.PsiWhiteSpace
5+
6+
class RemoveWhitespaceBeforeConstruct {
7+
fun invoke(constructStatement: PsiElement) {
8+
if (constructStatement.parent.prevSibling is PsiWhiteSpace) {
9+
constructStatement.parent.prevSibling.delete()
10+
}
11+
}
12+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,13 @@
4040
<projectService serviceImplementation="de.cawolf.quickmock.intention.service.AddArguments" />
4141
<projectService serviceImplementation="de.cawolf.quickmock.intention.service.AddMissingUseStatements" />
4242
<projectService serviceImplementation="de.cawolf.quickmock.intention.service.AddMockAssignment" />
43+
<projectService serviceImplementation="de.cawolf.quickmock.intention.service.AddNewlineBefore" />
4344
<projectService serviceImplementation="de.cawolf.quickmock.intention.service.AddProperty" />
45+
<projectService serviceImplementation="de.cawolf.quickmock.intention.service.ConstructorParameters" />
46+
<projectService serviceImplementation="de.cawolf.quickmock.intention.service.ExistingMocks" />
4447
<projectService serviceImplementation="de.cawolf.quickmock.intention.service.ReformatTestcase" />
4548
<projectService serviceImplementation="de.cawolf.quickmock.intention.service.RemoveSurroundingWhitespaces" />
49+
<projectService serviceImplementation="de.cawolf.quickmock.intention.service.RemoveWhitespaceBeforeConstruct" />
4650
</extensions>
4751

4852
<depends>com.jetbrains.php</depends>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
public function test()
22
{
3-
$subjectUnderTest = new Subject(<spot></spot>);
3+
$subjectUnderTest = <spot>new Subject()</spot>;
44
}

0 commit comments

Comments
 (0)