diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 551d15bbed6..687ea0c15a2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -59,6 +59,7 @@ intellij-analysisImpl = { module = "com.jetbrains.intellij.platform:analysis-imp intellij-android = { module = "com.jetbrains.intellij.android:android-adt-ui-model", version.ref = "idea" } intellij-projectModel = { module = "com.jetbrains.intellij.platform:project-model", version.ref = "idea" } intellij-projectModelImpl = { module = "com.jetbrains.intellij.platform:project-model-impl", version.ref = "idea" } +intellij-utilEx = { module = "com.jetbrains.intellij.platform:util-ex", version.ref = "idea" } jna = { module = "net.java.dev.jna:jna", version = "5.13.0" } diff --git a/sqldelight-compiler/dialect/build.gradle b/sqldelight-compiler/dialect/build.gradle index 124c7f25af3..ca080c0070c 100644 --- a/sqldelight-compiler/dialect/build.gradle +++ b/sqldelight-compiler/dialect/build.gradle @@ -11,6 +11,7 @@ dependencies { api libs.kotlinPoet compileOnly libs.intellij.coreImpl + compileOnly libs.intellij.utilEx } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/PragmaWithResults.kt b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/PragmaWithResults.kt similarity index 70% rename from sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/PragmaWithResults.kt rename to sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/PragmaWithResults.kt index 71d73785baf..aec00728404 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/PragmaWithResults.kt +++ b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/PragmaWithResults.kt @@ -1,6 +1,5 @@ -package app.cash.sqldelight.core.compiler.model +package app.cash.sqldelight.dialect.api -import app.cash.sqldelight.dialect.api.QueryWithResults import com.alecstrong.sql.psi.core.psi.NamedElement import com.alecstrong.sql.psi.core.psi.QueryElement import com.alecstrong.sql.psi.core.psi.QueryElement.QueryResult @@ -9,13 +8,13 @@ import com.alecstrong.sql.psi.core.psi.SqlPragmaStmt import com.alecstrong.sql.psi.core.psi.impl.SqlPragmaNameImpl import com.intellij.lang.ASTNode -class PragmaWithResults(private val pragmaStmt: SqlPragmaStmt) : QueryWithResults { +class PragmaWithResults(pragmaStmt: SqlPragmaStmt) : QueryWithResults { override var statement: SqlAnnotatedElement = pragmaStmt override val select: QueryElement = pragmaStmt.pragmaName as SqlDelightPragmaName override val pureTable: NamedElement? = null } -internal class SqlDelightPragmaName(node: ASTNode?) : SqlPragmaNameImpl(node), QueryElement { +class SqlDelightPragmaName(node: ASTNode?) : SqlPragmaNameImpl(node), QueryElement { override fun queryExposed() = listOf( QueryResult( column = this, diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/SelectQueryable.kt b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/SelectQueryable.kt similarity index 94% rename from sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/SelectQueryable.kt rename to sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/SelectQueryable.kt index 2d69b344686..d6fd0dbc7d1 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/SelectQueryable.kt +++ b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/SelectQueryable.kt @@ -1,7 +1,5 @@ -package app.cash.sqldelight.core.compiler.model +package app.cash.sqldelight.dialect.api -import app.cash.sqldelight.core.lang.util.parentOfType -import app.cash.sqldelight.dialect.api.QueryWithResults import com.alecstrong.sql.psi.core.psi.NamedElement import com.alecstrong.sql.psi.core.psi.QueryElement.QueryColumn import com.alecstrong.sql.psi.core.psi.Queryable @@ -11,6 +9,7 @@ import com.alecstrong.sql.psi.core.psi.SqlCreateViewStmt import com.alecstrong.sql.psi.core.psi.SqlCteTableName import com.alecstrong.sql.psi.core.psi.SqlViewName import com.intellij.psi.util.PsiTreeUtil +import com.intellij.psi.util.parentOfType class SelectQueryable( override val select: SqlCompoundSelectStmt, diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/SqlDelightCompiler.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/SqlDelightCompiler.kt index c9d78f24214..058168f824d 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/SqlDelightCompiler.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/SqlDelightCompiler.kt @@ -18,12 +18,12 @@ package app.cash.sqldelight.core.compiler import app.cash.sqldelight.core.SqlDelightFileIndex import app.cash.sqldelight.core.capitalize import app.cash.sqldelight.core.compiler.model.NamedQuery -import app.cash.sqldelight.core.compiler.model.SelectQueryable import app.cash.sqldelight.core.lang.MigrationFile import app.cash.sqldelight.core.lang.SqlDelightFile import app.cash.sqldelight.core.lang.SqlDelightQueriesFile import app.cash.sqldelight.core.lang.queriesName import app.cash.sqldelight.core.lang.util.sqFile +import app.cash.sqldelight.dialect.api.SelectQueryable import app.cash.sqldelight.dialect.api.SqlDelightDialect import com.alecstrong.sql.psi.core.psi.InvalidElementDetectedException import com.alecstrong.sql.psi.core.psi.NamedElement diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/NamedQuery.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/NamedQuery.kt index e7be3768be6..7c154631ae5 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/NamedQuery.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/NamedQuery.kt @@ -36,6 +36,7 @@ import app.cash.sqldelight.dialect.api.PrimitiveType.NULL import app.cash.sqldelight.dialect.api.PrimitiveType.REAL import app.cash.sqldelight.dialect.api.PrimitiveType.TEXT import app.cash.sqldelight.dialect.api.QueryWithResults +import app.cash.sqldelight.dialect.api.SelectQueryable import com.alecstrong.sql.psi.core.psi.NamedElement import com.alecstrong.sql.psi.core.psi.QueryElement import com.alecstrong.sql.psi.core.psi.SqlCompoundSelectStmt diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/ParserUtil.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/ParserUtil.kt index ea7cc97bfda..d4945544730 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/ParserUtil.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/ParserUtil.kt @@ -2,10 +2,10 @@ package app.cash.sqldelight.core.lang import app.cash.sqldelight.core.SqlDelightProjectService import app.cash.sqldelight.core.SqldelightParserUtil -import app.cash.sqldelight.core.compiler.model.SqlDelightPragmaName import app.cash.sqldelight.core.lang.psi.FunctionExprMixin import app.cash.sqldelight.dialect.api.SqlDelightDialect import app.cash.sqldelight.dialect.api.SqlDelightModule +import app.cash.sqldelight.dialect.api.SqlDelightPragmaName import com.alecstrong.sql.psi.core.SqlParserUtil import com.alecstrong.sql.psi.core.psi.SqlTypes import com.intellij.openapi.project.Project diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightQueriesFile.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightQueriesFile.kt index 9b11916c73d..e4cdcbeb86a 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightQueriesFile.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightQueriesFile.kt @@ -26,7 +26,6 @@ import app.cash.sqldelight.core.compiler.model.NamedMutator.Update import app.cash.sqldelight.core.compiler.model.NamedQuery import app.cash.sqldelight.core.lang.psi.StmtIdentifierMixin import app.cash.sqldelight.core.lang.util.argumentType -import app.cash.sqldelight.core.lang.util.parentOfTypeOrNull import app.cash.sqldelight.core.lang.util.table import app.cash.sqldelight.core.psi.SqlDelightStmtList import com.alecstrong.sql.psi.core.SqlAnnotationHolder @@ -38,6 +37,7 @@ import com.intellij.psi.FileViewProvider import com.intellij.psi.PsiDirectory import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.PsiTreeUtil +import com.intellij.psi.util.parentOfType class SqlDelightQueriesFile( viewProvider: FileViewProvider, @@ -114,7 +114,7 @@ class SqlDelightQueriesFile( internal val requiredAdapters by lazy { val binders = PsiTreeUtil.findChildrenOfType(this, SqlBindExpr::class.java) val argumentAdapters = binders.mapNotNull { - it.parentOfTypeOrNull()?.let { + it.parentOfType()?.let { if (it.acceptsTableInterface() && it.table.needsAdapters()) return@mapNotNull it.table.adapterProperty() } typeResolver.argumentType(it).parentAdapter() diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt index c10cf74f75b..96ebfefe304 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt @@ -18,7 +18,6 @@ package app.cash.sqldelight.core.lang.psi import app.cash.sqldelight.core.capitalize import app.cash.sqldelight.core.compiler.SqlDelightCompiler.allocateName import app.cash.sqldelight.core.lang.types.typeResolver -import app.cash.sqldelight.core.lang.util.parentOfType import app.cash.sqldelight.core.lang.util.sqFile import app.cash.sqldelight.core.psi.SqlDelightAnnotation import app.cash.sqldelight.core.psi.SqlDelightAnnotationValue @@ -42,6 +41,7 @@ import com.intellij.lang.ASTNode import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.tree.TokenSet import com.intellij.psi.util.PsiTreeUtil +import com.intellij.psi.util.parentOfType import com.intellij.util.castSafelyTo import com.squareup.kotlinpoet.AnnotationSpec import com.squareup.kotlinpoet.ClassName @@ -166,7 +166,7 @@ internal abstract class ColumnTypeMixin( } private fun SqlDelightJavaType.type(): ClassName { - parentOfType().importStmtList.importStmtList.forEach { import -> + parentOfType()!!.importStmtList.importStmtList.forEach { import -> val typePrefix = text.substringBefore('.') if (import.javaType.text.endsWith(".$typePrefix")) { return text.split(".").drop(1).fold(import.javaType.type()) { current, nested -> diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/Arguments.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/Arguments.kt index 48fca4eca5c..a454d362b72 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/Arguments.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/Arguments.kt @@ -16,7 +16,6 @@ package app.cash.sqldelight.core.lang.util import app.cash.sqldelight.core.compiler.model.NamedQuery -import app.cash.sqldelight.core.compiler.model.SelectQueryable import app.cash.sqldelight.core.lang.types.typeResolver import app.cash.sqldelight.dialect.api.IntermediateType import app.cash.sqldelight.dialect.api.PrimitiveType @@ -24,6 +23,7 @@ import app.cash.sqldelight.dialect.api.PrimitiveType.ARGUMENT import app.cash.sqldelight.dialect.api.PrimitiveType.INTEGER import app.cash.sqldelight.dialect.api.PrimitiveType.NULL import app.cash.sqldelight.dialect.api.PrimitiveType.TEXT +import app.cash.sqldelight.dialect.api.SelectQueryable import com.alecstrong.sql.psi.core.psi.SqlBetweenExpr import com.alecstrong.sql.psi.core.psi.SqlBinaryExpr import com.alecstrong.sql.psi.core.psi.SqlBinaryLikeExpr diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/ExprUtil.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/ExprUtil.kt index d8b2614c0a0..7c2fb3a8b7c 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/ExprUtil.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/ExprUtil.kt @@ -16,10 +16,9 @@ package app.cash.sqldelight.core.lang.util import app.cash.sqldelight.core.compiler.SqlDelightCompiler.allocateName -import app.cash.sqldelight.core.compiler.model.PragmaWithResults -import app.cash.sqldelight.core.compiler.model.SelectQueryable import app.cash.sqldelight.core.lang.types.typeResolver import app.cash.sqldelight.dialect.api.IntermediateType +import app.cash.sqldelight.dialect.api.PragmaWithResults import app.cash.sqldelight.dialect.api.PrimitiveType import app.cash.sqldelight.dialect.api.PrimitiveType.ARGUMENT import app.cash.sqldelight.dialect.api.PrimitiveType.BLOB @@ -28,6 +27,7 @@ import app.cash.sqldelight.dialect.api.PrimitiveType.NULL import app.cash.sqldelight.dialect.api.PrimitiveType.REAL import app.cash.sqldelight.dialect.api.PrimitiveType.TEXT import app.cash.sqldelight.dialect.api.QueryWithResults +import app.cash.sqldelight.dialect.api.SelectQueryable import app.cash.sqldelight.dialect.api.TypeResolver import app.cash.sqldelight.dialect.api.encapsulatingType import com.alecstrong.sql.psi.core.psi.SqlBetweenExpr diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt index 9342bbf2f0f..3771ec0d478 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt @@ -52,14 +52,6 @@ import org.jgrapht.graph.DefaultEdge import org.jgrapht.graph.DirectedAcyclicGraph import org.jgrapht.traverse.TopologicalOrderIterator -internal inline fun PsiElement.parentOfType(): R { - return PsiTreeUtil.getParentOfType(this, R::class.java)!! -} - -internal inline fun PsiElement.parentOfTypeOrNull(): R? { - return PsiTreeUtil.getParentOfType(this, R::class.java) -} - internal fun PsiElement.type(): IntermediateType = when (this) { is ExposableType -> type() is SqlTypeName -> sqFile().typeResolver.definitionType(this) diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/validation/OptimisticLockValidator.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/validation/OptimisticLockValidator.kt index 34a41bfd07c..a969998d853 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/validation/OptimisticLockValidator.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/validation/OptimisticLockValidator.kt @@ -2,7 +2,6 @@ package app.cash.sqldelight.core.lang.validation import app.cash.sqldelight.core.lang.util.columnDefSource import app.cash.sqldelight.core.lang.util.findChildrenOfType -import app.cash.sqldelight.core.lang.util.parentOfType import com.alecstrong.sql.psi.core.SqlAnnotationHolder import com.alecstrong.sql.psi.core.SqlCompilerAnnotator import com.alecstrong.sql.psi.core.psi.NamedElement @@ -20,6 +19,7 @@ import com.intellij.lang.annotation.AnnotationHolder import com.intellij.lang.annotation.Annotator import com.intellij.lang.annotation.HighlightSeverity import com.intellij.psi.PsiElement +import com.intellij.psi.util.parentOfType open class OptimisticLockValidator : Annotator, SqlCompilerAnnotator { open fun quickFix(element: PsiElement, lock: ColumnDefMixin): IntentionAction? = null