PyPsiUtils -> python-psi-api

This commit is contained in:
Dmitry Jemerov
2012-08-08 17:49:47 +02:00
parent c518835b59
commit 38f20a645c
10 changed files with 48 additions and 44 deletions
+1
View File
@@ -9,6 +9,7 @@
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="core-api" />
<orderEntry type="module" module-name="projectModel-api" />
<orderEntry type="module" module-name="core-impl" />
</component>
</module>
@@ -1,6 +1,5 @@
package com.jetbrains.python.psi.impl;
import com.google.common.collect.Lists;
import com.intellij.extapi.psi.ASTDelegatePsiElement;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
@@ -13,8 +12,8 @@ import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -309,10 +308,10 @@ public class PyPsiUtils {
final PyExpression[] args = call.getArguments();
for (int i = 0; i < args.length; i++) {
PyExpression expression = args[i];
if (expression instanceof PyKeywordArgumentImpl) {
expression = ((PyKeywordArgumentImpl)expression).getValueExpression();
if (expression instanceof PyKeywordArgument) {
expression = ((PyKeywordArgument)expression).getValueExpression();
}
expression = PyUtil.flattenParens(expression);
expression = flattenParens(expression);
if (expression == argument) {
return i;
}
@@ -320,19 +319,6 @@ public class PyPsiUtils {
return -1;
}
public static boolean isTopLevel(@NotNull PsiElement element) {
if (element instanceof StubBasedPsiElement) {
final StubElement stub = ((StubBasedPsiElement)element).getStub();
if (stub != null) {
final StubElement parentStub = stub.getParentStub();
if (parentStub != null) {
return parentStub.getPsi() instanceof PsiFile;
}
}
}
return ScopeUtil.getScopeOwner(element) instanceof PsiFile;
}
@Nullable
public static PyTargetExpression getAttribute(@NotNull final PyFile file, @NotNull final String name) {
PyTargetExpression attr = file.findTopLevelAttribute(name);
@@ -350,12 +336,12 @@ public class PyPsiUtils {
}
public static List<PyExpression> getAttributeValuesFromFile(@NotNull PyFile file, @NotNull String name) {
List<PyExpression> result = Lists.newArrayList();
List<PyExpression> result = ContainerUtil.newArrayList();
final PyTargetExpression attr = file.findTopLevelAttribute(name);
if (attr != null) {
PyExpression value = PyUtil.flattenParens(attr.findAssignedValue());
PyExpression value = flattenParens(attr.findAssignedValue());
if (value instanceof PySequenceExpression) {
result.addAll(Lists.newArrayList(((PySequenceExpression)value).getElements()));
result.addAll(ContainerUtil.newArrayList(((PySequenceExpression)value).getElements()));
}
else if (value instanceof PyStringLiteralExpression) {
result.add(value);
@@ -365,7 +351,7 @@ public class PyPsiUtils {
}
public static List<String> getStringValues(PyExpression[] elements) {
List<String> results = Lists.newArrayList();
List<String> results = ContainerUtil.newArrayList();
for (PyExpression element : elements) {
if (element instanceof PyStringLiteralExpression) {
results.add(((PyStringLiteralExpression)element).getStringValue());
@@ -374,6 +360,14 @@ public class PyPsiUtils {
return results;
}
@Nullable
public static PyExpression flattenParens(@Nullable PyExpression expr) {
while (expr instanceof PyParenthesizedExpression) {
expr = ((PyParenthesizedExpression)expr).getContainedExpression();
}
return expr;
}
private static abstract class TopLevelVisitor extends PyRecursiveElementVisitor {
public void visitPyElement(final PyElement node) {
super.visitPyElement(node);
@@ -20,7 +20,6 @@ import com.jetbrains.python.PythonFileType;
import com.jetbrains.python.codeInsight.imports.AddImportHelper;
import com.jetbrains.python.codeInsight.imports.PythonReferenceImporter;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.search.PyProjectScopeBuilder;
import com.jetbrains.python.psi.stubs.PyClassNameIndex;
import com.jetbrains.python.psi.stubs.PyFunctionNameIndex;
@@ -71,7 +70,7 @@ public class PyClassNameCompletionContributor extends CompletionContributor {
private static Condition<PsiElement> IS_TOPLEVEL = new Condition<PsiElement>() {
@Override
public boolean value(PsiElement element) {
return PyPsiUtils.isTopLevel(element);
return PyUtil.isTopLevel(element);
}
};
@@ -26,7 +26,6 @@ import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyFileImpl;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.impl.PyQualifiedName;
import com.jetbrains.python.psi.resolve.CollectProcessor;
import com.jetbrains.python.psi.resolve.PyResolveUtil;
@@ -244,7 +243,7 @@ public class PythonReferenceImporter implements ReferenceImporter {
return true;
}
if (symbol instanceof PyClass || symbol instanceof PyFunction) {
return PyPsiUtils.isTopLevel(symbol);
return PyUtil.isTopLevel(symbol);
}
// only top-level target expressions are included in VariableNameIndex
return symbol instanceof PyTargetExpression;
@@ -17,6 +17,7 @@ import com.jetbrains.python.PyNames;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.types.PyClassType;
import org.jetbrains.annotations.NotNull;
@@ -228,7 +229,7 @@ public class ConvertFormatOperatorToMethodIntention extends BaseIntentionAction
if (rightExpression == null) {
return;
}
PyExpression rhs = PyUtil.flattenParens(rightExpression);
PyExpression rhs = PyPsiUtils.flattenParens(rightExpression);
String param_text = sure(rhs).getText();
final PyStringLiteralExpression leftExpression = (PyStringLiteralExpression)element.getLeftExpression();
Pair<StringBuilder, Boolean> converted = convertFormat(leftExpression);
@@ -9,6 +9,7 @@ import com.intellij.util.ProcessingContext;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.PyElementImpl;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.resolve.RatedResolveResult;
import com.jetbrains.python.psi.types.PyCallableType;
@@ -114,7 +115,7 @@ public class PyNamedTupleType extends PyClassType implements PyCallableType {
@Nullable
public static PyType fromCall(PyCallExpression call) {
final String name = PyUtil.strValue(call.getArgument(0, PyExpression.class));
final PyExpression fieldNamesExpression = PyUtil.flattenParens(call.getArgument(1, PyExpression.class));
final PyExpression fieldNamesExpression = PyPsiUtils.flattenParens(call.getArgument(1, PyExpression.class));
if (name == null || fieldNamesExpression == null) {
return null;
}
@@ -9,6 +9,7 @@ import com.intellij.usages.impl.rules.UsageTypeProviderEx;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.CallArgumentsMappingImpl;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.types.PyType;
import com.jetbrains.python.psi.types.PyTypeReference;
import com.jetbrains.python.psi.types.TypeEvalContext;
@@ -57,7 +58,7 @@ public class PyUsageTypeProvider implements UsageTypeProviderEx {
if (element == typeExpression) {
return USAGE_IN_ISINSTANCE;
}
typeExpression = PyUtil.flattenParens(typeExpression);
typeExpression = PyPsiUtils.flattenParens(typeExpression);
if (typeExpression instanceof PySequenceExpression && element.getParent() == typeExpression) {
return USAGE_IN_ISINSTANCE;
}
@@ -11,6 +11,7 @@ import com.intellij.psi.PsiFile;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.packaging.PyPackageUtil;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.impl.PyQualifiedName;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.stubs.PyClassNameIndex;
@@ -102,7 +103,7 @@ public class SetupTaskIntrospector {
if (taskClass != null) {
final PyTargetExpression description = taskClass.findClassAttribute("description", true);
if (description != null) {
final String descriptionText = PyUtil.strValue(PyUtil.flattenParens(description.findAssignedValue()));
final String descriptionText = PyUtil.strValue(PyPsiUtils.flattenParens(description.findAssignedValue()));
if (descriptionText != null) {
task.setDescription(descriptionText);
}
@@ -162,12 +163,12 @@ public class SetupTaskIntrospector {
private static Map<String, String> parseNegativeOpt(PyExpression dict) {
Map<String, String> result = new HashMap<String, String>();
dict = PyUtil.flattenParens(dict);
dict = PyPsiUtils.flattenParens(dict);
if (dict instanceof PyDictLiteralExpression) {
final PyKeyValueExpression[] elements = ((PyDictLiteralExpression)dict).getElements();
for (PyKeyValueExpression element : elements) {
String key = PyUtil.strValue(PyUtil.flattenParens(element.getKey()));
String value = PyUtil.strValue(PyUtil.flattenParens(element.getValue()));
String key = PyUtil.strValue(PyPsiUtils.flattenParens(element.getKey()));
String value = PyUtil.strValue(PyPsiUtils.flattenParens(element.getValue()));
if (key != null && value != null) {
result.put(key, value);
}
@@ -178,7 +179,7 @@ public class SetupTaskIntrospector {
@Nullable
private static SetupTask.Option createOptionFromTuple(PyExpression tuple, List<String> booleanOptions, Map<String, String> negativeOptMap) {
tuple = PyUtil.flattenParens(tuple);
tuple = PyPsiUtils.flattenParens(tuple);
if (tuple instanceof PyTupleExpression) {
final PyExpression[] elements = ((PyTupleExpression)tuple).getElements();
if (elements.length == 3) {
@@ -22,6 +22,7 @@ import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.psi.*;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.ui.awt.RelativePoint;
@@ -34,6 +35,7 @@ import com.intellij.util.containers.HashSet;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.codeInsight.stdlib.PyNamedTupleType;
import com.jetbrains.python.documentation.EpydocUtil;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
@@ -120,14 +122,6 @@ public class PyUtil {
return ArrayUtil.toObjectArray(result, aClass);
}
@Nullable
public static PyExpression flattenParens(@Nullable PyExpression expr) {
while (expr instanceof PyParenthesizedExpression) {
expr = ((PyParenthesizedExpression)expr).getContainedExpression();
}
return expr;
}
/**
* @see PyUtil#flattenedParensAndTuples
*/
@@ -579,6 +573,19 @@ public class PyUtil {
return f1 == f2;
}
public static boolean isTopLevel(@NotNull PsiElement element) {
if (element instanceof StubBasedPsiElement) {
final StubElement stub = ((StubBasedPsiElement)element).getStub();
if (stub != null) {
final StubElement parentStub = stub.getParentStub();
if (parentStub != null) {
return parentStub.getPsi() instanceof PsiFile;
}
}
}
return ScopeUtil.getScopeOwner(element) instanceof PsiFile;
}
public static class KnownDecoratorProviderHolder {
public static PyKnownDecoratorProvider[] KNOWN_DECORATOR_PROVIDERS = Extensions.getExtensions(PyKnownDecoratorProvider.EP_NAME);
@@ -16,7 +16,7 @@ import com.intellij.util.IncorrectOperationException;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyFunction;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.PyUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -70,7 +70,7 @@ public class PyMoveClassOrFunctionDelegate extends MoveHandlerDelegate {
@Nullable Editor editor) {
final PsiNamedElement e = getElementToMove(element);
if (e instanceof PyClass || e instanceof PyFunction) {
if (PyPsiUtils.isTopLevel(e)) {
if (PyUtil.isTopLevel(e)) {
PsiElement targetContainer = null;
if (editor != null) {
final Document document = editor.getDocument();