# Context Information Database
#
# This database is used to provide additional context information to dex plugins regarding:
# - methods: provide context access (= context-sensitivity and side-effects information)
# - fields: provide effective finality

# Currently, this database supports the addition of methods' context accesses only
# (supported here as well as and programmatically)
# The specification of effective finality information for fields must be done programmatically
# (see IDexUnit.getContextInfoProvider)

# Notes:
# - One entry per line
# - Entry format: 'signature [=CAT]' (CAT is the ContextAccessType)
# - CAT is optional; if unspecified, the assumed value is NONE (i.e., context-insensitive, side-effect-free)
# - Other valid CATs include: READ_ONLY, WRITE_ONLY, READ_WRITE, UNKNOWN (same as READ_WRITE)
# - Methods and classes should be in canonical (jvm) form: e.g. 'La/b/Foo;', 'La/b/Foo;->bar([B)V'
# - Line comments are allowed and must start with pound
# - When classes are specified, all methods but the following methods are included: static initializer,
#   all constructors, Object.clone, Object.notify, Object.notifyAll, Object.wait (all overloads)
# - Class wildcards are allowed, used to match all methods with a given full descriptor (name, parameter
#   and return types), regardless of their class type

# SAFE
# immutable final objects or utility classes

Ljava/lang/String;
Ljava/lang/Boolean;
Ljava/lang/Byte;
Ljava/lang/Character;
Ljava/lang/Short;
Ljava/lang/Integer;
Ljava/lang/Long;
Ljava/lang/Float;
Ljava/lang/Double;
Ljava/lang/Void;
Ljava/lang/Math;

# UNSAFE
# everything below is theoretically unsafe

Ljava/lang/Enum;

# for all objects
*->hashCode()I
*->toString()Ljava/lang/String;
# collections, maps, etc.
*->size()I
*->isEmpty()Z
# exceptions
Ljava/lang/Throwable;-><init>()V
Ljava/lang/Exception;-><init>()V
Ljava/lang/RuntimeException;-><init>()V
Ljava/lang/IllegalArgumentException;-><init>()V
Ljava/lang/NullPointerException;-><init>()V
*->getCause()Ljava/lang/Throwable;
*->getMessage()Ljava/lang/String;
*->getLocalizedMessage()Ljava/lang/String;
# enums
*->name()Ljava/lang/String;
*->ordinal()I
# buffers
*->capacity()I
*->limit()I
*->position()I
*->remaining()I

# Class
#Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
#Ljava/lang/Class;->forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
Ljava/lang/Class;->toString()Ljava/lang/String;
Ljava/lang/Class;->getProtectionDomain()Ljava/security/ProtectionDomain;
Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z
Ljava/lang/Class;->isInstance(Ljava/lang/Object;)Z
Ljava/lang/Class;->getModifiers()I
Ljava/lang/Class;->isInterface()Z
Ljava/lang/Class;->isArray()Z
Ljava/lang/Class;->isPrimitive()Z
Ljava/lang/Class;->getSuperclass()Ljava/lang/Class;
Ljava/lang/Class;->getComponentType()Ljava/lang/Class;
Ljava/lang/Class;->getName()Ljava/lang/String;
#Ljava/lang/Class;->asSubclass(Ljava/lang/Class;)Ljava/lang/Class;
#Ljava/lang/Class;->cast(Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/Class;->desiredAssertionStatus()Z
Ljava/lang/Class;->getAnnotatedInterfaces()[Ljava/lang/reflect/AnnotatedType;
Ljava/lang/Class;->getAnnotatedSuperclass()Ljava/lang/reflect/AnnotatedType;
#Ljava/lang/Class;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
Ljava/lang/Class;->getAnnotations()[Ljava/lang/annotation/Annotation;
#Ljava/lang/Class;->getAnnotationsByType(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
Ljava/lang/Class;->getCanonicalName()Ljava/lang/String;
Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;
Ljava/lang/Class;->getClasses()[Ljava/lang/Class;
#Ljava/lang/Class;->getConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
Ljava/lang/Class;->getConstructors()[Ljava/lang/reflect/Constructor;
#Ljava/lang/Class;->getDeclaredAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
Ljava/lang/Class;->getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;
#Ljava/lang/Class;->getDeclaredAnnotationsByType(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
Ljava/lang/Class;->getDeclaredClasses()[Ljava/lang/Class;
#Ljava/lang/Class;->getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
Ljava/lang/Class;->getDeclaredConstructors()[Ljava/lang/reflect/Constructor;
#Ljava/lang/Class;->getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;
Ljava/lang/Class;->getDeclaredFields()[Ljava/lang/reflect/Field;
#Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
Ljava/lang/Class;->getDeclaredMethods()[Ljava/lang/reflect/Method;
Ljava/lang/Class;->getDeclaringClass()Ljava/lang/Class;
Ljava/lang/Class;->getEnclosingClass()Ljava/lang/Class;
Ljava/lang/Class;->getEnclosingConstructor()Ljava/lang/reflect/Constructor;
Ljava/lang/Class;->getEnclosingMethod()Ljava/lang/reflect/Method;
Ljava/lang/Class;->getEnumConstants()[Ljava/lang/Object;
#Ljava/lang/Class;->getField(Ljava/lang/String;)Ljava/lang/reflect/Field;
Ljava/lang/Class;->getFields()[Ljava/lang/reflect/Field;
Ljava/lang/Class;->getGenericInterfaces()[Ljava/lang/reflect/Type;
Ljava/lang/Class;->getGenericSuperclass()Ljava/lang/reflect/Type;
Ljava/lang/Class;->getInterfaces()[Ljava/lang/Class;
#Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
Ljava/lang/Class;->getMethods()[Ljava/lang/reflect/Method;
Ljava/lang/Class;->getPackage()Ljava/lang/Package;
#Ljava/lang/Class;->getResource(Ljava/lang/String;)Ljava/net/URL;
#Ljava/lang/Class;->getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;
Ljava/lang/Class;->getSigners()[Ljava/lang/Object;
Ljava/lang/Class;->getSimpleName()Ljava/lang/String;
Ljava/lang/Class;->getTypeName()Ljava/lang/String;
Ljava/lang/Class;->getTypeParameters()[Ljava/lang/reflect/TypeVariable;
Ljava/lang/Class;->isAnnotation()Z
Ljava/lang/Class;->isAnnotationPresent(Ljava/lang/Class;)Z
Ljava/lang/Class;->isAnonymousClass()Z
Ljava/lang/Class;->isEnum()Z
Ljava/lang/Class;->isLocalClass()Z
Ljava/lang/Class;->isMemberClass()Z
Ljava/lang/Class;->isSynthetic()Z
#Ljava/lang/Class;->newInstance()Ljava/lang/Object;
Ljava/lang/Class;->toGenericString()Ljava/lang/String;
