avoid stub to AST switches when using class name completion for variables

This commit is contained in:
Dmitry Jemerov
2012-08-09 14:02:21 +02:00
parent 8ff184dcda
commit 72dbe42e7b
7 changed files with 30 additions and 6 deletions
@@ -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();
}
}