import ceylon.language.meta.model {
    AppliedType = Type

"Type alias declaration. While type aliases are erased (substituted for what they alias is a better term) from every 
 declaration that uses them during compile-time, the declaration of the type alias is still visible at run-time."
shared sealed interface AliasDeclaration 
    satisfies NestableDeclaration & GenericDeclaration {

    "The open type that is substituted by this type alias."
    shared formal OpenType extendedType;

    FIXME: this is too shaky WRT member types, we'll figure it out later    
    shared formal AppliedType<Type> apply<Type=Anything>(AppliedType<Anything>* typeArguments);
    shared formal AppliedType<Type> & Member<Container, AppliedType<Type> & Model> memberApply<Container=Nothing, Type=Anything>(AppliedType<Container> containerType, AppliedType<Anything>* typeArguments);