Report declaration that was being analyzed when internal error happened
#KT-12188 Fixed
This commit is contained in:
@@ -16,18 +16,16 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.codegen;
|
package org.jetbrains.kotlin.codegen;
|
||||||
|
|
||||||
import com.intellij.openapi.application.ApplicationManager;
|
|
||||||
import com.intellij.openapi.util.Computable;
|
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils;
|
import org.jetbrains.kotlin.util.ExceptionUtilKt;
|
||||||
|
|
||||||
public class CompilationException extends RuntimeException {
|
public class CompilationException extends RuntimeException {
|
||||||
private final PsiElement element;
|
private final PsiElement element;
|
||||||
|
|
||||||
public CompilationException(@NotNull String message, @Nullable Throwable cause, @Nullable PsiElement element) {
|
public CompilationException(@NotNull String message, @Nullable Throwable cause, @Nullable PsiElement element) {
|
||||||
super(getMessage(message, cause, element), cause);
|
super(ExceptionUtilKt.getExceptionMessage("Back-end (JVM)", message, cause, element), cause);
|
||||||
this.element = element;
|
this.element = element;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,40 +33,4 @@ public class CompilationException extends RuntimeException {
|
|||||||
public PsiElement getElement() {
|
public PsiElement getElement() {
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static String where(@NotNull Throwable cause) {
|
|
||||||
StackTraceElement[] stackTrace = cause.getStackTrace();
|
|
||||||
if (stackTrace != null && stackTrace.length > 0) {
|
|
||||||
return stackTrace[0].getFileName() + ":" + stackTrace[0].getLineNumber();
|
|
||||||
}
|
|
||||||
return "unknown";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getMessage(@NotNull final String message, @Nullable final Throwable cause, @Nullable final PsiElement element) {
|
|
||||||
return ApplicationManager.getApplication().runReadAction(new Computable<String>() {
|
|
||||||
@Override
|
|
||||||
public String compute() {
|
|
||||||
StringBuilder result =
|
|
||||||
new StringBuilder("Back-end (JVM) Internal error: ").append(message).append("\n");
|
|
||||||
if (cause != null) {
|
|
||||||
String causeMessage = cause.getMessage();
|
|
||||||
result.append("Cause: ").append(causeMessage == null ? cause.toString() : causeMessage).append("\n");
|
|
||||||
}
|
|
||||||
if (element != null) {
|
|
||||||
result.append("File being compiled and position: ").append(DiagnosticUtils.atLocation(element)).append("\n");
|
|
||||||
result.append("PsiElement: ").append(element.getText()).append("\n");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result.append("Element is unknown");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cause != null) {
|
|
||||||
result.append("The root cause was thrown at: ").append(where(cause));
|
|
||||||
}
|
|
||||||
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2016 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.resolve
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
|
import org.jetbrains.kotlin.psi.KtVisitorVoid
|
||||||
|
import org.jetbrains.kotlin.util.KotlinFrontEndException
|
||||||
|
|
||||||
|
class ExceptionWrappingKtVisitorVoid(private val delegate: KtVisitorVoid) : KtVisitorVoid() {
|
||||||
|
override fun visitElement(element: PsiElement) {
|
||||||
|
element.accept(delegate)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitDeclaration(dcl: KtDeclaration) {
|
||||||
|
try {
|
||||||
|
dcl.accept(delegate)
|
||||||
|
} catch (e: KotlinFrontEndException) {
|
||||||
|
throw e
|
||||||
|
} catch (t: Throwable) {
|
||||||
|
throw KotlinFrontEndException("Failed to analyze declaration ${dcl.name}", t, dcl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -61,10 +61,12 @@ class LazyTopDownAnalyzer(
|
|||||||
|
|
||||||
// fill in the context
|
// fill in the context
|
||||||
for (declaration in declarations) {
|
for (declaration in declarations) {
|
||||||
declaration.accept(object : KtVisitorVoid() {
|
// The 'visitor' variable is used inside
|
||||||
|
var visitor: KtVisitorVoid? = null
|
||||||
|
visitor = ExceptionWrappingKtVisitorVoid(object : KtVisitorVoid() {
|
||||||
private fun registerDeclarations(declarations: List<KtDeclaration>) {
|
private fun registerDeclarations(declarations: List<KtDeclaration>) {
|
||||||
for (jetDeclaration in declarations) {
|
for (jetDeclaration in declarations) {
|
||||||
jetDeclaration.accept(this)
|
jetDeclaration.accept(visitor!!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,6 +179,8 @@ class LazyTopDownAnalyzer(
|
|||||||
typeAliases.add(typeAlias)
|
typeAliases.add(typeAlias)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
declaration.accept(visitor)
|
||||||
}
|
}
|
||||||
|
|
||||||
createFunctionDescriptors(c, functions)
|
createFunctionDescriptors(c, functions)
|
||||||
|
|||||||
@@ -16,4 +16,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.util
|
package org.jetbrains.kotlin.util
|
||||||
|
|
||||||
class KotlinFrontEndException(message: String, cause: Throwable) : RuntimeException(message, cause)
|
import com.intellij.psi.PsiElement
|
||||||
|
|
||||||
|
class KotlinFrontEndException(message: String, cause: Throwable) : RuntimeException(message, cause) {
|
||||||
|
constructor(
|
||||||
|
message: String,
|
||||||
|
cause: Throwable,
|
||||||
|
element: PsiElement
|
||||||
|
) : this(getExceptionMessage("Front-end", message, cause, element), cause)
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2016 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.util
|
||||||
|
|
||||||
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
|
||||||
|
|
||||||
|
fun getExceptionMessage(
|
||||||
|
subsystemName: String,
|
||||||
|
message: String,
|
||||||
|
cause: Throwable?,
|
||||||
|
element: PsiElement?
|
||||||
|
): String = ApplicationManager.getApplication().runReadAction<String> {
|
||||||
|
val result = StringBuilder(subsystemName + " Internal error: ").append(message).append("\n")
|
||||||
|
if (cause != null) {
|
||||||
|
val causeMessage = cause.message
|
||||||
|
result.append("Cause: ").append(causeMessage ?: cause.toString()).append("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element != null) {
|
||||||
|
result.append("File being compiled and position: ").append(DiagnosticUtils.atLocation(element)).append("\n")
|
||||||
|
result.append("PsiElement: ").append(element.text).append("\n")
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result.append("Element is unknown")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cause != null) {
|
||||||
|
result.append("The root cause was thrown at: ").append(where(cause))
|
||||||
|
}
|
||||||
|
|
||||||
|
result.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun where(cause: Throwable): String {
|
||||||
|
val stackTrace = cause.stackTrace
|
||||||
|
if (stackTrace != null && stackTrace.size > 0) {
|
||||||
|
return stackTrace[0].fileName + ":" + stackTrace[0].lineNumber
|
||||||
|
}
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user