Skip to content

Commit 775efa1

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 6fe1eab + f1a1b6f commit 775efa1

File tree

6 files changed

+32
-15
lines changed

6 files changed

+32
-15
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package de.cawolf.quickmock.intention
22

33
const val RESOURCE_BUNDLE = "QuickMock"
44

5+
const val GENERATED_SUFFIX = "QuickMocked"
6+
57
@JvmField
68
val PRIMITIVES = arrayOf(
79
"string",

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,16 @@ class QuickMockCreator : PsiElementBaseIntentionAction(), IntentionAction {
6464

6565
removeWhitespaceBeforeConstruct.invoke(constructStatement)
6666

67+
val parameterMapByName = ArrayList<Pair<String, Parameter>>(parametersWithoutMocks.size)
6768
for (parameter in parametersWithoutMocks) {
6869
val parameterClassName = parameter.type.toString()
69-
nonPrimitiveMocked = addMissingUseStatements.invoke(namespace, parameterClassName, aliasedUseStatementList.get(parameterClassName)) || nonPrimitiveMocked
70-
addMockAssignment.invoke(project, constructStatement, parameter)
70+
val parameterName = determineParameterName(clazz, parameter)
71+
nonPrimitiveMocked = addMissingUseStatements.invoke(namespace, parameterClassName, aliasedUseStatementList[parameterClassName]) || nonPrimitiveMocked
72+
addMockAssignment.invoke(project, constructStatement, parameter, parameterName)
7173

72-
currentAnchor = addProperty.invoke(project, parameter, currentAnchor, clazz, settings.addDocBlockForMembers)
74+
currentAnchor = addProperty.invoke(project, parameter, parameterName, currentAnchor, clazz, settings.addDocBlockForMembers)
75+
76+
parameterMapByName.add(Pair(parameterName, parameter))
7377
}
7478

7579
if (settings.addDocBlockForMembers && nonPrimitiveMocked) {
@@ -78,7 +82,11 @@ class QuickMockCreator : PsiElementBaseIntentionAction(), IntentionAction {
7882

7983
addNewlineBefore.invoke(constructStatement, project)
8084
removeSurroundingWhitespaces.invoke(parameterList)
81-
addArguments.invoke(parameterList, allParameters, project)
85+
addArguments.invoke(parameterList, parameterMapByName, project)
8286
reformatTestcase.invoke(project, currentAnchor, clazz)
8387
}
88+
89+
private fun determineParameterName(clazz: PhpClass, parameter: Parameter): String {
90+
return if (clazz.findOwnFieldByName(parameter.name, false) == null && clazz.findFieldByName(parameter.name, false) != null) parameter.name + GENERATED_SUFFIX else parameter.name
91+
}
8492
}

src/main/kotlin/de/cawolf/quickmock/intention/service/AddArguments.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import com.jetbrains.php.lang.psi.visitors.PhpElementVisitor
1111
import de.cawolf.quickmock.intention.PRIMITIVES
1212

1313
class AddArguments {
14-
fun invoke(parameterList: PsiElement, parameter: MutableList<Parameter>, project: Project) {
15-
val parameterListType = IElementType.enumerate { it -> it.toString() == "Parameter list" }.first()
16-
val joinedParameterValues = parameter.joinToString { it -> "\$this->${it.name}${addReveal(it)}" }
14+
fun invoke(parameterList: PsiElement, parameter: List<Pair<String, Parameter>>, project: Project) {
15+
val parameterListType = IElementType.enumerate { it.toString() == "Parameter list" }.first()
16+
val joinedParameterValues = parameter.joinToString { "\$this->${it.first}${addReveal(it.second)}" }
1717
val newParameterList = createFirstFromText(project, parameterListType, "f($joinedParameterValues);")
1818
parameterList.replace(newParameterList)
1919
}

src/main/kotlin/de/cawolf/quickmock/intention/service/AddMockAssignment.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import com.jetbrains.php.lang.psi.PhpPsiElementFactory
77
import com.jetbrains.php.lang.psi.elements.Parameter
88

99
class AddMockAssignment {
10-
fun invoke(project: Project, constructStatement: PsiElement, parameter: Parameter) {
11-
val whitespaceType = IElementType.enumerate { it -> it.toString() == "WHITE_SPACE" }.first()
10+
fun invoke(project: Project, constructStatement: PsiElement, parameter: Parameter, parameterName: String) {
11+
val whitespaceType = IElementType.enumerate { it.toString() == "WHITE_SPACE" }.first()
1212
val mockAssignment = PhpPsiElementFactory.createStatement(
1313
project,
14-
"\$this->${parameter.name} = ${mockValueFromType(parameter)};"
14+
"\$this->$parameterName = ${mockValueFromType(parameter)};"
1515
)
1616

1717
val currentMethod = constructStatement.parent

src/main/kotlin/de/cawolf/quickmock/intention/service/AddProperty.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import com.jetbrains.php.lang.psi.elements.PhpClass
99
import de.cawolf.quickmock.intention.PRIMITIVES
1010

1111
class AddProperty {
12-
fun invoke(project: Project, parameter: Parameter, currentAnchor: PsiElement, clazz: PhpClass, addDocBlockForMembers: Boolean): PsiElement {
13-
val classFieldsType = IElementType.enumerate { it -> it.toString() == "Class fields" }.first()
14-
val docCommentType = IElementType.enumerate { it -> it.toString() == "PhpDocComment" }.first()
12+
fun invoke(project: Project, parameter: Parameter, parameterName: String, currentAnchor: PsiElement, clazz: PhpClass, addDocBlockForMembers: Boolean): PsiElement {
13+
val classFieldsType = IElementType.enumerate { it.toString() == "Class fields" }.first()
14+
val docCommentType = IElementType.enumerate { it.toString() == "PhpDocComment" }.first()
1515

16-
val field = PhpPsiElementFactory.createFromText(project, classFieldsType, "class C { private \$${parameter.name}; }")
16+
val field = PhpPsiElementFactory.createFromText(project, classFieldsType, "class C { private \$$parameterName; }")
1717
val fieldAnchor = clazz.addAfter(field, currentAnchor)
1818

1919
if (addDocBlockForMembers) {

src/main/kotlin/de/cawolf/quickmock/intention/service/ExistingMocks.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package de.cawolf.quickmock.intention.service
22

3+
import com.jetbrains.php.lang.psi.elements.Field
34
import com.jetbrains.php.lang.psi.elements.Parameter
45
import com.jetbrains.php.lang.psi.elements.PhpClass
6+
import de.cawolf.quickmock.intention.GENERATED_SUFFIX
57

68
class ExistingMocks {
79
fun filter(parameter: Parameter, clazz: PhpClass): Boolean {
8-
val existingField = clazz.findFieldByName(parameter.name, false)
10+
val existingField = clazz.findOwnFieldByName(parameter.name, false)
11+
val existingSuffixedField = clazz.findOwnFieldByName(parameter.name + GENERATED_SUFFIX, false)
12+
return notMocked(existingField) || notMocked(existingSuffixedField)
13+
}
14+
15+
private fun notMocked(existingField: Field?): Boolean {
916
val isPrivate = existingField?.modifier?.isPrivate
1017
return isPrivate == null || !isPrivate
1118
}

0 commit comments

Comments
 (0)