Skip to content

Commit 738d92c

Browse files
author
yevhenii-nadtochii
committed
Rename deepSearch() to findFirstByText()
1 parent 196afeb commit 738d92c

12 files changed

+59
-133
lines changed

java/src/main/kotlin/io/spine/validation/java/MessageValidationCode.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import io.spine.validation.CompilationMessage
5353
import io.spine.validation.Rule
5454
import io.spine.validation.java.psi.addBefore
5555
import io.spine.validation.java.psi.createStatementsFromText
56-
import io.spine.validation.java.psi.deepSearch
56+
import io.spine.validation.java.psi.findFirstByText
5757
import io.spine.validation.java.psi.nested
5858

5959
private typealias MessagePsiClass = PsiClass
@@ -201,7 +201,7 @@ internal class MessageValidationCode(
201201
* If one or more constraints are violated, the injected snippet will throw.
202202
*/
203203
private fun BuilderPsiClass.injectValidationIntoBuildMethod() = method("build").run {
204-
val returningResult = deepSearch("return result;")
204+
val returningResult = findFirstByText("return result;")
205205
val runValidation = elementFactory.createStatementsFromText(
206206
"""
207207
java.util.Optional<io.spine.validate.ValidationError> error = result.validate();

java/src/main/kotlin/io/spine/validation/java/protodata/PsiElementExts.kt

Lines changed: 0 additions & 42 deletions
This file was deleted.

java/src/main/kotlin/io/spine/validation/java/psi/PsiClassExts.kt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
package io.spine.validation.java.psi
2828

2929
import com.intellij.psi.PsiClass
30+
import com.intellij.psi.PsiMethod
31+
import io.spine.tools.psi.java.Environment.elementFactory
3032

3133
/**
3234
* Returns a nested class declared in this [PsiClass].
@@ -40,3 +42,40 @@ public fun PsiClass.nested(simpleName: String): PsiClass {
4042
}
4143
return found
4244
}
45+
46+
/**
47+
* Looks for a method in this [PsiClass] matching the given signature
48+
* specified as [text].
49+
*
50+
* An example usage:
51+
*
52+
* ```
53+
* val method = psiClass.findMethodBySignature("public Builder setName(Name value)")
54+
* ```
55+
*
56+
* @param text The method signature as text.
57+
*/
58+
public fun PsiClass.findMethodBySignature(text: String): PsiMethod? {
59+
val reference = elementFactory.createMethodFromText(text, null)
60+
return findMethodBySignature(reference, false)
61+
}
62+
63+
/**
64+
* Returns a method from this [PsiClass] matching the given signature
65+
* specified as [text].
66+
*
67+
* An example usage:
68+
*
69+
* ```
70+
* val method = psiClass.getMethodBySignature("public Builder setName(Name value)")
71+
* ```
72+
*
73+
* @param text The method signature as text.
74+
* @throws IllegalStateException if this class does not have such a method.
75+
*/
76+
public fun PsiClass.methodWithSignature(text: String): PsiMethod =
77+
findMethodBySignature(text)
78+
?: error(
79+
"Could not find the method with the signature `$text` " +
80+
"in the `$qualifiedName` class."
81+
)

java/src/main/kotlin/io/spine/validation/java/psi/PsiElementExts.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ import com.intellij.psi.PsiElement
3636
* child of this [PsiElement] is checked only when the first child and all its descendants
3737
* are checked.
3838
*/
39-
internal fun PsiElement.deepSearch(
39+
internal fun PsiElement.findFirstByText(
4040
startsWith: String,
4141
contains: String = startsWith
4242
): PsiElement = children.firstNotNullOf { element ->
4343
val text = element.text
4444
when {
4545
!text.contains(contains) -> null
4646
text.startsWith(startsWith) -> element
47-
else -> element.deepSearch(startsWith, contains)
47+
else -> element.findFirstByText(startsWith, contains)
4848
}
4949
}

java/src/main/kotlin/io/spine/validation/java/setonce/PsiClassExts.kt

Lines changed: 0 additions & 68 deletions
This file was deleted.

java/src/main/kotlin/io/spine/validation/java/setonce/SetOnceBooleanField.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import com.intellij.psi.PsiClass
3030
import io.spine.protodata.ast.Field
3131
import io.spine.protodata.ast.PrimitiveType
3232
import io.spine.protodata.java.Expression
33-
import io.spine.protodata.java.AnElement
3433
import io.spine.protodata.java.ClassName
3534
import io.spine.protodata.java.call
3635
import io.spine.protodata.type.TypeSystem
@@ -65,7 +64,7 @@ internal class SetOnceBooleanField(
6564
alterSetter()
6665
alterBytesMerge(
6766
currentValue = Expression(fieldGetter),
68-
readerStartsWith = AnElement("${fieldName}_ = input.readBool();")
67+
readerStartsWith = "${fieldName}_ = input.readBool();"
6968
)
7069
}
7170

java/src/main/kotlin/io/spine/validation/java/setonce/SetOnceBytesField.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import com.google.protobuf.ByteString
3030
import com.intellij.psi.PsiClass
3131
import io.spine.protodata.ast.Field
3232
import io.spine.protodata.ast.PrimitiveType
33-
import io.spine.protodata.java.AnElement
3433
import io.spine.protodata.java.Expression
3534
import io.spine.protodata.java.MethodCall
3635
import io.spine.protodata.type.TypeSystem
@@ -70,7 +69,7 @@ internal class SetOnceBytesField(
7069
alterSetter()
7170
alterBytesMerge(
7271
currentValue = Expression(fieldGetter),
73-
readerStartsWith = AnElement("${fieldName}_ = input.readBytes();")
72+
readerStartsWith = "${fieldName}_ = input.readBytes();"
7473
)
7574
}
7675

java/src/main/kotlin/io/spine/validation/java/setonce/SetOnceEnumField.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import com.google.protobuf.ProtocolMessageEnum
3131
import com.intellij.psi.PsiClass
3232
import io.spine.protodata.ast.Field
3333
import io.spine.protodata.type.TypeSystem
34-
import io.spine.protodata.java.AnElement
3534
import io.spine.protodata.java.Expression
3635
import io.spine.protodata.java.call
3736
import io.spine.protodata.java.javaClassName
@@ -72,7 +71,7 @@ internal class SetOnceEnumField(
7271
alterEnumValueSetter()
7372
alterBytesMerge(
7473
currentValue = Expression("${fieldName}_"),
75-
readerStartsWith = AnElement("${fieldName}_ = input.readEnum();")
74+
readerStartsWith = "${fieldName}_ = input.readEnum();"
7675
)
7776
}
7877

java/src/main/kotlin/io/spine/validation/java/setonce/SetOnceJavaConstraints.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import io.spine.protodata.ast.Field
3434
import io.spine.protodata.ast.TypeName
3535
import io.spine.protodata.java.Expression
3636
import io.spine.protodata.java.InitVar
37-
import io.spine.protodata.java.JavaElement
3837
import io.spine.protodata.java.javaCase
3938
import io.spine.protodata.java.javaClassName
4039
import io.spine.protodata.java.render.findClass
@@ -45,7 +44,8 @@ import io.spine.string.camelCase
4544
import io.spine.tools.code.Java
4645
import io.spine.tools.psi.java.Environment.elementFactory
4746
import io.spine.tools.psi.java.execute
48-
import io.spine.validation.java.protodata.deepSearch
47+
import io.spine.validation.java.psi.findFirstByText
48+
import io.spine.validation.java.psi.methodWithSignature
4949

5050
/**
5151
* Renders Java code to support `(set_once)` option for the given [field].
@@ -151,12 +151,12 @@ internal sealed class SetOnceJavaConstraints<T>(
151151
*/
152152
protected fun PsiClass.alterBytesMerge(
153153
currentValue: Expression<T>,
154-
readerStartsWith: JavaElement,
155-
readerContains: JavaElement = readerStartsWith,
154+
readerStartsWith: String,
155+
readerContains: String = readerStartsWith,
156156
) {
157157

158158
val mergeFromBytes = methodWithSignature(MergeFromBytesSignature).body!!
159-
val fieldReading = mergeFromBytes.deepSearch(readerStartsWith, readerContains)
159+
val fieldReading = mergeFromBytes.findFirstByText(readerStartsWith, readerContains)
160160
val fieldCaseBlock = fieldReading.parent
161161

162162
val previousValue = InitVar("previous", currentValue)

java/src/main/kotlin/io/spine/validation/java/setonce/SetOnceMessageField.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ package io.spine.validation.java.setonce
2929
import com.google.protobuf.Message
3030
import com.intellij.psi.PsiClass
3131
import io.spine.protodata.ast.Field
32-
import io.spine.protodata.java.AnElement
3332
import io.spine.protodata.java.Expression
3433
import io.spine.protodata.java.MethodCall
3534
import io.spine.protodata.java.javaClassName
3635
import io.spine.protodata.type.TypeSystem
3736
import io.spine.tools.psi.java.method
37+
import io.spine.validation.java.psi.methodWithSignature
3838

3939
/**
4040
* Renders Java code to support `(set_once)` option for the given message [field].
@@ -72,8 +72,8 @@ internal class SetOnceMessageField(
7272
alterFieldMerge()
7373
alterBytesMerge(
7474
currentValue = Expression(fieldGetter),
75-
readerStartsWith = AnElement("input.readMessage"),
76-
readerContains = AnElement("${fieldGetterName}FieldBuilder().getBuilder()"),
75+
readerStartsWith = "input.readMessage",
76+
readerContains = "${fieldGetterName}FieldBuilder().getBuilder()"
7777
)
7878
}
7979

java/src/main/kotlin/io/spine/validation/java/setonce/SetOnceNumberField.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ internal class SetOnceNumberField(
9191
alterSetter()
9292
alterBytesMerge(
9393
currentValue = Expression(fieldGetter),
94-
readerStartsWith = AnElement("${fieldName}_ = input.$fieldReader();")
94+
readerStartsWith = "${fieldName}_ = input.$fieldReader();"
9595
)
9696
}
9797

java/src/main/kotlin/io/spine/validation/java/setonce/SetOnceStringField.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ import com.intellij.psi.PsiClass
3232
import com.intellij.psi.PsiIfStatement
3333
import io.spine.protodata.ast.Field
3434
import io.spine.protodata.ast.PrimitiveType
35-
import io.spine.protodata.java.AnElement
3635
import io.spine.protodata.java.Expression
3736
import io.spine.protodata.java.MethodCall
3837
import io.spine.protodata.type.TypeSystem
3938
import io.spine.tools.psi.java.method
40-
import io.spine.validation.java.psi.deepSearch
39+
import io.spine.validation.java.psi.findFirstByText
40+
import io.spine.validation.java.psi.methodWithSignature
4141

4242
/**
4343
* A type that can be either [String] or [ByteString].
@@ -86,7 +86,7 @@ internal class SetOnceStringField(
8686
alterMessageMerge()
8787
alterBytesMerge(
8888
currentValue = Expression(fieldGetter),
89-
readerStartsWith = AnElement("${fieldName}_ = input.readStringRequireUtf8();")
89+
readerStartsWith = "${fieldName}_ = input.readStringRequireUtf8();"
9090
)
9191
}
9292

@@ -141,7 +141,7 @@ internal class SetOnceStringField(
141141
val mergeFromMessage = methodWithSignature(
142142
"public Builder mergeFrom(${declaringMessageClass.canonical} other)"
143143
).body!!
144-
val fieldCheck = mergeFromMessage.deepSearch(
144+
val fieldCheck = mergeFromMessage.findFirstByText(
145145
"if (!other.$fieldGetter.isEmpty())"
146146
) as PsiIfStatement
147147
val fieldProcessing = (fieldCheck.thenBranch!! as PsiBlockStatement).codeBlock

0 commit comments

Comments
 (0)