Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
f38bc13
fix view history on watch log expression
BFergerson Mar 15, 2022
1646eb5
lower logging
BFergerson Mar 15, 2022
c0da0b3
rename
BFergerson Mar 15, 2022
04543b2
update
BFergerson Mar 15, 2022
5f84af3
link
BFergerson Mar 15, 2022
8158f9f
Update README.md
BFergerson Mar 15, 2022
23348e1
Update README.md
BFergerson Mar 15, 2022
6568d30
Update README.md
BFergerson Mar 15, 2022
5c37977
Update README.md
BFergerson Mar 15, 2022
c4a8f1b
Update README.md
BFergerson Mar 15, 2022
a97d924
Update README.md
BFergerson Mar 15, 2022
8c04cfc
Update README.md
BFergerson Mar 15, 2022
b44993a
Update README.md
BFergerson Mar 15, 2022
5e92668
Update README.md
BFergerson Mar 15, 2022
d9cab78
Update README.md
BFergerson Mar 15, 2022
458ed62
Update README.md
BFergerson Mar 15, 2022
4c0c1ad
Update README.md
BFergerson Mar 15, 2022
af6676d
Update README.md
BFergerson Mar 15, 2022
33235ae
Update README.md
BFergerson Mar 15, 2022
87e5f9a
Update README.md
BFergerson Mar 16, 2022
4838782
trigger event
BFergerson Mar 17, 2022
03c0e03
convenience method
BFergerson Mar 17, 2022
f133199
createMethodGutterMark
BFergerson Mar 17, 2022
dee50c0
default
BFergerson Mar 18, 2022
d05af32
lazy changelog
BFergerson Mar 18, 2022
1c7cf7f
move method
BFergerson Mar 18, 2022
318dfeb
impl SWLiveViewService
BFergerson Mar 18, 2022
1034189
allow live view commands
BFergerson Mar 18, 2022
681b11e
move code to processor
BFergerson Mar 18, 2022
925bfe3
impl show/hide quick stats
BFergerson Mar 19, 2022
2794e7c
todo
BFergerson Mar 19, 2022
5a34119
accept events to indiv subscriber
BFergerson Mar 19, 2022
8e6d282
Merge branch 'master' into dev
BFergerson Mar 19, 2022
72fc955
bump
BFergerson Mar 19, 2022
c19b07e
Merge remote-tracking branch 'origin/dev' into dev
BFergerson Mar 19, 2022
55d5f14
don't need
BFergerson Mar 19, 2022
5fd681f
Update JVMMarkerUtils.kt
BFergerson Mar 19, 2022
10d0cb5
auto-display endpoint quick stats setting
BFergerson Mar 19, 2022
0459a94
auto-display endpoint quick stats setting
BFergerson Mar 19, 2022
0b509f5
change default
BFergerson Mar 19, 2022
e2d72e2
impl auto-resolve for SWLiveService
BFergerson Mar 19, 2022
cdb202d
fix compatibility issues
BFergerson Mar 19, 2022
19277b8
fix compatibility issues
BFergerson Mar 19, 2022
4d38574
fix compatibility issues
BFergerson Mar 19, 2022
bc43a1d
fixes https://github.com/sourceplusplus/interface-jetbrains/issues/690
BFergerson Mar 20, 2022
66a7917
clean
BFergerson Mar 20, 2022
e8da64e
fix command highlighting
BFergerson Mar 20, 2022
86a2774
fixes #681
BFergerson Mar 25, 2022
d13e66c
clean
BFergerson Mar 25, 2022
659e920
bump
BFergerson Mar 25, 2022
4bdeea6
fix dupes caused by quick stats indicator
BFergerson Mar 26, 2022
6c00808
keep focused if empty
BFergerson Mar 26, 2022
d9c9a25
ability to set virtual text font and offset
BFergerson Mar 26, 2022
8aac8a0
fixes https://github.com/sourceplusplus/interface-jetbrains/issues/692
BFergerson Mar 26, 2022
0808bc4
remove unused and fix font
BFergerson Mar 26, 2022
7723f86
fixes https://github.com/sourceplusplus/interface-jetbrains/issues/692
BFergerson Mar 26, 2022
7d10fa3
fixes https://github.com/sourceplusplus/interface-jetbrains/issues/692
BFergerson Mar 26, 2022
c44d6dd
more distinct
BFergerson Mar 26, 2022
a73d8d0
updated icons
BFergerson Mar 26, 2022
6b9676a
better coloring
BFergerson Mar 26, 2022
e835b24
fix off center text
BFergerson Mar 26, 2022
0704a58
bold values instead of labels
BFergerson Mar 26, 2022
60a39c9
improve coloring
BFergerson Mar 26, 2022
bc04b5f
improve coloring
BFergerson Mar 26, 2022
ccf10ba
fix auto resolving for spp install
BFergerson Mar 28, 2022
24dc9be
ability to set editor
BFergerson Mar 28, 2022
a64145e
refactor
BFergerson Mar 28, 2022
cb1299b
refactor
BFergerson Mar 28, 2022
b4a255c
bump
BFergerson Mar 28, 2022
d3821cc
Merge branch 'master' into dev
BFergerson Mar 28, 2022
d8deb6a
merge revert
BFergerson Mar 28, 2022
a00d8fa
refactor
BFergerson Mar 28, 2022
62c6249
revert
BFergerson Mar 28, 2022
9cf291d
Merge remote-tracking branch 'origin/dev' into dev
BFergerson Mar 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ kotlin.code.style=official

pluginGroup = spp.jetbrains
pluginName = Source++
projectVersion=0.4.3
projectVersion=0.4.4
pluginSinceBuild = 202.4357
# Plugin Verifier integration -> https://github.com/JetBrains/gradle-intellij-plugin#plugin-verifier-dsl
# See https://jb.gg/intellij-platform-builds-list for available build versions
pluginVerifierIdeVersions = 2020.3.2, 2021.3.2
pluginVerifierIdeVersions = 2020.3.2, 2021.3.3

platformType = IC
ideVersion = 2021.3.2
ideVersion = 2021.3.3
platformDownloadSources = true
# Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html
# Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22
Expand Down
20 changes: 2 additions & 18 deletions marker/src/main/kotlin/spp/jetbrains/marker/SourceMarker.kt
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ object SourceMarker {
private val availableSourceFileMarkers = Maps.newConcurrentMap<Int, SourceFileMarker>()
private val globalSourceMarkEventListeners = Lists.newArrayList<SourceMarkEventListener>()

fun clearAvailableSourceFileMarkers() {
suspend fun clearAvailableSourceFileMarkers() {
check(enabled) { "SourceMarker disabled" }

availableSourceFileMarkers.forEach {
Expand All @@ -60,23 +60,7 @@ object SourceMarker {
availableSourceFileMarkers.clear()
}

fun refreshAvailableSourceFileMarkers(recreateFileMarkers: Boolean) {
check(enabled) { "SourceMarker disabled" }

if (recreateFileMarkers) {
val previousFileMarkers = getAvailableSourceFileMarkers()
clearAvailableSourceFileMarkers()
previousFileMarkers.forEach {
getSourceFileMarker(it.psiFile)!!.refresh()
}
} else {
availableSourceFileMarkers.forEach {
it.value.refresh()
}
}
}

fun deactivateSourceFileMarker(sourceFileMarker: SourceFileMarker): Boolean {
suspend fun deactivateSourceFileMarker(sourceFileMarker: SourceFileMarker): Boolean {
check(enabled) { "SourceMarker disabled" }

if (availableSourceFileMarkers.remove(sourceFileMarker.hashCode()) != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import kotlinx.coroutines.runBlocking
import org.slf4j.LoggerFactory
import spp.jetbrains.marker.SourceMarker
import spp.jetbrains.marker.source.SourceFileMarker
Expand Down Expand Up @@ -61,7 +62,9 @@ class FileActivityListener : FileEditorManagerListener {
val psiFile = PsiManager.getInstance(source.project).findFile(file)
val fileMarker = psiFile?.getUserData(SourceFileMarker.KEY)
if (fileMarker != null) {
SourceMarker.deactivateSourceFileMarker(fileMarker)
runBlocking {
SourceMarker.deactivateSourceFileMarker(fileMarker)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import com.intellij.openapi.editor.impl.EditorImpl
import com.intellij.openapi.editor.markup.EffectType
import com.intellij.openapi.editor.markup.TextAttributes
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.util.Disposer
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.ui.paint.EffectPainter
Expand All @@ -37,6 +38,7 @@ import org.slf4j.LoggerFactory
import spp.jetbrains.marker.SourceMarker
import spp.jetbrains.marker.SourceMarker.getSourceFileMarker
import spp.jetbrains.marker.source.mark.api.event.SourceMarkEventCode.MARK_REMOVED
import spp.jetbrains.marker.source.mark.api.event.SourceMarkEventListener
import spp.jetbrains.marker.source.mark.api.key.SourceKey
import spp.jetbrains.marker.source.mark.inlay.InlayMark
import spp.jetbrains.marker.source.mark.inlay.config.InlayMarkVirtualText
Expand All @@ -60,37 +62,32 @@ abstract class SourceInlayHintProvider : InlayHintsProvider<NoSettings> {
companion object {
private val log = LoggerFactory.getLogger(SourceInlayHintProvider::class.java)

@Volatile
@JvmField
var latestInlayMarkAddedAt: Long = -1L

init {
SourceMarker.addGlobalSourceMarkEventListener { event ->
when (event.eventCode) {
VIRTUAL_TEXT_UPDATED, INLAY_MARK_VISIBLE, INLAY_MARK_HIDDEN -> {
ApplicationManager.getApplication().invokeLater {
FileEditorManager.getInstance(event.sourceMark.project).selectedTextEditor?.inlayModel
//todo: smaller range
?.getInlineElementsInRange(0, Integer.MAX_VALUE)?.forEach {
it.repaint()
}
FileEditorManager.getInstance(event.sourceMark.project).selectedTextEditor?.inlayModel
//todo: smaller range
?.getAfterLineEndElementsInRange(0, Integer.MAX_VALUE)?.forEach {
it.repaint()
}
FileEditorManager.getInstance(event.sourceMark.project).selectedTextEditor?.inlayModel
//todo: smaller range
?.getBlockElementsInRange(0, Integer.MAX_VALUE)?.forEach {
it.repaint()
}
}
val EVENT_LISTENER = SourceMarkEventListener { event ->
when (event.eventCode) {
VIRTUAL_TEXT_UPDATED, INLAY_MARK_VISIBLE, INLAY_MARK_HIDDEN -> {
ApplicationManager.getApplication().invokeLater {
FileEditorManager.getInstance(event.sourceMark.project).selectedTextEditor?.inlayModel
//todo: smaller range
?.getInlineElementsInRange(0, Integer.MAX_VALUE)?.forEach {
it.repaint()
}
FileEditorManager.getInstance(event.sourceMark.project).selectedTextEditor?.inlayModel
//todo: smaller range
?.getAfterLineEndElementsInRange(0, Integer.MAX_VALUE)?.forEach {
it.repaint()
}
FileEditorManager.getInstance(event.sourceMark.project).selectedTextEditor?.inlayModel
//todo: smaller range
?.getBlockElementsInRange(0, Integer.MAX_VALUE)?.forEach {
it.repaint()
}
}
MARK_REMOVED -> {
ApplicationManager.getApplication().invokeLater {
FileEditorManager.getInstance(event.sourceMark.project).selectedTextEditor?.inlayModel
//todo: smaller range
?.getBlockElementsInRange(0, Integer.MAX_VALUE)?.forEach {
}
MARK_REMOVED -> {
ApplicationManager.getApplication().invokeLater {
FileEditorManager.getInstance(event.sourceMark.project).selectedTextEditor?.inlayModel
//todo: smaller range
?.getBlockElementsInRange(0, Integer.MAX_VALUE)?.forEach {
if (it.renderer is BlockInlayRenderer) {
val cachedPresentation = Reflect.on(it.renderer).field("cachedPresentation").get<Any>()
if (cachedPresentation is RecursivelyUpdatingRootPresentation) {
Expand All @@ -99,18 +96,21 @@ abstract class SourceInlayHintProvider : InlayHintsProvider<NoSettings> {
if (delegatePresentation.presentation is DynamicTextInlayPresentation) {
val dynamicPresentation = delegatePresentation.presentation as DynamicTextInlayPresentation
if (dynamicPresentation.inlayMark == event.sourceMark) {
it.dispose()
Disposer.dispose(it)
}
}
}
}
}
}
}
}
}
}
}

@Volatile
@JvmField
var latestInlayMarkAddedAt: Long = -1L
}

override val key: SettingsKey<NoSettings> = SettingsKey("SourceMarker/InlayHints")
Expand Down Expand Up @@ -201,13 +201,13 @@ abstract class SourceInlayHintProvider : InlayHintsProvider<NoSettings> {
if (virtualText.icon != null) {
virtualText.icon!!.paintIcon(null, g, virtualText.iconLocation.x, virtualText.iconLocation.y)
}
g.font = font
g.font = virtualText.font ?: font
g.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
AntialiasingType.getKeyForCurrentScope(false)
)
g.color = foreground
g.drawString(virtualText.getRenderedVirtualText(), 0, ascent)
g.drawString(virtualText.getRenderedVirtualText(), virtualText.xOffset, ascent)
val effectColor = virtualText.textAttributes.effectColor
if (effectColor != null) {
g.color = effectColor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import com.intellij.openapi.util.Key
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiNameIdentifierOwner
import kotlinx.coroutines.runBlocking
import org.slf4j.LoggerFactory
import spp.jetbrains.marker.source.mark.api.*
import spp.jetbrains.marker.source.mark.api.event.SourceMarkEvent
Expand Down Expand Up @@ -83,9 +84,11 @@ open class SourceFileMarker(val psiFile: PsiFile) : SourceMarkProvider {
}
}

open fun clearSourceMarks() {
open suspend fun clearSourceMarks() {
val removed = sourceMarks.removeIf {
it.dispose(false)
runBlocking {
it.disposeSuspend(false)
}
true
}
if (removed) refresh()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,13 @@ abstract class ClassSourceMark(
false
}

override fun apply(sourceMarkComponent: SourceMarkComponent, addToMarker: Boolean) {
override fun apply(sourceMarkComponent: SourceMarkComponent, addToMarker: Boolean, editor: Editor?) {
this.sourceMarkComponent = sourceMarkComponent
super.apply(addToMarker)
super.apply(addToMarker, editor)
}

override fun apply(addToMarker: Boolean) {
apply(configuration.componentProvider.getComponent(this), addToMarker)
override fun apply(addToMarker: Boolean, editor: Editor?) {
apply(configuration.componentProvider.getComponent(this), addToMarker, editor)
}

override fun dispose(removeFromMarker: Boolean, assertRemoval: Boolean) {
Expand All @@ -99,6 +99,12 @@ abstract class ClassSourceMark(
super.dispose(removeFromMarker, assertRemoval)
}

override suspend fun disposeSuspend(removeFromMarker: Boolean, assertRemoval: Boolean) {
psiClass.nameIdentifier?.putUserData(SourceKey.GutterMark, null)
psiClass.nameIdentifier?.putUserData(SourceKey.InlayMark, null)
super.disposeSuspend(removeFromMarker, assertRemoval)
}

private val userData = HashMap<Any, Any>()
override fun <T> getUserData(key: SourceKey<T>): T? = userData[key] as T?
override fun <T> putUserData(key: SourceKey<T>, value: T?) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,13 @@ abstract class ExpressionSourceMark(
}

@Synchronized
override fun apply(sourceMarkComponent: SourceMarkComponent, addToMarker: Boolean) {
override fun apply(sourceMarkComponent: SourceMarkComponent, addToMarker: Boolean, editor: Editor?) {
this.sourceMarkComponent = sourceMarkComponent
super.apply(addToMarker)
super.apply(addToMarker, editor)
}

override fun apply(addToMarker: Boolean) {
apply(configuration.componentProvider.getComponent(this), addToMarker)
override fun apply(addToMarker: Boolean, editor: Editor?) {
apply(configuration.componentProvider.getComponent(this), addToMarker, editor)
}

override fun dispose(removeFromMarker: Boolean, assertRemoval: Boolean) {
Expand All @@ -98,6 +98,15 @@ abstract class ExpressionSourceMark(
super.dispose(removeFromMarker, assertRemoval)
}

override suspend fun disposeSuspend(removeFromMarker: Boolean, assertRemoval: Boolean) {
when (this) {
is GutterMark -> getPsiElement().putUserData(SourceKey.GutterMark, null)
is InlayMark -> getPsiElement().putUserData(SourceKey.InlayMark, null)
else -> throw IllegalStateException("ExpressionSourceMark is not a GutterMark or InlayMark")
}
super.disposeSuspend(removeFromMarker, assertRemoval)
}

fun getParentSourceMark(): SourceMark? {
return SourceMarker.getSourceMark(
artifactQualifiedName.copy(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,13 @@ abstract class MethodSourceMark(
}

@Synchronized
override fun apply(sourceMarkComponent: SourceMarkComponent, addToMarker: Boolean) {
override fun apply(sourceMarkComponent: SourceMarkComponent, addToMarker: Boolean, editor: Editor?) {
this.sourceMarkComponent = sourceMarkComponent
super.apply(addToMarker)
super.apply(addToMarker, editor)
}

override fun apply(addToMarker: Boolean) {
apply(configuration.componentProvider.getComponent(this), addToMarker)
override fun apply(addToMarker: Boolean, editor: Editor?) {
apply(configuration.componentProvider.getComponent(this), addToMarker, editor)
}

override fun dispose(removeFromMarker: Boolean, assertRemoval: Boolean) {
Expand All @@ -100,6 +100,12 @@ abstract class MethodSourceMark(
super.dispose(removeFromMarker, assertRemoval)
}

override suspend fun disposeSuspend(removeFromMarker: Boolean, assertRemoval: Boolean) {
psiMethod.nameIdentifier?.putUserData(SourceKey.GutterMark, null)
psiMethod.nameIdentifier?.putUserData(SourceKey.InlayMark, null)
super.disposeSuspend(removeFromMarker, assertRemoval)
}

private val userData = HashMap<Any, Any>()
override fun <T> getUserData(key: SourceKey<T>): T? = userData[key] as T?
override fun <T> putUserData(key: SourceKey<T>, value: T?) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import com.intellij.ui.awt.RelativePoint
import com.intellij.util.ui.JBUI
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.slf4j.LoggerFactory
import spp.jetbrains.marker.SourceMarker
import spp.jetbrains.marker.plugin.SourceInlayComponentProvider
Expand Down Expand Up @@ -119,8 +120,8 @@ interface SourceMark : JBPopupListener, MouseMotionListener, VisibleAreaListener
fun setVisible(visible: Boolean)

fun canApply(): Boolean = configuration.applySourceMarkFilter.test(this)
fun apply(sourceMarkComponent: SourceMarkComponent, addToMarker: Boolean = true)
fun apply(addToMarker: Boolean = true) {
fun apply(sourceMarkComponent: SourceMarkComponent, addToMarker: Boolean = true, editor: Editor? = null)
fun apply(addToMarker: Boolean = true, editor: Editor? = null) {
SourceMarker.getGlobalSourceMarkEventListeners().forEach(::addEventListener)

if (addToMarker) {
Expand All @@ -143,12 +144,12 @@ interface SourceMark : JBPopupListener, MouseMotionListener, VisibleAreaListener
}
} else if (this is InlayMark) {
if (configuration.showComponentInlay) {
val editor = FileEditorManager.getInstance(project).selectedTextEditor
if (editor == null) {
val selectedEditor = editor ?: FileEditorManager.getInstance(project).selectedTextEditor
if (selectedEditor == null) {
TODO()
} else {
val provider = SourceInlayComponentProvider.from(editor)
val viewport = (editor as? EditorImpl)?.scrollPane?.viewport!!
val provider = SourceInlayComponentProvider.from(selectedEditor)
val viewport = (selectedEditor as? EditorImpl)?.scrollPane?.viewport!!
var displayLineIndex = lineNumber - 1
if (this is ExpressionInlayMark) {
if (showAboveExpression) {
Expand Down Expand Up @@ -232,6 +233,24 @@ interface SourceMark : JBPopupListener, MouseMotionListener, VisibleAreaListener
}
}

suspend fun disposeSuspend(removeFromMarker: Boolean = true, assertRemoval: Boolean = true) {
if (this is InlayMark) {
configuration.inlayRef?.get()?.dispose()
configuration.inlayRef = null
}
closePopup()

if (removeFromMarker) {
if (assertRemoval) {
check(sourceFileMarker.removeSourceMark(this, autoRefresh = true, autoDispose = false))
} else {
sourceFileMarker.removeSourceMark(this, autoRefresh = true, autoDispose = false)
}
}
triggerEventSuspend(SourceMarkEvent(this, SourceMarkEventCode.MARK_REMOVED))
clearEventListeners()
}

fun <T> getUserData(key: SourceKey<T>): T?
fun <T> putUserData(key: SourceKey<T>, value: T?)
fun hasUserData(): Boolean
Expand Down Expand Up @@ -261,6 +280,22 @@ interface SourceMark : JBPopupListener, MouseMotionListener, VisibleAreaListener
}
}

suspend fun triggerEventSuspend(event: SourceMarkEvent) {
//sync listeners
getEventListeners()
.filterIsInstance<SynchronousSourceMarkEventListener>()
.forEach { it.handleEvent(event) }

//async listeners
runBlocking {
getEventListeners().forEach {
if (it !is SynchronousSourceMarkEventListener) {
it.handleEvent(event)
}
}
}
}

fun closePopup() {
if (openedMarks.remove(this)) {
log.trace("Closing popup")
Expand Down
Loading