Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b0a62ee

Browse files
committed
Add intention to expand wildcard in select statement into column names
1 parent 21c7e89 commit b0a62ee

File tree

5 files changed

+118
-0
lines changed

5 files changed

+118
-0
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.squareup.sqldelight.intellij
2+
3+
import com.alecstrong.sqlite.psi.core.psi.SqliteResultColumn
4+
import com.intellij.lang.annotation.AnnotationHolder
5+
import com.intellij.lang.annotation.Annotator
6+
import com.intellij.psi.PsiElement
7+
import com.squareup.sqldelight.intellij.intentions.ExpandColumnNamesWildcardQuickFix
8+
9+
class SqlDelightIntentionsAnnotator : Annotator {
10+
override fun annotate(element: PsiElement, holder: AnnotationHolder) {
11+
if (element is SqliteResultColumn && element.text == "*") {
12+
holder.createInfoAnnotation(element, null)
13+
.registerFix(ExpandColumnNamesWildcardQuickFix())
14+
}
15+
}
16+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.squareup.sqldelight.intellij.intentions
2+
3+
import com.alecstrong.sqlite.psi.core.psi.SqliteSelectStmt
4+
import com.intellij.codeInsight.intention.impl.BaseIntentionAction
5+
import com.intellij.openapi.application.ApplicationManager
6+
import com.intellij.openapi.command.WriteCommandAction
7+
import com.intellij.openapi.editor.Editor
8+
import com.intellij.openapi.project.Project
9+
import com.intellij.openapi.vfs.VirtualFile
10+
import com.intellij.psi.PsiFile
11+
import com.intellij.psi.PsiManager
12+
import com.squareup.sqldelight.core.lang.SqlDelightFile
13+
import com.squareup.sqldelight.core.lang.util.findChildrenOfType
14+
import org.jetbrains.kotlin.psi.psiUtil.endOffset
15+
import org.jetbrains.kotlin.psi.psiUtil.startOffset
16+
17+
class ExpandColumnNamesWildcardQuickFix : BaseIntentionAction() {
18+
19+
override fun getFamilyName() = INTENTIONS_FAMILY_NAME_REFACTORINGS
20+
21+
override fun getText() = INTENTION_EXPAND_COLUMN_NAMES_TEXT
22+
23+
override fun isAvailable(project: Project, editor: Editor?, psiFile: PsiFile?) = true
24+
25+
override fun invoke(project: Project, editor: Editor, psiFile: PsiFile) {
26+
ApplicationManager.getApplication().invokeLater {
27+
expandWildcard(project, editor, psiFile.virtualFile)
28+
}
29+
}
30+
31+
private fun expandWildcard(project: Project, editor: Editor, virtualFile: VirtualFile) {
32+
object : WriteCommandAction.Simple<Project>(project) {
33+
override fun run() {
34+
val file = PsiManager.getInstance(project).findFile(virtualFile) as SqlDelightFile
35+
val selectStatement = findStatementAtCaret(editor, file.findChildrenOfType())
36+
if (selectStatement.resultColumnList.size == 1 &&
37+
selectStatement.resultColumnList.first().text == "*") {
38+
val wildcard = selectStatement.resultColumnList.first()
39+
val allColumns = selectStatement.queryExposed()
40+
.flatMap { it.columns }
41+
.joinToString(separator = ", ") { it.element.text }
42+
editor.document.replaceString(wildcard.startOffset, wildcard.endOffset, allColumns)
43+
}
44+
}
45+
46+
private fun findStatementAtCaret(
47+
editor: Editor,
48+
statements: Iterable<SqliteSelectStmt>
49+
): SqliteSelectStmt {
50+
val caretOffset = editor.caretModel.offset
51+
return statements.first { caretOffset in it.startOffset..it.endOffset }
52+
}
53+
}.execute()
54+
}
55+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.squareup.sqldelight.intellij.intentions
2+
3+
internal const val INTENTIONS_FAMILY_NAME_REFACTORINGS = "Refactorings"
4+
5+
internal const val INTENTION_EXPAND_COLUMN_NAMES_TEXT = "Expand * into column names"

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
implementationClass="com.alecstrong.sqlite.psi.core.SqliteAnnotator" />
3535
<annotator language="SqlDelight"
3636
implementationClass="com.squareup.sqldelight.intellij.SqlDelightClassNameElementAnnotator" />
37+
<annotator language="SqlDelight"
38+
implementationClass="com.squareup.sqldelight.intellij.SqlDelightIntentionsAnnotator" />
3739
<completion.contributor language="SqlDelight"
3840
implementationClass="com.squareup.sqldelight.intellij.SqlDelightClassCompletionContributor"/>
3941
<gotoDeclarationHandler
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.squareup.sqldelight.intellij.intentions
2+
3+
import com.google.common.truth.Truth.assertThat
4+
import com.squareup.sqldelight.core.lang.SqlDelightFileType
5+
import com.squareup.sqldelight.intellij.SqlDelightFixtureTestCase
6+
7+
class ExpandColumnNamesWildcardQuickFixTest : SqlDelightFixtureTestCase() {
8+
9+
fun testIntentionAvailableOnWildcard() {
10+
myFixture.configureByText(SqlDelightFileType, """
11+
|CREATE TABLE test (
12+
| _id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
13+
| title TEXT NOT NULL
14+
|);
15+
|
16+
|select_all:
17+
|SELECT <caret>*
18+
|FROM test;
19+
""".trimMargin())
20+
21+
assertThat(myFixture.availableIntentions).hasSize(1)
22+
val intention = ExpandColumnNamesWildcardQuickFix()
23+
assertThat(myFixture.availableIntentions.first().text).isEqualTo(intention.text)
24+
}
25+
26+
fun testIntentionNotAvailableOnColumnName() {
27+
myFixture.configureByText(SqlDelightFileType, """
28+
|CREATE TABLE test (
29+
| _id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
30+
| title TEXT NOT NULL
31+
|);
32+
|
33+
|select_all:
34+
|SELECT <caret>_id
35+
|FROM test;
36+
""".trimMargin())
37+
38+
assertThat(myFixture.availableIntentions).isEmpty()
39+
}
40+
}

0 commit comments

Comments
 (0)