/* * 03/21/2010 * * Copyright (C) 2010 Robert Futrell * robert_futrell at users.sourceforge.net * http://fifesoft.com/rsyntaxtextarea * * This library is distributed under a modified BSD license. See the included * RSTALanguageSupport.License.txt file for details. */ package org.fife.rsta.ac.java.rjc.lang; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.fife.rsta.ac.java.rjc.lexer.TokenTypes; /** * Wrapper around modifiers to a member. * * @author Robert Futrell * @version 1.0 */ public class Modifiers { public static final Integer ABSTRACT = new Integer(1024); public static final Integer FINAL = new Integer(16); public static final Integer INTERFACE = new Integer(512); public static final Integer NATIVE = new Integer(256); public static final Integer PRIVATE = new Integer(2); public static final Integer PROTECTED = new Integer(4); public static final Integer PUBLIC = new Integer(1); public static final Integer STATIC = new Integer(8); public static final Integer STRICTFP = new Integer(2048); public static final Integer SYNCHRONIZED = new Integer(32); public static final Integer TRANSIENT = new Integer(128); public static final Integer VOLATILE = new Integer(64); private List modifiers; private List annotations; private static final Map MODIFIER_TEXT = new HashMap() { private static final long serialVersionUID = 1L; { put(ABSTRACT, "abstract"); put(FINAL, "final"); put(INTERFACE, "interface"); put(NATIVE, "native"); put(PRIVATE, "private"); put(PROTECTED, "protected"); put(PUBLIC, "public"); put(STATIC, "static"); put(STRICTFP, "strictfp"); put(SYNCHRONIZED, "synchronized"); put(TRANSIENT, "transient"); put(VOLATILE, "volatile"); } }; public Modifiers() { modifiers = new ArrayList(1); // Usually not many. annotations = new ArrayList(0); // Often 0 or 1 (@Deprecated) } public void addAnnotation(Annotation annotation) { annotations.add(annotation); } public boolean addModifier(int tokenType) { Integer key = null; switch (tokenType) { case TokenTypes.KEYWORD_ABSTRACT: key = ABSTRACT; break; case TokenTypes.KEYWORD_FINAL: key = FINAL; break; case TokenTypes.KEYWORD_INTERFACE: key = INTERFACE; break; case TokenTypes.KEYWORD_NATIVE: key = NATIVE; break; case TokenTypes.KEYWORD_PRIVATE: key = PRIVATE; break; case TokenTypes.KEYWORD_PROTECTED: key = PROTECTED; break; case TokenTypes.KEYWORD_PUBLIC: key = PUBLIC; break; case TokenTypes.KEYWORD_STATIC: key = STATIC; break; case TokenTypes.KEYWORD_STRICTFP: key = STRICTFP; break; case TokenTypes.KEYWORD_SYNCHRONIZED: key = SYNCHRONIZED; break; case TokenTypes.KEYWORD_TRANSIENT: key = TRANSIENT; break; case TokenTypes.KEYWORD_VOLATILE: key = VOLATILE; break; default: throw new IllegalArgumentException("Invalid tokenType: " + tokenType); } int pos = Collections.binarySearch(modifiers, key); if (pos<0) { // pos = -insertionPoint - 1 int insertionPoint = -(pos+1); modifiers.add(insertionPoint, key); } return pos<0; } private boolean containsModifier(Integer modifierKey) { return Collections.binarySearch(modifiers, modifierKey)>=0; } public boolean isAbstract() { return containsModifier(ABSTRACT); } public boolean isFinal() { return containsModifier(FINAL); } public boolean isPrivate() { return containsModifier(PRIVATE); } public boolean isProtected() { return containsModifier(PROTECTED); } public boolean isPublic() { return containsModifier(PUBLIC); } public boolean isStatic() { return containsModifier(STATIC); } public String toString() { StringBuffer sb = new StringBuffer(); for (int i=0; i<annotations.size(); i++) { sb.append(annotations.get(i).toString()); if (i<annotations.size()-1 || modifiers.size()>0) { sb.append(' '); } } for (int i=0; i<modifiers.size(); i++) { Integer modifier = (Integer)modifiers.get(i); sb.append(MODIFIER_TEXT.get(modifier)); if (i<modifiers.size()-1) { sb.append(' '); } } return sb.toString(); } }