package org.fandev.lang.fan.psi.impl.modifiers;
import org.fandev.lang.fan.psi.api.modifiers.FanModifierList;
import org.fandev.lang.fan.psi.impl.FanBaseElementImpl;
import org.fandev.lang.fan.FanElementTypes;
import org.fandev.lang.fan.FanTokenTypes;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.intellij.psi.*;
import com.intellij.util.IncorrectOperationException;
import com.intellij.lang.ASTNode;
/**
* @author Dror Bereznitsky
* @date Apr 2, 2009 2:42:18 PM
*/
public class FanModifierListImpl extends FanBaseElementImpl implements FanModifierList {
public FanModifierListImpl(ASTNode astNode) {
super(astNode);
}
public boolean hasModifierProperty(@Modifier final String modifier) {
// If no protection keyword is specified, the class defaults to public
// If no protection keyword is specified, the slot defaults to public
if (modifier.equals(PsiModifier.PUBLIC)) {
return findChildByType(FanTokenTypes.PRIVATE_KEYWORD) == null &&
findChildByType(FanTokenTypes.PROTECTED_KEYWORD) == null &&
findChildByType(FanTokenTypes.INTERNAL_KEYWORD) == null;
}
return hasExplicitModifier(modifier);
}
//TODO check if we can extends this beyond the modifier set we have in PsiModifier
public boolean hasExplicitModifier(@Modifier final String name) {
if (name.equals(PsiModifier.PUBLIC)) return findChildByType(FanTokenTypes.PUBLIC_KEYWORD) != null;
if (name.equals(PsiModifier.ABSTRACT)) return findChildByType(FanTokenTypes.ABSTRACT_KEYWORD) != null;
if (name.equals(PsiModifier.NATIVE)) return findChildByType(FanTokenTypes.NATIVE_KEYWORD) != null;
return hasOtherModifiers(name);
}
private boolean hasOtherModifiers(final String name) {
if (name.equals(PsiModifier.PRIVATE)) return findChildByType(FanTokenTypes.PRIVATE_KEYWORD) != null;
if (name.equals(PsiModifier.PROTECTED)) return findChildByType(FanTokenTypes.PROTECTED_KEYWORD) != null;
if (name.equals(PsiModifier.PACKAGE_LOCAL)) return findChildByType(FanTokenTypes.INTERNAL_KEYWORD) != null;
if (name.equals(PsiModifier.STATIC)) return findChildByType(FanTokenTypes.STATIC_KEYWORD) != null;
if (name.equals(PsiModifier.FINAL)) return findChildByType(FanTokenTypes.FINAL_KEYWORD) != null;
return name.equals(PsiModifier.VOLATILE) && findChildByType(FanTokenTypes.VOLATILE_KEYWORD) != null;
}
public void setModifierProperty(@Modifier final String name, final boolean value) throws IncorrectOperationException {
//TODO implement
}
public void checkSetModifierProperty(@Modifier final String name, final boolean value) throws IncorrectOperationException {
//TODO implement
}
@NotNull
public PsiAnnotation[] getAnnotations() {
return PsiAnnotation.EMPTY_ARRAY;
}
@Nullable
public PsiAnnotation findAnnotation(@NotNull final String qualifiedName) {
return null;
}
@NotNull
public PsiAnnotation[] getApplicableAnnotations() {
return new PsiAnnotation[0];
}
@NotNull
public PsiAnnotation addAnnotation(@NotNull final String qualifiedName) {
return null;
}
public String toString() {
return "Modifiers";
}
}