List of usage examples for com.google.gwt.dev.jjs.ast JMethod JMethod
public JMethod(SourceInfo info, String name, JDeclaredType enclosingType, JType returnType, boolean isAbstract, boolean isStatic, boolean isFinal, AccessModifier access)
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"); }