APIdia Launch Partner
Top Description Inners Fields Constructors Methods
com.sun.tools.javac.util

public Class Context

extends Object
Class Inheritance
Known Direct Subclasses
com.sun.tools.javac.api.JavacTaskPool.ReusableContext
Imports
java.util.*

Support for an abstract context, modelled loosely after ThreadLocal but using a user-provided context instead of the current thread.

Within the compiler, a single Context is used for each invocation of the compiler. The context is then used to ensure a single copy of each compiler phase exists per compiler invocation.

The context can be used to assist in extending the compiler by extending its components. To do that, the extended component must be registered before the base component. We break initialization cycles by (1) registering a factory for the component rather than the component itself, and (2) a convention for a pattern of usage in which each base component registers itself by calling an instance method that is overridden in extended components. A base phase supporting extension would look something like this:

public class Phase {
    protected static final Context.Key<Phase> phaseKey =
        new Context.Key<Phase>();

    public static Phase instance(Context context) {
        Phase instance = context.get(phaseKey);
        if (instance == null)
            // the phase has not been overridden
            instance = new Phase(context);
        return instance;
    }

    protected Phase(Context context) {
        context.put(phaseKey, this);
        // other initialization follows...
    }
}

In the compiler, we simply use Phase.instance(context) to get the reference to the phase. But in extensions of the compiler, we must register extensions of the phases to replace the base phase, and this must be done before any reference to the phase is accessed using Phase.instance(). An extended phase might be declared thus:

public class NewPhase extends Phase {
    protected NewPhase(Context context) {
        super(context);
    }
    public static void preRegister(final Context context) {
        context.put(phaseKey, new Context.Factory<Phase>() {
            public Phase make() {
                return new NewPhase(context);
            }
        });
    }
}

And is registered early in the extended compiler like this

    NewPhase.preRegister(context);

This is NOT part of any supported API. If you write code that depends on this, you do so at your own risk. This code and its internal interfaces are subject to change or deletion without notice.

Nested and Inner Type Summary

Modifier and TypeClass and Description
public static interface
Context.Factory<T>

The client can register a factory for lazy creation of the instance.

public static class
Context.Key<T>

The client creates an instance of this class for each key.

Field Summary

Modifier and TypeField and Description
private final Map<Context.Key<?>, Context.Factory<?>>
ft

The table of preregistered factories.

protected final Map<Context.Key<?>, Object>
ht

The underlying map storing the data.

private final Map<Class<?>, Context.Key<?>>

Constructor Summary

AccessConstructor and Description
public

Method Summary

Modifier and TypeMethod and Description
private static void
checkState(Map<?, ?> t)

public void
dump()

public <T> T
get(Context.Key<T> key)

Get the value for the key in this context.

public <T> T
get(Class<T> clazz)

protected <T> Context.Key<T>
key(Class<T> clss)

public <T> void
put(Context.Key<T> key, Context.Factory<T> fac)

Set the factory for the key in this context.

public <T> void
put(Context.Key<T> key, T data)

Set the value for the key in this context.

public <T> void
put(Class<T> clazz, T data)

public <T> void
put(Class<T> clazz, Context.Factory<T> fac)

private static <T> T
uncheckedCast(Object o)

Todo

This method should be removed and Context should be made type safe.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

ftback to summary
private final Map<Context.Key<?>, Context.Factory<?>> ft

The table of preregistered factories.

htback to summary
protected final Map<Context.Key<?>, Object> ht

The underlying map storing the data. We maintain the invariant that this table contains only mappings of the form Key<T> -> T or Key<T> -> Factory<T>

ktback to summary
private final Map<Class<?>, Context.Key<?>> kt

Constructor Detail

Contextback to summary
public Context()

Method Detail

checkStateback to summary
private static void checkState(Map<?, ?> t)
dumpback to summary
public void dump()
getback to summary
public <T> T get(Context.Key<T> key)

Get the value for the key in this context.

getback to summary
public <T> T get(Class<T> clazz)
keyback to summary
protected <T> Context.Key<T> key(Class<T> clss)
putback to summary
public <T> void put(Context.Key<T> key, Context.Factory<T> fac)

Set the factory for the key in this context.

putback to summary
public <T> void put(Context.Key<T> key, T data)

Set the value for the key in this context.

putback to summary
public <T> void put(Class<T> clazz, T data)
putback to summary
public <T> void put(Class<T> clazz, Context.Factory<T> fac)
uncheckedCastback to summary
private static <T> T uncheckedCast(Object o)

Todo

This method should be removed and Context should be made type safe. This can be accomplished by using class literals as type tokens.

Annotations
@SuppressWarnings:unchecked
com.sun.tools.javac.util back to summary

public Interface Context.Factory<T>


The client can register a factory for lazy creation of the instance.

Method Summary

Modifier and TypeMethod and Description
public T

Method Detail

makeback to summary
public T make(Context c)
com.sun.tools.javac.util back to summary

public Class Context.Key<T>

extends Object
Class Inheritance

The client creates an instance of this class for each key.

Constructor Summary

AccessConstructor and Description
public
Key()

Method Summary

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Constructor Detail

Keyback to summary
public Key()