Skip to content

Commit 729808e

Browse files
committed
Link com.demonwav.mcdev stacktrace lines in auto error report
Probably overboard but seemed like a cool thing to do.
1 parent d9de3ef commit 729808e

File tree

2 files changed

+83
-11
lines changed

2 files changed

+83
-11
lines changed

src/main/kotlin/errorreporter/AnonymousFeedback.kt

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ object AnonymousFeedback {
3838
val duplicateId = findDuplicateIssue(envDetails, factory)
3939
if (duplicateId != null) {
4040
// This is a duplicate
41-
val commentUrl =
42-
sendCommentOnDuplicateIssue(duplicateId, factory, convertToGitHubIssueFormat(envDetails, attachments))
41+
val issueContent = convertToGitHubIssueFormat(envDetails, attachments)
42+
val commentUrl = sendCommentOnDuplicateIssue(duplicateId, factory, issueContent)
4343
return FeedbackData(commentUrl, duplicateId, true)
4444
}
4545

@@ -66,8 +66,10 @@ object AnonymousFeedback {
6666
}
6767

6868
var stackTrace = body.remove("error.stacktrace")
69-
if (stackTrace.isNullOrEmpty()) {
70-
stackTrace = "no stacktrace"
69+
stackTrace = if (stackTrace.isNullOrEmpty()) {
70+
"no stacktrace"
71+
} else {
72+
linkStacktrace(stackTrace)
7173
}
7274

7375
val sb = StringBuilder()
@@ -88,7 +90,7 @@ object AnonymousFeedback {
8890
}
8991
sb.append("</table></td></tr></table>\n")
9092

91-
sb.append("\n```\n").append(stackTrace).append("\n```\n")
93+
sb.append("\n<pre>\n").append(stackTrace).append("\n</pre>\n")
9294
sb.append("\n```\n").append(errorMessage).append("\n```\n")
9395

9496
if (attachments.isNotEmpty()) {
@@ -138,15 +140,15 @@ object AnonymousFeedback {
138140
return connection
139141
}
140142

141-
private val numberRegex = Regex("\\d+")
142-
private val newLineRegex = Regex("[\r\n]+")
143-
144143
private const val openIssueUrl = "$baseUrl?state=open&creator=minecraft-dev-autoreporter&per_page=100"
145144
private const val closedIssueUrl = "$baseUrl?state=closed&creator=minecraft-dev-autoreporter&per_page=100"
146145

147146
private const val packagePrefix = "\tat com.demonwav.mcdev"
148147

149148
private fun findDuplicateIssue(envDetails: LinkedHashMap<String, String?>, factory: HttpConnectionFactory): Int? {
149+
val numberRegex = Regex("\\d+")
150+
val newLineRegex = Regex("[\r\n]+")
151+
150152
val stack = envDetails["error.stacktrace"]?.replace(numberRegex, "") ?: return null
151153

152154
val stackMcdevParts = stack.lineSequence()
@@ -298,6 +300,72 @@ object AnonymousFeedback {
298300
return connection
299301
}
300302

303+
private fun linkStacktrace(stacktrace: String): String {
304+
val versionRegex = Regex("""(?<intellijVersion>\d{4}\.\d)-(?<pluginVersion>\d+\.\d+\.\d+)""")
305+
306+
val version = PluginUtil.pluginVersion
307+
val match = versionRegex.matchEntire(version) ?: return stacktrace
308+
309+
val intellijVersion = match.groups["intellijVersion"]?.value ?: return stacktrace
310+
val pluginVersion = match.groups["pluginVersion"]?.value ?: return stacktrace
311+
312+
val tag = "$pluginVersion-$intellijVersion"
313+
314+
// v stack element text v
315+
// at com.demonwav.mcdev.facet.MinecraftFacet.shouldShowPluginIcon(MinecraftFacet.kt:185)
316+
// prefix ^ class path ^ ^ file name ^ ^ ^ line number
317+
val stackElementRegex = Regex(
318+
"""(?<prefix>\s+at\s+)""" +
319+
"""(?<stackElementText>""" +
320+
"""(?<className>com\.demonwav\.mcdev(?:\.\p{javaJavaIdentifierStart}\p{javaJavaIdentifierPart}*)+)""" +
321+
"""(?:\.\p{javaJavaIdentifierStart}\p{javaJavaIdentifierPart}*|<(?:cl)?init>)""" +
322+
"""\((?<fileName>.*\.\w+):(?<lineNumber>\d+)\)""" +
323+
""")\s*"""
324+
)
325+
326+
val baseTagUrl = "https://github.com/minecraft-dev/MinecraftDev/blob/$tag/src/main/kotlin/"
327+
328+
val sb = StringBuilder(stacktrace.length * 2)
329+
330+
for (line in stacktrace.lineSequence()) {
331+
val lineMatch = stackElementRegex.matchEntire(line)
332+
if (lineMatch == null) {
333+
sb.append(line).append('\n')
334+
continue
335+
}
336+
337+
val prefix = lineMatch.groups["prefix"]?.value
338+
val className = lineMatch.groups["className"]?.value
339+
val fileName = lineMatch.groups["fileName"]?.value
340+
val lineNumber = lineMatch.groups["lineNumber"]?.value
341+
val stackElementText = lineMatch.groups["stackElementText"]?.value
342+
343+
if (prefix == null || className == null || fileName == null || lineNumber == null || stackElementText == null) {
344+
sb.append(line).append('\n')
345+
continue
346+
}
347+
348+
val path = className.substringAfter("com.demonwav.mcdev.")
349+
.substringBeforeLast('.')
350+
.replace('.', '/')
351+
sb.apply {
352+
append(prefix)
353+
append("<a href=\"")
354+
append(baseTagUrl)
355+
append(path)
356+
append('/')
357+
append(fileName)
358+
append("#L")
359+
append(lineNumber)
360+
append("\">")
361+
append(stackElementText)
362+
append("</a>\n")
363+
}
364+
}
365+
366+
return sb.toString()
367+
}
368+
301369
private val userAgent by lazy {
302370
var agent = "Minecraft Development IntelliJ IDEA plugin"
303371

src/main/kotlin/update/PluginUtil.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,20 @@
1010

1111
package com.demonwav.mcdev.update
1212

13+
import com.intellij.ide.plugins.IdeaPluginDescriptor
1314
import com.intellij.ide.plugins.PluginManagerCore
1415
import com.intellij.openapi.extensions.PluginId
16+
import org.jetbrains.annotations.NotNull
1517

1618
object PluginUtil {
1719
val PLUGIN_ID = PluginId.getId("com.demonwav.minecraft-dev")
1820

19-
val pluginVersion: String
21+
val plugin: IdeaPluginDescriptor
2022
get() {
21-
val plugin = PluginManagerCore.getPlugin(PLUGIN_ID)
23+
return PluginManagerCore.getPlugin(PLUGIN_ID)
2224
?: error("Minecraft Development plugin not found: " + PluginManagerCore.getPlugins().contentToString())
23-
return plugin.version
2425
}
26+
27+
val pluginVersion: String
28+
get() = plugin.version
2529
}

0 commit comments

Comments
 (0)