@@ -42,13 +42,19 @@ fun <T> UIdentifier.findColor(function: (Map<String, Color>, Map.Entry<String, C
4242
4343private 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(
7682fun 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