1 /* 2 * Copyright (C) 2016 The Dagger Authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package dagger.internal.codegen.javapoet; 18 19 import androidx.room.compiler.processing.XType; 20 import com.google.common.collect.ImmutableSet; 21 import com.squareup.javapoet.ClassName; 22 import com.squareup.javapoet.ParameterizedTypeName; 23 import com.squareup.javapoet.TypeName; 24 25 /** Common names and convenience methods for JavaPoet {@link TypeName} usage. */ 26 public final class TypeNames { 27 28 // Dagger Core classnames 29 public static final ClassName ASSISTED = ClassName.get("dagger.assisted", "Assisted"); 30 public static final ClassName ASSISTED_FACTORY = 31 ClassName.get("dagger.assisted", "AssistedFactory"); 32 public static final ClassName ASSISTED_INJECT = 33 ClassName.get("dagger.assisted", "AssistedInject"); 34 public static final ClassName BINDS = ClassName.get("dagger", "Binds"); 35 public static final ClassName BINDS_INSTANCE = ClassName.get("dagger", "BindsInstance"); 36 public static final ClassName BINDS_OPTIONAL_OF = ClassName.get("dagger", "BindsOptionalOf"); 37 public static final ClassName COMPONENT = ClassName.get("dagger", "Component"); 38 public static final ClassName COMPONENT_BUILDER = COMPONENT.nestedClass("Builder"); 39 public static final ClassName COMPONENT_FACTORY = COMPONENT.nestedClass("Factory"); 40 public static final ClassName DAGGER_PROCESSING_OPTIONS = 41 ClassName.get("dagger", "DaggerProcessingOptions"); 42 public static final ClassName ELEMENTS_INTO_SET = 43 ClassName.get("dagger.multibindings", "ElementsIntoSet"); 44 public static final ClassName INTO_MAP = ClassName.get("dagger.multibindings", "IntoMap"); 45 public static final ClassName INTO_SET = ClassName.get("dagger.multibindings", "IntoSet"); 46 public static final ClassName MAP_KEY = ClassName.get("dagger", "MapKey"); 47 public static final ClassName MODULE = ClassName.get("dagger", "Module"); 48 public static final ClassName MULTIBINDS = ClassName.get("dagger.multibindings", "Multibinds"); 49 public static final ClassName PROVIDES = ClassName.get("dagger", "Provides"); 50 public static final ClassName REUSABLE = ClassName.get("dagger", "Reusable"); 51 public static final ClassName SUBCOMPONENT = ClassName.get("dagger", "Subcomponent"); 52 public static final ClassName SUBCOMPONENT_BUILDER = SUBCOMPONENT.nestedClass("Builder"); 53 public static final ClassName SUBCOMPONENT_FACTORY = SUBCOMPONENT.nestedClass("Factory"); 54 55 // Dagger Internal classnames 56 public static final ClassName IDENTIFIER_NAME_STRING = 57 ClassName.get("dagger.internal", "IdentifierNameString"); 58 public static final ClassName KEEP_FIELD_TYPE = ClassName.get("dagger.internal", "KeepFieldType"); 59 public static final ClassName LAZY_CLASS_KEY = 60 ClassName.get("dagger.multibindings", "LazyClassKey"); 61 public static final ClassName LAZY_CLASS_KEY_MAP = 62 ClassName.get("dagger.internal", "LazyClassKeyMap"); 63 public static final ClassName LAZY_CLASS_KEY_MAP_FACTORY = 64 ClassName.get("dagger.internal", "LazyClassKeyMap", "MapFactory"); 65 public static final ClassName LAZY_CLASS_KEY_MAP_PROVIDER_FACTORY = 66 ClassName.get("dagger.internal", "LazyClassKeyMap", "MapProviderFactory"); 67 public static final ClassName LAZY_MAP_OF_PRODUCED_PRODUCER = 68 ClassName.get("dagger.producers.internal", "LazyMapOfProducedProducer"); 69 public static final ClassName LAZY_MAP_OF_PRODUCER_PRODUCER = 70 ClassName.get("dagger.producers.internal", "LazyMapOfProducerProducer"); 71 public static final ClassName LAZY_MAP_PRODUCER = 72 ClassName.get("dagger.producers.internal", "LazyMapProducer"); 73 74 public static final ClassName DELEGATE_FACTORY = 75 ClassName.get("dagger.internal", "DelegateFactory"); 76 public static final ClassName DOUBLE_CHECK = ClassName.get("dagger.internal", "DoubleCheck"); 77 78 public static final ClassName FACTORY = ClassName.get("dagger.internal", "Factory"); 79 public static final ClassName INJECTED_FIELD_SIGNATURE = 80 ClassName.get("dagger.internal", "InjectedFieldSignature"); 81 public static final ClassName INSTANCE_FACTORY = 82 ClassName.get("dagger.internal", "InstanceFactory"); 83 public static final ClassName MAP_BUILDER = ClassName.get("dagger.internal", "MapBuilder"); 84 public static final ClassName MAP_FACTORY = ClassName.get("dagger.internal", "MapFactory"); 85 public static final ClassName MAP_PROVIDER_FACTORY = 86 ClassName.get("dagger.internal", "MapProviderFactory"); 87 public static final ClassName MEMBERS_INJECTOR = ClassName.get("dagger", "MembersInjector"); 88 public static final ClassName MEMBERS_INJECTORS = 89 ClassName.get("dagger.internal", "MembersInjectors"); 90 public static final ClassName PROVIDER = ClassName.get("javax.inject", "Provider"); 91 public static final ClassName JAKARTA_PROVIDER = ClassName.get("jakarta.inject", "Provider"); 92 public static final ClassName DAGGER_PROVIDER = ClassName.get("dagger.internal", "Provider"); 93 public static final ClassName DAGGER_PROVIDERS = ClassName.get("dagger.internal", "Providers"); 94 public static final ClassName PROVIDER_OF_LAZY = 95 ClassName.get("dagger.internal", "ProviderOfLazy"); 96 public static final ClassName SCOPE_METADATA = ClassName.get("dagger.internal", "ScopeMetadata"); 97 public static final ClassName QUALIFIER_METADATA = 98 ClassName.get("dagger.internal", "QualifierMetadata"); 99 public static final ClassName SET_FACTORY = ClassName.get("dagger.internal", "SetFactory"); 100 public static final ClassName SINGLE_CHECK = ClassName.get("dagger.internal", "SingleCheck"); 101 public static final ClassName LAZY = ClassName.get("dagger", "Lazy"); 102 103 // Dagger Producers classnames 104 public static final ClassName ABSTRACT_PRODUCER = 105 ClassName.get("dagger.producers.internal", "AbstractProducer"); 106 public static final ClassName ABSTRACT_PRODUCES_METHOD_PRODUCER = 107 ClassName.get("dagger.producers.internal", "AbstractProducesMethodProducer"); 108 public static final ClassName CANCELLATION_LISTENER = 109 ClassName.get("dagger.producers.internal", "CancellationListener"); 110 public static final ClassName CANCELLATION_POLICY = 111 ClassName.get("dagger.producers", "CancellationPolicy"); 112 public static final ClassName DELEGATE_PRODUCER = 113 ClassName.get("dagger.producers.internal", "DelegateProducer"); 114 public static final ClassName DEPENDENCY_METHOD_PRODUCER = 115 ClassName.get("dagger.producers.internal", "DependencyMethodProducer"); 116 public static final ClassName MAP_OF_PRODUCED_PRODUCER = 117 ClassName.get("dagger.producers.internal", "MapOfProducedProducer"); 118 public static final ClassName MAP_OF_PRODUCER_PRODUCER = 119 ClassName.get("dagger.producers.internal", "MapOfProducerProducer"); 120 public static final ClassName MAP_PRODUCER = 121 ClassName.get("dagger.producers.internal", "MapProducer"); 122 public static final ClassName MONITORS = 123 ClassName.get("dagger.producers.monitoring.internal", "Monitors"); 124 public static final ClassName PRODUCED = ClassName.get("dagger.producers", "Produced"); 125 public static final ClassName PRODUCER = ClassName.get("dagger.producers", "Producer"); 126 public static final ClassName PRODUCERS = ClassName.get("dagger.producers.internal", "Producers"); 127 public static final ClassName PRODUCER_MODULE = 128 ClassName.get("dagger.producers", "ProducerModule"); 129 public static final ClassName PRODUCES = ClassName.get("dagger.producers", "Produces"); 130 public static final ClassName PRODUCTION = ClassName.get("dagger.producers", "Production"); 131 public static final ClassName PRODUCTION_COMPONENT = 132 ClassName.get("dagger.producers", "ProductionComponent"); 133 public static final ClassName PRODUCTION_COMPONENT_BUILDER = 134 PRODUCTION_COMPONENT.nestedClass("Builder"); 135 public static final ClassName PRODUCTION_COMPONENT_FACTORY = 136 PRODUCTION_COMPONENT.nestedClass("Factory"); 137 public static final ClassName PRODUCTION_EXECTUTOR_MODULE = 138 ClassName.get("dagger.producers.internal", "ProductionExecutorModule"); 139 public static final ClassName PRODUCTION_IMPLEMENTATION = 140 ClassName.get("dagger.producers.internal", "ProductionImplementation"); 141 public static final ClassName PRODUCTION_SUBCOMPONENT = 142 ClassName.get("dagger.producers", "ProductionSubcomponent"); 143 public static final ClassName PRODUCTION_SUBCOMPONENT_BUILDER = 144 PRODUCTION_SUBCOMPONENT.nestedClass("Builder"); 145 public static final ClassName PRODUCTION_SUBCOMPONENT_FACTORY = 146 PRODUCTION_SUBCOMPONENT.nestedClass("Factory"); 147 public static final ClassName PRODUCER_TOKEN = 148 ClassName.get("dagger.producers.monitoring", "ProducerToken"); 149 public static final ClassName PRODUCTION_COMPONENT_MONITOR = 150 ClassName.get("dagger.producers.monitoring", "ProductionComponentMonitor"); 151 public static final ClassName PRODUCTION_COMPONENT_MONITOR_FACTORY = 152 ClassName.get("dagger.producers.monitoring", "ProductionComponentMonitor", "Factory"); 153 public static final ClassName SET_OF_PRODUCED_PRODUCER = 154 ClassName.get("dagger.producers.internal", "SetOfProducedProducer"); 155 public static final ClassName SET_PRODUCER = 156 ClassName.get("dagger.producers.internal", "SetProducer"); 157 public static final ClassName PRODUCTION_SCOPE = 158 ClassName.get("dagger.producers", "ProductionScope"); 159 160 // Other classnames 161 public static final ClassName EXECUTOR = ClassName.get("java.util.concurrent", "Executor"); 162 public static final ClassName ERROR = ClassName.get("java.lang", "Error"); 163 public static final ClassName EXCEPTION = ClassName.get("java.lang", "Exception"); 164 public static final ClassName RUNTIME_EXCEPTION = ClassName.get("java.lang", "RuntimeException"); 165 public static final ClassName STRING = ClassName.get("java.lang", "String"); 166 167 public static final ClassName MAP = ClassName.get("java.util", "Map"); 168 public static final ClassName KOTLIN_METADATA = ClassName.get("kotlin", "Metadata"); 169 public static final ClassName IMMUTABLE_MAP = 170 ClassName.get("com.google.common.collect", "ImmutableMap"); 171 public static final ClassName SINGLETON = ClassName.get("jakarta.inject", "Singleton"); 172 public static final ClassName SINGLETON_JAVAX = ClassName.get("javax.inject", "Singleton"); 173 public static final ClassName SCOPE = ClassName.get("jakarta.inject", "Scope"); 174 public static final ClassName SCOPE_JAVAX = ClassName.get("javax.inject", "Scope"); 175 public static final ClassName INJECT = ClassName.get("jakarta.inject", "Inject"); 176 public static final ClassName INJECT_JAVAX = ClassName.get("javax.inject", "Inject"); 177 public static final ClassName QUALIFIER = ClassName.get("jakarta.inject", "Qualifier"); 178 public static final ClassName QUALIFIER_JAVAX = ClassName.get("javax.inject", "Qualifier"); 179 public static final ClassName COLLECTION = ClassName.get("java.util", "Collection"); 180 public static final ClassName LIST = ClassName.get("java.util", "List"); 181 public static final ClassName SET = ClassName.get("java.util", "Set"); 182 public static final ClassName IMMUTABLE_SET = 183 ClassName.get("com.google.common.collect", "ImmutableSet"); 184 public static final ClassName FUTURES = 185 ClassName.get("com.google.common.util.concurrent", "Futures"); 186 public static final ClassName LISTENABLE_FUTURE = 187 ClassName.get("com.google.common.util.concurrent", "ListenableFuture"); 188 public static final ClassName FLUENT_FUTURE = 189 ClassName.get("com.google.common.util.concurrent", "FluentFuture"); 190 public static final ClassName GUAVA_OPTIONAL = 191 ClassName.get("com.google.common.base", "Optional"); 192 public static final ClassName JDK_OPTIONAL = ClassName.get("java.util", "Optional"); 193 public static final ClassName OVERRIDE = ClassName.get("java.lang", "Override"); 194 public static final ClassName JVM_STATIC = ClassName.get("kotlin.jvm", "JvmStatic"); 195 public static final ClassName CLASS = ClassName.get("java.lang", "Class"); 196 public static final ClassName KCLASS = ClassName.get("kotlin.reflect", "KClass"); 197 198 /** 199 * {@link TypeName#VOID} is lowercase-v {@code void} whereas this represents the class, {@link 200 * Void}. 201 */ 202 public static final ClassName VOID_CLASS = ClassName.get(Void.class); 203 abstractProducerOf(TypeName typeName)204 public static ParameterizedTypeName abstractProducerOf(TypeName typeName) { 205 return ParameterizedTypeName.get(ABSTRACT_PRODUCER, typeName); 206 } 207 factoryOf(TypeName factoryType)208 public static ParameterizedTypeName factoryOf(TypeName factoryType) { 209 return ParameterizedTypeName.get(FACTORY, factoryType); 210 } 211 lazyOf(TypeName typeName)212 public static ParameterizedTypeName lazyOf(TypeName typeName) { 213 return ParameterizedTypeName.get(LAZY, typeName); 214 } 215 listOf(TypeName typeName)216 public static ParameterizedTypeName listOf(TypeName typeName) { 217 return ParameterizedTypeName.get(LIST, typeName); 218 } 219 listenableFutureOf(TypeName typeName)220 public static ParameterizedTypeName listenableFutureOf(TypeName typeName) { 221 return ParameterizedTypeName.get(LISTENABLE_FUTURE, typeName); 222 } 223 membersInjectorOf(TypeName membersInjectorType)224 public static ParameterizedTypeName membersInjectorOf(TypeName membersInjectorType) { 225 return ParameterizedTypeName.get(MEMBERS_INJECTOR, membersInjectorType); 226 } 227 producedOf(TypeName typeName)228 public static ParameterizedTypeName producedOf(TypeName typeName) { 229 return ParameterizedTypeName.get(PRODUCED, typeName); 230 } 231 producerOf(TypeName typeName)232 public static ParameterizedTypeName producerOf(TypeName typeName) { 233 return ParameterizedTypeName.get(PRODUCER, typeName); 234 } 235 dependencyMethodProducerOf(TypeName typeName)236 public static ParameterizedTypeName dependencyMethodProducerOf(TypeName typeName) { 237 return ParameterizedTypeName.get(DEPENDENCY_METHOD_PRODUCER, typeName); 238 } 239 providerOf(TypeName typeName)240 public static ParameterizedTypeName providerOf(TypeName typeName) { 241 return ParameterizedTypeName.get(PROVIDER, typeName); 242 } 243 daggerProviderOf(TypeName typeName)244 public static ParameterizedTypeName daggerProviderOf(TypeName typeName) { 245 return ParameterizedTypeName.get(DAGGER_PROVIDER, typeName); 246 } 247 setOf(TypeName elementType)248 public static ParameterizedTypeName setOf(TypeName elementType) { 249 return ParameterizedTypeName.get(SET, elementType); 250 } 251 252 private static final ImmutableSet<ClassName> FUTURE_TYPES = 253 ImmutableSet.of(LISTENABLE_FUTURE, FLUENT_FUTURE); 254 isFutureType(XType type)255 public static boolean isFutureType(XType type) { 256 return isFutureType(type.getTypeName()); 257 } 258 isFutureType(TypeName typeName)259 public static boolean isFutureType(TypeName typeName) { 260 return FUTURE_TYPES.contains(rawTypeName(typeName)); 261 } 262 263 /** 264 * Returns the {@link TypeName} for the raw type of the given {@link TypeName}. If the argument 265 * isn't a parameterized type, it returns the argument unchanged. 266 */ rawTypeName(TypeName typeName)267 public static TypeName rawTypeName(TypeName typeName) { 268 return (typeName instanceof ParameterizedTypeName) 269 ? ((ParameterizedTypeName) typeName).rawType 270 : typeName; 271 } 272 TypeNames()273 private TypeNames() {} 274 } 275