Skip to content

Commit 4980aa5

Browse files
committed
Add a bunch of ProgressManager.checkCanceled() checks. Should hopefully fix UI freeze. #114
1 parent b36efe2 commit 4980aa5

File tree

6 files changed

+77
-6
lines changed

6 files changed

+77
-6
lines changed

CHANGELOG.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44

55
## [Unreleased]
66

7+
### Fixed
8+
- Add a bunch of `ProgressManager.checkCanceled()` checks. Should hopefully fix UI freeze. #114
9+
710
## [4.0.3]
8-
### Fixed
11+
### Fixed
912
- Use non-blocking read action. Should hopefully fix UI freeze. #114
1013

1114
## [4.0.2]
@@ -188,4 +191,4 @@
188191
- Table alias support
189192
- Model table name resolving
190193
- Relation table name resolving
191-
- Initial scaffold created from [IntelliJ Platform Plugin Template](https://github.com/JetBrains/intellij-platform-plugin-template)
194+
- Initial scaffold created from [IntelliJ Platform Plugin Template](https://github.com/JetBrains/intellij-platform-plugin-template)

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
pluginGroup = dev.ekvedaras.laravelquery
55
pluginName = Laravel Query
66
# SemVer format -> https://semver.org
7-
pluginVersion=4.0.3
7+
pluginVersion=4.0.4
88

99
# See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
1010
# for insight into build numbers and IntelliJ Platform versions.

src/main/kotlin/dev/ekvedaras/laravelquery/models/DbReferenceExpression.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.intellij.database.model.DasTableKey
99
import com.intellij.openapi.Disposable
1010
import com.intellij.openapi.application.ApplicationManager
1111
import com.intellij.openapi.application.ReadAction
12+
import com.intellij.openapi.progress.ProcessCanceledException
1213
import com.intellij.openapi.project.DumbService
1314
import com.intellij.openapi.project.Project
1415
import com.intellij.openapi.util.Disposer
@@ -70,8 +71,12 @@ class DbReferenceExpression(val expression: PsiElement, val type: Type) {
7071
}
7172
}, expressionDisposable)
7273
ReadAction.nonBlocking<Unit> {
73-
TableAndAliasCollector(this).collect()
74-
DbReferenceResolver(this).resolve()
74+
try {
75+
TableAndAliasCollector(this).collect()
76+
DbReferenceResolver(this).resolve()
77+
} catch (_: ProcessCanceledException) {
78+
79+
}
7580
}.inSmartMode(project).expireWith(expressionDisposable).executeSynchronously()
7681
}
7782
}

src/main/kotlin/dev/ekvedaras/laravelquery/utils/DbReferenceResolver.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.intellij.database.model.DasIndex
66
import com.intellij.database.model.DasNamespace
77
import com.intellij.database.model.DasTable
88
import com.intellij.database.model.DasTableKey
9+
import com.intellij.openapi.progress.ProgressManager
910
import dev.ekvedaras.laravelquery.models.DbReferenceExpression
1011
import dev.ekvedaras.laravelquery.utils.DatabaseUtils.Companion.columnsInParallel
1112
import dev.ekvedaras.laravelquery.utils.DatabaseUtils.Companion.dbDataSourcesInParallel
@@ -49,6 +50,8 @@ private class ResolverForTableMethods(
4950
fun resolve() {
5051
resolveSchemes()
5152

53+
ProgressManager.checkCanceled()
54+
5255
when (reference.parts.size) {
5356
1 -> resolveTables()
5457
else -> resolveSchemaTables()
@@ -72,7 +75,11 @@ private class ResolverForTableMethods(
7275
*/
7376
private fun resolveTables() {
7477
reference.project.dbDataSourcesInParallel().forEach { dataSource ->
78+
ProgressManager.checkCanceled()
79+
7580
dataSource.tablesInParallel().forEach { table ->
81+
ProgressManager.checkCanceled()
82+
7683
if (table.nameWithoutPrefix(reference.project) == reference.parts.last()) {
7784
tables.add(table)
7885
} else if (reference.tablesAndAliases[reference.parts.last()]?.first == table.nameWithoutPrefix(reference.project)) {
@@ -88,9 +95,13 @@ private class ResolverForTableMethods(
8895
*/
8996
private fun resolveSchemaTables() {
9097
reference.project.dbDataSourcesInParallel().forEach { dataSource ->
98+
ProgressManager.checkCanceled()
99+
91100
dataSource.schemasInParallel()
92101
.filter { schemas.contains(it) }
93102
.forEach { schema ->
103+
ProgressManager.checkCanceled()
104+
94105
dataSource.tablesInParallel()
95106
.filter { it.dasParent?.name == schema.name }
96107
.filter { it.nameWithoutPrefix(reference.project) == reference.parts.last() }
@@ -122,11 +133,15 @@ private class ResolverForColumnMethods(
122133
*/
123134
private fun withOnePart() {
124135
reference.project.dbDataSourcesInParallel().forEach { dataSource ->
136+
ProgressManager.checkCanceled()
137+
125138
dataSource.schemasInParallel()
126139
.filter { it.name == reference.parts.first() }
127140
.forEach { schemas.add(it) }
128141

129142
dataSource.tablesInParallel().forEach { dasTable ->
143+
ProgressManager.checkCanceled()
144+
130145
if (dasTable.nameWithoutPrefix(reference.project) == reference.parts.first()) {
131146
tables.add(dasTable)
132147
} else if (reference.tablesAndAliases[reference.parts.first()]?.first == dasTable.nameWithoutPrefix(reference.project)) {
@@ -147,11 +162,15 @@ private class ResolverForColumnMethods(
147162
*/
148163
private fun withTwoParts() {
149164
reference.project.dbDataSourcesInParallel().forEach { dataSource ->
165+
ProgressManager.checkCanceled()
166+
150167
dataSource.schemasInParallel()
151168
.filter { it.name == reference.parts.first() }
152169
.forEach { schemas.add(it) }
153170

154171
dataSource.tablesInParallel().forEach { table ->
172+
ProgressManager.checkCanceled()
173+
155174
if (schemas.isEmpty() || schemas.contains(table.dasParent)) {
156175
addTablesAndTheirColumns(table)
157176
}
@@ -185,10 +204,14 @@ private class ResolverForColumnMethods(
185204
*/
186205
private fun withThreeParts() {
187206
reference.project.dbDataSourcesInParallel().forEach { dataSource ->
207+
ProgressManager.checkCanceled()
208+
188209
dataSource.schemasInParallel()
189210
.filter { it.name == reference.parts.first() }
190211
.forEach { schemas.add(it) }
191212

213+
ProgressManager.checkCanceled()
214+
192215
dataSource.tablesInParallel()
193216
.filter { schemas.contains(it.dasParent) }
194217
.forEach { addTableAndItsColumns(it) }
@@ -218,11 +241,15 @@ private class ResolverForIndexMethods(
218241
) {
219242
fun resolve() {
220243
reference.project.dbDataSourcesInParallel().forEach { dataSource ->
244+
ProgressManager.checkCanceled()
245+
221246
dataSource.tablesInParallel().filter {
222247
reference.tablesAndAliases.containsKey(it.nameWithoutPrefix(reference.project))
223248
}.filter {
224249
(reference.tablesAndAliases[it.nameWithoutPrefix(reference.project)]?.second ?: it.dasParent?.name) == it.dasParent?.name
225250
}.forEach { table ->
251+
ProgressManager.checkCanceled()
252+
226253
table.indexesInParallel()
227254
.filter { it.name == reference.parts[0] }
228255
.forEach { indexes.add(it) }
@@ -237,11 +264,15 @@ private class ResolverForKeyMethods(
237264
) {
238265
fun resolve() {
239266
reference.project.dbDataSourcesInParallel().forEach { dataSource ->
267+
ProgressManager.checkCanceled()
268+
240269
dataSource.tablesInParallel().filter {
241270
reference.tablesAndAliases.containsKey(it.nameWithoutPrefix(reference.project))
242271
}.filter {
243272
(reference.tablesAndAliases[it.nameWithoutPrefix(reference.project)]?.second ?: it.dasParent?.name) == it.dasParent?.name
244273
}.forEach { table ->
274+
ProgressManager.checkCanceled()
275+
245276
table.keysInParallel()
246277
.filter { it.name == reference.parts[0] }
247278
.forEach { keys.add(it) }
@@ -256,11 +287,15 @@ private class ResolverForForeignKeyMethods(
256287
) {
257288
fun resolve() {
258289
reference.project.dbDataSourcesInParallel().forEach { dataSource ->
290+
ProgressManager.checkCanceled()
291+
259292
dataSource.tablesInParallel().filter {
260293
reference.tablesAndAliases.containsKey(it.nameWithoutPrefix(reference.project))
261294
}.filter {
262295
(reference.tablesAndAliases[it.nameWithoutPrefix(reference.project)]?.second ?: it.dasParent?.name) == it.dasParent?.name
263296
}.forEach { table ->
297+
ProgressManager.checkCanceled()
298+
264299
table.foreignKeysInParallel()
265300
.filter { it.name == reference.parts[0] }
266301
.forEach { foreignKeys.add(it) }

src/main/kotlin/dev/ekvedaras/laravelquery/utils/ModelRelationResolver.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.ekvedaras.laravelquery.utils
22

3+
import com.intellij.openapi.progress.ProgressManager
34
import com.intellij.psi.PsiElement
45
import com.jetbrains.php.lang.psi.elements.MethodReference
56
import com.jetbrains.php.lang.psi.elements.PhpClass
@@ -28,13 +29,20 @@ class ModelRelationResolver(
2829
it.isChildOf(LaravelClasses.Relation)
2930
}
3031
}
32+
33+
ProgressManager.checkCanceled()
34+
3135
if (relationMethod != null && relationMethod.name != null) {
3236
resolveRelationTable(relationMethod.name ?: "", model)
3337
return
3438
}
3539

40+
ProgressManager.checkCanceled()
41+
3642
tableAndAliasCollector.resolveTableName(model)
3743

44+
ProgressManager.checkCanceled()
45+
3846
val deepParent =
3947
method.parent?.parent?.parent?.parent?.parent?.parent // TODO utilize parentOfType<>() ?
4048
if (deepParent?.isInsideRelationClosure() == true) {
@@ -67,6 +75,8 @@ class ModelRelationResolver(
6775
) as? ParameterListImpl
6876
)?.getParameter(0) ?: return
6977

78+
ProgressManager.checkCanceled()
79+
7080
when (firstParam) {
7181
is ClassConstantReferenceImpl -> {
7282
tableAndAliasCollector.resolveTableName(

src/main/kotlin/dev/ekvedaras/laravelquery/utils/TableAndAliasCollector.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.ekvedaras.laravelquery.utils
22

3+
import com.intellij.openapi.progress.ProgressManager
34
import com.intellij.psi.PsiReference
45
import com.intellij.psi.util.parentOfType
56
import com.jetbrains.php.lang.psi.elements.MethodReference
@@ -35,15 +36,25 @@ class TableAndAliasCollector(private val reference: DbReferenceExpression) {
3536
val method = MethodUtils.resolveMethodReference(reference.expression) ?: return
3637
val methods = Collections.synchronizedList(mutableListOf<MethodReference>())
3738

39+
ProgressManager.checkCanceled()
40+
3841
collectMethodsAcrossVariableReferences(methods, method)
3942
collectMethodsInCurrentTree(methods, method)
4043

44+
ProgressManager.checkCanceled()
45+
4146
relationResolver.resolveModelAndRelationTables(methods, method)
47+
48+
ProgressManager.checkCanceled()
49+
4250
schemaTableResolver.resolve(methods, method)
4351

4452
methods
4553
.filter { LaravelUtils.BuilderTableMethods.contains(it.name) }
46-
.forEach { scanMethodReference(it) }
54+
.forEach {
55+
ProgressManager.checkCanceled()
56+
scanMethodReference(it)
57+
}
4758
}
4859

4960
private fun collectMethodsAcrossVariableReferences(methods: MutableList<MethodReference>, method: MethodReference) {
@@ -55,7 +66,10 @@ class TableAndAliasCollector(private val reference: DbReferenceExpression) {
5566
collectMethodsInVariableReference(declaration.reference as PsiReference, methods)
5667
}
5768

69+
ProgressManager.checkCanceled()
70+
5871
variable.references.forEach {
72+
ProgressManager.checkCanceled()
5973
collectMethodsInVariableReference(it, methods)
6074
}
6175
}
@@ -72,6 +86,8 @@ class TableAndAliasCollector(private val reference: DbReferenceExpression) {
7286
return
7387
}
7488

89+
ProgressManager.checkCanceled()
90+
7591
// $var->where()
7692
if (element is MethodReference) {
7793
MethodUtils.findMethodsInTree(
@@ -108,6 +124,8 @@ class TableAndAliasCollector(private val reference: DbReferenceExpression) {
108124
}
109125
}
110126

127+
ProgressManager.checkCanceled()
128+
111129
// Mode::when(true, function (Builder $query) { $query->where(''); });
112130
if (method.isInsideModelQueryClosure(reference.project)) {
113131
MethodUtils.findMethodsInTree(method.getParentOfClosure()).forEach {

0 commit comments

Comments
 (0)