mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
PyPsiUtils -> python-psi-api
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
+16
-22
@@ -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);
|
||||
+1
-2
@@ -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;
|
||||
|
||||
+2
-1
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user