mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
store initializer for target expressions in stubs
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user