@@ -24,11 +24,11 @@ object SolResolver {
24
24
val result = if (element is SolFunctionCallElement ) {
25
25
resolveError(element) +
26
26
resolveEvent(element) +
27
- resolveContractUsingImports (element, element.containingFile, true ) +
27
+ resolveContract (element) +
28
28
resolveEnum(element) +
29
29
resolveUserDefinedValueType(element)
30
30
} else {
31
- resolveContractUsingImports (element, element.containingFile, true ) +
31
+ resolveContract (element) +
32
32
resolveEnum(element) +
33
33
resolveStruct(element) +
34
34
resolveUserDefinedValueType(element)
@@ -39,17 +39,18 @@ object SolResolver {
39
39
/* *
40
40
* @param withAliases aliases are not recursive, so count them only at the first level of recursion
41
41
*/
42
- private fun resolveContractUsingImports (
42
+ private fun <T : SolNamedElement >resolveUsingImports (
43
+ target : Class <T >,
43
44
element : PsiElement ,
44
45
file : PsiFile ,
45
- withAliases : Boolean
46
- ): Set <SolContractDefinition > =
47
- RecursionManager .doPreventingRecursion(ResolveContractKey (element.nameOrText, file), true ) {
46
+ withAliases : Boolean ,
47
+ ): Set <T > =
48
+ RecursionManager .doPreventingRecursion(ResolveUsingImportsKey (element.nameOrText, file), true ) {
48
49
if (element is SolUserDefinedTypeName && element.findIdentifiers().size > 1 ) {
49
50
emptySet()
50
51
} else {
51
52
val inFile = file.children
52
- .filterIsInstance< SolContractDefinition >( )
53
+ .filterIsInstance(target )
53
54
.filter { it.name == element.nameOrText }
54
55
55
56
val resolvedViaAlias = when (withAliases) {
@@ -64,36 +65,38 @@ object SolResolver {
64
65
}
65
66
}
66
67
}.flatMap { (alias, resolvedFile) ->
67
- resolveContractUsingImports( alias, resolvedFile.containingFile, false )
68
+ resolveUsingImports(target, alias, resolvedFile.containingFile, false )
68
69
}
69
70
else -> emptyList()
70
71
}
71
72
72
73
val imported = file.children
73
74
.filterIsInstance<SolImportDirective >()
74
75
.mapNotNull { nullIfError { it.importPath?.reference?.resolve()?.containingFile } }
75
- .flatMap { resolveContractUsingImports( element, it, false ) }
76
+ .flatMap { resolveUsingImports(target, element, it, false ) }
76
77
77
78
(inFile + resolvedViaAlias + imported).toSet()
78
79
}
79
80
} ? : emptySet()
80
81
82
+ private fun resolveContract (element : PsiElement ): Set <SolContractDefinition > =
83
+ resolveUsingImports(SolContractDefinition ::class .java, element, element.containingFile, true )
81
84
private fun resolveEnum (element : PsiElement ): Set <SolNamedElement > =
82
- resolveInFile< SolEnumDefinition >(element) + resolveInnerType<SolEnumDefinition >(element) { it.enumDefinitionList }
85
+ resolveInnerType<SolEnumDefinition >(element) { it.enumDefinitionList } + resolveUsingImports( SolEnumDefinition :: class .java, element, element.containingFile, true )
83
86
84
87
private fun resolveStruct (element : PsiElement ): Set <SolNamedElement > =
85
- resolveInFile< SolStructDefinition >(element) + resolveInnerType<SolStructDefinition >(element) { it.structDefinitionList }
88
+ resolveInnerType<SolStructDefinition >(element) { it.structDefinitionList } + resolveUsingImports( SolStructDefinition :: class .java, element, element.containingFile, true )
86
89
87
90
private fun resolveUserDefinedValueType (element : PsiElement ): Set <SolNamedElement > =
88
- resolveInFile< SolUserDefinedValueTypeDefinition >(element) + resolveInnerType<SolUserDefinedValueTypeDefinition >(
91
+ resolveInnerType<SolUserDefinedValueTypeDefinition >(
89
92
element,
90
- { it.userDefinedValueTypeDefinitionList })
93
+ { it.userDefinedValueTypeDefinitionList }) + resolveUsingImports( SolUserDefinedValueTypeDefinition :: class .java, element, element.containingFile, true )
91
94
92
95
private fun resolveEvent (element : PsiElement ): Set <SolNamedElement > =
93
96
resolveInnerType<SolEventDefinition >(element) { it.eventDefinitionList }
94
97
95
98
private fun resolveError (element : PsiElement ): Set <SolNamedElement > =
96
- resolveInnerType<SolErrorDefinition >(element) { it.errorDefinitionList }
99
+ resolveInnerType<SolErrorDefinition >(element) { it.errorDefinitionList } + resolveUsingImports( SolErrorDefinition :: class .java, element, element.containingFile, true )
97
100
98
101
private inline fun <reified T : SolNamedElement > resolveInFile (element : PsiElement ) : Set <T > {
99
102
return element.parentOfType<SolidityFile >()
@@ -343,7 +346,7 @@ object SolResolver {
343
346
}
344
347
}
345
348
346
- data class ResolveContractKey (val name : String? , val file : PsiFile )
349
+ data class ResolveUsingImportsKey (val name : String? , val file : PsiFile )
347
350
348
351
private fun <T > Sequence<T>.takeWhileInclusive (pred : (T ) -> Boolean ): Sequence <T > {
349
352
var shouldContinue = true
0 commit comments