Skip to content

Commit 13322de

Browse files
committed
Add "depth checks" to recursive color resolution
Fixes #860
1 parent b45b3db commit 13322de

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/main/kotlin/insight/ColorUtil.kt

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,19 @@ fun <T> UIdentifier.findColor(function: (Map<String, Color>, Map.Entry<String, C
4242

4343
private fun <T> findColorFromExpression(
4444
expression: UReferenceExpression,
45-
function: (Map<String, Color>, Map.Entry<String, Color>) -> T
45+
function: (Map<String, Color>, Map.Entry<String, Color>) -> T,
46+
maxDepth: Int = 10,
47+
depth: Int = 0,
4648
): T? {
49+
if (depth >= maxDepth) {
50+
return null
51+
}
52+
4753
val referencedElement = expression.resolveToUElement()
4854
if (referencedElement is UField) {
4955
val referencedFieldInitializer = referencedElement.uastInitializer
5056
if (referencedFieldInitializer is UReferenceExpression) {
51-
return findColorFromExpression(referencedFieldInitializer, function)
57+
return findColorFromExpression(referencedFieldInitializer, function, maxDepth, depth + 1)
5258
}
5359
}
5460

@@ -76,8 +82,14 @@ private fun <T> findColorFromExpression(
7682
fun UIdentifier.findColor(
7783
moduleType: AbstractModuleType<AbstractModule>,
7884
className: String,
79-
vectorClasses: Array<String>?
85+
vectorClasses: Array<String>?,
86+
maxDepth: Int = 10,
87+
depth: Int = 0
8088
): Pair<Color, UElement>? {
89+
if (depth >= maxDepth) {
90+
return null
91+
}
92+
8193
val sourcePsi = this.sourcePsi ?: return null
8294
val module = ModuleUtilCore.findModuleForPsiElement(sourcePsi) ?: return null
8395
val facet = MinecraftFacet.getInstance(module) ?: return null
@@ -95,15 +107,16 @@ fun UIdentifier.findColor(
95107
val referencedFieldInitializer: UExpression? = referencedElement.uastInitializer
96108
if (referencedFieldInitializer is UCallExpression) {
97109
// The field is initialized with a method call
98-
return referencedFieldInitializer.methodIdentifier?.findColor(moduleType, className, vectorClasses)
110+
val calledMethodIdentifier = referencedFieldInitializer.methodIdentifier ?: return null
111+
return calledMethodIdentifier.findColor(moduleType, className, vectorClasses, maxDepth, depth + 1)
99112
}
100113

101114
if (referencedFieldInitializer is UReferenceExpression) {
102115
// The field is probably initialized with a reference to another field
103116
val referenceNameElement = referencedFieldInitializer.referenceNameElement
104117
if (referenceNameElement is UIdentifier) {
105118
// The expression was simple enough
106-
return referenceNameElement.findColor(moduleType, className, vectorClasses)
119+
return referenceNameElement.findColor(moduleType, className, vectorClasses, maxDepth, depth + 1)
107120
} else if (referenceNameElement is UResolvable) {
108121
// The expression is complex, so we resolve it. If it is a field we're on for another round
109122
referencedElement = referenceNameElement.resolveToUElement()

0 commit comments

Comments
 (0)