blob: 44ecb1b85f694c59b8c93fb0ae04d4b352dce2fc [file] [log] [blame]
/*
* Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved.
*/
package com.intellij.mock;
import com.intellij.lang.ASTNode;
import com.intellij.lang.Language;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.pom.Navigatable;
import com.intellij.psi.*;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.List;
/**
* @author peter
*/
public class MockPsiElement extends UserDataHolderBase implements PsiElement, Navigatable {
private final String myText;
private final Project myProject;
private final List<PsiElement> myDeclarations = new SmartList<PsiElement>();
private Ref<PsiElement> myParent;
private PsiManager myManager;
public MockPsiElement(@NotNull Disposable parentDisposable) {
this(null, new MockProjectEx(parentDisposable));
}
private MockPsiElement(final String text, @NotNull Project project) {
myText = text;
myProject = project;
}
@Override
public void navigate(boolean requestFocus) {
throw new UnsupportedOperationException("Method navigate is not yet implemented in " + getClass().getName());
}
@Override
public boolean canNavigate() {
throw new UnsupportedOperationException("Method canNavigate is not yet implemented in " + getClass().getName());
}
@Override
public boolean canNavigateToSource() {
throw new UnsupportedOperationException("Method canNavigateToSource is not yet implemented in " + getClass().getName());
}
public List<PsiElement> getDeclarations() {
return myDeclarations;
}
@Override
public void accept(@NotNull final PsiElementVisitor visitor) {
throw new UnsupportedOperationException("Method accept is not yet implemented in " + getClass().getName());
}
@Override
public void acceptChildren(@NotNull final PsiElementVisitor visitor) {
throw new UnsupportedOperationException("Method acceptChildren is not yet implemented in " + getClass().getName());
}
@Override
public PsiElement add(@NotNull final PsiElement element) throws IncorrectOperationException {
throw new UnsupportedOperationException("Method add is not yet implemented in " + getClass().getName());
}
@Override
public PsiElement addAfter(@NotNull final PsiElement element, final PsiElement anchor) throws IncorrectOperationException {
throw new UnsupportedOperationException("Method addAfter is not yet implemented in " + getClass().getName());
}
@Override
public PsiElement addBefore(@NotNull final PsiElement element, final PsiElement anchor) throws IncorrectOperationException {
throw new UnsupportedOperationException("Method addBefore is not yet implemented in " + getClass().getName());
}
@Override
public PsiElement addRange(final PsiElement first, final PsiElement last) throws IncorrectOperationException {
throw new UnsupportedOperationException("Method addRange is not yet implemented in " + getClass().getName());
}
@Override
public PsiElement addRangeAfter(final PsiElement first, final PsiElement last, final PsiElement anchor) throws IncorrectOperationException {
throw new UnsupportedOperationException("Method addRangeAfter is not yet implemented in " + getClass().getName());
}
@Override
public PsiElement addRangeBefore(@NotNull final PsiElement first, @NotNull final PsiElement last, final PsiElement anchor) throws
IncorrectOperationException {
throw new UnsupportedOperationException("Method addRangeBefore is not yet implemented in " + getClass().getName());
}
@Override
public void checkAdd(@NotNull final PsiElement element) throws IncorrectOperationException {
throw new UnsupportedOperationException("Method checkAdd is not yet implemented in " + getClass().getName());
}
@Override
public void checkDelete() throws IncorrectOperationException {
throw new UnsupportedOperationException("Method checkDelete is not yet implemented in " + getClass().getName());
}
@Override
public PsiElement copy() {
throw new UnsupportedOperationException("Method copy is not yet implemented in " + getClass().getName());
}
@Override
public void delete() throws IncorrectOperationException {
throw new UnsupportedOperationException("Method delete is not yet implemented in " + getClass().getName());
}
@Override
public void deleteChildRange(final PsiElement first, final PsiElement last) throws IncorrectOperationException {
throw new UnsupportedOperationException("Method deleteChildRange is not yet implemented in " + getClass().getName());
}
@Override
@Nullable
public PsiElement findElementAt(final int offset) {
throw new UnsupportedOperationException("Method findElementAt is not yet implemented in " + getClass().getName());
}
@Override
@Nullable
public PsiReference findReferenceAt(final int offset) {
throw new UnsupportedOperationException("Method findReferenceAt is not yet implemented in " + getClass().getName());
}
@Override
@NotNull
public PsiElement[] getChildren() {
throw new UnsupportedOperationException("Method getChildren is not yet implemented in " + getClass().getName());
}
@Override
public PsiFile getContainingFile() throws PsiInvalidElementAccessException {
throw new UnsupportedOperationException("Method getContainingFile is not yet implemented in " + getClass().getName());
}
@Override
@Nullable
public PsiElement getContext() {
return getParent();
}
@Override
@Nullable
public <T> T getCopyableUserData(final Key<T> key) {
throw new UnsupportedOperationException("Method getCopyableUserData is not yet implemented in " + getClass().getName());
}
@Override
@Nullable
public PsiElement getFirstChild() {
throw new UnsupportedOperationException("Method getFirstChild is not yet implemented in " + getClass().getName());
}
@Override
@NotNull
public Language getLanguage() {
throw new UnsupportedOperationException("Method getLanguage is not yet implemented in " + getClass().getName());
}
@Override
@Nullable
public PsiElement getLastChild() {
throw new UnsupportedOperationException("Method getLastChild is not yet implemented in " + getClass().getName());
}
@Override
public PsiManager getManager() {
return myManager;
}
public void setManager(final PsiManager manager) {
myManager = manager;
}
@Override
public PsiElement getNavigationElement() {
throw new UnsupportedOperationException("Method getNavigationElement is not yet implemented in " + getClass().getName());
}
@Override
@Nullable
public PsiElement getNextSibling() {
throw new UnsupportedOperationException("Method getNextSibling is not yet implemented in " + getClass().getName());
}
@Override
@Nullable
public ASTNode getNode() {
throw new UnsupportedOperationException("Method getNode is not yet implemented in " + getClass().getName());
}
@Override
public PsiElement getOriginalElement() {
throw new UnsupportedOperationException("Method getOriginalElement is not yet implemented in " + getClass().getName());
}
public void setParent(PsiElement parent) {
myParent = Ref.create(parent);
}
@Override
public PsiElement getParent() {
if (myParent == null) {
throw new UnsupportedOperationException("Method getParent is not yet implemented in " + getClass().getName());
}
return myParent.get();
}
@Override
@Nullable
public PsiElement getPrevSibling() {
throw new UnsupportedOperationException("Method getPrevSibling is not yet implemented in " + getClass().getName());
}
@Override
@NotNull
public Project getProject() {
return myProject;
}
@Override
@Nullable
public PsiReference getReference() {
throw new UnsupportedOperationException("Method getReference is not yet implemented in " + getClass().getName());
}
@Override
@NotNull
public PsiReference[] getReferences() {
throw new UnsupportedOperationException("Method getReferences is not yet implemented in " + getClass().getName());
}
@Override
@NotNull
public GlobalSearchScope getResolveScope() {
throw new UnsupportedOperationException("Method getResolveScope is not yet implemented in " + getClass().getName());
}
@Override
public int getStartOffsetInParent() {
throw new UnsupportedOperationException("Method getStartOffsetInParent is not yet implemented in " + getClass().getName());
}
@Override
@NonNls
public String getText() {
return myText;
}
@Override
public int getTextLength() {
return myText.length();
}
@Override
public int getTextOffset() {
return getTextRange().getStartOffset();
}
@Override
public TextRange getTextRange() {
throw new UnsupportedOperationException("Method getTextRange is not yet implemented in " + getClass().getName());
}
@Override
@NotNull
public SearchScope getUseScope() {
throw new UnsupportedOperationException("Method getUseScope is not yet implemented in " + getClass().getName());
}
@Override
public boolean isPhysical() {
return false;
}
@Override
public boolean isValid() {
return true;
}
@Override
public boolean isWritable() {
throw new UnsupportedOperationException("Method isWritable is not yet implemented in " + getClass().getName());
}
@Nullable
protected <T extends PsiNamedElement> T findDeclaration(String name, Class<T> aClass) {
for (final PsiElement declaration : myDeclarations) {
if (declaration instanceof PsiNamedElement) {
final PsiNamedElement psiNamedElement = (PsiNamedElement)declaration;
if (name.equals(psiNamedElement.getName()) && aClass.isInstance(psiNamedElement)) {
return (T)psiNamedElement;
}
}
}
return null;
}
public void addDeclaration(PsiElement declaration) {
if (myDeclarations.contains(declaration)) {
myDeclarations.remove(declaration);
}
else if (declaration instanceof PsiNamedElement) {
myDeclarations.remove(findDeclaration(((PsiNamedElement)declaration).getName(), ((PsiNamedElement)declaration).getClass()));
}
myDeclarations.add(declaration);
}
@Override
public boolean processDeclarations(@NotNull final PsiScopeProcessor processor,
@NotNull final ResolveState state, final PsiElement lastParent, @NotNull final PsiElement place) {
for (final PsiElement declaration : myDeclarations) {
if (!processor.execute(declaration, state)) return false;
}
return true;
}
@Override
public <T> void putCopyableUserData(final Key<T> key, final T value) {
throw new UnsupportedOperationException("Method putCopyableUserData is not yet implemented in " + getClass().getName());
}
@Override
public PsiElement replace(@NotNull final PsiElement newElement) throws IncorrectOperationException {
throw new UnsupportedOperationException("Method replace is not yet implemented in " + getClass().getName());
}
@Override
public boolean textContains(final char c) {
throw new UnsupportedOperationException("Method textContains is not yet implemented in " + getClass().getName());
}
@Override
public boolean textMatches(@NotNull final PsiElement element) {
throw new UnsupportedOperationException("Method textMatches is not yet implemented in " + getClass().getName());
}
@Override
public boolean textMatches(@NotNull final CharSequence text) {
throw new UnsupportedOperationException("Method textMatches is not yet implemented in " + getClass().getName());
}
@Override
@NotNull
public char[] textToCharArray() {
throw new UnsupportedOperationException("Method textToCharArray is not yet implemented in " + getClass().getName());
}
@Override
public Icon getIcon(final int flags) {
return null;
}
@Override
public boolean isEquivalentTo(final PsiElement another) {
return this == another;
}
}