Skip to content

Commit 346636e

Browse files
authored
feat: ability to set LCP on class/method and JVM end brackets (#867)
* feat: ability to set LCP on class/method and function end brackets ref: sourceplusplus/sourceplusplus#690, sourceplusplus/sourceplusplus#726 * chore(deps): bump * refactor: remove mark filters (unused) added static method getSourceFileMarker * chore: put back
1 parent 3ee464d commit 346636e

File tree

39 files changed

+311
-510
lines changed

39 files changed

+311
-510
lines changed

core/src/main/kotlin/spp/jetbrains/command/LiveLocationContext.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import spp.jetbrains.marker.source.SourceFileMarker
2121
import spp.protocol.artifact.ArtifactQualifiedName
2222

2323
data class LiveLocationContext(
24-
val lineNumber: Int,
2524
val qualifiedName: ArtifactQualifiedName,
2625
val fileMarker: SourceFileMarker,
2726
val element: PsiElement,

marker/js-marker/src/main/kotlin/spp/jetbrains/marker/js/JavascriptLineMarkerProvider.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package spp.jetbrains.marker.js
1919
import com.intellij.codeInsight.daemon.LineMarkerInfo
2020
import com.intellij.lang.javascript.psi.JSFile
2121
import com.intellij.psi.PsiElement
22-
import spp.jetbrains.marker.SourceMarker
2322
import spp.jetbrains.marker.plugin.SourceLineMarkerProvider
2423
import spp.jetbrains.marker.source.SourceFileMarker
2524
import spp.jetbrains.marker.source.mark.gutter.GutterMark
@@ -40,7 +39,6 @@ class JavascriptLineMarkerProvider : SourceLineMarkerProvider() {
4039
}
4140

4241
override fun getLineMarkerInfo(parent: PsiElement?, element: PsiElement): LineMarkerInfo<PsiElement>? {
43-
val fileMarker = SourceMarker.getInstance(element.project).getSourceFileMarker(element.containingFile)
4442
return null //todo: this
4543
}
4644

marker/js-marker/src/main/kotlin/spp/jetbrains/marker/js/service/JavascriptArtifactCreationService.kt

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,8 @@ class JavascriptArtifactCreationService : IArtifactCreationService {
8484
SourceMark.Type.GUTTER
8585
) as ExpressionGutterMark
8686
return if (autoApply) {
87-
if (gutterMark.canApply()) {
88-
gutterMark.apply(true)
89-
gutterMark
90-
} else {
91-
null
92-
}
87+
gutterMark.apply(true)
88+
gutterMark
9389
} else {
9490
gutterMark
9591
}
@@ -151,12 +147,8 @@ class JavascriptArtifactCreationService : IArtifactCreationService {
151147
SourceMark.Type.INLAY
152148
) as ExpressionInlayMark
153149
return if (autoApply) {
154-
if (inlayMark.canApply()) {
155-
inlayMark.apply(true)
156-
inlayMark
157-
} else {
158-
error("Could not apply inlay mark: $inlayMark")
159-
}
150+
inlayMark.apply(true)
151+
inlayMark
160152
} else {
161153
inlayMark
162154
}
@@ -188,12 +180,8 @@ class JavascriptArtifactCreationService : IArtifactCreationService {
188180
SourceMark.Type.INLAY
189181
) as ExpressionInlayMark
190182
return if (autoApply) {
191-
if (inlayMark.canApply()) {
192-
inlayMark.apply(true)
193-
inlayMark
194-
} else {
195-
null
196-
}
183+
inlayMark.apply(true)
184+
inlayMark
197185
} else {
198186
inlayMark
199187
}

marker/js-marker/src/main/kotlin/spp/jetbrains/marker/js/service/JavascriptArtifactNamingService.kt

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,18 @@ class JavascriptArtifactNamingService : IArtifactNamingService {
7979

8080
override fun getFullyQualifiedName(element: PsiElement): ArtifactQualifiedName {
8181
return when (element) {
82-
is JSClass -> {
83-
ArtifactQualifiedName(element.qualifiedName!!, null, ArtifactType.CLASS)
84-
}
82+
is JSClass -> ArtifactQualifiedName(
83+
element.qualifiedName!!,
84+
type = ArtifactType.CLASS,
85+
lineNumber = SourceMarkerUtils.getLineNumber(element)
86+
)
8587

8688
is JSFunctionExpression -> getStatementOrExpressionQualifiedName(element, ArtifactType.EXPRESSION)
87-
88-
is JSFunction -> {
89-
ArtifactQualifiedName(element.qualifiedName!!, null, ArtifactType.METHOD)
90-
}
89+
is JSFunction -> ArtifactQualifiedName(
90+
element.qualifiedName!!,
91+
type = ArtifactType.METHOD,
92+
lineNumber = SourceMarkerUtils.getLineNumber(element)
93+
)
9194

9295
is JSStatement, is JSStatementList -> getStatementOrExpressionQualifiedName(element, ArtifactType.STATEMENT)
9396
else -> getStatementOrExpressionQualifiedName(element, ArtifactType.EXPRESSION)
@@ -104,12 +107,14 @@ class JavascriptArtifactNamingService : IArtifactNamingService {
104107
val parentElement = element.parentOfType<JSNamedElement>()
105108
return if (parentElement != null) {
106109
ArtifactQualifiedName(
107-
"${getFullyQualifiedName(parentElement).identifier}.${name}", null, type,
110+
"${getFullyQualifiedName(parentElement).identifier}.${name}",
111+
type = type,
108112
lineNumber = SourceMarkerUtils.getLineNumber(element)
109113
)
110114
} else {
111115
ArtifactQualifiedName(
112-
"${element.containingFile.virtualFile.path}#$name", null, type,
116+
"${element.containingFile.virtualFile.path}#$name",
117+
type = type,
113118
lineNumber = SourceMarkerUtils.getLineNumber(element)
114119
)
115120
}
@@ -120,7 +125,13 @@ class JavascriptArtifactNamingService : IArtifactNamingService {
120125
psiFile.acceptChildren(object : JSRecursiveWalkingElementVisitor() {
121126
override fun visitJSClass(node: JSClass) { // TODO: check this also works for typescript classes, otherwise use visitTypescriptClass
122127
super.visitJSClass(node)
123-
classQualifiedNames.add(ArtifactQualifiedName(node.qualifiedName!!, type = ArtifactType.CLASS))
128+
classQualifiedNames.add(
129+
ArtifactQualifiedName(
130+
node.qualifiedName!!,
131+
type = ArtifactType.CLASS,
132+
lineNumber = SourceMarkerUtils.getLineNumber(node)
133+
)
134+
)
124135
}
125136
})
126137
return classQualifiedNames

marker/jvm-marker/src/main/kotlin/spp/jetbrains/marker/jvm/JVMLineMarkerProvider.kt

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package spp.jetbrains.marker.jvm
1818

1919
import com.intellij.codeInsight.daemon.GutterIconNavigationHandler
2020
import com.intellij.codeInsight.daemon.LineMarkerInfo
21-
import com.intellij.openapi.diagnostic.logger
2221
import com.intellij.openapi.editor.markup.GutterIconRenderer
2322
import com.intellij.psi.PsiClass
2423
import com.intellij.psi.PsiElement
@@ -27,13 +26,11 @@ import com.intellij.psi.PsiJavaFile
2726
import org.jetbrains.kotlin.psi.KtFile
2827
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile
2928
import org.jetbrains.uast.UClass
30-
import org.jetbrains.uast.UMethod
3129
import org.jetbrains.uast.toUElement
32-
import org.jetbrains.uast.toUElementOfType
3330
import spp.jetbrains.marker.SourceMarker
3431
import spp.jetbrains.marker.impl.ArtifactCreationService
35-
import spp.jetbrains.marker.plugin.SourceLineMarkerProvider
3632
import spp.jetbrains.marker.jvm.service.utils.JVMMarkerUtils
33+
import spp.jetbrains.marker.plugin.SourceLineMarkerProvider
3734
import spp.jetbrains.marker.source.SourceFileMarker.Companion.SUPPORTED_FILE_TYPES
3835
import spp.jetbrains.marker.source.mark.api.SourceMark
3936
import spp.jetbrains.marker.source.mark.api.key.SourceKey
@@ -49,10 +46,6 @@ import spp.jetbrains.marker.source.mark.gutter.MethodGutterMark
4946
*/
5047
abstract class JVMLineMarkerProvider : SourceLineMarkerProvider() {
5148

52-
companion object {
53-
private val log = logger<JVMLineMarkerProvider>()
54-
}
55-
5649
override fun getLineMarkerInfo(
5750
parent: PsiElement?,
5851
element: PsiElement
@@ -65,9 +58,8 @@ abstract class JVMLineMarkerProvider : SourceLineMarkerProvider() {
6558
}
6659

6760
private fun getClassGutterMark(element: PsiIdentifier): LineMarkerInfo<PsiElement>? {
68-
val fileMarker = SourceMarker.getInstance(element.project).getSourceFileMarker(element.containingFile) ?: return null
61+
val fileMarker = SourceMarker.getSourceFileMarker(element.containingFile) ?: return null
6962
val artifactQualifiedName = JVMMarkerUtils.getFullyQualifiedName(element.parent.toUElement() as UClass)
70-
if (!SourceMarker.getInstance(element.project).configuration.createSourceMarkFilter.test(artifactQualifiedName)) return null
7163

7264
//check by artifact name first due to user can erroneously name same class twice
7365
var gutterMark = fileMarker.getSourceMark(artifactQualifiedName, SourceMark.Type.GUTTER) as ClassGutterMark?
@@ -95,14 +87,8 @@ abstract class JVMLineMarkerProvider : SourceLineMarkerProvider() {
9587
}
9688

9789
private fun getMethodGutterMark(element: PsiElement): LineMarkerInfo<PsiElement>? {
98-
val fileMarker = SourceMarker.getInstance(element.project).getSourceFileMarker(element.containingFile) ?: return null
99-
val uMethod = element.parent.toUElementOfType<UMethod>()
100-
if (uMethod == null) {
101-
log.warn("Unable to transform to UMethod: ${element.parent}")
102-
return null
103-
}
104-
val artifactQualifiedName = JVMMarkerUtils.getFullyQualifiedName(uMethod)
105-
if (!SourceMarker.getInstance(element.project).configuration.createSourceMarkFilter.test(artifactQualifiedName)) return null
90+
val fileMarker = SourceMarker.getSourceFileMarker(element.containingFile) ?: return null
91+
val artifactQualifiedName = JVMMarkerUtils.getFullyQualifiedName(element)
10692

10793
//check by artifact name first due to user can erroneously name same method twice
10894
var gutterMark = fileMarker.getSourceMark(

marker/jvm-marker/src/main/kotlin/spp/jetbrains/marker/jvm/JVMSourceInlayHintProvider.kt

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,9 @@ import com.intellij.psi.PsiElement
2222
import com.intellij.psi.PsiMethod
2323
import com.intellij.psi.PsiMethodCallExpression
2424
import com.intellij.psi.PsiStatement
25-
import org.jetbrains.uast.UExpression
26-
import org.jetbrains.uast.UMethod
27-
import org.jetbrains.uast.toUElement
2825
import spp.jetbrains.marker.SourceMarker
29-
import spp.jetbrains.marker.plugin.SourceInlayHintProvider
3026
import spp.jetbrains.marker.jvm.service.utils.JVMMarkerUtils
27+
import spp.jetbrains.marker.plugin.SourceInlayHintProvider
3128
import spp.jetbrains.marker.source.mark.inlay.InlayMark
3229
import spp.jetbrains.marker.source.mark.inlay.config.InlayMarkVirtualText
3330

@@ -44,19 +41,11 @@ class JVMSourceInlayHintProvider : SourceInlayHintProvider() {
4441
if ((parent is PsiMethod && element === parent.nameIdentifier)
4542
|| (JVMMarkerUtils.getNameIdentifier(parent) === element)
4643
) {
47-
val fileMarker = SourceMarker.getInstance(element.project).getSourceFileMarker(element.containingFile)!!
48-
val artifactQualifiedName = JVMMarkerUtils.getFullyQualifiedName(parent.toUElement() as UMethod)
49-
return if (!SourceMarker.getInstance(element.project).configuration.createSourceMarkFilter.test(artifactQualifiedName)) null else {
50-
JVMMarkerUtils.getOrCreateMethodInlayMark(fileMarker, element)
51-
}
44+
val fileMarker = SourceMarker.getSourceFileMarker(element.containingFile)!!
45+
return JVMMarkerUtils.getOrCreateMethodInlayMark(fileMarker, element)
5246
} else if (element is PsiStatement) {
53-
val fileMarker = SourceMarker.getInstance(element.project).getSourceFileMarker(element.containingFile)!!
54-
val artifactQualifiedName = JVMMarkerUtils.getFullyQualifiedName(
55-
JVMMarkerUtils.getUniversalExpression(element).toUElement() as UExpression
56-
)
57-
return if (!SourceMarker.getInstance(element.project).configuration.createSourceMarkFilter.test(artifactQualifiedName)) null else {
58-
JVMMarkerUtils.getOrCreateExpressionInlayMark(fileMarker, element)
59-
}
47+
val fileMarker = SourceMarker.getSourceFileMarker(element.containingFile)!!
48+
return JVMMarkerUtils.getOrCreateExpressionInlayMark(fileMarker, element)
6049
}
6150
return null
6251
}

marker/jvm-marker/src/main/kotlin/spp/jetbrains/marker/jvm/service/JVMArtifactCreationService.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,8 @@ class JVMArtifactCreationService : IArtifactCreationService {
7373
SourceMark.Type.GUTTER
7474
) as MethodGutterMark
7575
return if (autoApply) {
76-
if (gutterMark.canApply()) {
77-
gutterMark.apply(true)
78-
gutterMark
79-
} else {
80-
null
81-
}
76+
gutterMark.apply(true)
77+
gutterMark
8278
} else {
8379
gutterMark
8480
}

marker/jvm-marker/src/main/kotlin/spp/jetbrains/marker/jvm/service/JVMArtifactNamingService.kt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import com.intellij.openapi.diagnostic.logger
2121
import com.intellij.openapi.project.Project
2222
import com.intellij.psi.*
2323
import com.intellij.psi.util.ClassUtil
24-
import org.jetbrains.uast.*
2524
import spp.jetbrains.marker.IArtifactNamingService
2625
import spp.jetbrains.marker.SourceMarker
2726
import spp.jetbrains.marker.jvm.service.utils.JVMMarkerUtils
@@ -84,14 +83,7 @@ class JVMArtifactNamingService : IArtifactNamingService {
8483
}
8584

8685
override fun getFullyQualifiedName(element: PsiElement): ArtifactQualifiedName {
87-
return when (val uElement = element.toUElement()) {
88-
is UClass -> JVMMarkerUtils.getFullyQualifiedName(uElement)
89-
is UMethod -> JVMMarkerUtils.getFullyQualifiedName(uElement)
90-
is UExpression -> JVMMarkerUtils.getFullyQualifiedName(element)
91-
is UDeclaration -> JVMMarkerUtils.getFullyQualifiedName(element)
92-
is UIdentifier -> JVMMarkerUtils.getFullyQualifiedName(element)
93-
else -> TODO("Not yet implemented")
94-
}
86+
return JVMMarkerUtils.getFullyQualifiedName(element)
9587
}
9688

9789
override fun getQualifiedClassNames(psiFile: PsiFile): List<ArtifactQualifiedName> {

marker/jvm-marker/src/main/kotlin/spp/jetbrains/marker/jvm/service/JVMArtifactScopeService.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.intellij.psi.scope.util.PsiScopesUtil
2222
import com.intellij.psi.util.parentOfTypes
2323
import com.siyeh.ig.psiutils.ControlFlowUtils
2424
import org.jetbrains.kotlin.psi.KtNamedFunction
25+
import org.joor.Reflect
2526
import spp.jetbrains.marker.IArtifactScopeService
2627
import spp.jetbrains.marker.SourceMarkerUtils
2728
import spp.jetbrains.marker.source.SourceFileMarker
@@ -34,14 +35,6 @@ import spp.jetbrains.marker.source.SourceFileMarker
3435
*/
3536
class JVMArtifactScopeService : IArtifactScopeService {
3637

37-
fun isMethodAtLine(psiFile: PsiFile, lineNumber: Int): Boolean {
38-
var el = SourceMarkerUtils.getElementAtLine(psiFile, lineNumber)
39-
while (el is PsiKeyword || el is PsiModifierList) {
40-
el = el.parent
41-
}
42-
return el is PsiMethod
43-
}
44-
4538
override fun getScopeVariables(fileMarker: SourceFileMarker, lineNumber: Int): List<String> {
4639
//determine available vars
4740
var checkLine = lineNumber
@@ -73,4 +66,15 @@ class JVMArtifactScopeService : IArtifactScopeService {
7366
}
7467

7568
override fun isJVM(element: PsiElement): Boolean = true
69+
70+
override fun canShowControlBar(psiElement: PsiElement): Boolean {
71+
return when (psiElement::class.java.name) {
72+
"org.jetbrains.kotlin.psi.KtObjectDeclaration" -> false
73+
"org.jetbrains.kotlin.psi.KtProperty" -> {
74+
Reflect.on(psiElement).call("isLocal").get<Boolean>() == true
75+
}
76+
77+
else -> super.canShowControlBar(psiElement)
78+
}
79+
}
7680
}

0 commit comments

Comments
 (0)