org.eclipse.jdt.core.Flags Maven / Gradle / Ivy
/*******************************************************************************
* Copyright (c) 2000, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* IBM Corporation - added constant AccDefault
* IBM Corporation - added constants AccBridge and AccVarargs for J2SE 1.5
*******************************************************************************/
package org.eclipse.jdt.core;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
/**
* Utility class for decoding modifier flags in Java elements.
*
* This class provides static methods only.
*
*
* Note that the numeric values of these flags match the ones for class files
* as described in the Java Virtual Machine Specification (except for
* {@link #AccDeprecated}, {@link #AccAnnotationDefault}, and {@link #AccDefaultMethod}).
*
*
* The AST class Modifier
provides
* similar functionality as this class, only in the
* org.eclipse.jdt.core.dom
package.
*
*
* @see IMember#getFlags()
* @noinstantiate This class is not intended to be instantiated by clients.
*/
public final class Flags {
/**
* Constant representing the absence of any flag.
* @since 3.0
*/
public static final int AccDefault = ClassFileConstants.AccDefault;
/**
* Public access flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccPublic = ClassFileConstants.AccPublic;
/**
* Private access flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccPrivate = ClassFileConstants.AccPrivate;
/**
* Protected access flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccProtected = ClassFileConstants.AccProtected;
/**
* Static access flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccStatic = ClassFileConstants.AccStatic;
/**
* Final access flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccFinal = ClassFileConstants.AccFinal;
/**
* Synchronized access flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccSynchronized = ClassFileConstants.AccSynchronized;
/**
* Volatile property flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccVolatile = ClassFileConstants.AccVolatile;
/**
* Transient property flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccTransient = ClassFileConstants.AccTransient;
/**
* Native property flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccNative = ClassFileConstants.AccNative;
/**
* Interface property flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccInterface = ClassFileConstants.AccInterface;
/**
* Abstract property flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccAbstract = ClassFileConstants.AccAbstract;
/**
* Strictfp property flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccStrictfp = ClassFileConstants.AccStrictfp;
/**
* Super property flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccSuper = ClassFileConstants.AccSuper;
/**
* Synthetic property flag. See The Java Virtual Machine Specification for more details.
* @since 2.0
*/
public static final int AccSynthetic = ClassFileConstants.AccSynthetic;
/**
* Deprecated property flag.
*
* Note that this flag's value is internal and is not defined in the
* Virtual Machine specification.
*
* @since 2.0
*/
public static final int AccDeprecated = ClassFileConstants.AccDeprecated;
/**
* Bridge method property flag (added in J2SE 1.5). Used to flag a compiler-generated
* bridge methods.
* See The Java Virtual Machine Specification for more details.
* @since 3.0
*/
public static final int AccBridge = ClassFileConstants.AccBridge;
/**
* Varargs method property flag (added in J2SE 1.5).
* Used to flag variable arity method declarations.
* See The Java Virtual Machine Specification for more details.
* @since 3.0
*/
public static final int AccVarargs = ClassFileConstants.AccVarargs;
/**
* Enum property flag (added in J2SE 1.5).
* See The Java Virtual Machine Specification for more details.
* @since 3.0
*/
public static final int AccEnum = ClassFileConstants.AccEnum;
/**
* Annotation property flag (added in J2SE 1.5).
* See The Java Virtual Machine Specification for more details.
* @since 3.0
*/
public static final int AccAnnotation = ClassFileConstants.AccAnnotation;
/**
* Default method property flag.
*
* Note that this flag's value is internal and is not defined in the
* Virtual Machine specification.
*
* @since 3.10
*/
public static final int AccDefaultMethod = ExtraCompilerModifiers.AccDefaultMethod;
/**
* Annotation method default property flag.
* Used to flag annotation type methods that declare a default value.
*
* Note that this flag's value is internal and is not defined in the
* Virtual Machine specification.
*
* @since 3.10
*/
public static final int AccAnnotationDefault = ClassFileConstants.AccAnnotationDefault;
/**
* Module declaration property flag.
* Used to flag a compilation unit or a class file that contains a module declaration.
*
* @since 3.14
*/
public static final int AccModule = ClassFileConstants.AccModule;
/**
* Record property flag.
*
* Note that this flag's value is internal and is not defined in the
* Virtual Machine specification.
*
* @since 3.26
*/
public static final int AccRecord = ExtraCompilerModifiers.AccRecord;
/**
* Sealed property flag.
*
* Note that this flag's value is internal and is not defined in the
* Virtual Machine specification.
*
* @since 3.24
*/
public static final int AccSealed = ExtraCompilerModifiers.AccSealed;
/**
* Non-sealed property flag.
*
* Note that this flag's value is internal and is not defined in the
* Virtual Machine specification.
*
* @since 3.24
*/
public static final int AccNonSealed = ExtraCompilerModifiers.AccNonSealed;
/**
* Not instantiable.
*/
private Flags() {
// Not instantiable
}
/**
* Returns whether the given integer includes the abstract
modifier.
*
* @param flags the flags
* @return true
if the abstract
modifier is included
*/
public static boolean isAbstract(int flags) {
return (flags & AccAbstract) != 0;
}
/**
* Returns whether the given integer includes the indication that the
* element is deprecated (@deprecated
tag in Javadoc comment).
*
* @param flags the flags
* @return true
if the element is marked as deprecated
*/
public static boolean isDeprecated(int flags) {
return (flags & AccDeprecated) != 0;
}
/**
* Returns whether the given integer includes the final
modifier.
*
* @param flags the flags
* @return true
if the final
modifier is included
*/
public static boolean isFinal(int flags) {
return (flags & AccFinal) != 0;
}
/**
* Returns whether the given integer includes the interface
modifier.
*
* @param flags the flags
* @return true
if the interface
modifier is included
* @since 2.0
*/
public static boolean isInterface(int flags) {
return (flags & AccInterface) != 0;
}
/**
* Returns whether the given integer includes the native
modifier.
*
* @param flags the flags
* @return true
if the native
modifier is included
*/
public static boolean isNative(int flags) {
return (flags & AccNative) != 0;
}
/**
* Returns whether the given integer does not include one of the
* public
, private
, or protected
flags.
*
* @param flags the flags
* @return true
if no visibility flag is set
* @since 3.2
*/
public static boolean isPackageDefault(int flags) {
return (flags & (AccPublic | AccPrivate | AccProtected)) == 0;
}
/**
* Returns whether the given integer includes the private
modifier.
*
* @param flags the flags
* @return true
if the private
modifier is included
*/
public static boolean isPrivate(int flags) {
return (flags & AccPrivate) != 0;
}
/**
* Returns whether the given integer includes the protected
modifier.
*
* @param flags the flags
* @return true
if the protected
modifier is included
*/
public static boolean isProtected(int flags) {
return (flags & AccProtected) != 0;
}
/**
* Returns whether the given integer includes the public
modifier.
*
* @param flags the flags
* @return true
if the public
modifier is included
*/
public static boolean isPublic(int flags) {
return (flags & AccPublic) != 0;
}
/**
* Returns whether the given integer includes the static
modifier.
*
* @param flags the flags
* @return true
if the static
modifier is included
*/
public static boolean isStatic(int flags) {
return (flags & AccStatic) != 0;
}
/**
* Returns whether the given integer includes the super
modifier.
*
* @param flags the flags
* @return true
if the super
modifier is included
* @since 3.2
*/
public static boolean isSuper(int flags) {
return (flags & AccSuper) != 0;
}
/**
* Returns whether the given integer includes the strictfp
modifier.
*
* @param flags the flags
* @return true
if the strictfp
modifier is included
*/
public static boolean isStrictfp(int flags) {
return (flags & AccStrictfp) != 0;
}
/**
* Returns whether the given integer includes the synchronized
modifier.
*
* @param flags the flags
* @return true
if the synchronized
modifier is included
*/
public static boolean isSynchronized(int flags) {
return (flags & AccSynchronized) != 0;
}
/**
* Returns whether the given integer includes the indication that the
* element is synthetic.
*
* @param flags the flags
* @return true
if the element is marked synthetic
*/
public static boolean isSynthetic(int flags) {
return (flags & AccSynthetic) != 0;
}
/**
* Returns whether the given integer includes the transient
modifier.
*
* @param flags the flags
* @return true
if the transient
modifier is included
*/
public static boolean isTransient(int flags) {
return (flags & AccTransient) != 0;
}
/**
* Returns whether the given integer includes the volatile
modifier.
*
* @param flags the flags
* @return true
if the volatile
modifier is included
*/
public static boolean isVolatile(int flags) {
return (flags & AccVolatile) != 0;
}
/**
* Returns whether the given integer has the AccBridge
* bit set.
*
* @param flags the flags
* @return true
if the AccBridge
flag is included
* @see #AccBridge
* @since 3.0
*/
public static boolean isBridge(int flags) {
return (flags & AccBridge) != 0;
}
/**
* Returns whether the given integer has the AccVarargs
* bit set.
*
* @param flags the flags
* @return true
if the AccVarargs
flag is included
* @see #AccVarargs
* @since 3.0
*/
public static boolean isVarargs(int flags) {
return (flags & AccVarargs) != 0;
}
/**
* Returns whether the given integer has the AccEnum
* bit set.
*
* @param flags the flags
* @return true
if the AccEnum
flag is included
* @see #AccEnum
* @since 3.0
*/
public static boolean isEnum(int flags) {
return (flags & AccEnum) != 0;
}
/**
* Returns whether the given integer has the AccRecord
* bit set.
*
* @param flags the flags
* @return true
if the AccRecord
flag is included
* @see #AccRecord
* @since 3.26
*/
public static boolean isRecord(int flags) {
return (flags & AccRecord) != 0;
}
/**
* Returns whether the given integer has the AccSealed
* bit set.
*
* @param flags the flags
* @return true
if the AccSealed
flag is included
* @see #AccSealed
* @since 3.28
* */
public static boolean isSealed(int flags) {
return (flags & AccSealed) != 0;
}
/**
* Returns whether the given integer has the AccNonSealed
* bit set.
*
* @param flags the flags
* @return true
if the AccNonSealed
flag is included
* @see #AccNonSealed
* @since 3.28
*/
public static boolean isNonSealed(int flags) {
return (flags & AccNonSealed) != 0;
}
/**
* Returns whether the given integer has the AccAnnotation
* bit set.
*
* @param flags the flags
* @return true
if the AccAnnotation
flag is included
* @see #AccAnnotation
* @since 3.0
*/
public static boolean isAnnotation(int flags) {
return (flags & AccAnnotation) != 0;
}
/**
* Returns whether the given integer has the AccDefaultMethod
* bit set. Note that this flag represents the usage of the 'default' keyword
* on a method and should not be confused with the 'package' access visibility (which used to be called 'default access').
*
* @return true
if the AccDefaultMethod
flag is included
* @see #AccDefaultMethod
* @since 3.10
*/
public static boolean isDefaultMethod(int flags) {
return (flags & AccDefaultMethod) != 0;
}
/**
* Returns whether the given integer has the AccAnnnotationDefault
* bit set.
*
* @return true
if the AccAnnotationDefault
flag is included
* @see #AccAnnotationDefault
* @since 3.10
*/
public static boolean isAnnnotationDefault(int flags) {
return (flags & AccAnnotationDefault) != 0;
}
/**
* Returns whether the given integer has the AccModule
* bit set.
*
* @return true
if the AccModule
flag is included
* @see #AccModule
* @since 3.14
*/
public static boolean isModule(int flags) {
return (flags & AccModule) != 0;
}
/**
* Returns a standard string describing the given modifier flags.
* Only modifier flags are included in the output; deprecated,
* synthetic, bridge, etc. flags are ignored.
*
* The flags are output in the following order:
*
public protected private
* abstract default static final synchronized native strictfp transient volatile
*
* This order is consistent with the recommendations in JLS8 ("*Modifier:" rules in chapters 8 and 9).
*
*
* Note that the flags of a method can include the AccVarargs flag that has no standard description. Since the AccVarargs flag has the same value as
* the AccTransient flag (valid for fields only), attempting to get the description of method modifiers with the AccVarargs flag set would result in an
* unexpected description. Clients should ensure that the AccVarargs is not included in the flags of a method as follows:
*
* IMethod method = ...
* int flags = method.getFlags() & ~Flags.AccVarargs;
* return Flags.toString(flags);
*
*
* Examples results:
*
* "public static final"
* "private native"
*
*
* @param flags the flags
* @return the standard string representation of the given flags
*/
public static String toString(int flags) {
StringBuilder sb = new StringBuilder();
if (isPublic(flags))
sb.append("public "); //$NON-NLS-1$
if (isProtected(flags))
sb.append("protected "); //$NON-NLS-1$
if (isPrivate(flags))
sb.append("private "); //$NON-NLS-1$
if (isAbstract(flags))
sb.append("abstract "); //$NON-NLS-1$
if (isDefaultMethod(flags))
sb.append("default "); //$NON-NLS-1$
if (isStatic(flags))
sb.append("static "); //$NON-NLS-1$
if (isFinal(flags))
sb.append("final "); //$NON-NLS-1$
if (isSynchronized(flags))
sb.append("synchronized "); //$NON-NLS-1$
if (isNative(flags))
sb.append("native "); //$NON-NLS-1$
if (isStrictfp(flags))
sb.append("strictfp "); //$NON-NLS-1$
if (isTransient(flags))
sb.append("transient "); //$NON-NLS-1$
if (isVolatile(flags))
sb.append("volatile "); //$NON-NLS-1$
if (isSealed(flags))
sb.append("sealed "); //$NON-NLS-1$
if (isNonSealed(flags))
sb.append("non-sealed "); //$NON-NLS-1$
int len = sb.length();
if (len == 0)
return ""; //$NON-NLS-1$
sb.setLength(len - 1);
return sb.toString();
}
}