File tree 6 files changed +38
-0
lines changed
core/src/main/kotlin/spp/jetbrains/artifact/service
js-marker/src/main/kotlin/spp/jetbrains/marker/js/service
jvm-marker/src/main/kotlin/spp/jetbrains/marker/jvm/service
py-marker/src/main/kotlin/spp/jetbrains/marker/py/service
6 files changed +38
-0
lines changed Original file line number Diff line number Diff line change @@ -35,6 +35,10 @@ import spp.protocol.artifact.ArtifactType
35
35
@Suppress(" MemberVisibilityCanBePrivate" , " TooManyFunctions" ) // public API
36
36
object ArtifactScopeService : AbstractSourceMarkerService<IArtifactScopeService>(), IArtifactScopeService {
37
37
38
+ override fun getFields (element : PsiElement ): List <PsiElement > {
39
+ return getService(element.language).getFields(element)
40
+ }
41
+
38
42
override fun getLoops (element : PsiElement ): List <PsiElement > {
39
43
return getService(element.language).getLoops(element)
40
44
}
@@ -118,6 +122,10 @@ object ArtifactScopeService : AbstractSourceMarkerService<IArtifactScopeService>
118
122
119
123
// Extensions
120
124
125
+ fun PsiElement.getFields (): List <PsiElement > {
126
+ return ArtifactScopeService .getService(language).getFields(this )
127
+ }
128
+
121
129
fun PsiElement.getFunctions (includeInnerClasses : Boolean = false): List <PsiNamedElement > {
122
130
return ArtifactScopeService .getService(language).getFunctions(this , includeInnerClasses)
123
131
}
Original file line number Diff line number Diff line change @@ -31,6 +31,7 @@ import com.intellij.psi.PsiNamedElement
31
31
@Suppress(" TooManyFunctions" ) // public API
32
32
interface IArtifactScopeService : ISourceMarkerService {
33
33
34
+ fun getFields (element : PsiElement ): List <PsiElement >
34
35
fun getLoops (element : PsiElement ): List <PsiElement >
35
36
fun getFunctions (element : PsiElement , includeInnerClasses : Boolean = false): List <PsiNamedElement >
36
37
fun getClasses (element : PsiElement ): List <PsiNamedElement >
Original file line number Diff line number Diff line change @@ -49,6 +49,11 @@ import spp.jetbrains.marker.SourceMarkerUtils
49
49
@Suppress(" TooManyFunctions" ) // public API
50
50
class JavascriptArtifactScopeService : IArtifactScopeService {
51
51
52
+ override fun getFields (element : PsiElement ): List <PsiElement > {
53
+ require(ArtifactTypeService .isJavaScript(element))
54
+ return element.descendantsOfType<JSField >().toList()
55
+ }
56
+
52
57
override fun getLoops (element : PsiElement ): List <PsiElement > {
53
58
require(ArtifactTypeService .isJavaScript(element))
54
59
return element.descendantsOfType<JSLoopStatement >().toList()
Original file line number Diff line number Diff line change @@ -57,6 +57,13 @@ import spp.jetbrains.marker.SourceMarkerUtils.doOnReadThread
57
57
@Suppress(" TooManyFunctions" ) // public API
58
58
class JVMArtifactScopeService : IArtifactScopeService {
59
59
60
+ override fun getFields (element : PsiElement ): List <PsiElement > {
61
+ return when {
62
+ ArtifactTypeService .isKotlin(element) -> element.descendantsOfType<KtProperty >().toList()
63
+ else -> element.descendantsOfType<PsiField >().toList()
64
+ }
65
+ }
66
+
60
67
override fun getLoops (element : PsiElement ): List <PsiElement > {
61
68
return when {
62
69
ArtifactTypeService .isKotlin(element) -> element.descendantsOfType<KtLoopExpression >().toList()
Original file line number Diff line number Diff line change @@ -55,6 +55,7 @@ object JVMMarkerUtils {
55
55
element is PsiAnnotation -> return getFullyQualifiedName(element)
56
56
element is PsiClass -> return getFullyQualifiedName(element)
57
57
element is PsiMethod -> return getFullyQualifiedName(element)
58
+ element is PsiField -> return getFullyQualifiedName(element)
58
59
else -> Unit
59
60
}
60
61
@@ -158,6 +159,17 @@ object JVMMarkerUtils {
158
159
)
159
160
}
160
161
162
+ private fun getFullyQualifiedName (psiField : PsiField ): ArtifactQualifiedName {
163
+ val classQualifiedName = psiField.findAnyContainingStrict(PsiClass ::class .java)?.let {
164
+ getFullyQualifiedName(it).identifier
165
+ }
166
+ return ArtifactQualifiedName (
167
+ " $classQualifiedName .${psiField.name} " ,
168
+ type = ArtifactType .EXPRESSION , // todo: ArtifactType.VARIABLE
169
+ lineNumber = psiField.nameIdentifier.let { SourceMarkerUtils .getLineNumber(it) }
170
+ )
171
+ }
172
+
161
173
private fun getFullyQualifiedName (method : KtNamedFunction ): ArtifactQualifiedName {
162
174
val classQualifiedName = method.findAnyContainingStrict(KtClass ::class .java)?.let {
163
175
getFullyQualifiedName(it).identifier
Original file line number Diff line number Diff line change @@ -49,6 +49,11 @@ import spp.jetbrains.marker.SourceMarkerUtils
49
49
@Suppress(" TooManyFunctions" ) // public API
50
50
class PythonArtifactScopeService : IArtifactScopeService {
51
51
52
+ override fun getFields (element : PsiElement ): List <PsiElement > {
53
+ require(ArtifactTypeService .isPython(element))
54
+ return element.descendantsOfType<PyTargetExpression >().toList()
55
+ }
56
+
52
57
override fun getLoops (element : PsiElement ): List <PsiElement > {
53
58
require(ArtifactTypeService .isPython(element))
54
59
return element.descendantsOfType<PyLoopStatement >().toList()
You can’t perform that action at this time.
0 commit comments