Search in sources :

Example 1 with TypeMirror

use of org.eclipse.ceylon.javax.lang.model.type.TypeMirror in project ceylon by eclipse.

the class JNIWriter method jniType.

protected final String jniType(TypeMirror t) {
    TypeElement throwable = elements.getTypeElement("java.lang.Throwable");
    TypeElement jClass = elements.getTypeElement("java.lang.Class");
    TypeElement jString = elements.getTypeElement("java.lang.String");
    Element tclassDoc = types.asElement(t);
    switch(t.getKind()) {
        case ARRAY:
            {
                TypeMirror ct = ((ArrayType) t).getComponentType();
                switch(ct.getKind()) {
                    case BOOLEAN:
                        return "jbooleanArray";
                    case BYTE:
                        return "jbyteArray";
                    case CHAR:
                        return "jcharArray";
                    case SHORT:
                        return "jshortArray";
                    case INT:
                        return "jintArray";
                    case LONG:
                        return "jlongArray";
                    case FLOAT:
                        return "jfloatArray";
                    case DOUBLE:
                        return "jdoubleArray";
                    case ARRAY:
                    case DECLARED:
                        return "jobjectArray";
                    default:
                        throw new Error(ct.toString());
                }
            }
        case VOID:
            return "void";
        case BOOLEAN:
            return "jboolean";
        case BYTE:
            return "jbyte";
        case CHAR:
            return "jchar";
        case SHORT:
            return "jshort";
        case INT:
            return "jint";
        case LONG:
            return "jlong";
        case FLOAT:
            return "jfloat";
        case DOUBLE:
            return "jdouble";
        case DECLARED:
            {
                if (tclassDoc.equals(jString))
                    return "jstring";
                else if (types.isAssignable(t, throwable.asType()))
                    return "jthrowable";
                else if (types.isAssignable(t, jClass.asType()))
                    return "jclass";
                else
                    return "jobject";
            }
    }
    Assert.check(false, "jni unknown type");
    return null;
/* dead code. */
}
Also used : TypeMirror(org.eclipse.ceylon.javax.lang.model.type.TypeMirror) TypeElement(org.eclipse.ceylon.javax.lang.model.element.TypeElement) Element(org.eclipse.ceylon.javax.lang.model.element.Element) TypeElement(org.eclipse.ceylon.javax.lang.model.element.TypeElement) ExecutableElement(org.eclipse.ceylon.javax.lang.model.element.ExecutableElement) VariableElement(org.eclipse.ceylon.javax.lang.model.element.VariableElement)

Example 2 with TypeMirror

use of org.eclipse.ceylon.javax.lang.model.type.TypeMirror in project ceylon by eclipse.

the class Facades method unfacade.

public static TypeMirror[] unfacade(javax.lang.model.type.TypeMirror[] arg) {
    TypeMirror[] ret = new TypeMirror[arg.length];
    int i = 0;
    for (javax.lang.model.type.TypeMirror el : arg) {
        ret[i++] = unfacade(el);
    }
    return ret;
}
Also used : TypeMirror(org.eclipse.ceylon.javax.lang.model.type.TypeMirror) TypeMirror(org.eclipse.ceylon.javax.lang.model.type.TypeMirror)

Example 3 with TypeMirror

use of org.eclipse.ceylon.javax.lang.model.type.TypeMirror in project ceylon by eclipse.

the class JNIWriter method writeMethods.

protected void writeMethods(Writer out, ClassSymbol sym, String cname) throws IOException, TypeSignature.SignatureException {
    List<ExecutableElement> classmethods = ElementFilter.methodsIn(sym.getEnclosedElements());
    for (ExecutableElement md : classmethods) {
        if (md.getModifiers().contains(Modifier.NATIVE)) {
            TypeMirror mtr = types.erasure(md.getReturnType());
            String sig = signature(md);
            TypeSignature newtypesig = new TypeSignature(elements);
            CharSequence methodName = md.getSimpleName();
            boolean longName = false;
            for (ExecutableElement md2 : classmethods) {
                if ((md2 != md) && (methodName.equals(md2.getSimpleName())) && (md2.getModifiers().contains(Modifier.NATIVE)))
                    longName = true;
            }
            println(out, "/*");
            println(out, " * Class:     " + cname);
            println(out, " * Method:    " + mangler.mangle(methodName, Mangle.Type.FIELDSTUB));
            println(out, " * Signature: " + newtypesig.getTypeSignature(sig, mtr));
            println(out, " */");
            println(out, "JNIEXPORT " + jniType(mtr) + " JNICALL " + mangler.mangleMethod(md, sym, (longName) ? Mangle.Type.METHOD_JNI_LONG : Mangle.Type.METHOD_JNI_SHORT));
            print(out, "  (JNIEnv *, ");
            List<? extends VariableElement> paramargs = md.getParameters();
            List<TypeMirror> args = new ArrayList<TypeMirror>();
            for (VariableElement p : paramargs) {
                args.add(types.erasure(p.asType()));
            }
            if (md.getModifiers().contains(Modifier.STATIC))
                print(out, "jclass");
            else
                print(out, "jobject");
            for (TypeMirror arg : args) {
                print(out, ", ");
                print(out, jniType(arg));
            }
            println(out, ");" + lineSep);
        }
    }
}
Also used : TypeMirror(org.eclipse.ceylon.javax.lang.model.type.TypeMirror) ExecutableElement(org.eclipse.ceylon.javax.lang.model.element.ExecutableElement) ArrayList(java.util.ArrayList) VariableElement(org.eclipse.ceylon.javax.lang.model.element.VariableElement)

Aggregations

TypeMirror (org.eclipse.ceylon.javax.lang.model.type.TypeMirror)3 ExecutableElement (org.eclipse.ceylon.javax.lang.model.element.ExecutableElement)2 VariableElement (org.eclipse.ceylon.javax.lang.model.element.VariableElement)2 ArrayList (java.util.ArrayList)1 Element (org.eclipse.ceylon.javax.lang.model.element.Element)1 TypeElement (org.eclipse.ceylon.javax.lang.model.element.TypeElement)1