org.mbte.groovypp.compiler.PresentationUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.mbte.groovypp.compiler.PresentationUtil.java

Source

/*
 * Copyright 2009-2011 MBTE Sweden AB.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.mbte.groovypp.compiler;

import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.GenericsType;
import org.codehaus.groovy.ast.MethodNode;
import org.codehaus.groovy.ast.Parameter;
import org.mbte.groovypp.compiler.ClosureClassNode;
import org.mbte.groovypp.compiler.TypeUtil;
import org.objectweb.asm.Opcodes;

public class PresentationUtil {
    public static String getText(ClassNode type) {
        StringBuilder builder = new StringBuilder();
        if (type instanceof ClosureClassNode) {
            builder.append("{ ");
            Parameter[] parameters = ((ClosureClassNode) type).getDoCallMethod().getParameters();
            for (int i = 0; i < parameters.length; i++) {
                if (i > 0)
                    builder.append(", ");
                getText(parameters[i].getType(), builder);
            }
            builder.append(" -> ...}");
        } else {
            if ((type.getModifiers() & Opcodes.ACC_SYNTHETIC) != 0) {
                // This is synthetic closure node, present its super type.
                if (type.getInterfaces().length > 0) {
                    type = type.getInterfaces()[0];
                } else if (type.getSuperClass() != null) {
                    type = type.getSuperClass();
                }
            }
            getText(type, builder);
        }
        return builder.toString();
    }

    private static void getText(ClassNode type, StringBuilder builder) {
        if (type.isArray()) {
            getText(type.getComponentType(), builder);
            builder.append("[]");
            return;
        } else if (type.isGenericsPlaceHolder()) {
            builder.append(type.redirect().getNameWithoutPackage());
            return;
        }

        if (type == TypeUtil.TMAP) {
            builder.append("<map>");
            return;
        } else if (type == TypeUtil.TLIST) {
            builder.append("<list>");
            return;
        } else if (type == TypeUtil.NULL_TYPE) {
            builder.append("Object");
            return;
        }

        builder.append(type.getNameWithoutPackage());
        GenericsType[] generics = type.getGenericsTypes();
        if (generics != null && generics.length > 0) {
            builder.append("<");
            for (int i = 0; i < generics.length; i++) {
                if (i > 0)
                    builder.append(",");
                if (generics[i].isWildcard()) {
                    if (TypeUtil.isExtends(generics[i])) {
                        builder.append("? extends ");
                    } else if (TypeUtil.isSuper(generics[i])) {
                        builder.append("? super ");
                    } else {
                        builder.append("?");
                        continue;
                    }
                }
                getText(generics[i].getType(), builder);
            }
            builder.append(">");
        }
    }

    public static String getText(MethodNode node) {
        StringBuilder sb = new StringBuilder();
        sb.append(PresentationUtil.getText(node.getDeclaringClass()));
        sb.append(".");
        sb.append(node.getName());
        sb.append("(");
        Parameter[] parameters = node.getParameters();
        for (int i = 0; i != parameters.length; i++) {
            if (i > 0)
                sb.append(", ");
            sb.append(getText(parameters[i].getType()));
        }
        sb.append(")");
        return sb.toString();
    }
}