001    /* Copyright 2000, 2001, Compaq Computer Corporation */
002    
003    package javafe.ast;
004    
005    /**
006     * <code>TagConstants</code> is a class defining a partially-opaque
007     * type for tags used in the AST.  "Partially opaque" means that the
008     * representation of this type is known -- it's an <code>int</code> --
009     * but code should not depend on the detailed mapping of operator tags
010     * to integers.
011     *
012     * @see OperatorTags
013     * @see GeneratedTags
014     */
015    
016    public class TagConstants extends OperatorTags
017    {
018        /**
019         * Used to indicate that no tag applies, for example, when looking
020         * up the tag associated with a string.
021         */
022        public static final int NULL = -1;
023    
024        public static final int IDENT = javafe.ast.OperatorTags.LAST_TAG + 1;
025    
026        public static final int ERRORTYPE = IDENT + 1;
027        public static final int BOOLEANTYPE = ERRORTYPE + 1;
028        public static final int CHARTYPE = BOOLEANTYPE + 1;
029        public static final int VOIDTYPE = CHARTYPE + 1;
030        public static final int NULLTYPE = VOIDTYPE + 1;
031        // The following must be in the order of implicit promotion
032        public static final int BYTETYPE = NULLTYPE + 1;
033        public static final int SHORTTYPE = BYTETYPE + 1;
034        public static final int INTTYPE = SHORTTYPE + 1;
035        public static final int LONGTYPE = INTTYPE + 1;
036        public static final int FLOATTYPE = LONGTYPE + 1;
037        public static final int DOUBLETYPE = FLOATTYPE + 1;
038    
039        public static final int BOOLEANLIT = DOUBLETYPE +1;
040        public static final int INTLIT = BOOLEANLIT + 1;
041        public static final int LONGLIT = INTLIT + 1;
042        public static final int CHARLIT = LONGLIT + 1;
043        public static final int FLOATLIT = CHARLIT + 1;
044        public static final int DOUBLELIT = FLOATLIT + 1;
045        public static final int STRINGLIT = DOUBLELIT + 1;
046        public static final int NULLLIT = STRINGLIT + 1;
047        public static final int BYTELIT = NULLLIT + 1;
048        public static final int SHORTLIT = BYTELIT + 1;
049    
050        public static final int LAST_TAG = NULLLIT;
051    
052        //@ private invariant \nonnullelements(tags);
053        private static final /*@ non_null @*/ String[] tags = { 
054            "IDENT", "ERRORTYPE",
055            "BOOLEANTYPE", "CHARTYPE", "VOIDTYPE", "NULLTYPE",
056            "BYTETYPE", "SHORTTYPE", "INTTYPE", "LONGTYPE",
057            "FLOATTYPE", "DOUBLETYPE",
058            "BOOLEANLIT", "INTLIT", "LONGLIT", "CHARLIT",
059            "FLOATLIT", "DOUBLELIT", "STRINGLIT", "NULLLIT" };
060    
061        //@ requires tag <= LAST_TAG;
062        //@ ensures \result != null;
063        public static String toString(int tag) {
064            if (IDENT <= tag && tag <= LAST_TAG)
065                return tags[tag - IDENT];
066    
067            return OperatorTags.toString(tag);
068        }
069    }