aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorSimon Ogorodnik <Simon.Ogorodnik@jetbrains.com>2018-01-10 21:56:20 +0300
committerSimon Ogorodnik <Simon.Ogorodnik@jetbrains.com>2018-01-10 22:19:55 +0300
commit43d699c14f2859135b15efb8a5a92af4d9da2b12 (patch)
treeaf2c20a0e28ff8db33f57123373e8277b129ca20 /core
parent4a425e29fba4030d9cde7072ee6bf39ab7ae3668 (diff)
downloaddokka-43d699c14f2859135b15efb8a5a92af4d9da2b12.tar.gz
dokka-43d699c14f2859135b15efb8a5a92af4d9da2b12.tar.bz2
dokka-43d699c14f2859135b15efb8a5a92af4d9da2b12.zip
Fix crash on incorrect sample conversion
Diffstat (limited to 'core')
-rw-r--r--core/src/main/kotlin/Samples/KotlinWebsiteSampleProcessingService.kt48
1 files changed, 45 insertions, 3 deletions
diff --git a/core/src/main/kotlin/Samples/KotlinWebsiteSampleProcessingService.kt b/core/src/main/kotlin/Samples/KotlinWebsiteSampleProcessingService.kt
index b0988c35..b99b405f 100644
--- a/core/src/main/kotlin/Samples/KotlinWebsiteSampleProcessingService.kt
+++ b/core/src/main/kotlin/Samples/KotlinWebsiteSampleProcessingService.kt
@@ -1,15 +1,18 @@
package org.jetbrains.dokka.Samples
import com.google.inject.Inject
-import com.intellij.psi.PsiElement
-import com.intellij.psi.PsiWhiteSpace
+import com.intellij.psi.*
import com.intellij.psi.impl.source.tree.LeafPsiElement
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.dokka.*
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.allChildren
import org.jetbrains.kotlin.psi.psiUtil.prevLeaf
+import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.ImportPath
+import java.io.PrintWriter
+import java.io.StringWriter
+
open class KotlinWebsiteSampleProcessingService
@Inject constructor(options: DocumentationOptions,
@@ -22,6 +25,10 @@ open class KotlinWebsiteSampleProcessingService
val text: String
get() = builder.toString()
+ val errors = mutableListOf<ConvertError>()
+
+ data class ConvertError(val e: Exception, val text: String, val loc: String)
+
fun KtValueArgument.extractStringArgumentValue() =
(getArgumentExpression() as KtStringTemplateExpression)
.entries.joinToString("") { it.text }
@@ -92,16 +99,51 @@ open class KotlinWebsiteSampleProcessingService
}
}
+ private fun reportProblemConvertingElement(element: PsiElement, e: Exception) {
+ val text = element.text
+ val document = PsiDocumentManager.getInstance(element.project).getDocument(element.containingFile)
+
+ val lineInfo = if (document != null) {
+ val lineNumber = document.getLineNumber(element.startOffset)
+ "$lineNumber, ${element.startOffset - document.getLineStartOffset(lineNumber)}"
+ } else {
+ "offset: ${element.startOffset}"
+ }
+ errors += ConvertError(e, text, lineInfo)
+ }
+
override fun visitElement(element: PsiElement) {
if (element is LeafPsiElement)
builder.append(element.text)
- super.visitElement(element)
+
+ element.acceptChildren(object : PsiElementVisitor() {
+ override fun visitElement(element: PsiElement) {
+ try {
+ element.accept(this@SampleBuilder)
+ } catch (e: Exception) {
+ try {
+ reportProblemConvertingElement(element, e)
+ } finally {
+ builder.append(element.text) //recover
+ }
+ }
+ }
+ })
}
+
}
private fun PsiElement.buildSampleText(): String {
val sampleBuilder = SampleBuilder()
this.accept(sampleBuilder)
+
+ sampleBuilder.errors.forEach {
+ val sw = StringWriter()
+ val pw = PrintWriter(sw)
+ it.e.printStackTrace(pw)
+
+ logger.error("${containingFile.name}: (${it.loc}): Exception thrown while converting \n```\n${it.text}\n```\n$sw")
+ }
return sampleBuilder.text
}