Example usage for com.google.gwt.dev.jjs.ast JMethod JMethod

List of usage examples for com.google.gwt.dev.jjs.ast JMethod JMethod

Introduction

In this page you can find the example usage for com.google.gwt.dev.jjs.ast JMethod JMethod.

Prototype

public JMethod(SourceInfo info, String name, JDeclaredType enclosingType, JType returnType, boolean isAbstract,
        boolean isStatic, boolean isFinal, AccessModifier access) 

Source Link

Document

These are only supposed to be constructed by JProgram.

Usage

From source file:xapi.dev.inject.MagicMethods.java

License:Open Source License

private static JExpression injectSingleton(TreeLogger logger, JClassLiteral classLiteral, JNode x,
        UnifyAstView ast) throws UnableToCompleteException {
    // check for cached result.

    // inject our provider class
    JDeclaredType type = (JDeclaredType) classLiteral.getRefType();
    if (cachedProviders.containsKey(type))
        return cachedProviders.get(type);
    JExpression expr = injectLazySingleton(logger, classLiteral, x, type, ast);
    String[] names = type.getShortName().split("[$]");

    String answer = classLiteral.getRefType().getName();
    answer = answer.substring(0, answer.lastIndexOf('.') + 1) + "impl.SingletonFor_" + names[names.length - 1];

    JDeclaredType enclosing = ast.searchForTypeBySource(answer);
    JDeclaredType lazyProvider = ast.searchForTypeBySource(SingletonProvider.class.getName());
    for (JMethod method : lazyProvider.getMethods()) {
        if (method.getName().equals("get")) {
            // Create a new method for each singleton to access the desired provider
            SourceInfo info = null;//from w  w w . j  a  v a  2s.c o  m
            JMethod getSingleton = null;
            String targetName = "singleton" + type.getShortName().replaceAll("[$]", "_");
            for (JMethod existingMethod : enclosing.getMethods()) {
                if (existingMethod.getName().equals(existingMethod)) {
                    getSingleton = existingMethod;
                    info = getSingleton.getSourceInfo();
                    logger.log(logLevel(), "Reusing generated method " + getSingleton.toSource());
                    break;
                }
            }
            if (getSingleton == null) {

                info = expr.getSourceInfo().makeChild(SourceOrigin.UNKNOWN);
                JMethodBody body = new JMethodBody(info);
                getSingleton = new JMethod(info, targetName, enclosing, type, false, true, true,
                        AccessModifier.PRIVATE);
                // insert our generated method into the enclosing type; needed for super dev mode
                enclosing.addMethod(getSingleton);

                // freeze this method
                getSingleton.setBody(body);
                getSingleton.freezeParamTypes();
                getSingleton.setSynthetic();
                info.addCorrelation(info.getCorrelator().by(getSingleton));

                JMethodCall call = new JMethodCall(info, expr, method);
                JReturnStatement value = new JReturnStatement(x.getSourceInfo(), call);
                if (enclosing.getClinitTarget() != null) {
                    JDeclaredType clinit = enclosing.getClinitTarget();
                    JMethod clinitMethod = clinit.getMethods().get(0);
                    assert (JProgram.isClinit(clinitMethod));
                    JMethodCall doClinit = new JMethodCall(clinit.getSourceInfo(), null, clinitMethod);
                    body.getBlock().addStmt(doClinit.makeStatement());
                }
                body.getBlock().addStmt(value);
                if (logger.isLoggable(Type.DEBUG)) {
                    logger = logger.branch(Type.DEBUG, "Generated magic singleton: ");
                    for (String str : getSingleton.toSource().split("\n")) {
                        logger.branch(Type.DEBUG, str);
                    }
                }
            }
            expr = new JMethodCall(info, null, getSingleton);
            cachedProviders.put(type, expr);
            return expr;
        }
    }
    throw new InternalCompilerException("Unable to generate synchronous injected class access");
}