Skip to content

Commit 8462002

Browse files
authored
Python bp view (#573)
* wip * organize imports * only warn on intellij * bump protocol * split local/global * comment * dont need * refactor * bump * unreleased Former-commit-id: 7b5639b
1 parent d97dbfa commit 8462002

File tree

10 files changed

+218
-76
lines changed

10 files changed

+218
-76
lines changed

gradle.properties

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ kotlin.code.style=official
44

55
pluginGroup = spp.jetbrains
66
pluginName = Source++
7-
pluginVersion = 0.2.0
7+
pluginVersion = 0.2.1
88
pluginSinceBuild = 202.4357
99
# Plugin Verifier integration -> https://github.com/JetBrains/gradle-intellij-plugin#plugin-verifier-dsl
1010
# See https://jb.gg/intellij-platform-builds-list for available build versions
@@ -23,5 +23,5 @@ kotlin.stdlib.default.dependency = true
2323

2424
apolloVersion = 2.5.10
2525

26-
protocolVersion=0.2.0
26+
protocolVersion=0.2.1
2727
portalVersion=0.2.0

marker/jvm-marker/src/main/kotlin/spp/jetbrains/marker/jvm/VariableSimpleNode.kt renamed to marker/jvm-marker/src/main/kotlin/spp/jetbrains/marker/jvm/JVMVariableSimpleNode.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import org.apache.commons.lang3.EnumUtils
1818
* @author [Brandon Fergerson](mailto:[email protected])
1919
*/
2020
@Suppress("MagicNumber")
21-
class VariableSimpleNode(val variable: LiveVariable) : SimpleNode() {
21+
class JVMVariableSimpleNode(val variable: LiveVariable) : SimpleNode() {
2222

2323
private val primitives = setOf(
2424
"java.lang.String",
@@ -48,7 +48,7 @@ class VariableSimpleNode(val variable: LiveVariable) : SimpleNode() {
4848
override fun getChildren(): Array<SimpleNode> {
4949
return if (variable.value is List<*>) {
5050
(variable.value as List<Map<*, *>>).map {
51-
VariableSimpleNode(
51+
JVMVariableSimpleNode(
5252
LiveVariable(
5353
name = it["name"] as String,
5454
value = it["value"] as Any,

marker/py-marker/build.gradle.kts

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ plugins {
33
}
44

55
val kotlinVersion = ext.get("kotlinVersion")
6+
val vertxVersion = ext.get("vertxVersion")
67
val protocolVersion: String by project
78

89
repositories {
@@ -16,6 +17,7 @@ dependencies {
1617
} else {
1718
compileOnly(project(":marker"))
1819
}
20+
compileOnly("com.github.sourceplusplus.protocol:protocol:$protocolVersion")
1921
val intellijVersion = "212.5457.46"
2022

2123
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinVersion")
@@ -39,4 +41,8 @@ dependencies {
3941
compileOnly("com.jetbrains.intellij.platform:util-rt:$intellijVersion") { isTransitive = false }
4042
compileOnly("com.jetbrains.intellij.python:python-psi:211.7628.21") { isTransitive = false }
4143
compileOnly("com.jetbrains.intellij.python:python-community:211.7628.21") { isTransitive = false }
44+
compileOnly("com.jetbrains.intellij.platform:debugger:$intellijVersion") { isTransitive = false }
45+
compileOnly("com.jetbrains.intellij.platform:debugger-impl:$intellijVersion") { isTransitive = false }
46+
47+
compileOnly("io.vertx:vertx-core:$vertxVersion")
4248
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package spp.jetbrains.marker.py
2+
3+
import com.intellij.ide.projectView.PresentationData
4+
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
5+
import com.intellij.ui.SimpleTextAttributes
6+
import com.intellij.ui.treeStructure.SimpleNode
7+
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil
8+
import spp.protocol.instrument.LiveVariable
9+
import spp.protocol.instrument.LiveVariableScope
10+
11+
/**
12+
* todo: description.
13+
*
14+
* @since 0.2.1
15+
* @author [Brandon Fergerson](mailto:[email protected])
16+
*/
17+
class PythonVariableRootNode(val variables: List<LiveVariable>, val scope: LiveVariableScope) : SimpleNode() {
18+
19+
private val scheme = DebuggerUIUtil.getColorScheme(null)
20+
21+
override fun getChildren(): Array<SimpleNode> {
22+
return variables.map { PythonVariableSimpleNode(it) }.toTypedArray()
23+
}
24+
25+
override fun update(presentation: PresentationData) {
26+
presentation.addText(
27+
let { if (scope == LiveVariableScope.GLOBAL_VARIABLE) "Global" else "Local" },
28+
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.IDENTIFIER))
29+
)
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package spp.jetbrains.marker.py
2+
3+
import com.intellij.ide.projectView.PresentationData
4+
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
5+
import com.intellij.ui.SimpleTextAttributes
6+
import com.intellij.ui.treeStructure.SimpleNode
7+
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil
8+
import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants
9+
import io.vertx.core.json.JsonObject
10+
import spp.protocol.instrument.LiveVariable
11+
12+
/**
13+
* todo: description.
14+
*
15+
* @since 0.2.1
16+
* @author [Brandon Fergerson](mailto:[email protected])
17+
*/
18+
@Suppress("MagicNumber")
19+
class PythonVariableSimpleNode(private val variable: LiveVariable) : SimpleNode() {
20+
21+
private val scheme = DebuggerUIUtil.getColorScheme(null)
22+
23+
override fun getChildren(): Array<SimpleNode> {
24+
if (variable.liveClazz == "<class 'dict'>") {
25+
val dict = JsonObject((variable.value as String).replace("'", "\""))
26+
val children = mutableListOf<SimpleNode>()
27+
dict.map.forEach {
28+
children.add(PythonVariableSimpleNode(LiveVariable("'" + it.key + "'", it.value)))
29+
}
30+
return children.toTypedArray()
31+
}
32+
return emptyArray()
33+
}
34+
35+
override fun update(presentation: PresentationData) {
36+
presentation.addText(variable.name, XDebuggerUIConstants.VALUE_NAME_ATTRIBUTES)
37+
presentation.addText(
38+
" = ",
39+
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.IDENTIFIER))
40+
)
41+
42+
if (variable.liveClazz?.startsWith("<class '") == true) {
43+
presentation.addText(
44+
"{" + variable.liveClazz!!.substringAfter("'").substringBefore("'") + "} ",
45+
SimpleTextAttributes.GRAYED_ATTRIBUTES
46+
)
47+
}
48+
49+
when (variable.liveClazz) {
50+
"<class 'dict'>" -> {
51+
presentation.addText(
52+
variable.value.toString(),
53+
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.IDENTIFIER))
54+
)
55+
}
56+
"<class 'str'>" -> {
57+
presentation.addText(
58+
"\"" + variable.value + "\"",
59+
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.STRING))
60+
)
61+
}
62+
"<class 'NoneType'>" -> {
63+
presentation.addText(
64+
variable.value.toString(),
65+
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.IDENTIFIER))
66+
)
67+
}
68+
else -> {
69+
presentation.addText(
70+
variable.value.toString(),
71+
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.CONSTANT))
72+
)
73+
}
74+
}
75+
}
76+
77+
override fun getEqualityObjects(): Array<Any> = arrayOf(variable)
78+
}

plugin/CHANGELOG.md

+2-10
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,9 @@
33
# SourceMarker Changelog
44

55
## [Unreleased]
6-
### Added
7-
8-
### Changed
9-
10-
### Deprecated
11-
12-
### Removed
13-
14-
### Fixed
156

16-
### Security
7+
## [0.2.1] - 2021-11-22
8+
- Improved Python live breakpoint display
179

1810
## [0.2.0] - 2021-11-20
1911
### Added

plugin/src/main/kotlin/spp/jetbrains/sourcemarker/SourceMarkerPlugin.kt

+48-45
Original file line numberDiff line numberDiff line change
@@ -19,50 +19,6 @@ import com.intellij.openapi.application.ApplicationInfo
1919
import com.intellij.openapi.application.ApplicationManager
2020
import com.intellij.openapi.editor.Editor
2121
import com.intellij.openapi.project.Project
22-
import spp.jetbrains.marker.SourceMarker
23-
import spp.jetbrains.marker.jvm.*
24-
import spp.jetbrains.marker.py.PythonArtifactCreationService
25-
import spp.jetbrains.marker.py.PythonArtifactNamingService
26-
import spp.jetbrains.marker.py.PythonArtifactScopeService
27-
import spp.jetbrains.marker.py.PythonConditionParser
28-
import spp.jetbrains.marker.source.mark.api.component.api.config.ComponentSizeEvaluator
29-
import spp.jetbrains.marker.source.mark.api.component.api.config.SourceMarkComponentConfiguration
30-
import spp.jetbrains.marker.source.mark.api.component.jcef.SourceMarkSingleJcefComponentProvider
31-
import spp.jetbrains.marker.source.mark.api.filter.CreateSourceMarkFilter
32-
import spp.jetbrains.marker.source.mark.gutter.config.GutterMarkConfiguration
33-
import spp.jetbrains.monitor.skywalking.SkywalkingMonitor
34-
import spp.jetbrains.portal.SourcePortal
35-
import spp.jetbrains.portal.backend.PortalServer
36-
import spp.protocol.SourceMarkerServices
37-
import spp.protocol.SourceMarkerServices.Instance
38-
import spp.protocol.artifact.ArtifactQualifiedName
39-
import spp.protocol.artifact.endpoint.EndpointResult
40-
import spp.protocol.artifact.exception.LiveStackTraceElement
41-
import spp.protocol.artifact.log.LogResult
42-
import spp.protocol.artifact.metrics.ArtifactMetricResult
43-
import spp.protocol.artifact.trace.TraceResult
44-
import spp.protocol.artifact.trace.TraceSpan
45-
import spp.protocol.artifact.trace.TraceSpanStackQueryResult
46-
import spp.protocol.artifact.trace.TraceStack
47-
import spp.protocol.service.live.LiveInstrumentService
48-
import spp.protocol.service.live.LiveViewService
49-
import spp.protocol.service.logging.LogCountIndicatorService
50-
import spp.protocol.service.tracing.LocalTracingService
51-
import spp.jetbrains.sourcemarker.PluginBundle.message
52-
import spp.jetbrains.sourcemarker.activities.PluginSourceMarkerStartupActivity.Companion.INTELLIJ_PRODUCT_CODES
53-
import spp.jetbrains.sourcemarker.activities.PluginSourceMarkerStartupActivity.Companion.PYCHARM_PRODUCT_CODES
54-
import spp.jetbrains.sourcemarker.discover.TCPServiceDiscoveryBackend
55-
import spp.jetbrains.sourcemarker.listeners.PluginSourceMarkEventListener
56-
import spp.jetbrains.sourcemarker.listeners.PortalEventListener
57-
import spp.jetbrains.sourcemarker.service.LiveInstrumentManager
58-
import spp.jetbrains.sourcemarker.service.LiveViewManager
59-
import spp.jetbrains.sourcemarker.service.LogCountIndicators
60-
import spp.jetbrains.sourcemarker.service.breakpoint.BreakpointHitWindowService
61-
import spp.jetbrains.sourcemarker.settings.SourceMarkerConfig
62-
import spp.jetbrains.sourcemarker.settings.getServicePortNormalized
63-
import spp.jetbrains.sourcemarker.settings.isSsl
64-
import spp.jetbrains.sourcemarker.settings.serviceHostNormalized
65-
import spp.jetbrains.sourcemarker.status.LiveStatusManager
6622
import eu.geekplace.javapinning.JavaPinning
6723
import eu.geekplace.javapinning.pin.Pin
6824
import io.vertx.core.Promise
@@ -93,6 +49,50 @@ import kotlinx.coroutines.Job
9349
import kotlinx.coroutines.launch
9450
import kotlinx.datetime.Instant
9551
import org.slf4j.LoggerFactory
52+
import spp.jetbrains.marker.SourceMarker
53+
import spp.jetbrains.marker.jvm.*
54+
import spp.jetbrains.marker.py.PythonArtifactCreationService
55+
import spp.jetbrains.marker.py.PythonArtifactNamingService
56+
import spp.jetbrains.marker.py.PythonArtifactScopeService
57+
import spp.jetbrains.marker.py.PythonConditionParser
58+
import spp.jetbrains.marker.source.mark.api.component.api.config.ComponentSizeEvaluator
59+
import spp.jetbrains.marker.source.mark.api.component.api.config.SourceMarkComponentConfiguration
60+
import spp.jetbrains.marker.source.mark.api.component.jcef.SourceMarkSingleJcefComponentProvider
61+
import spp.jetbrains.marker.source.mark.api.filter.CreateSourceMarkFilter
62+
import spp.jetbrains.marker.source.mark.gutter.config.GutterMarkConfiguration
63+
import spp.jetbrains.monitor.skywalking.SkywalkingMonitor
64+
import spp.jetbrains.portal.SourcePortal
65+
import spp.jetbrains.portal.backend.PortalServer
66+
import spp.jetbrains.sourcemarker.PluginBundle.message
67+
import spp.jetbrains.sourcemarker.activities.PluginSourceMarkerStartupActivity.Companion.INTELLIJ_PRODUCT_CODES
68+
import spp.jetbrains.sourcemarker.activities.PluginSourceMarkerStartupActivity.Companion.PYCHARM_PRODUCT_CODES
69+
import spp.jetbrains.sourcemarker.discover.TCPServiceDiscoveryBackend
70+
import spp.jetbrains.sourcemarker.listeners.PluginSourceMarkEventListener
71+
import spp.jetbrains.sourcemarker.listeners.PortalEventListener
72+
import spp.jetbrains.sourcemarker.service.LiveInstrumentManager
73+
import spp.jetbrains.sourcemarker.service.LiveViewManager
74+
import spp.jetbrains.sourcemarker.service.LogCountIndicators
75+
import spp.jetbrains.sourcemarker.service.breakpoint.BreakpointHitWindowService
76+
import spp.jetbrains.sourcemarker.settings.SourceMarkerConfig
77+
import spp.jetbrains.sourcemarker.settings.getServicePortNormalized
78+
import spp.jetbrains.sourcemarker.settings.isSsl
79+
import spp.jetbrains.sourcemarker.settings.serviceHostNormalized
80+
import spp.jetbrains.sourcemarker.status.LiveStatusManager
81+
import spp.protocol.SourceMarkerServices
82+
import spp.protocol.SourceMarkerServices.Instance
83+
import spp.protocol.artifact.ArtifactQualifiedName
84+
import spp.protocol.artifact.endpoint.EndpointResult
85+
import spp.protocol.artifact.exception.LiveStackTraceElement
86+
import spp.protocol.artifact.log.LogResult
87+
import spp.protocol.artifact.metrics.ArtifactMetricResult
88+
import spp.protocol.artifact.trace.TraceResult
89+
import spp.protocol.artifact.trace.TraceSpan
90+
import spp.protocol.artifact.trace.TraceSpanStackQueryResult
91+
import spp.protocol.artifact.trace.TraceStack
92+
import spp.protocol.service.live.LiveInstrumentService
93+
import spp.protocol.service.live.LiveViewService
94+
import spp.protocol.service.logging.LogCountIndicatorService
95+
import spp.protocol.service.tracing.LocalTracingService
9696
import java.awt.Color
9797
import java.awt.Dimension
9898
import java.io.IOException
@@ -579,7 +579,10 @@ object SourceMarkerPlugin {
579579
config.rootSourcePackages.any { artifactQualifiedName.startsWith(it) }
580580
}
581581
} else {
582-
log.warn("Could not determine root source package. Skipped adding create source mark filter...")
582+
val productCode = ApplicationInfo.getInstance().build.productCode
583+
if (INTELLIJ_PRODUCT_CODES.contains(productCode)) {
584+
log.warn("Could not determine root source package. Skipped adding create source mark filter...")
585+
}
583586
}
584587
SourceMarker.enabled = true
585588

plugin/src/main/kotlin/spp/jetbrains/sourcemarker/service/breakpoint/BreakpointEventColumnInfo.kt

+4
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ class BreakpointEventColumnInfo(name: String) : ColumnInfo<LiveBreakpointHit, St
4747
"Class Name" -> Comparator { t: LiveBreakpointHit, t2: LiveBreakpointHit ->
4848
t.stackTrace.first().qualifiedClassName().compareTo(t2.stackTrace.first().qualifiedClassName())
4949
}
50+
"File Name" -> Comparator { t: LiveBreakpointHit, t2: LiveBreakpointHit ->
51+
t.stackTrace.first().source.compareTo(t2.stackTrace.first().source)
52+
}
5053
"Line No" -> Comparator { t: LiveBreakpointHit, t2: LiveBreakpointHit ->
5154
t.stackTrace.first().sourceAsLineNumber()!!.compareTo(t2.stackTrace.first().sourceAsLineNumber()!!)
5255
}
@@ -60,6 +63,7 @@ class BreakpointEventColumnInfo(name: String) : ColumnInfo<LiveBreakpointHit, St
6063
"Host Name" -> item.serviceInstance.substringAfter("@")
6164
"Service" -> item.service
6265
"Class Name" -> item.stackTrace.first().shortQualifiedClassName()
66+
"File Name" -> item.stackTrace.first().source
6367
"Method Name" -> item.stackTrace.first().methodName()
6468
"Line No" -> item.stackTrace.first().sourceAsLineNumber()!!.toString()
6569
"Breakpoint Data" -> "View Frames/Variables"

plugin/src/main/kotlin/spp/jetbrains/sourcemarker/service/breakpoint/tree/VariableRootSimpleNode.kt

+30-12
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package spp.jetbrains.sourcemarker.service.breakpoint.tree
22

3+
import com.intellij.openapi.application.ApplicationInfo
34
import com.intellij.ui.treeStructure.SimpleNode
45
import com.intellij.util.containers.hash.LinkedHashMap
5-
import spp.jetbrains.marker.jvm.VariableSimpleNode
6+
import spp.jetbrains.marker.jvm.JVMVariableSimpleNode
7+
import spp.jetbrains.marker.py.PythonVariableRootNode
8+
import spp.jetbrains.sourcemarker.activities.PluginSourceMarkerStartupActivity.Companion.PYCHARM_PRODUCT_CODES
69
import spp.jetbrains.sourcemarker.service.breakpoint.StackFrameManager
10+
import spp.protocol.instrument.LiveVariableScope
711

812
/**
913
* todo: description.
@@ -28,19 +32,33 @@ class VariableRootSimpleNode : SimpleNode() {
2832
NO_CHILDREN
2933
} else {
3034
val vars = stackFrameManager.currentFrame!!.variables
31-
val simpleNodeMap: MutableMap<String, VariableSimpleNode> = LinkedHashMap()
32-
vars.forEach {
33-
if (it.name.isNotEmpty()) {
34-
simpleNodeMap[it.name] = VariableSimpleNode(it)
35+
val productCode = ApplicationInfo.getInstance().build.productCode
36+
if (PYCHARM_PRODUCT_CODES.contains(productCode)) {
37+
return arrayOf(
38+
PythonVariableRootNode(
39+
vars.filter { it.scope == LiveVariableScope.GLOBAL_VARIABLE },
40+
LiveVariableScope.GLOBAL_VARIABLE
41+
),
42+
PythonVariableRootNode(
43+
vars.filter { it.scope == LiveVariableScope.LOCAL_VARIABLE },
44+
LiveVariableScope.LOCAL_VARIABLE
45+
)
46+
)
47+
} else {
48+
val simpleNodeMap: MutableMap<String, JVMVariableSimpleNode> = LinkedHashMap()
49+
vars.forEach {
50+
if (it.name.isNotEmpty()) {
51+
simpleNodeMap[it.name] = JVMVariableSimpleNode(it)
52+
}
3553
}
54+
simpleNodeMap.values.sortedWith { p0, p1 ->
55+
when {
56+
p0.variable.name == "this" -> -1
57+
p1.variable.name == "this" -> 1
58+
else -> 0
59+
}
60+
}.toTypedArray()
3661
}
37-
simpleNodeMap.values.sortedWith { p0, p1 ->
38-
when {
39-
p0.variable.name == "this" -> -1
40-
p1.variable.name == "this" -> 1
41-
else -> 0
42-
}
43-
}.toTypedArray()
4462
}
4563
}
4664
}

0 commit comments

Comments
 (0)