Skip to content

Python bp view #573

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Nov 23, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ kotlin.code.style=official

pluginGroup = spp.jetbrains
pluginName = Source++
pluginVersion = 0.2.0
pluginVersion = 0.2.1
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
Expand All @@ -23,5 +23,5 @@ kotlin.stdlib.default.dependency = true

apolloVersion = 2.5.10

protocolVersion=0.2.0
protocolVersion=0.2.1
portalVersion=0.2.0
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import org.apache.commons.lang3.EnumUtils
* @author [Brandon Fergerson](mailto:bfergerson@apache.org)
*/
@Suppress("MagicNumber")
class VariableSimpleNode(val variable: LiveVariable) : SimpleNode() {
class JVMVariableSimpleNode(val variable: LiveVariable) : SimpleNode() {

private val primitives = setOf(
"java.lang.String",
Expand Down Expand Up @@ -48,7 +48,7 @@ class VariableSimpleNode(val variable: LiveVariable) : SimpleNode() {
override fun getChildren(): Array<SimpleNode> {
return if (variable.value is List<*>) {
(variable.value as List<Map<*, *>>).map {
VariableSimpleNode(
JVMVariableSimpleNode(
LiveVariable(
name = it["name"] as String,
value = it["value"] as Any,
Expand Down
6 changes: 6 additions & 0 deletions marker/py-marker/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ plugins {
}

val kotlinVersion = ext.get("kotlinVersion")
val vertxVersion = ext.get("vertxVersion")
val protocolVersion: String by project

repositories {
Expand All @@ -16,6 +17,7 @@ dependencies {
} else {
compileOnly(project(":marker"))
}
compileOnly("com.github.sourceplusplus.protocol:protocol:$protocolVersion")
val intellijVersion = "212.5457.46"

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinVersion")
Expand All @@ -39,4 +41,8 @@ dependencies {
compileOnly("com.jetbrains.intellij.platform:util-rt:$intellijVersion") { isTransitive = false }
compileOnly("com.jetbrains.intellij.python:python-psi:211.7628.21") { isTransitive = false }
compileOnly("com.jetbrains.intellij.python:python-community:211.7628.21") { isTransitive = false }
compileOnly("com.jetbrains.intellij.platform:debugger:$intellijVersion") { isTransitive = false }
compileOnly("com.jetbrains.intellij.platform:debugger-impl:$intellijVersion") { isTransitive = false }

compileOnly("io.vertx:vertx-core:$vertxVersion")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package spp.jetbrains.marker.py

import com.intellij.ide.projectView.PresentationData
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
import com.intellij.ui.SimpleTextAttributes
import com.intellij.ui.treeStructure.SimpleNode
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil
import spp.protocol.instrument.LiveVariable
import spp.protocol.instrument.LiveVariableScope

/**
* todo: description.
*
* @since 0.2.1
* @author [Brandon Fergerson](mailto:bfergerson@apache.org)
*/
class PythonVariableRootNode(val variables: List<LiveVariable>, val scope: LiveVariableScope) : SimpleNode() {

private val scheme = DebuggerUIUtil.getColorScheme(null)

override fun getChildren(): Array<SimpleNode> {
return variables.map { PythonVariableSimpleNode(it) }.toTypedArray()
}

override fun update(presentation: PresentationData) {
presentation.addText(
let { if (scope == LiveVariableScope.GLOBAL_VARIABLE) "Global" else "Local" },
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.IDENTIFIER))
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package spp.jetbrains.marker.py

import com.intellij.ide.projectView.PresentationData
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
import com.intellij.ui.SimpleTextAttributes
import com.intellij.ui.treeStructure.SimpleNode
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil
import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants
import io.vertx.core.json.JsonObject
import spp.protocol.instrument.LiveVariable

/**
* todo: description.
*
* @since 0.2.1
* @author [Brandon Fergerson](mailto:bfergerson@apache.org)
*/
@Suppress("MagicNumber")
class PythonVariableSimpleNode(private val variable: LiveVariable) : SimpleNode() {

private val scheme = DebuggerUIUtil.getColorScheme(null)

override fun getChildren(): Array<SimpleNode> {
if (variable.liveClazz == "<class 'dict'>") {
val dict = JsonObject((variable.value as String).replace("'", "\""))
val children = mutableListOf<SimpleNode>()
dict.map.forEach {
children.add(PythonVariableSimpleNode(LiveVariable("'" + it.key + "'", it.value)))
}
return children.toTypedArray()
}
return emptyArray()
}

override fun update(presentation: PresentationData) {
presentation.addText(variable.name, XDebuggerUIConstants.VALUE_NAME_ATTRIBUTES)
presentation.addText(
" = ",
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.IDENTIFIER))
)

if (variable.liveClazz?.startsWith("<class '") == true) {
presentation.addText(
"{" + variable.liveClazz!!.substringAfter("'").substringBefore("'") + "} ",
SimpleTextAttributes.GRAYED_ATTRIBUTES
)
}

when (variable.liveClazz) {
"<class 'dict'>" -> {
presentation.addText(
variable.value.toString(),
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.IDENTIFIER))
)
}
"<class 'str'>" -> {
presentation.addText(
"\"" + variable.value + "\"",
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.STRING))
)
}
"<class 'NoneType'>" -> {
presentation.addText(
variable.value.toString(),
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.IDENTIFIER))
)
}
else -> {
presentation.addText(
variable.value.toString(),
SimpleTextAttributes.fromTextAttributes(scheme.getAttributes(DefaultLanguageHighlighterColors.CONSTANT))
)
}
}
}

override fun getEqualityObjects(): Array<Any> = arrayOf(variable)
}
12 changes: 2 additions & 10 deletions plugin/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,9 @@
# SourceMarker Changelog

## [Unreleased]
### Added

### Changed

### Deprecated

### Removed

### Fixed

### Security
## [0.2.1] - 2021-11-22
- Improved Python live breakpoint display

## [0.2.0] - 2021-11-20
### Added
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,50 +19,6 @@ import com.intellij.openapi.application.ApplicationInfo
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import spp.jetbrains.marker.SourceMarker
import spp.jetbrains.marker.jvm.*
import spp.jetbrains.marker.py.PythonArtifactCreationService
import spp.jetbrains.marker.py.PythonArtifactNamingService
import spp.jetbrains.marker.py.PythonArtifactScopeService
import spp.jetbrains.marker.py.PythonConditionParser
import spp.jetbrains.marker.source.mark.api.component.api.config.ComponentSizeEvaluator
import spp.jetbrains.marker.source.mark.api.component.api.config.SourceMarkComponentConfiguration
import spp.jetbrains.marker.source.mark.api.component.jcef.SourceMarkSingleJcefComponentProvider
import spp.jetbrains.marker.source.mark.api.filter.CreateSourceMarkFilter
import spp.jetbrains.marker.source.mark.gutter.config.GutterMarkConfiguration
import spp.jetbrains.monitor.skywalking.SkywalkingMonitor
import spp.jetbrains.portal.SourcePortal
import spp.jetbrains.portal.backend.PortalServer
import spp.protocol.SourceMarkerServices
import spp.protocol.SourceMarkerServices.Instance
import spp.protocol.artifact.ArtifactQualifiedName
import spp.protocol.artifact.endpoint.EndpointResult
import spp.protocol.artifact.exception.LiveStackTraceElement
import spp.protocol.artifact.log.LogResult
import spp.protocol.artifact.metrics.ArtifactMetricResult
import spp.protocol.artifact.trace.TraceResult
import spp.protocol.artifact.trace.TraceSpan
import spp.protocol.artifact.trace.TraceSpanStackQueryResult
import spp.protocol.artifact.trace.TraceStack
import spp.protocol.service.live.LiveInstrumentService
import spp.protocol.service.live.LiveViewService
import spp.protocol.service.logging.LogCountIndicatorService
import spp.protocol.service.tracing.LocalTracingService
import spp.jetbrains.sourcemarker.PluginBundle.message
import spp.jetbrains.sourcemarker.activities.PluginSourceMarkerStartupActivity.Companion.INTELLIJ_PRODUCT_CODES
import spp.jetbrains.sourcemarker.activities.PluginSourceMarkerStartupActivity.Companion.PYCHARM_PRODUCT_CODES
import spp.jetbrains.sourcemarker.discover.TCPServiceDiscoveryBackend
import spp.jetbrains.sourcemarker.listeners.PluginSourceMarkEventListener
import spp.jetbrains.sourcemarker.listeners.PortalEventListener
import spp.jetbrains.sourcemarker.service.LiveInstrumentManager
import spp.jetbrains.sourcemarker.service.LiveViewManager
import spp.jetbrains.sourcemarker.service.LogCountIndicators
import spp.jetbrains.sourcemarker.service.breakpoint.BreakpointHitWindowService
import spp.jetbrains.sourcemarker.settings.SourceMarkerConfig
import spp.jetbrains.sourcemarker.settings.getServicePortNormalized
import spp.jetbrains.sourcemarker.settings.isSsl
import spp.jetbrains.sourcemarker.settings.serviceHostNormalized
import spp.jetbrains.sourcemarker.status.LiveStatusManager
import eu.geekplace.javapinning.JavaPinning
import eu.geekplace.javapinning.pin.Pin
import io.vertx.core.Promise
Expand Down Expand Up @@ -93,6 +49,50 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.datetime.Instant
import org.slf4j.LoggerFactory
import spp.jetbrains.marker.SourceMarker
import spp.jetbrains.marker.jvm.*
import spp.jetbrains.marker.py.PythonArtifactCreationService
import spp.jetbrains.marker.py.PythonArtifactNamingService
import spp.jetbrains.marker.py.PythonArtifactScopeService
import spp.jetbrains.marker.py.PythonConditionParser
import spp.jetbrains.marker.source.mark.api.component.api.config.ComponentSizeEvaluator
import spp.jetbrains.marker.source.mark.api.component.api.config.SourceMarkComponentConfiguration
import spp.jetbrains.marker.source.mark.api.component.jcef.SourceMarkSingleJcefComponentProvider
import spp.jetbrains.marker.source.mark.api.filter.CreateSourceMarkFilter
import spp.jetbrains.marker.source.mark.gutter.config.GutterMarkConfiguration
import spp.jetbrains.monitor.skywalking.SkywalkingMonitor
import spp.jetbrains.portal.SourcePortal
import spp.jetbrains.portal.backend.PortalServer
import spp.jetbrains.sourcemarker.PluginBundle.message
import spp.jetbrains.sourcemarker.activities.PluginSourceMarkerStartupActivity.Companion.INTELLIJ_PRODUCT_CODES
import spp.jetbrains.sourcemarker.activities.PluginSourceMarkerStartupActivity.Companion.PYCHARM_PRODUCT_CODES
import spp.jetbrains.sourcemarker.discover.TCPServiceDiscoveryBackend
import spp.jetbrains.sourcemarker.listeners.PluginSourceMarkEventListener
import spp.jetbrains.sourcemarker.listeners.PortalEventListener
import spp.jetbrains.sourcemarker.service.LiveInstrumentManager
import spp.jetbrains.sourcemarker.service.LiveViewManager
import spp.jetbrains.sourcemarker.service.LogCountIndicators
import spp.jetbrains.sourcemarker.service.breakpoint.BreakpointHitWindowService
import spp.jetbrains.sourcemarker.settings.SourceMarkerConfig
import spp.jetbrains.sourcemarker.settings.getServicePortNormalized
import spp.jetbrains.sourcemarker.settings.isSsl
import spp.jetbrains.sourcemarker.settings.serviceHostNormalized
import spp.jetbrains.sourcemarker.status.LiveStatusManager
import spp.protocol.SourceMarkerServices
import spp.protocol.SourceMarkerServices.Instance
import spp.protocol.artifact.ArtifactQualifiedName
import spp.protocol.artifact.endpoint.EndpointResult
import spp.protocol.artifact.exception.LiveStackTraceElement
import spp.protocol.artifact.log.LogResult
import spp.protocol.artifact.metrics.ArtifactMetricResult
import spp.protocol.artifact.trace.TraceResult
import spp.protocol.artifact.trace.TraceSpan
import spp.protocol.artifact.trace.TraceSpanStackQueryResult
import spp.protocol.artifact.trace.TraceStack
import spp.protocol.service.live.LiveInstrumentService
import spp.protocol.service.live.LiveViewService
import spp.protocol.service.logging.LogCountIndicatorService
import spp.protocol.service.tracing.LocalTracingService
import java.awt.Color
import java.awt.Dimension
import java.io.IOException
Expand Down Expand Up @@ -579,7 +579,10 @@ object SourceMarkerPlugin {
config.rootSourcePackages.any { artifactQualifiedName.startsWith(it) }
}
} else {
log.warn("Could not determine root source package. Skipped adding create source mark filter...")
val productCode = ApplicationInfo.getInstance().build.productCode
if (INTELLIJ_PRODUCT_CODES.contains(productCode)) {
log.warn("Could not determine root source package. Skipped adding create source mark filter...")
}
}
SourceMarker.enabled = true

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ class BreakpointEventColumnInfo(name: String) : ColumnInfo<LiveBreakpointHit, St
"Class Name" -> Comparator { t: LiveBreakpointHit, t2: LiveBreakpointHit ->
t.stackTrace.first().qualifiedClassName().compareTo(t2.stackTrace.first().qualifiedClassName())
}
"File Name" -> Comparator { t: LiveBreakpointHit, t2: LiveBreakpointHit ->
t.stackTrace.first().source.compareTo(t2.stackTrace.first().source)
}
"Line No" -> Comparator { t: LiveBreakpointHit, t2: LiveBreakpointHit ->
t.stackTrace.first().sourceAsLineNumber()!!.compareTo(t2.stackTrace.first().sourceAsLineNumber()!!)
}
Expand All @@ -60,6 +63,7 @@ class BreakpointEventColumnInfo(name: String) : ColumnInfo<LiveBreakpointHit, St
"Host Name" -> item.serviceInstance.substringAfter("@")
"Service" -> item.service
"Class Name" -> item.stackTrace.first().shortQualifiedClassName()
"File Name" -> item.stackTrace.first().source
"Method Name" -> item.stackTrace.first().methodName()
"Line No" -> item.stackTrace.first().sourceAsLineNumber()!!.toString()
"Breakpoint Data" -> "View Frames/Variables"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package spp.jetbrains.sourcemarker.service.breakpoint.tree

import com.intellij.openapi.application.ApplicationInfo
import com.intellij.ui.treeStructure.SimpleNode
import com.intellij.util.containers.hash.LinkedHashMap
import spp.jetbrains.marker.jvm.VariableSimpleNode
import spp.jetbrains.marker.jvm.JVMVariableSimpleNode
import spp.jetbrains.marker.py.PythonVariableRootNode
import spp.jetbrains.sourcemarker.activities.PluginSourceMarkerStartupActivity.Companion.PYCHARM_PRODUCT_CODES
import spp.jetbrains.sourcemarker.service.breakpoint.StackFrameManager
import spp.protocol.instrument.LiveVariableScope

/**
* todo: description.
Expand All @@ -28,19 +32,33 @@ class VariableRootSimpleNode : SimpleNode() {
NO_CHILDREN
} else {
val vars = stackFrameManager.currentFrame!!.variables
val simpleNodeMap: MutableMap<String, VariableSimpleNode> = LinkedHashMap()
vars.forEach {
if (it.name.isNotEmpty()) {
simpleNodeMap[it.name] = VariableSimpleNode(it)
val productCode = ApplicationInfo.getInstance().build.productCode
if (PYCHARM_PRODUCT_CODES.contains(productCode)) {
return arrayOf(
PythonVariableRootNode(
vars.filter { it.scope == LiveVariableScope.GLOBAL_VARIABLE },
LiveVariableScope.GLOBAL_VARIABLE
),
PythonVariableRootNode(
vars.filter { it.scope == LiveVariableScope.LOCAL_VARIABLE },
LiveVariableScope.LOCAL_VARIABLE
)
)
} else {
val simpleNodeMap: MutableMap<String, JVMVariableSimpleNode> = LinkedHashMap()
vars.forEach {
if (it.name.isNotEmpty()) {
simpleNodeMap[it.name] = JVMVariableSimpleNode(it)
}
}
simpleNodeMap.values.sortedWith { p0, p1 ->
when {
p0.variable.name == "this" -> -1
p1.variable.name == "this" -> 1
else -> 0
}
}.toTypedArray()
}
simpleNodeMap.values.sortedWith { p0, p1 ->
when {
p0.variable.name == "this" -> -1
p1.variable.name == "this" -> 1
else -> 0
}
}.toTypedArray()
}
}
}
Loading