Don't fail during error reporting on invalid elements
This commit is contained in:
@@ -24,6 +24,7 @@ import com.intellij.openapi.util.TextRange;
|
|||||||
import com.intellij.openapi.vfs.VirtualFile;
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile;
|
||||||
|
import com.intellij.psi.PsiInvalidElementAccessException;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
|
||||||
@@ -68,16 +69,31 @@ public class DiagnosticUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String atLocation(@NotNull PsiElement element) {
|
public static String atLocation(@NotNull PsiElement element) {
|
||||||
return atLocation(element.getNode());
|
if (element.isValid()) {
|
||||||
|
return atLocation(element.getContainingFile(), element.getTextRange());
|
||||||
|
}
|
||||||
|
|
||||||
|
PsiFile file = null;
|
||||||
|
int offset = -1;
|
||||||
|
try {
|
||||||
|
file = element.getContainingFile();
|
||||||
|
offset = element.getTextOffset();
|
||||||
|
}
|
||||||
|
catch (PsiInvalidElementAccessException invalidException) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
return "at offset: " + (offset != -1 ? offset : "<unknown>") + " file: " + (file != null ? file : "<unknown>");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String atLocation(@NotNull ASTNode node) {
|
public static String atLocation(@NotNull ASTNode node) {
|
||||||
int startOffset = node.getStartOffset();
|
int startOffset = node.getStartOffset();
|
||||||
PsiElement element = getClosestPsiElement(node);
|
PsiElement element = getClosestPsiElement(node);
|
||||||
if (element != null && element.isValid()) {
|
if (element != null) {
|
||||||
return atLocation(element.getContainingFile(), element.getTextRange());
|
return atLocation(element);
|
||||||
}
|
}
|
||||||
return "' at offset " + startOffset + " (line and file unknown: no PSI element)";
|
|
||||||
|
return "at offset " + startOffset + " (line and file unknown: no PSI element)";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
@@ -15,6 +15,13 @@ class KotlinFrontEndException(message: String, cause: Throwable) : KotlinExcepti
|
|||||||
cause: Throwable,
|
cause: Throwable,
|
||||||
element: PsiElement
|
element: PsiElement
|
||||||
) : this(getExceptionMessage("Front-end", message, cause, DiagnosticUtils.atLocation(element)), cause) {
|
) : this(getExceptionMessage("Front-end", message, cause, DiagnosticUtils.atLocation(element)), cause) {
|
||||||
withAttachment("element.kt", element.text)
|
withAttachment(
|
||||||
|
"element.kt",
|
||||||
|
if (element.isValid) {
|
||||||
|
element.text
|
||||||
|
} else {
|
||||||
|
"PsiElement (invalid): " + element.toString()
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ fun getExceptionMessage(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (location != null) {
|
if (location != null) {
|
||||||
result.append("File being compiled and position: ").append(location).append("\n")
|
result.append("File being compiled at position: ").append(location).append("\n")
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result.append("Element is unknown")
|
result.append("Element is unknown")
|
||||||
|
|||||||
Reference in New Issue
Block a user