public void replaceSuperCall(JMethod method, JBlock replacement) { String superCallStart = "super." + method.name() + "("; JBlock oldBody = removeBody(method); JBlock newBody = method.body(); for (Object content : oldBody.getContents()) { StringWriter writer = new StringWriter(); JFormatter formatter = new JFormatter(writer); IJStatement statement = (IJStatement) content; statement.state(formatter); String statementString = writer.getBuffer().toString(); if (statementString.startsWith(superCallStart)) { newBody.add(replacement); } else { newBody.add(statement); } } }
@Override public void process(Element element, EFragmentHolder holder) throws Exception { ExecutableElement executableElement = (ExecutableElement) element; JMethod delegatingMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); JBlock previousMethodBody = codeModelHelper.removeBody(delegatingMethod); IgnoreWhen ignoreWhen = element.getAnnotation(IgnoreWhen.class); JBlock methodBody = delegatingMethod.body(); JConditional conditional = null; switch (ignoreWhen.value()) { case VIEW_DESTROYED: conditional = methodBody._if(holder.getViewDestroyedField().not()); break; case DETACHED: conditional = methodBody._if(invoke(holder.getGeneratedClass().staticRef("this"), "getActivity").ne(_null())); break; } conditional._then().add(previousMethodBody); } }
@Override public void process(Element element, EComponentHolder holder) throws Exception { ExecutableElement executableElement = (ExecutableElement) element; JMethod delegatingMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); JBlock previousBody = codeModelHelper.removeBody(delegatingMethod); JDefinedClass anonymousRunnableClass = codeModelHelper.createDelegatingAnonymousRunnableClass(previousBody); UiThread annotation = element.getAnnotation(UiThread.class); long delay = annotation.delay(); UiThread.Propagation propagation = annotation.propagation(); if (delay == 0 && propagation == UiThread.Propagation.REUSE) { // Put in the check for the UI thread. addUIThreadCheck(delegatingMethod, previousBody, holder); } delegatingMethod.body().add(getJClass(UiThreadExecutor.class).staticInvoke(METHOD_RUN_TASK) // .arg(annotation.id()) // .arg(_new(anonymousRunnableClass)) // .arg(lit(delay))); }
codeModelHelper.removeBody(method);
JBlock previousMethodBody = codeModelHelper.removeBody(delegatingMethod);
@Override public void process(Element element, EComponentHolder holder) { ExecutableElement executableElement = (ExecutableElement) element; WakeLock annotation = executableElement.getAnnotation(WakeLock.class); String tag = extractTag(executableElement); Level level = annotation.level(); Flag[] flags = annotation.flags(); JMethod method = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); JBlock previousMethodBody = codeModelHelper.removeBody(method); JBlock methodBody = method.body(); IJExpression levelAndFlags = getClasses().POWER_MANAGER.staticRef(level.name()); if (flags.length > 0) { for (Flag flag : flags) { levelAndFlags = levelAndFlags.bor(getClasses().POWER_MANAGER.staticRef(flag.name())); } } JInvocation newWakeLock = holder.getPowerManagerRef().invoke("newWakeLock").arg(levelAndFlags).arg(JExpr.lit(tag)); JVar wakeLock = methodBody.decl(getClasses().WAKE_LOCK, "wakeLock", JExpr._null()); JTryBlock tryBlock = methodBody._try(); tryBlock.body().assign(wakeLock, newWakeLock); tryBlock.body().add(wakeLock.invoke("acquire")); tryBlock.body().add(previousMethodBody); JBlock finallyBlock = tryBlock._finally(); JConditional ifStatement = finallyBlock._if(wakeLock.ne(JExpr._null())); ifStatement._then().add(wakeLock.invoke("release")); }
JBlock previousMethodBody = codeModelHelper.removeBody(method);
public void replaceSuperCall(JMethod method, JBlock replacement) { String superCallStart = "super." + method.name() + "("; JBlock oldBody = removeBody(method); JBlock newBody = method.body(); for (Object content : oldBody.getContents()) { StringWriter writer = new StringWriter(); JFormatter formatter = new JFormatter(writer); IJStatement statement = (IJStatement) content; statement.state(formatter); String statementString = writer.getBuffer().toString(); if (statementString.startsWith(superCallStart)) { newBody.add(replacement); } else { newBody.add(statement); } } }
@Override public void process(Element element, EFragmentHolder holder) throws Exception { ExecutableElement executableElement = (ExecutableElement) element; JMethod delegatingMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); JBlock previousMethodBody = codeModelHelper.removeBody(delegatingMethod); IgnoreWhen ignoreWhen = element.getAnnotation(IgnoreWhen.class); JBlock methodBody = delegatingMethod.body(); JConditional conditional = null; switch (ignoreWhen.value()) { case VIEW_DESTROYED: conditional = methodBody._if(holder.getViewDestroyedField().not()); break; case DETACHED: conditional = methodBody._if(invoke(holder.getGeneratedClass().staticRef("this"), "getActivity").ne(_null())); break; } conditional._then().add(previousMethodBody); } }
@Override public void process(Element element, EComponentHolder holder) throws Exception { ExecutableElement executableElement = (ExecutableElement) element; JMethod delegatingMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); JBlock previousBody = codeModelHelper.removeBody(delegatingMethod); JDefinedClass anonymousRunnableClass = codeModelHelper.createDelegatingAnonymousRunnableClass(previousBody); UiThread annotation = element.getAnnotation(UiThread.class); long delay = annotation.delay(); UiThread.Propagation propagation = annotation.propagation(); if (delay == 0 && propagation == UiThread.Propagation.REUSE) { // Put in the check for the UI thread. addUIThreadCheck(delegatingMethod, previousBody, holder); } delegatingMethod.body().add(getJClass(UiThreadExecutor.class).staticInvoke(METHOD_RUN_TASK) // .arg(annotation.id()) // .arg(_new(anonymousRunnableClass)) // .arg(lit(delay))); }
private void setPermissionMethods(Element element, EComponentHolder holder, AbstractJClass delegateClass, JFieldVar dispatcherCalledField) { ExecutableElement executableElement = (ExecutableElement) element; JMethod overrideMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); JBlock previousMethodBody = codeModelHelper.removeBody(overrideMethod); JBlock overrideMethodBody = overrideMethod.body(); JConditional conditional = overrideMethodBody._if(dispatcherCalledField.not()); JBlock thenBlock = conditional._then(); thenBlock.assign(dispatcherCalledField, JExpr.TRUE); String delegateMethodName = element.getSimpleName().toString() + "WithPermissionCheck"; JInvocation delegateCall = delegateClass.staticInvoke(delegateMethodName) .arg(JExpr._this()); overrideMethod.params().forEach(delegateCall::arg); if (overrideMethod.hasVarArgs()) { JVar jVar = overrideMethod.varParam(); if (jVar != null) { delegateCall.arg(jVar); } } if (!removeRuntimePermissionsAnnotation(holder.getGeneratedClass())) { codeModelHelper.copyAnnotation(overrideMethod, findAnnotation(element)); } thenBlock.add(delegateCall); JBlock elseBlock = conditional._else(); elseBlock.assign(dispatcherCalledField, JExpr.FALSE); elseBlock.add(previousMethodBody); }
codeModelHelper.removeBody(method);
JBlock previousMethodBody = codeModelHelper.removeBody(delegatingMethod);
@Override public void process(Element element, EComponentHolder holder) { ExecutableElement executableElement = (ExecutableElement) element; WakeLock annotation = executableElement.getAnnotation(WakeLock.class); String tag = extractTag(executableElement); Level level = annotation.level(); Flag[] flags = annotation.flags(); JMethod method = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); JBlock previousMethodBody = codeModelHelper.removeBody(method); JBlock methodBody = method.body(); IJExpression levelAndFlags = getClasses().POWER_MANAGER.staticRef(level.name()); if (flags.length > 0) { for (Flag flag : flags) { levelAndFlags = levelAndFlags.bor(getClasses().POWER_MANAGER.staticRef(flag.name())); } } JInvocation newWakeLock = holder.getPowerManagerRef().invoke("newWakeLock").arg(levelAndFlags).arg(JExpr.lit(tag)); JVar wakeLock = methodBody.decl(getClasses().WAKE_LOCK, "wakeLock", JExpr._null()); JTryBlock tryBlock = methodBody._try(); tryBlock.body().assign(wakeLock, newWakeLock); tryBlock.body().add(wakeLock.invoke("acquire")); tryBlock.body().add(previousMethodBody); JBlock finallyBlock = tryBlock._finally(); JConditional ifStatement = finallyBlock._if(wakeLock.ne(JExpr._null())); ifStatement._then().add(wakeLock.invoke("release")); }
JBlock previousMethodBody = codeModelHelper.removeBody(method);