diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index bae3cc9890d..ca42397faaf 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -19,9 +19,13 @@ package org.jetbrains.k2js.translate.reference; import com.google.common.collect.Lists; import com.google.dart.compiler.backend.js.ast.*; import com.google.dart.compiler.util.AstUtil; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; +import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.calls.ExpressionAsFunctionDescriptor; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.VariableAsFunctionResolvedCall; @@ -124,8 +128,24 @@ public final class CallTranslator extends AbstractTranslator { @NotNull private JsExpression intrinsicInvocation() { assert descriptor instanceof FunctionDescriptor; - Intrinsic intrinsic = context().intrinsics().getFunctionIntrinsic((FunctionDescriptor) descriptor); - return intrinsic.apply(callParameters.getThisOrReceiverOrNull(), arguments, context()); + try { + Intrinsic intrinsic = context().intrinsics().getFunctionIntrinsic((FunctionDescriptor) descriptor); + return intrinsic.apply(callParameters.getThisOrReceiverOrNull(), arguments, context()); + } catch (RuntimeException e) { + PsiElement element = BindingContextUtils.descriptorToDeclaration(bindingContext(), descriptor); + if (element == null) { + element = BindingContextUtils.descriptorToDeclaration(bindingContext(), descriptor.getOriginal()); + } + if (element == null && descriptor instanceof ASTNode) { + element = DiagnosticUtils.getClosestPsiElement((ASTNode) descriptor); + } + if (element != null) { + String location = DiagnosticUtils.atLocation(element); + throw new IllegalStateException(e.getMessage() + " at " + location, e); + } else { + throw e; + } + } } private boolean isConstructor() { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java index 984ffaed759..75121bae788 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java @@ -17,11 +17,15 @@ package org.jetbrains.k2js.translate.reference; import com.google.dart.compiler.backend.js.ast.JsExpression; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.k2js.translate.context.TranslationContext; import static org.jetbrains.k2js.translate.general.Translation.translateAsExpression; @@ -68,7 +72,16 @@ public final class QualifiedExpressionTranslator { ((JetSimpleNameExpression)selector, receiver, callType, context); } if (selector instanceof JetCallExpression) { - return CallExpressionTranslator.translate((JetCallExpression)selector, receiver, callType, context); + try { + return CallExpressionTranslator.translate((JetCallExpression)selector, receiver, callType, context); + } catch (RuntimeException e) { + if (selector != null) { + String location = DiagnosticUtils.atLocation(selector); + throw new IllegalStateException(e.getMessage() + " at " + location, e); + } else { + throw e; + } + } } //TODO: never get there if (selector instanceof JetSimpleNameExpression) {