From e984ce2aa894b2210b9a5ea4738790aae968f389 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 15 Aug 2013 17:35:43 +0400 Subject: [PATCH] Introduce method for getting element with context for better error reports --- .../jetbrains/jet/lang/psi/JetPsiUtil.java | 25 +++++++++++++++++++ .../jet/lang/resolve/lazy/ResolveSession.java | 3 ++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index cd297233783..edea03308a8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -20,6 +20,7 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Lists; import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.Condition; import com.intellij.psi.*; import com.intellij.psi.impl.CheckUtil; import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; @@ -946,4 +947,28 @@ public class JetPsiUtil { } return element; } + + @NotNull + public static String getElementTextWithContext(@NotNull JetElement element) { + if (element instanceof JetFile) { + return element.getContainingFile().getText(); + } + + // Find parent for element among file children + PsiElement inFileParent = PsiTreeUtil.findFirstParent(element, new Condition() { + @Override + public boolean value(PsiElement parentCandidate) { + return parentCandidate != null && parentCandidate.getParent() instanceof JetFile; + } + }); + + assert inFileParent != null : "For non-file element we should always be able to find parent in file children"; + + int startContextOffset = inFileParent.getTextRange().getStartOffset(); + int elementContextOffset = element.getTextRange().getStartOffset(); + + int inFileParentOffset = elementContextOffset - startContextOffset; + + return new StringBuilder(inFileParent.getText()).insert(inFileParentOffset, "").toString(); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java index bff81905d3f..4c7ec761314 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java @@ -341,7 +341,8 @@ public class ResolveSession implements KotlinCodeAnalyzer { @Override public DeclarationDescriptor visitJetElement(JetElement element, Void data) { - throw new IllegalArgumentException("Unsupported declaration type: " + element + " " + element.getText()); + throw new IllegalArgumentException("Unsupported declaration type: " + element + " " + + JetPsiUtil.getElementTextWithContext(element)); } }, null); if (result == null) {