langtools/src/share/classes/com/sun/tools/javac/code/Flags.java
changeset 18411 58e11c41d705
parent 18389 a425d0819f36
child 18909 8f9fc5d876e4
equal deleted inserted replaced
18410:daf2e2653da5 18411:58e11c41d705
    29 import java.util.EnumSet;
    29 import java.util.EnumSet;
    30 import java.util.Map;
    30 import java.util.Map;
    31 import java.util.Set;
    31 import java.util.Set;
    32 
    32 
    33 import javax.lang.model.element.Modifier;
    33 import javax.lang.model.element.Modifier;
       
    34 
       
    35 import com.sun.tools.javac.util.Assert;
    34 
    36 
    35 /** Access flags and other modifiers for Java classes and members.
    37 /** Access flags and other modifiers for Java classes and members.
    36  *
    38  *
    37  *  <p><b>This is NOT part of any supported API.
    39  *  <p><b>This is NOT part of any supported API.
    38  *  If you write code that depends on this, you do so at your own risk.
    40  *  If you write code that depends on this, you do so at your own risk.
    44     private Flags() {} // uninstantiable
    46     private Flags() {} // uninstantiable
    45 
    47 
    46     public static String toString(long flags) {
    48     public static String toString(long flags) {
    47         StringBuilder buf = new StringBuilder();
    49         StringBuilder buf = new StringBuilder();
    48         String sep = "";
    50         String sep = "";
    49         for (Flag s : asFlagSet(flags)) {
    51         for (Flag flag : asFlagSet(flags)) {
    50             buf.append(sep);
    52             buf.append(sep);
    51             buf.append(s);
    53             buf.append(flag);
    52             sep = " ";
    54             sep = " ";
    53         }
    55         }
    54         return buf.toString();
    56         return buf.toString();
    55     }
    57     }
    56 
    58 
    57     public static EnumSet<Flag> asFlagSet(long mask) {
    59     public static EnumSet<Flag> asFlagSet(long flags) {
    58         EnumSet<Flag> flags = EnumSet.noneOf(Flag.class);
    60         EnumSet<Flag> flagSet = EnumSet.noneOf(Flag.class);
    59         if ((mask&PUBLIC) != 0) flags.add(Flag.PUBLIC);
    61         for (Flag flag : Flag.values()) {
    60         if ((mask&PRIVATE) != 0) flags.add(Flag.PRIVATE);
    62             if ((flags & flag.value) != 0) {
    61         if ((mask&PROTECTED) != 0) flags.add(Flag.PROTECTED);
    63                 flagSet.add(flag);
    62         if ((mask&STATIC) != 0) flags.add(Flag.STATIC);
    64                 flags &= ~flag.value;
    63         if ((mask&FINAL) != 0) flags.add(Flag.FINAL);
    65             }
    64         if ((mask&SYNCHRONIZED) != 0) flags.add(Flag.SYNCHRONIZED);
    66         }
    65         if ((mask&VOLATILE) != 0) flags.add(Flag.VOLATILE);
    67         Assert.check(flags == 0, "Flags parameter contains unknown flags " + flags);
    66         if ((mask&TRANSIENT) != 0) flags.add(Flag.TRANSIENT);
    68         return flagSet;
    67         if ((mask&NATIVE) != 0) flags.add(Flag.NATIVE);
       
    68         if ((mask&INTERFACE) != 0) flags.add(Flag.INTERFACE);
       
    69         if ((mask&ABSTRACT) != 0) flags.add(Flag.ABSTRACT);
       
    70         if ((mask&DEFAULT) != 0) flags.add(Flag.DEFAULT);
       
    71         if ((mask&STRICTFP) != 0) flags.add(Flag.STRICTFP);
       
    72         if ((mask&BRIDGE) != 0) flags.add(Flag.BRIDGE);
       
    73         if ((mask&SYNTHETIC) != 0) flags.add(Flag.SYNTHETIC);
       
    74         if ((mask&DEPRECATED) != 0) flags.add(Flag.DEPRECATED);
       
    75         if ((mask&HASINIT) != 0) flags.add(Flag.HASINIT);
       
    76         if ((mask&ENUM) != 0) flags.add(Flag.ENUM);
       
    77         if ((mask&MANDATED) != 0) flags.add(Flag.MANDATED);
       
    78         if ((mask&IPROXY) != 0) flags.add(Flag.IPROXY);
       
    79         if ((mask&NOOUTERTHIS) != 0) flags.add(Flag.NOOUTERTHIS);
       
    80         if ((mask&EXISTS) != 0) flags.add(Flag.EXISTS);
       
    81         if ((mask&COMPOUND) != 0) flags.add(Flag.COMPOUND);
       
    82         if ((mask&CLASS_SEEN) != 0) flags.add(Flag.CLASS_SEEN);
       
    83         if ((mask&SOURCE_SEEN) != 0) flags.add(Flag.SOURCE_SEEN);
       
    84         if ((mask&LOCKED) != 0) flags.add(Flag.LOCKED);
       
    85         if ((mask&UNATTRIBUTED) != 0) flags.add(Flag.UNATTRIBUTED);
       
    86         if ((mask&ANONCONSTR) != 0) flags.add(Flag.ANONCONSTR);
       
    87         if ((mask&ACYCLIC) != 0) flags.add(Flag.ACYCLIC);
       
    88         if ((mask&PARAMETER) != 0) flags.add(Flag.PARAMETER);
       
    89         if ((mask&VARARGS) != 0) flags.add(Flag.VARARGS);
       
    90         return flags;
       
    91     }
    69     }
    92 
    70 
    93     /* Standard Java flags.
    71     /* Standard Java flags.
    94      */
    72      */
    95     public static final int PUBLIC       = 1<<0;
    73     public static final int PUBLIC       = 1;
    96     public static final int PRIVATE      = 1<<1;
    74     public static final int PRIVATE      = 1<<1;
    97     public static final int PROTECTED    = 1<<2;
    75     public static final int PROTECTED    = 1<<2;
    98     public static final int STATIC       = 1<<3;
    76     public static final int STATIC       = 1<<3;
    99     public static final int FINAL        = 1<<4;
    77     public static final int FINAL        = 1<<4;
   100     public static final int SYNCHRONIZED = 1<<5;
    78     public static final int SYNCHRONIZED = 1<<5;
   152      */
   130      */
   153     public static final int IPROXY           = 1<<21;
   131     public static final int IPROXY           = 1<<21;
   154 
   132 
   155     /** Flag is set for nested classes that do not access instance members
   133     /** Flag is set for nested classes that do not access instance members
   156      *  or `this' of an outer class and therefore don't need to be passed
   134      *  or `this' of an outer class and therefore don't need to be passed
   157      *  a this$n reference.  This flag is currently set only for anonymous
   135      *  a this$n reference.  This value is currently set only for anonymous
   158      *  classes in superclass constructor calls and only for pre 1.4 targets.
   136      *  classes in superclass constructor calls and only for pre 1.4 targets.
   159      *  todo: use this flag for optimizing away this$n parameters in
   137      *  todo: use this value for optimizing away this$n parameters in
   160      *  other cases.
   138      *  other cases.
   161      */
   139      */
   162     public static final int NOOUTERTHIS  = 1<<22;
   140     public static final int NOOUTERTHIS  = 1<<22;
   163 
   141 
   164     /** Flag is set for package symbols if a package has a member or
   142     /** Flag is set for package symbols if a package has a member or
   340 
   318 
   341     public static boolean isConstant(Symbol.VarSymbol symbol) {
   319     public static boolean isConstant(Symbol.VarSymbol symbol) {
   342         return symbol.getConstValue() != null;
   320         return symbol.getConstValue() != null;
   343     }
   321     }
   344 
   322 
       
   323 
   345     public enum Flag {
   324     public enum Flag {
   346 
   325         PUBLIC(Flags.PUBLIC),
   347         PUBLIC("public"),
   326         PRIVATE(Flags.PRIVATE),
   348         PRIVATE("private"),
   327         PROTECTED(Flags.PROTECTED),
   349         PROTECTED("protected"),
   328         STATIC(Flags.STATIC),
   350         STATIC("static"),
   329         FINAL(Flags.FINAL),
   351         FINAL("final"),
   330         SYNCHRONIZED(Flags.SYNCHRONIZED),
   352         SYNCHRONIZED("synchronized"),
   331         VOLATILE(Flags.VOLATILE),
   353         VOLATILE("volatile"),
   332         TRANSIENT(Flags.TRANSIENT),
   354         TRANSIENT("transient"),
   333         NATIVE(Flags.NATIVE),
   355         NATIVE("native"),
   334         INTERFACE(Flags.INTERFACE),
   356         INTERFACE("interface"),
   335         ABSTRACT(Flags.ABSTRACT),
   357         ABSTRACT("abstract"),
   336         DEFAULT(Flags.DEFAULT),
   358         DEFAULT("default"),
   337         STRICTFP(Flags.STRICTFP),
   359         STRICTFP("strictfp"),
   338         BRIDGE(Flags.BRIDGE),
   360         BRIDGE("bridge"),
   339         SYNTHETIC(Flags.SYNTHETIC),
   361         SYNTHETIC("synthetic"),
   340         ANNOTATION(Flags.ANNOTATION),
   362         DEPRECATED("deprecated"),
   341         DEPRECATED(Flags.DEPRECATED),
   363         HASINIT("hasinit"),
   342         HASINIT(Flags.HASINIT),
   364         ENUM("enum"),
   343         BLOCK(Flags.BLOCK),
   365         MANDATED("mandated"),
   344         ENUM(Flags.ENUM),
   366         IPROXY("iproxy"),
   345         MANDATED(Flags.MANDATED),
   367         NOOUTERTHIS("noouterthis"),
   346         IPROXY(Flags.IPROXY),
   368         EXISTS("exists"),
   347         NOOUTERTHIS(Flags.NOOUTERTHIS),
   369         COMPOUND("compound"),
   348         EXISTS(Flags.EXISTS),
   370         CLASS_SEEN("class_seen"),
   349         COMPOUND(Flags.COMPOUND),
   371         SOURCE_SEEN("source_seen"),
   350         CLASS_SEEN(Flags.CLASS_SEEN),
   372         LOCKED("locked"),
   351         SOURCE_SEEN(Flags.SOURCE_SEEN),
   373         UNATTRIBUTED("unattributed"),
   352         LOCKED(Flags.LOCKED),
   374         ANONCONSTR("anonconstr"),
   353         UNATTRIBUTED(Flags.UNATTRIBUTED),
   375         ACYCLIC("acyclic"),
   354         ANONCONSTR(Flags.ANONCONSTR),
   376         PARAMETER("parameter"),
   355         ACYCLIC(Flags.ACYCLIC),
   377         VARARGS("varargs"),
   356         PARAMETER(Flags.PARAMETER),
   378         PACKAGE("package");
   357         VARARGS(Flags.VARARGS),
   379 
   358         ACYCLIC_ANN(Flags.ACYCLIC_ANN),
   380         private final String name;
   359         GENERATEDCONSTR(Flags.GENERATEDCONSTR),
   381 
   360         HYPOTHETICAL(Flags.HYPOTHETICAL),
   382         Flag(String name) {
   361         PROPRIETARY(Flags.PROPRIETARY),
   383             this.name = name;
   362         UNION(Flags.UNION),
   384         }
   363         OVERRIDE_BRIDGE(Flags.OVERRIDE_BRIDGE),
   385 
   364         EFFECTIVELY_FINAL(Flags.EFFECTIVELY_FINAL),
       
   365         CLASH(Flags.CLASH),
       
   366         AUXILIARY(Flags.AUXILIARY),
       
   367         NOT_IN_PROFILE(Flags.NOT_IN_PROFILE),
       
   368         BAD_OVERRIDE(Flags.BAD_OVERRIDE);
       
   369 
       
   370         Flag(long flag) {
       
   371             this.value = flag;
       
   372             this.lowercaseName = name().toLowerCase();
       
   373         }
       
   374 
       
   375         @Override
   386         public String toString() {
   376         public String toString() {
   387             return name;
   377             return lowercaseName;
   388         }
   378         }
   389     }
   379 
       
   380         final long value;
       
   381         final String lowercaseName;
       
   382     }
       
   383 
   390 }
   384 }