JetProperty#getReceiverTypeRef() and getReturnTypeRef() by stub

This commit is contained in:
Pavel V. Talanov
2014-04-09 16:17:43 +04:00
parent abda0deac8
commit ada9845b5f
@@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.ItemPresentationProviders;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.PsiElement;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
@@ -38,6 +39,9 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
public class JetProperty extends JetTypeParameterListOwnerStub<PsiJetPropertyStub> implements JetVariableDeclaration,
JetCallableDeclaration {
private static final Logger LOG = Logger.getInstance(JetProperty.class);
public JetProperty(@NotNull ASTNode node) {
super(node);
}
@@ -84,6 +88,20 @@ public class JetProperty extends JetTypeParameterListOwnerStub<PsiJetPropertyStu
@Override
@Nullable
public JetTypeReference getReceiverTypeRef() {
PsiJetPropertyStub stub = getStub();
if (stub != null) {
if (!stub.hasReceiverTypeRef()) {
return null;
}
else {
return getStubOrPsiChild(JetStubElementTypes.TYPE_REFERENCE);
}
}
return getReceiverTypeRefByTree();
}
@Nullable
private JetTypeReference getReceiverTypeRefByTree() {
ASTNode node = getNode().getFirstChildNode();
while (node != null) {
IElementType tt = node.getElementType();
@@ -107,6 +125,26 @@ public class JetProperty extends JetTypeParameterListOwnerStub<PsiJetPropertyStu
@Override
@Nullable
public JetTypeReference getTypeRef() {
PsiJetPropertyStub stub = getStub();
if (stub != null) {
if (!stub.hasReturnTypeRef()) {
return null;
}
else {
List<JetTypeReference> typeReferences = getStubOrPsiChildrenAsList(JetStubElementTypes.TYPE_REFERENCE);
int returnTypeRefPositionInPsi = stub.hasReceiverTypeRef() ? 1 : 0;
if (typeReferences.size() <= returnTypeRefPositionInPsi) {
LOG.error("Invalid stub structure built for property:\n" + getText());
return null;
}
return typeReferences.get(returnTypeRefPositionInPsi);
}
}
return getTypeRefByTree();
}
@Nullable
private JetTypeReference getTypeRefByTree() {
ASTNode node = getNode().getFirstChildNode();
boolean passedColon = false;
while (node != null) {