MemberMeta.ceylon

import ceylon.ast.core {
    BaseType,
    LIdentifier,
    MemberMeta,
    MemberNameWithTypeArguments,
    OptionalType,
    PrimaryType,
    TypeArgument,
    TypeArguments,
    TypeNameWithTypeArguments,
    UIdentifier
}
import ceylon.ast.redhat {
    RedHatTransformer,
    memberMetaToCeylon,
    compileMemberMeta
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JMemberLiteral=MemberLiteral
    }
}

shared object memberMeta satisfies ConcreteTest<MemberMeta,JMemberLiteral> {
    
    String->MemberMeta construct(String->PrimaryType qualifier, <String->LIdentifier>|<String->MemberNameWithTypeArguments> nameAndArgs) {
        MemberNameWithTypeArguments actualNameAndArgs;
        switch (nameAndArgsItem = nameAndArgs.item)
        case (is LIdentifier) { actualNameAndArgs = MemberNameWithTypeArguments(nameAndArgsItem); }
        case (is MemberNameWithTypeArguments) { actualNameAndArgs = nameAndArgsItem; }
        return "` ``qualifier.key``.``nameAndArgs.key`` `"->MemberMeta(qualifier.item, actualNameAndArgs);
    }
    
    shared String->MemberMeta personSayMemberMeta = construct(baseType.personObjectType, identifier.sayLIdentifier);
    shared String->MemberMeta systemMillisecondsMemberMeta = construct(baseType.systemObjectType, identifier.millisecondsLIdentifier);
    shared String->MemberMeta iterableOfStringCollectOfIntegerOptionalMemberMeta
            = construct(baseType.iterableOfStringType, "collect<Integer?>"->MemberNameWithTypeArguments(LIdentifier("collect"), TypeArguments([TypeArgument(OptionalType(BaseType(TypeNameWithTypeArguments(UIdentifier("Integer")))))])));
    shared String->MemberMeta packageObjectEqualsMeta = construct(baseType.objectPackageQualifiedType, identifier.equalsLIdentifier);
    
    compile = compileMemberMeta;
    fromCeylon = RedHatTransformer.transformMemberMeta;
    toCeylon = memberMetaToCeylon;
    codes = [personSayMemberMeta, systemMillisecondsMemberMeta, iterableOfStringCollectOfIntegerOptionalMemberMeta, packageObjectEqualsMeta];
}