mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
avoid stub to AST switches when using class name completion for variables
This commit is contained in:
@@ -41,4 +41,6 @@ public interface PyTargetExpression extends PyQualifiedExpression, PsiNamedEleme
|
||||
|
||||
@Nullable
|
||||
PyClass getContainingClass();
|
||||
|
||||
boolean isQualified();
|
||||
}
|
||||
|
||||
@@ -41,6 +41,8 @@ public interface PyTargetExpressionStub extends NamedStub<PyTargetExpression> {
|
||||
@Nullable
|
||||
PyQualifiedName getInitializer();
|
||||
|
||||
boolean isQualified();
|
||||
|
||||
@Nullable
|
||||
<T extends CustomTargetExpressionStub> T getCustomStub(Class<T> stubClass);
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class PyFileElementType extends IStubFileElementType<PyFileStub> {
|
||||
|
||||
@Override
|
||||
public int getStubVersion() {
|
||||
return 45;
|
||||
return 46;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
@@ -363,12 +363,20 @@ public class PyTargetExpressionImpl extends PyPresentableElementImpl<PyTargetExp
|
||||
}
|
||||
|
||||
public Icon getIcon(final int flags) {
|
||||
if (getQualifier() != null || PsiTreeUtil.<PsiElement>getParentOfType(this, PyFunction.class, PyClass.class) instanceof PyClass) {
|
||||
if (isQualified() || PsiTreeUtil.getStubOrPsiParentOfType(this, PyDocStringOwner.class) instanceof PyClass) {
|
||||
return PlatformIcons.FIELD_ICON;
|
||||
}
|
||||
return PlatformIcons.VARIABLE_ICON;
|
||||
}
|
||||
|
||||
public boolean isQualified() {
|
||||
PyTargetExpressionStub stub = getStub();
|
||||
if (stub != null) {
|
||||
return stub.isQualified();
|
||||
}
|
||||
return getQualifier() != null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public PyExpression findAssignedValue() {
|
||||
if (isValid()) {
|
||||
|
||||
@@ -66,7 +66,7 @@ public class PyTargetExpressionElementType extends PyStubElementType<PyTargetExp
|
||||
initializer = ((PyReferenceExpression) callee).asQualifiedName();
|
||||
}
|
||||
}
|
||||
return new PyTargetExpressionStubImpl(name, initializerType, initializer, parentStub);
|
||||
return new PyTargetExpressionStubImpl(name, initializerType, initializer, psi.getQualifier() != null, parentStub);
|
||||
}
|
||||
|
||||
public void serialize(final PyTargetExpressionStub stub, final StubOutputStream stream)
|
||||
@@ -80,6 +80,7 @@ public class PyTargetExpressionElementType extends PyStubElementType<PyTargetExp
|
||||
}
|
||||
else {
|
||||
PyQualifiedName.serialize(stub.getInitializer(), stream);
|
||||
stream.writeBoolean(stub.isQualified());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,7 +99,8 @@ public class PyTargetExpressionElementType extends PyStubElementType<PyTargetExp
|
||||
throw new IOException("Unknown custom stub type " + typeName);
|
||||
}
|
||||
PyQualifiedName initializer = PyQualifiedName.deserialize(stream);
|
||||
return new PyTargetExpressionStubImpl(name, initializerType, initializer, parentStub);
|
||||
boolean isQualified = stream.readBoolean();
|
||||
return new PyTargetExpressionStubImpl(name, initializerType, initializer, isQualified, parentStub);
|
||||
}
|
||||
|
||||
public boolean shouldCreateStub(final ASTNode node) {
|
||||
|
||||
@@ -15,6 +15,7 @@ public class PyTargetExpressionStubImpl extends StubBase<PyTargetExpression> imp
|
||||
private final String myName;
|
||||
private final InitializerType myInitializerType;
|
||||
private final PyQualifiedName myInitializer;
|
||||
private final boolean myQualified;
|
||||
|
||||
private final CustomTargetExpressionStub myCustomStub;
|
||||
|
||||
@@ -23,16 +24,20 @@ public class PyTargetExpressionStubImpl extends StubBase<PyTargetExpression> imp
|
||||
myName = name;
|
||||
myInitializerType = InitializerType.Custom;
|
||||
myInitializer = null;
|
||||
myQualified = false;
|
||||
myCustomStub = customStub;
|
||||
}
|
||||
|
||||
public PyTargetExpressionStubImpl(final String name, final InitializerType initializerType,
|
||||
final PyQualifiedName initializer, final StubElement parentStub) {
|
||||
final PyQualifiedName initializer,
|
||||
final boolean qualified,
|
||||
final StubElement parentStub) {
|
||||
super(parentStub, PyElementTypes.TARGET_EXPRESSION);
|
||||
myName = name;
|
||||
assert initializerType != InitializerType.Custom;
|
||||
myInitializerType = initializerType;
|
||||
myInitializer = initializer;
|
||||
myQualified = qualified;
|
||||
myCustomStub = null;
|
||||
}
|
||||
|
||||
@@ -48,6 +53,11 @@ public class PyTargetExpressionStubImpl extends StubBase<PyTargetExpression> imp
|
||||
return myInitializer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isQualified() {
|
||||
return myQualified;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public <T extends CustomTargetExpressionStub> T getCustomStub(Class<T> stubClass) {
|
||||
|
||||
@@ -72,7 +72,7 @@ public class CompletionVariantsProcessor extends VariantsProcessor {
|
||||
}
|
||||
else if (element instanceof PyTargetExpression) {
|
||||
final PyTargetExpression expr = (PyTargetExpression)element;
|
||||
if (expr.getQualifier() != null || ScopeUtil.getScopeOwner(expr) instanceof PyClass) {
|
||||
if (expr.isQualified() || ScopeUtil.getScopeOwner(expr) instanceof PyClass) {
|
||||
cls = expr.getContainingClass();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user