/** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.litho.specmodels.generator; import javax.lang.model.element.Modifier; import com.facebook.litho.annotations.FromBoundsDefined; import com.facebook.litho.annotations.FromMeasure; import com.facebook.litho.annotations.OnMount; import com.facebook.litho.specmodels.model.ClassNames; import com.facebook.litho.specmodels.model.DelegateMethodModel; import com.facebook.litho.specmodels.model.InterStageInputParamModel; import com.facebook.litho.specmodels.model.MethodParamModel; import com.facebook.litho.specmodels.model.MountSpecModel; import com.facebook.litho.specmodels.model.SpecModelUtils; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeName; /** * Class that generates methods for Mount Specs. */ public class MountSpecGenerator { private MountSpecGenerator() { } public static TypeSpecDataHolder generateCanMountIncrementally(MountSpecModel specModel) { TypeSpecDataHolder.Builder dataHolder = TypeSpecDataHolder.newBuilder(); if (specModel.canMountIncrementally()) { dataHolder.addMethod( MethodSpec.methodBuilder("canMountIncrementally") .addAnnotation(Override.class) .addModifiers(Modifier.PUBLIC) .returns(TypeName.BOOLEAN) .addStatement("return true") .build()); } return dataHolder.build(); } public static TypeSpecDataHolder generateShouldUseDisplayList(MountSpecModel specModel) { TypeSpecDataHolder.Builder dataHolder = TypeSpecDataHolder.newBuilder(); if (specModel.shouldUseDisplayList()) { dataHolder.addMethod( MethodSpec.methodBuilder("shouldUseDisplayList") .addAnnotation(Override.class) .addModifiers(Modifier.PUBLIC) .returns(TypeName.BOOLEAN) .addStatement("return true") .build()); } return dataHolder.build(); } public static TypeSpecDataHolder generatePoolSize(MountSpecModel specModel) { return TypeSpecDataHolder.newBuilder() .addMethod( MethodSpec.methodBuilder("poolSize") .addAnnotation(Override.class) .addModifiers(javax.lang.model.element.Modifier.PROTECTED) .returns(TypeName.INT) .addStatement("return $L", specModel.getPoolSize()) .build()) .build(); } public static TypeSpecDataHolder generateGetMountType(MountSpecModel specModel) { return TypeSpecDataHolder.newBuilder() .addMethod( MethodSpec.methodBuilder("getMountType") .addAnnotation(Override.class) .addModifiers(Modifier.PUBLIC) .returns(ClassNames.COMPONENT_LIFECYCLE_MOUNT_TYPE) .addStatement("return $T", specModel.getMountType()) .build()) .build(); } public static TypeSpecDataHolder generateIsMountSizeDependent(MountSpecModel specModel) { TypeSpecDataHolder.Builder dataHolder = TypeSpecDataHolder.newBuilder(); final DelegateMethodModel onMount = SpecModelUtils.getMethodModelWithAnnotation(specModel, OnMount.class); if (onMount == null) { return dataHolder.build(); } for (MethodParamModel methodParamModel : onMount.methodParams) { if (methodParamModel instanceof InterStageInputParamModel && (SpecModelUtils.hasAnnotation(methodParamModel, FromMeasure.class) || SpecModelUtils.hasAnnotation(methodParamModel, FromBoundsDefined.class))) { return dataHolder .addMethod(MethodSpec.methodBuilder("isMountSizeDependent") .addAnnotation(Override.class) .addModifiers(Modifier.PROTECTED) .returns(TypeName.BOOLEAN) .addStatement("return true") .build()) .build(); } } return dataHolder.build(); } }