*/
package com.jetbrains.python.debugger;
+import com.google.common.annotations.VisibleForTesting;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileTypes.FileType;
}
@Nullable
- private static PsiElement getContextElement(final Project project, XSourcePosition sourcePosition) {
+ @VisibleForTesting
+ public static PsiElement getContextElement(final Project project, XSourcePosition sourcePosition) {
if (sourcePosition != null) {
final Document document = FileDocumentManager.getInstance().getDocument(sourcePosition.getFile());
final PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(document);
if (element != null && !(element instanceof PsiWhiteSpace || element instanceof PsiComment)) {
return PyPsiUtils.getStatement(element);
}
- offset = element.getTextRange().getEndOffset() + 1;
+ offset = element.getTextRange().getEndOffset();
}
while (offset < lineEndOffset);
}
uexpr = null;
}
else if (owner == originalOwner && !scope.isGlobal(referencedName)) {
- final List<ReadWriteInstruction> instructions = PyDefUseUtil.getLatestDefs(owner, referencedName, myElement, false);
- final ResolveResultList latest = resolveToLatestDefs(instructions, myElement, referencedName);
+ final List<ReadWriteInstruction> instructions = PyDefUseUtil.getLatestDefs(owner, referencedName, realContext, false);
+ final ResolveResultList latest = resolveToLatestDefs(instructions, realContext, referencedName);
if (!latest.isEmpty()) {
return latest;
}
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.util.JDOMUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiElement;
+import com.intellij.xdebugger.impl.XSourcePositionImpl;
+import com.jetbrains.python.debugger.PyDebuggerEditorsProvider;
import com.jetbrains.python.fixtures.PyInspectionTestCase;
import com.jetbrains.python.inspections.unresolvedReference.PyUnresolvedReferencesInspection;
import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.psi.impl.PyExpressionCodeFragmentImpl;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
myFixture.checkHighlighting(isWarning(), isInfo(), isWeakWarning());
}
+ protected VirtualFile prepareFile() {
+ myFixture.copyDirectoryToProject(getTestDirectory(false), "");
+ return myFixture.configureByFile(getTestDirectory(false) + "/" + getTestName(true) + ".py").getVirtualFile();
+ }
+
+ protected void doEvaluateExpressionTest(@NotNull VirtualFile mainFile, @NotNull String expression, int lineNumber) {
+ PsiElement element = PyDebuggerEditorsProvider.getContextElement(myFixture.getProject(),
+ XSourcePositionImpl.create(mainFile, lineNumber));
+ final PyExpressionCodeFragmentImpl fragment = new PyExpressionCodeFragmentImpl(myFixture.getProject(), "fragment.py", expression, true);
+ fragment.setContext(element);
+ myFixture.configureFromExistingVirtualFile(fragment.getVirtualFile());
+ myFixture.enableInspections(getInspectionClass());
+ myFixture.checkHighlighting(isWarning(), isInfo(), isWeakWarning());
+ }
+
+ public void testEvaluateExpressionBuiltins() {
+ VirtualFile mainFile = prepareFile();
+ doEvaluateExpressionTest(mainFile, "len(a)", 2);
+ doEvaluateExpressionTest(mainFile, "a", 2);
+ }
+
+ public void testEvaluateExpressionInsideFunction() {
+ VirtualFile mainFile = prepareFile();
+ doEvaluateExpressionTest(mainFile, "a", 3);
+ doEvaluateExpressionTest(mainFile, "s", 3);
+ }
+
+ // PY-14309
+ public void testEvaluateExpressionClass() {
+ VirtualFile mainFile = prepareFile();
+ doEvaluateExpressionTest(mainFile, "s", 4);
+ doEvaluateExpressionTest(mainFile, "self", 4);
+ doEvaluateExpressionTest(mainFile, "self.a", 4);
+ }
+
// PY-13554
public void testDocstringTypeFromSubModule() {
doMultiFileTest();