IDEA-CR-1432

This commit is contained in:
Dennis Ushakov
2015-02-19 15:06:41 +03:00
parent 4b6595952b
commit cded6fd316
4 changed files with 24 additions and 11 deletions
@@ -17,14 +17,15 @@ package com.intellij.psi.impl.smartPointers;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Dennis.Ushakov
*/
public class JavaAnchorProvider implements SmartPointerAnchorProvider {
public class JavaAnchorProvider extends SmartPointerAnchorProvider {
@Override
public PsiElement getAnchor(PsiElement element) {
public PsiElement getAnchor(@NotNull PsiElement element) {
if (!element.getLanguage().isKindOf(JavaLanguage.INSTANCE)) {
return null;
}
@@ -45,7 +46,7 @@ public class JavaAnchorProvider implements SmartPointerAnchorProvider {
@Nullable
@Override
public PsiElement getElement(PsiElement anchor) {
public PsiElement getElement(@NotNull PsiElement anchor) {
if (anchor instanceof PsiIdentifier) {
PsiElement parent = anchor.getParent();
if (parent instanceof PsiJavaCodeReferenceElement) { // anonymous class, type
@@ -53,7 +53,7 @@ public class AnchorElementInfoFactory implements SmartPointerElementInfoFactory
}
@Nullable
static PsiElement getAnchor(PsiElement element) {
static PsiElement getAnchor(@NotNull PsiElement element) {
PsiUtilCore.ensureValid(element);
PsiElement anchor = null;
for (SmartPointerAnchorProvider provider : SmartPointerAnchorProvider.EP_NAME.getExtensions()) {
@@ -17,17 +17,28 @@ package com.intellij.psi.impl.smartPointers;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Allows SmartPointer that points to stubbed psi element to survive stub-to-AST switch
*
* @author Dennis.Ushakov
*/
public interface SmartPointerAnchorProvider {
ExtensionPointName<SmartPointerAnchorProvider> EP_NAME = ExtensionPointName.create("com.intellij.smartPointer.anchorProvider");
public abstract class SmartPointerAnchorProvider {
public static final ExtensionPointName<SmartPointerAnchorProvider> EP_NAME = ExtensionPointName.create("com.intellij.smartPointer.anchorProvider");
/**
* @param element
* @return anchor to be used when restoring element after stub-to-AST switch
*/
@Nullable
PsiElement getAnchor(PsiElement element);
public abstract PsiElement getAnchor(@NotNull PsiElement element);
/**
* @param anchor
* @return restored original element using anchor
*/
@Nullable
PsiElement getElement(PsiElement anchor);
public abstract PsiElement getElement(@NotNull PsiElement anchor);
}
@@ -20,15 +20,16 @@ import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.XmlToken;
import com.intellij.psi.xml.XmlTokenType;
import com.intellij.xml.util.XmlTagUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Dennis.Ushakov
*/
public class XmlAnchorProvider implements SmartPointerAnchorProvider {
public class XmlAnchorProvider extends SmartPointerAnchorProvider {
@Nullable
@Override
public PsiElement getAnchor(PsiElement element) {
public PsiElement getAnchor(@NotNull PsiElement element) {
if (element instanceof XmlTag) {
return XmlTagUtil.getStartTagNameElement((XmlTag)element);
}
@@ -37,7 +38,7 @@ public class XmlAnchorProvider implements SmartPointerAnchorProvider {
@Nullable
@Override
public PsiElement getElement(PsiElement anchor) {
public PsiElement getElement(@NotNull PsiElement anchor) {
if (anchor instanceof XmlToken) {
XmlToken token = (XmlToken)anchor;
return token.getTokenType() == XmlTokenType.XML_NAME ? token.getParent() : null;