From e659e6900a1279dc470b069abd2661222cc288a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:51:13 +0100 Subject: [PATCH 1/9] Add IndexElement similar to TableElement, represents CreateIndex, DropIndex, AlterIndex --- .../kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt new file mode 100644 index 00000000..f9861967 --- /dev/null +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt @@ -0,0 +1,3 @@ +package com.alecstrong.sql.psi.core.psi + +interface IndexElement : SqlCompositeElement, SchemaContributor From a6eeb4e6f77f171865edfc1649f85780c019a952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:51:42 +0100 Subject: [PATCH 2/9] Change usage to IndexElement Store IndexElement in Schema --- .../psi/core/psi/mixins/CreateIndexMixin.kt | 21 ++++++++----------- .../psi/core/psi/mixins/CreateTableMixin.kt | 4 +++- .../sql/psi/core/psi/mixins/DropIndexMixin.kt | 12 +++++------ 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateIndexMixin.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateIndexMixin.kt index ffea3c3d..06a67e3f 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateIndexMixin.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateIndexMixin.kt @@ -2,6 +2,7 @@ package com.alecstrong.sql.psi.core.psi.mixins import com.alecstrong.sql.psi.core.SqlAnnotationHolder import com.alecstrong.sql.psi.core.SqlSchemaContributorElementType +import com.alecstrong.sql.psi.core.psi.IndexElement import com.alecstrong.sql.psi.core.psi.QueryElement.QueryResult import com.alecstrong.sql.psi.core.psi.Schema import com.alecstrong.sql.psi.core.psi.SchemaContributorStub @@ -13,13 +14,11 @@ import com.intellij.lang.ASTNode import com.intellij.psi.PsiElement import com.intellij.psi.tree.IElementType -internal abstract class CreateIndexMixin( - stub: SchemaContributorStub?, - nodeType: IElementType?, - node: ASTNode?, -) : - SqlSchemaContributorImpl(stub, nodeType, node), - SqlCreateIndexStmt { +internal abstract class CreateIndexMixin +private constructor(stub: SchemaContributorStub?, nodeType: IElementType?, node: ASTNode?) : + SqlSchemaContributorImpl(stub, nodeType, node), + SqlCreateIndexStmt, + IndexElement { constructor(node: ASTNode) : this(null, null, node) constructor(stub: SchemaContributorStub, nodeType: IElementType) : this(stub, nodeType, null) @@ -32,7 +31,7 @@ internal abstract class CreateIndexMixin( } override fun modifySchema(schema: Schema) { - schema.put(this) + schema.put(this) } override fun queryAvailable(child: PsiElement): Collection { @@ -47,9 +46,7 @@ internal abstract class CreateIndexMixin( override fun annotate(annotationHolder: SqlAnnotationHolder) { if ( node.findChildByType(SqlTypes.EXISTS) == null && - containingFile.schema(this).any { - it != this && it.indexName.textMatches(indexName) - } + containingFile.schema(this).any { it != this && it.name() == indexName.text } ) { annotationHolder.createErrorAnnotation(indexName, "Duplicate index name ${indexName.text}") } @@ -58,7 +55,7 @@ internal abstract class CreateIndexMixin( } open class CreateIndexElementType(name: String) : - SqlSchemaContributorElementType(name, SqlCreateIndexStmt::class.java) { + SqlSchemaContributorElementType(name, IndexElement::class.java) { override fun nameType() = SqlTypes.INDEX_NAME override fun createPsi(stub: SchemaContributorStub) = SqlCreateIndexStmtImpl(stub, this) diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateTableMixin.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateTableMixin.kt index c50ed313..1ba8d241 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateTableMixin.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateTableMixin.kt @@ -2,6 +2,7 @@ package com.alecstrong.sql.psi.core.psi.mixins import com.alecstrong.sql.psi.core.SqlAnnotationHolder import com.alecstrong.sql.psi.core.SqlSchemaContributorElementType +import com.alecstrong.sql.psi.core.psi.IndexElement import com.alecstrong.sql.psi.core.psi.LazyQuery import com.alecstrong.sql.psi.core.psi.QueryElement.QueryResult import com.alecstrong.sql.psi.core.psi.QueryElement.SynthesizedColumn @@ -120,7 +121,8 @@ private constructor(stub: SchemaContributorStub?, nodeType: IElementType?, node: // Check in file for `CREATE UNIQUE INDEX` statement that matches the given columns. containingFile - .schema() // sqlStmtElement is null to include all statements + .schema() + .filterIsInstance() .filter { it.isUnique() && it.indexedColumnList.all { it.collationName == null } } .forEach { val indexedColumns = diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt index 183eb1ee..44d3e5b0 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt @@ -2,9 +2,9 @@ package com.alecstrong.sql.psi.core.psi.mixins import com.alecstrong.sql.psi.core.SqlAnnotationHolder import com.alecstrong.sql.psi.core.SqlSchemaContributorElementType +import com.alecstrong.sql.psi.core.psi.IndexElement import com.alecstrong.sql.psi.core.psi.Schema import com.alecstrong.sql.psi.core.psi.SchemaContributorStub -import com.alecstrong.sql.psi.core.psi.SqlCreateIndexStmt import com.alecstrong.sql.psi.core.psi.SqlDropIndexStmt import com.alecstrong.sql.psi.core.psi.SqlSchemaContributorImpl import com.alecstrong.sql.psi.core.psi.SqlTypes @@ -14,7 +14,7 @@ import com.intellij.psi.tree.IElementType internal abstract class DropIndexMixin private constructor(stub: SchemaContributorStub?, nodeType: IElementType?, node: ASTNode?) : - SqlSchemaContributorImpl(stub, nodeType, node), + SqlSchemaContributorImpl(stub, nodeType, node), SqlDropIndexStmt { constructor(node: ASTNode) : this(null, null, node) @@ -28,15 +28,15 @@ private constructor(stub: SchemaContributorStub?, nodeType: IElementType?, node: } override fun modifySchema(schema: Schema) { - schema.forType().remove(name()) + schema.forType().remove(name()) } override fun annotate(annotationHolder: SqlAnnotationHolder) { indexName?.let { indexName -> if ( node.findChildByType(SqlTypes.EXISTS) == null && - containingFile.schema(this).none { - it != this && it.indexName.textMatches(indexName) + containingFile.schema(this).none { + it != this && it.name() == indexName.text } ) { annotationHolder.createErrorAnnotation( @@ -51,7 +51,7 @@ private constructor(stub: SchemaContributorStub?, nodeType: IElementType?, node: } internal class DropIndexElementType(name: String) : - SqlSchemaContributorElementType(name, SqlCreateIndexStmt::class.java) { + SqlSchemaContributorElementType(name, IndexElement::class.java) { override fun nameType() = SqlTypes.TABLE_NAME override fun createPsi(stub: SchemaContributorStub) = SqlDropIndexStmtImpl(stub, this) From b1e268da82ad2904a4ae2abbb93a762309c18c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:52:53 +0100 Subject: [PATCH 3/9] Add replace Remove name and add new name. Type is not inlined as has to call private inline functions --- .../alecstrong/sql/psi/core/psi/SchemaContributor.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/SchemaContributor.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/SchemaContributor.kt index 0b4468d4..509d8e3a 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/SchemaContributor.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/SchemaContributor.kt @@ -47,4 +47,16 @@ class Schema { @Suppress("UNCHECKED_CAST") fun values(type: KClass) = map[type]?.values as Collection? ?: emptyList() + + fun replace( + type: KClass, + name: String, + newName: String, + value: SchemaContributor, + ) { + @Suppress("UNCHECKED_CAST") + val typedMap = map.getOrPut(type) { linkedMapOf() } as MutableMap + typedMap.remove(name) + typedMap[newName] = value + } } From ff5d9ce5ece35991372b5e6b8e207217a2117300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:53:21 +0100 Subject: [PATCH 4/9] Use IndexElement Implements IndexElement SchemaContrib --- core/src/main/kotlin/com/alecstrong/sql/psi/core/sql.bnf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/sql.bnf b/core/src/main/kotlin/com/alecstrong/sql/psi/core/sql.bnf index 494434ca..1df51a73 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/sql.bnf +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/sql.bnf @@ -103,7 +103,7 @@ release_stmt ::= RELEASE [ SAVEPOINT ] savepoint_name { } create_index_stmt ::= CREATE [ UNIQUE ] INDEX [ IF NOT EXISTS ] [ database_name DOT ] index_name ON table_name LP indexed_column ( COMMA indexed_column ) * RP [ WHERE expr ] { mixin = "com.alecstrong.sql.psi.core.psi.mixins.CreateIndexMixin" - implements = "com.alecstrong.sql.psi.core.psi.SchemaContributor" + implements = "com.alecstrong.sql.psi.core.psi.IndexElement" elementTypeClass = "com.alecstrong.sql.psi.core.psi.mixins.CreateIndexElementType" stubClass = "com.alecstrong.sql.psi.core.psi.SchemaContributorStub" pin = 6 From 1e61c0e339d113a8be438f73e0a56d6de79cfd43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:54:17 +0100 Subject: [PATCH 5/9] Update SqlFileBase.kt Need to check extension statements for SchemaContrib types that a dialect creates e.g AlterIndex --- .../com/alecstrong/sql/psi/core/SqlFileBase.kt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/SqlFileBase.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/SqlFileBase.kt index e0bdcefc..af66de98 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/SqlFileBase.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/SqlFileBase.kt @@ -7,6 +7,7 @@ import com.alecstrong.sql.psi.core.psi.SchemaContributorIndex import com.alecstrong.sql.psi.core.psi.SqlCreateTableStmt import com.alecstrong.sql.psi.core.psi.SqlCreateTriggerStmt import com.alecstrong.sql.psi.core.psi.SqlCreateViewStmt +import com.alecstrong.sql.psi.core.psi.SqlExtensionStmt import com.alecstrong.sql.psi.core.psi.SqlStmtList import com.alecstrong.sql.psi.core.psi.TableElement import com.intellij.extapi.psi.PsiFileBase @@ -117,7 +118,7 @@ abstract class SqlFileBase(viewProvider: FileViewProvider, language: Language) : for ((baseContributorIndex, baseContributor) in baseContributorFiles.withIndex()) { // Put the last file to index -1, and the previous files to previous index. val orderedIndex = -1 - baseContributorFiles.lastIndex + baseContributorIndex.toLong() - baseContributor.contributors()?.let { contributors -> + baseContributor.contributors().let { contributors -> orderedContributors[orderedIndex] = linkedSetOf(elements = contributors.toTypedArray()) } } @@ -129,12 +130,18 @@ abstract class SqlFileBase(viewProvider: FileViewProvider, language: Language) : } contributors() - ?.takeWhile { order == null || until == null || it.textOffset <= until.textOffset } - ?.forEach { block(it) } + .takeWhile { order == null || until == null || it.textOffset <= until.textOffset } + .forEach { block(it) } } - private fun contributors() = - sqlStmtList?.stmtList?.mapNotNull { it.firstChild as? SchemaContributor } + private fun contributors(): List { + return sqlStmtList?.stmtList?.mapNotNull { it.firstChild as? SchemaContributor }.orEmpty() + + sqlStmtList + ?.stmtList + ?.mapNotNull { it.firstChild as? SqlExtensionStmt } + ?.mapNotNull { it.firstChild as? SchemaContributor } + .orEmpty() + } /** * Optional files which can be used for extra Schema Contributors that are unindexed. The files From fbb2589d1defb411eacc10178977e39ee5019247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 28 Apr 2026 11:03:34 +0100 Subject: [PATCH 6/9] Add IndexElement Allows the index name to be overridden AlterIndex name --- .../com/alecstrong/sql/psi/core/psi/IndexElement.kt | 8 +++++++- .../sql/psi/core/psi/mixins/CreateIndexMixin.kt | 4 +++- .../alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt index f9861967..0183dde8 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt @@ -1,3 +1,9 @@ package com.alecstrong.sql.psi.core.psi -interface IndexElement : SqlCompositeElement, SchemaContributor +/** + * IndexElement represents a named index element implemented by CreateIndex, DropIndex, AlterIndex. + * The indexElementName can be overridden to return the new name of an AlterIndex element + */ +interface IndexElement : SqlCompositeElement, SchemaContributor { + fun indexElementName(): String = name() +} diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateIndexMixin.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateIndexMixin.kt index 06a67e3f..9d9ba049 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateIndexMixin.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateIndexMixin.kt @@ -46,7 +46,9 @@ private constructor(stub: SchemaContributorStub?, nodeType: IElementType?, node: override fun annotate(annotationHolder: SqlAnnotationHolder) { if ( node.findChildByType(SqlTypes.EXISTS) == null && - containingFile.schema(this).any { it != this && it.name() == indexName.text } + containingFile.schema(this).any { + it != this && it.indexElementName() == indexName.text + } ) { annotationHolder.createErrorAnnotation(indexName, "Duplicate index name ${indexName.text}") } diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt index 44d3e5b0..1ad637d7 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt @@ -36,7 +36,7 @@ private constructor(stub: SchemaContributorStub?, nodeType: IElementType?, node: if ( node.findChildByType(SqlTypes.EXISTS) == null && containingFile.schema(this).none { - it != this && it.name() == indexName.text + it != this && it.indexElementName() == indexName.text } ) { annotationHolder.createErrorAnnotation( From 29687536cb228fb376852bee3d5d313af3ca5554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Thu, 30 Apr 2026 20:18:45 +0100 Subject: [PATCH 7/9] Preserve ordering of statements --- .../alecstrong/sql/psi/core/SqlFileBase.kt | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/SqlFileBase.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/SqlFileBase.kt index af66de98..fb58eb45 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/SqlFileBase.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/SqlFileBase.kt @@ -118,7 +118,7 @@ abstract class SqlFileBase(viewProvider: FileViewProvider, language: Language) : for ((baseContributorIndex, baseContributor) in baseContributorFiles.withIndex()) { // Put the last file to index -1, and the previous files to previous index. val orderedIndex = -1 - baseContributorFiles.lastIndex + baseContributorIndex.toLong() - baseContributor.contributors().let { contributors -> + baseContributor.contributors()?.let { contributors -> orderedContributors[orderedIndex] = linkedSetOf(elements = contributors.toTypedArray()) } } @@ -130,17 +130,19 @@ abstract class SqlFileBase(viewProvider: FileViewProvider, language: Language) : } contributors() - .takeWhile { order == null || until == null || it.textOffset <= until.textOffset } - .forEach { block(it) } + ?.takeWhile { order == null || until == null || it.textOffset <= until.textOffset } + ?.forEach { block(it) } } - private fun contributors(): List { - return sqlStmtList?.stmtList?.mapNotNull { it.firstChild as? SchemaContributor }.orEmpty() + - sqlStmtList - ?.stmtList - ?.mapNotNull { it.firstChild as? SqlExtensionStmt } - ?.mapNotNull { it.firstChild as? SchemaContributor } - .orEmpty() + private fun contributors(): List? { + // Preserve schemaContributor statement ordering and add any schemaContributors that are first + // child of SqlExtensionStmt. + return sqlStmtList?.stmtList?.mapNotNull { stmt -> + stmt.firstChild as? SchemaContributor + ?: (stmt.firstChild as? SqlExtensionStmt)?.let { sqlExt -> + sqlExt.firstChild as? SchemaContributor + } + } } /** From a2573b2265099d9f10c766bbf726345f85f11750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Thu, 30 Apr 2026 20:19:33 +0100 Subject: [PATCH 8/9] Update DropIndexMixin.kt Should be SqlTypes.INDEX_NAME not SqlTypes.TABLE_NAME --- .../com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt index 1ad637d7..02201b97 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/DropIndexMixin.kt @@ -52,7 +52,7 @@ private constructor(stub: SchemaContributorStub?, nodeType: IElementType?, node: internal class DropIndexElementType(name: String) : SqlSchemaContributorElementType(name, IndexElement::class.java) { - override fun nameType() = SqlTypes.TABLE_NAME + override fun nameType() = SqlTypes.INDEX_NAME override fun createPsi(stub: SchemaContributorStub) = SqlDropIndexStmtImpl(stub, this) } From 35b1c602727b27fe39049cb9143e5c6a7faf7419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Fri, 1 May 2026 13:47:38 +0100 Subject: [PATCH 9/9] Allow stub creation --- .../kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt | 5 ++++- .../alecstrong/sql/psi/core/psi/SqlCompositeElementImpl.kt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt index 0183dde8..fd632ac3 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/IndexElement.kt @@ -1,9 +1,12 @@ package com.alecstrong.sql.psi.core.psi +import com.intellij.psi.StubBasedPsiElement + /** * IndexElement represents a named index element implemented by CreateIndex, DropIndex, AlterIndex. * The indexElementName can be overridden to return the new name of an AlterIndex element */ -interface IndexElement : SqlCompositeElement, SchemaContributor { +interface IndexElement : + SqlCompositeElement, SchemaContributor, StubBasedPsiElement { fun indexElementName(): String = name() } diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/SqlCompositeElementImpl.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/SqlCompositeElementImpl.kt index 651307c6..8b4d0e4c 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/SqlCompositeElementImpl.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/SqlCompositeElementImpl.kt @@ -39,7 +39,7 @@ open class SqlCompositeElementImpl(node: ASTNode) : } } -internal abstract class SqlSchemaContributorImpl< +abstract class SqlSchemaContributorImpl< SchemaType : SchemaContributor, ElementType : SqlSchemaContributorElementType, >(stub: SchemaContributorStub?, nodeType: IElementType?, node: ASTNode?) :