Skip to content

Commit

Permalink
Add sqldelight directory suggestions
Browse files Browse the repository at this point in the history
  • Loading branch information
aperfilyev committed Mar 18, 2023
1 parent b0d67a4 commit 926087a
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,11 @@ interface SqlDelightFileIndex {
*/
fun sourceFolders(file: SqlDelightFile, includeDependencies: Boolean = true): Collection<PsiDirectory>

/**
* @return The source roots of sqldelight files.
*/
fun sourceFolders(includeDependencies: Boolean): List<List<SqlDelightSourceFolder>> = emptyList()

companion object {
fun getInstance(module: Module) = SqlDelightProjectService.getInstance(module.project).fileIndex(module)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package app.cash.sqldelight.intellij
import app.cash.sqldelight.core.SqlDelightCompilationUnit
import app.cash.sqldelight.core.SqlDelightDatabaseProperties
import app.cash.sqldelight.core.SqlDelightFileIndex
import app.cash.sqldelight.core.SqlDelightSourceFolder
import app.cash.sqldelight.core.lang.SqlDelightFile
import app.cash.sqldelight.intellij.util.isAncestorOf
import com.intellij.openapi.vfs.LocalFileSystem
Expand Down Expand Up @@ -76,22 +77,20 @@ class FileIndex(
file: VirtualFile,
includeDependencies: Boolean,
): Collection<VirtualFile> {
return properties.compilationUnits.map {
it.sourceFolders
.filter { includeDependencies || !it.dependency }
.mapNotNull { sourceFolder -> sourceFolder.folder.localVirtualFile() }
}.fold(emptySet()) { currentSources: Collection<VirtualFile>, sourceSet ->
if (sourceSet.any { it.isAncestorOf(file) }) {
// File is in this source set.
if (currentSources.isEmpty()) {
return@fold sourceSet
} else {
// File also in another source set! The files available sources is the intersection.
return@fold currentSources.intersect(sourceSet)
return sourceFolders(includeDependencies)
.map { sourceFolders -> sourceFolders.mapNotNull { sourceFolder -> sourceFolder.folder.localVirtualFile() } }
.fold(emptySet()) { currentSources: Collection<VirtualFile>, sourceSet ->
if (sourceSet.any { it.isAncestorOf(file) }) {
// File is in this source set.
if (currentSources.isEmpty()) {
return@fold sourceSet
} else {
// File also in another source set! The files available sources is the intersection.
return@fold currentSources.intersect(sourceSet)
}
}
return@fold currentSources
}
return@fold currentSources
}
}

override fun sourceFolders(
Expand All @@ -102,6 +101,12 @@ class FileIndex(
.map { PsiManager.getInstance(file.project).findDirectory(it)!! }
}

override fun sourceFolders(includeDependencies: Boolean): List<List<SqlDelightSourceFolder>> {
return properties.compilationUnits.map {
it.sourceFolders.filter { includeDependencies || !it.dependency }
}
}

private fun File.localVirtualFile() = contentRoot.findFileByRelativePath(
this.relativeTo(
File(contentRoot.path),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package app.cash.sqldelight.intellij

import app.cash.sqldelight.core.SqlDelightProjectService
import app.cash.sqldelight.core.SqlDelightSourceFolder
import com.intellij.ide.actions.CreateDirectoryCompletionContributor
import com.intellij.ide.actions.CreateDirectoryCompletionContributor.Variant
import com.intellij.openapi.module.ModuleUtil
import com.intellij.psi.PsiDirectory
import org.jetbrains.jps.model.module.UnknownSourceRootType
import org.jetbrains.kotlin.konan.file.File

internal class SqlDelightDirectoryCompletionContributor : CreateDirectoryCompletionContributor {
override fun getDescription(): String {
return "SqlDelight"
}

override fun getVariants(directory: PsiDirectory): Collection<Variant> {
val module = ModuleUtil.findModuleForFile(directory.virtualFile, directory.project)
?: return emptyList()
val projectService = SqlDelightProjectService.getInstance(directory.project)
val fileIndex = projectService.fileIndex(module)
if (!fileIndex.isConfigured) {
return emptyList()
}

val packageName = fileIndex.packageName.replace(".", File.separator)

fun packagePath(sourceFolderPath: String): String {
return if (packageName.isEmpty()) {
sourceFolderPath
} else {
"$sourceFolderPath${File.separator}$packageName"
}
}

fun migrationsPath(sourceFolderPath: String): String {
return "$sourceFolderPath${File.separator}migrations"
}

val sourceRootType = UnknownSourceRootType.getInstance("sqldelight")

return fileIndex.sourceFolders(true)
.flatten()
.fold(mutableListOf()) { acc: MutableList<Variant>, sourceFolders: SqlDelightSourceFolder ->
val sourceFolderPath = sourceFolders.folder.path
acc.apply {
add(Variant(packagePath(sourceFolderPath), sourceRootType))
add(Variant(migrationsPath(sourceFolderPath), sourceRootType))
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
implementationClass="app.cash.sqldelight.intellij.lang.completion.SqlDelightKeywordCompletionContributor"/>
<completion.contributor language="SqlDelightMigration"
implementationClass="app.cash.sqldelight.intellij.lang.completion.SqlDelightKeywordCompletionContributor"/>
<createDirectoryCompletionContributor implementation="app.cash.sqldelight.intellij.SqlDelightDirectoryCompletionContributor"/>
<editorNotificationProvider
implementation="app.cash.sqldelight.intellij.notifications.FileIndexingNotification" />
<gotoDeclarationHandler
Expand Down

0 comments on commit 926087a

Please sign in to comment.