store initializer for target expressions in stubs

This commit is contained in:
Dmitry Jemerov
2010-03-10 21:21:31 +03:00
parent 84dd320d61
commit 3dc0c0db14
8 changed files with 37 additions and 10 deletions
@@ -24,7 +24,7 @@ public class PyFileElementType extends IStubFileElementType {
@Override
public int getStubVersion() {
return 19;
return 20;
}
@Override
@@ -2,6 +2,7 @@ package com.jetbrains.python.psi;
import com.intellij.psi.PsiNamedElement;
import com.intellij.psi.StubBasedPsiElement;
import com.jetbrains.python.psi.impl.PyQualifiedName;
import com.jetbrains.python.psi.stubs.PyTargetExpressionStub;
import org.jetbrains.annotations.Nullable;
@@ -11,11 +12,6 @@ import org.jetbrains.annotations.Nullable;
public interface PyTargetExpression extends PyQualifiedExpression, PsiNamedElement, StubBasedPsiElement<PyTargetExpressionStub> {
PyTargetExpression[] EMPTY_ARRAY = new PyTargetExpression[0];
/*
@Nullable
PyExpression getQualifier();
*/
/**
* Find the value that maps to this target expression in an enclosing assignment expression.
* Does not work with other expressions (e.g. if the target is in a 'for' loop).
@@ -24,4 +20,7 @@ public interface PyTargetExpression extends PyQualifiedExpression, PsiNamedEleme
*/
@Nullable
PyExpression findAssignedValue();
@Nullable
PyQualifiedName getAssignedQName();
}
@@ -130,4 +130,13 @@ public class PyTargetExpressionImpl extends PyPresentableElementImpl<PyTargetExp
}
return null;
}
public PyQualifiedName getAssignedQName() {
final PyTargetExpressionStub stub = getStub();
if (stub != null) {
return stub.getInitializer();
}
final PyExpression value = findAssignedValue();
return value instanceof PyReferenceExpression ? ((PyReferenceExpression) value).asQualifiedName() : null;
}
}
@@ -8,8 +8,11 @@ import com.intellij.psi.stubs.StubInputStream;
import com.intellij.psi.stubs.StubOutputStream;
import com.intellij.util.io.StringRef;
import com.jetbrains.python.PyElementTypes;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyReferenceExpression;
import com.jetbrains.python.psi.PyStubElementType;
import com.jetbrains.python.psi.PyTargetExpression;
import com.jetbrains.python.psi.impl.PyQualifiedName;
import com.jetbrains.python.psi.impl.PyTargetExpressionImpl;
import com.jetbrains.python.psi.stubs.PyTargetExpressionStub;
@@ -32,18 +35,24 @@ public class PyTargetExpressionElementType extends PyStubElementType<PyTargetExp
}
public PyTargetExpressionStub createStub(final PyTargetExpression psi, final StubElement parentStub) {
return new PyTargetExpressionStubImpl(psi.getName(), parentStub);
final PyExpression assignedValue = psi.findAssignedValue();
final PyQualifiedName initializer = assignedValue instanceof PyReferenceExpression
? ((PyReferenceExpression) assignedValue).asQualifiedName()
: null;
return new PyTargetExpressionStubImpl(psi.getName(), initializer, parentStub);
}
public void serialize(final PyTargetExpressionStub stub, final StubOutputStream dataStream)
throws IOException {
dataStream.writeName(stub.getName());
PyQualifiedName.serialize(stub.getInitializer(), dataStream);
}
public PyTargetExpressionStub deserialize(final StubInputStream dataStream, final StubElement parentStub)
throws IOException {
String name = StringRef.toString(dataStream.readName());
return new PyTargetExpressionStubImpl(name, parentStub);
PyQualifiedName initializer = PyQualifiedName.deserialize(dataStream);
return new PyTargetExpressionStubImpl(name, initializer, parentStub);
}
public boolean shouldCreateStub(final ASTNode node) {
@@ -4,6 +4,7 @@ import com.intellij.psi.stubs.StubBase;
import com.intellij.psi.stubs.StubElement;
import com.jetbrains.python.PyElementTypes;
import com.jetbrains.python.psi.PyTargetExpression;
import com.jetbrains.python.psi.impl.PyQualifiedName;
import com.jetbrains.python.psi.stubs.PyTargetExpressionStub;
/**
@@ -11,13 +12,19 @@ import com.jetbrains.python.psi.stubs.PyTargetExpressionStub;
*/
public class PyTargetExpressionStubImpl extends StubBase<PyTargetExpression> implements PyTargetExpressionStub {
private final String myName;
private final PyQualifiedName myInitializer;
public PyTargetExpressionStubImpl(final String name, final StubElement parentStub) {
public PyTargetExpressionStubImpl(final String name, final PyQualifiedName initializer, final StubElement parentStub) {
super(parentStub, PyElementTypes.TARGET_EXPRESSION);
myName = name;
myInitializer = initializer;
}
public String getName() {
return myName;
}
public PyQualifiedName getInitializer() {
return myInitializer;
}
}
@@ -2,9 +2,11 @@ package com.jetbrains.python.psi.stubs;
import com.intellij.psi.stubs.NamedStub;
import com.jetbrains.python.psi.PyTargetExpression;
import com.jetbrains.python.psi.impl.PyQualifiedName;
/**
* @author yole
*/
public interface PyTargetExpressionStub extends NamedStub<PyTargetExpression> {
PyQualifiedName getInitializer();
}
+1 -1
View File
@@ -2,7 +2,7 @@ def deco(fun):
return fun # valid
class FooClass:
staticField = 1
staticField = deco
def __init__(self):
self.instanceField = 2
@@ -45,6 +45,7 @@ public class PyStubsTest extends PyLightFixtureTestCase {
final PyTargetExpression[] attrs = pyClass.getClassAttributes();
assertEquals(1, attrs.length);
assertEquals("staticField", attrs [0].getName());
assertTrue(attrs [0].getAssignedQName().matches("deco"));
final PyFunction[] methods = pyClass.getMethods();
assertEquals(2, methods.length);