Skip to content

Commit 031e708

Browse files
authored
Merge pull request #184 from domaframework/fix/custom-function-code-completion
Fix Custom Function Code Completion
2 parents 1432342 + 8584109 commit 031e708

File tree

6 files changed

+87
-68
lines changed

6 files changed

+87
-68
lines changed

src/main/kotlin/org/domaframework/doma/intellij/common/sql/directive/StaticDirectiveHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class StaticDirectiveHandler(
5353
}
5454
if (handleResult) return true
5555

56-
if (element.prevSibling?.elementType == SqlTypes.AT_SIGN) {
56+
if (PsiTreeUtil.prevLeaf(element)?.elementType == SqlTypes.AT_SIGN) {
5757
// Built-in function completion
5858
handleResult = builtInDirectiveHandler(element, result)
5959
}

src/main/kotlin/org/domaframework/doma/intellij/common/sql/directive/collector/StaticBuildFunctionCollector.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.domaframework.doma.intellij.common.sql.directive.collector
1717

18+
import com.intellij.codeInsight.lookup.AutoCompletionPolicy
1819
import com.intellij.codeInsight.lookup.LookupElement
1920
import com.intellij.codeInsight.lookup.LookupElementBuilder
2021
import com.intellij.openapi.project.Project
@@ -74,6 +75,7 @@ class StaticBuildFunctionCollector(
7475
})",
7576
true,
7677
).withTypeText(it.returnType?.presentableText ?: "void")
78+
.withAutoCompletionPolicy(AutoCompletionPolicy.ALWAYS_AUTOCOMPLETE)
7779
}
7880
}
7981

src/test/kotlin/org/domaframework/doma/intellij/complate/sql/SqlCompleteTest.kt

Lines changed: 77 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -22,50 +22,51 @@ import org.domaframework.doma.intellij.inspection.sql.inspector.SqlBindVariableV
2222
* Code completion testing in SQL
2323
*/
2424
class SqlCompleteTest : DomaSqlTest() {
25-
private val testDapName = "SqlCompleteTestDao"
25+
private val testDaoName = "SqlCompleteTestDao"
2626

2727
override fun setUp() {
2828
super.setUp()
2929
addDaoJavaFile(
30-
"$testDapName.java",
30+
"$testDaoName.java",
3131
)
3232
addSqlFile(
33-
"$testDapName/completeDaoArgument.sql",
34-
"$testDapName/completeInstancePropertyFromDaoArgumentClass.sql",
35-
"$testDapName/completeJavaPackageClass.sql",
36-
"$testDapName/completeDirective.sql",
37-
"$testDapName/completeBatchInsert.sql",
38-
"$testDapName/completeStaticPropertyFromStaticPropertyCall.sql",
39-
"$testDapName/completePropertyAfterStaticPropertyCall.sql",
40-
"$testDapName/completeBuiltinFunction.sql",
41-
"$testDapName/completeDirectiveInsideIf.sql",
42-
"$testDapName/completeDirectiveInsideElseIf.sql",
43-
"$testDapName/completeDirectiveInsideFor.sql",
44-
"$testDapName/completeDirectiveFieldInsideIf.sql",
45-
"$testDapName/completeDirectiveFieldInsideElseIf.sql",
46-
"$testDapName/completeDirectiveFieldInsideFor.sql",
47-
"$testDapName/completeConcatenationOperator.sql",
48-
"$testDapName/completeComparisonOperator.sql",
49-
"$testDapName/completeParameterFirst.sql",
50-
"$testDapName/completeParameterFirstProperty.sql",
51-
"$testDapName/completeParameterSecond.sql",
52-
"$testDapName/completeParameterSecondProperty.sql",
53-
"$testDapName/completeCallStaticPropertyClassPackage.sql",
54-
"$testDapName/completeCallStaticPropertyClass.sql",
55-
"$testDapName/completeForItemHasNext.sql",
56-
"$testDapName/completeForItemIndex.sql",
57-
"$testDapName/completeOptionalDaoParam.sql",
58-
"$testDapName/completeOptionalStaticProperty.sql",
59-
"$testDapName/completeOptionalByForItem.sql",
60-
"$testDapName/completeOptionalBatchAnnotation.sql",
61-
"$testDapName/completeForDirectiveItem.sql",
62-
"$testDapName/completeImplementCustomFunction.sql",
33+
"$testDaoName/completeDaoArgument.sql",
34+
"$testDaoName/completeInstancePropertyFromDaoArgumentClass.sql",
35+
"$testDaoName/completeJavaPackageClass.sql",
36+
"$testDaoName/completeDirective.sql",
37+
"$testDaoName/completeBatchInsert.sql",
38+
"$testDaoName/completeStaticPropertyFromStaticPropertyCall.sql",
39+
"$testDaoName/completePropertyAfterStaticPropertyCall.sql",
40+
"$testDaoName/completeBuiltinFunction.sql",
41+
"$testDaoName/completeDirectiveInsideIf.sql",
42+
"$testDaoName/completeDirectiveInsideElseIf.sql",
43+
"$testDaoName/completeDirectiveInsideFor.sql",
44+
"$testDaoName/completeDirectiveFieldInsideIf.sql",
45+
"$testDaoName/completeDirectiveFieldInsideElseIf.sql",
46+
"$testDaoName/completeDirectiveFieldInsideFor.sql",
47+
"$testDaoName/completeConcatenationOperator.sql",
48+
"$testDaoName/completeComparisonOperator.sql",
49+
"$testDaoName/completeParameterFirst.sql",
50+
"$testDaoName/completeParameterFirstProperty.sql",
51+
"$testDaoName/completeParameterSecond.sql",
52+
"$testDaoName/completeParameterSecondProperty.sql",
53+
"$testDaoName/completeCallStaticPropertyClassPackage.sql",
54+
"$testDaoName/completeCallStaticPropertyClass.sql",
55+
"$testDaoName/completeForItemHasNext.sql",
56+
"$testDaoName/completeForItemIndex.sql",
57+
"$testDaoName/completeOptionalDaoParam.sql",
58+
"$testDaoName/completeOptionalStaticProperty.sql",
59+
"$testDaoName/completeOptionalByForItem.sql",
60+
"$testDaoName/completeOptionalBatchAnnotation.sql",
61+
"$testDaoName/completeForDirectiveItem.sql",
62+
"$testDaoName/completeImplementCustomFunction.sql",
63+
"$testDaoName/completeNotImplementCustomFunction.sql",
6364
)
6465
myFixture.enableInspections(SqlBindVariableValidInspector())
6566
}
6667

6768
fun testCompleteDaoArgument() {
68-
val sqlFile = findSqlFile("$testDapName/completeDaoArgument.sql")
69+
val sqlFile = findSqlFile("$testDaoName/completeDaoArgument.sql")
6970
assertNotNull("Not Found SQL File", sqlFile)
7071
if (sqlFile == null) return
7172

@@ -87,7 +88,7 @@ class SqlCompleteTest : DomaSqlTest() {
8788

8889
fun testCompleteInstancePropertyFromDaoArgumentClass() {
8990
innerDirectiveCompleteTest(
90-
"$testDapName/completeInstancePropertyFromDaoArgumentClass.sql",
91+
"$testDaoName/completeInstancePropertyFromDaoArgumentClass.sql",
9192
listOf(
9293
"employeeId",
9394
"employeeName",
@@ -102,7 +103,7 @@ class SqlCompleteTest : DomaSqlTest() {
102103

103104
fun testCompleteJavaPackageClass() {
104105
innerDirectiveCompleteTest(
105-
"$testDapName/completeJavaPackageClass.sql",
106+
"$testDaoName/completeJavaPackageClass.sql",
106107
listOf(
107108
"CASE_INSENSITIVE_ORDER",
108109
"toString()",
@@ -118,7 +119,7 @@ class SqlCompleteTest : DomaSqlTest() {
118119

119120
fun testCompleteForItemHasNext() {
120121
innerDirectiveCompleteTest(
121-
"$testDapName/completeForItemHasNext.sql",
122+
"$testDaoName/completeForItemHasNext.sql",
122123
emptyList(),
123124
listOf(
124125
"get()",
@@ -137,7 +138,7 @@ class SqlCompleteTest : DomaSqlTest() {
137138

138139
fun testCompleteForItemIndex() {
139140
innerDirectiveCompleteTest(
140-
"$testDapName/completeForItemIndex.sql",
141+
"$testDaoName/completeForItemIndex.sql",
141142
emptyList(),
142143
listOf(
143144
"get()",
@@ -157,7 +158,7 @@ class SqlCompleteTest : DomaSqlTest() {
157158

158159
fun testCompleteDirective() {
159160
innerDirectiveCompleteTest(
160-
"$testDapName/completeDirective.sql",
161+
"$testDaoName/completeDirective.sql",
161162
listOf(
162163
"elseif",
163164
"else",
@@ -176,7 +177,7 @@ class SqlCompleteTest : DomaSqlTest() {
176177

177178
fun testCompleteBatchInsert() {
178179
innerDirectiveCompleteTest(
179-
"$testDapName/completeBatchInsert.sql",
180+
"$testDaoName/completeBatchInsert.sql",
180181
listOf(
181182
"employeeId",
182183
"employeeName",
@@ -191,7 +192,7 @@ class SqlCompleteTest : DomaSqlTest() {
191192

192193
fun testCompleteStaticPropertyFromStaticPropertyCall() {
193194
innerDirectiveCompleteTest(
194-
"$testDapName/completeStaticPropertyFromStaticPropertyCall.sql",
195+
"$testDaoName/completeStaticPropertyFromStaticPropertyCall.sql",
195196
listOf(
196197
"members",
197198
"projectNumber",
@@ -208,7 +209,7 @@ class SqlCompleteTest : DomaSqlTest() {
208209

209210
fun testCompleteCallStaticPropertyClassPackage() {
210211
innerDirectiveCompleteTest(
211-
"$testDapName/completeCallStaticPropertyClassPackage.sql",
212+
"$testDaoName/completeCallStaticPropertyClassPackage.sql",
212213
listOf(
213214
"doma",
214215
"com",
@@ -220,7 +221,7 @@ class SqlCompleteTest : DomaSqlTest() {
220221
)
221222

222223
innerDirectiveCompleteTest(
223-
"$testDapName/completeCallStaticPropertyClass.sql",
224+
"$testDaoName/completeCallStaticPropertyClass.sql",
224225
listOf(
225226
"doma.example.entity.Employee",
226227
"doma.example.entity.EmployeeSummary",
@@ -245,7 +246,7 @@ class SqlCompleteTest : DomaSqlTest() {
245246

246247
fun testCompletePropertyAfterStaticPropertyCall() {
247248
innerDirectiveCompleteTest(
248-
"$testDapName/completePropertyAfterStaticPropertyCall.sql",
249+
"$testDaoName/completePropertyAfterStaticPropertyCall.sql",
249250
listOf(
250251
"managerId",
251252
),
@@ -258,7 +259,7 @@ class SqlCompleteTest : DomaSqlTest() {
258259

259260
fun testCompleteBuiltinFunction() {
260261
innerDirectiveCompleteTest(
261-
"$testDapName/completeBuiltinFunction.sql",
262+
"$testDaoName/completeBuiltinFunction.sql",
262263
listOf(
263264
"isEmpty()",
264265
"isNotEmpty()",
@@ -278,35 +279,35 @@ class SqlCompleteTest : DomaSqlTest() {
278279

279280
fun testCompleteDirectiveInside() {
280281
innerDirectiveCompleteTest(
281-
"$testDapName/completeDirectiveInsideIf.sql",
282+
"$testDaoName/completeDirectiveInsideIf.sql",
282283
listOf("employee"),
283284
listOf("project"),
284285
)
285286
innerDirectiveCompleteTest(
286-
"$testDapName/completeDirectiveInsideElseIf.sql",
287+
"$testDaoName/completeDirectiveInsideElseIf.sql",
287288
listOf("employee", "project"),
288289
emptyList(),
289290
)
290291
innerDirectiveCompleteTest(
291-
"$testDapName/completeDirectiveInsideFor.sql",
292+
"$testDaoName/completeDirectiveInsideFor.sql",
292293
listOf("project"),
293294
listOf("employee", "member", "%for"),
294295
)
295296
}
296297

297298
fun testCompleteDirectiveFieldInside() {
298299
innerDirectiveCompleteTest(
299-
"$testDapName/completeDirectiveFieldInsideIf.sql",
300+
"$testDaoName/completeDirectiveFieldInsideIf.sql",
300301
listOf("startsWith()"),
301302
listOf("employee", "project", "toLowCase"),
302303
)
303304
innerDirectiveCompleteTest(
304-
"$testDapName/completeDirectiveFieldInsideElseIf.sql",
305+
"$testDaoName/completeDirectiveFieldInsideElseIf.sql",
305306
listOf("department"),
306307
listOf("employee", "project"),
307308
)
308309
innerDirectiveCompleteTest(
309-
"$testDapName/completeDirectiveFieldInsideFor.sql",
310+
"$testDaoName/completeDirectiveFieldInsideFor.sql",
310311
listOf(
311312
"projectId",
312313
"projectName",
@@ -323,79 +324,79 @@ class SqlCompleteTest : DomaSqlTest() {
323324

324325
fun testCompleteConcatenationOperator() {
325326
innerDirectiveCompleteTest(
326-
"$testDapName/completeConcatenationOperator.sql",
327+
"$testDaoName/completeConcatenationOperator.sql",
327328
listOf("rank"),
328329
listOf("employee", "employeeId", "department"),
329330
)
330331

331332
innerDirectiveCompleteTest(
332-
"$testDapName/completeComparisonOperator.sql",
333+
"$testDaoName/completeComparisonOperator.sql",
333334
listOf("rank"),
334335
listOf("employee", "employeeId", "department"),
335336
)
336337
}
337338

338339
fun testCompleteParameter() {
339340
innerDirectiveCompleteTest(
340-
"$testDapName/completeParameterFirst.sql",
341+
"$testDaoName/completeParameterFirst.sql",
341342
listOf("employee"),
342343
listOf("employeeId", "department", "rank", "startWith"),
343344
)
344345

345346
innerDirectiveCompleteTest(
346-
"$testDapName/completeParameterFirstProperty.sql",
347+
"$testDaoName/completeParameterFirstProperty.sql",
347348
listOf("employeeId", "department", "rank"),
348349
listOf("employee"),
349350
)
350351

351352
innerDirectiveCompleteTest(
352-
"$testDapName/completeParameterSecond.sql",
353+
"$testDaoName/completeParameterSecond.sql",
353354
listOf("employee"),
354355
listOf("employeeId", "department", "rank", "startWith"),
355356
)
356357

357358
innerDirectiveCompleteTest(
358-
"$testDapName/completeParameterSecondProperty.sql",
359+
"$testDaoName/completeParameterSecondProperty.sql",
359360
listOf("managerId"),
360361
listOf("employee", "department", "rank"),
361362
)
362363
}
363364

364365
fun testCompleteOptionalDaoParam() {
365366
innerDirectiveCompleteTest(
366-
"$testDapName/completeOptionalDaoParam.sql",
367+
"$testDaoName/completeOptionalDaoParam.sql",
367368
listOf("manager", "projectNumber", "getFirstEmployee()"),
368369
listOf("get()", "orElseGet()", "isPresent()"),
369370
)
370371
}
371372

372373
fun testCompleteOptionalStaticProperty() {
373374
innerDirectiveCompleteTest(
374-
"$testDapName/completeOptionalStaticProperty.sql",
375+
"$testDaoName/completeOptionalStaticProperty.sql",
375376
listOf("userId", "userName", "email", "getUserNameFormat()"),
376377
listOf("get()", "orElseGet()", "isPresent()"),
377378
)
378379
}
379380

380381
fun testCompleteOptionalByForItem() {
381382
innerDirectiveCompleteTest(
382-
"$testDapName/completeOptionalByForItem.sql",
383+
"$testDaoName/completeOptionalByForItem.sql",
383384
listOf("manager", "projectNumber", "getFirstEmployee()"),
384385
listOf("get()", "orElseGet()", "isPresent()"),
385386
)
386387
}
387388

388389
fun testCompleteOptionalBatchAnnotation() {
389390
innerDirectiveCompleteTest(
390-
"$testDapName/completeOptionalBatchAnnotation.sql",
391+
"$testDaoName/completeOptionalBatchAnnotation.sql",
391392
listOf("optionalIds"),
392393
listOf("get()", "orElseGet()", "isPresent()", "projectId"),
393394
)
394395
}
395396

396397
fun testCompleteForDirectiveItem() {
397398
innerDirectiveCompleteTest(
398-
"$testDapName/completeForDirectiveItem.sql",
399+
"$testDaoName/completeForDirectiveItem.sql",
399400
listOf("projects", "project", "project_has_next", "project_index"),
400401
listOf("get()", "size()", "toString()", "projectId"),
401402
)
@@ -406,16 +407,26 @@ class SqlCompleteTest : DomaSqlTest() {
406407
mutableListOf("doma.example.expression.TestExpressionFunctions", "doma.example.expression.TestNotExpressionFunctions"),
407408
)
408409
innerDirectiveCompleteTest(
409-
"$testDapName/completeImplementCustomFunction.sql",
410-
listOf("userId()", "userName()", "userAge()", "langCode()", "isGest()", "isBlank()", "isNotBlank()"),
411-
listOf("getId()", "getName()", "getAge()", "getLangCode()", "isManager()"),
410+
"$testDaoName/completeImplementCustomFunction.sql",
411+
listOf("userId()", "userName()", "userAge()"),
412+
listOf(
413+
"getId()",
414+
"getName()",
415+
"getAge()",
416+
"getLangCode()",
417+
"isManager()",
418+
"langCode()",
419+
"isGest()",
420+
"isBlank()",
421+
"isNotBlank()",
422+
),
412423
)
413424
}
414425

415426
fun testCompleteNotImplementCustomFunction() {
416427
innerDirectiveCompleteTest(
417-
"$testDapName/completeImplementCustomFunction.sql",
418-
listOf("isEmpty()", "roundDownTimePart()", "isBlank()", "isNotBlank()"),
428+
"$testDaoName/completeNotImplementCustomFunction.sql",
429+
listOf("isEmpty()", "isBlank()", "isNotBlank()", "roundDownTimePart()"),
419430
listOf(
420431
"userId()",
421432
"userName()",

src/test/testData/src/main/java/doma/example/dao/SqlCompleteTestDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,6 @@ interface SqlCompleteTestDao {
103103
@Select
104104
Employee completeImplementCustomFunction(Project project);
105105

106+
@Select
107+
Employee completeNotImplementCustomFunction(Project project);
106108
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
SELECT * FROM project
22
WHERE project_id = /* project.projectId */0
33
AND manager = /* project.manager.userId */0
4-
AND lang = /* @<caret> */'en'
4+
AND lang = /* @use<caret>() */'en'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
SELECT * FROM project
2+
WHERE project_id = /* project.projectId */0
3+
AND manager = /* project.manager.userId */0
4+
AND lang = /* @<caret> */'en'

0 commit comments

Comments
 (0)