xref: /aosp_15_r20/external/dagger2/java/dagger/spi/model/Scope.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1*f585d8a3SJacky Wang /*
2*f585d8a3SJacky Wang  * Copyright (C) 2021 The Dagger Authors.
3*f585d8a3SJacky Wang  *
4*f585d8a3SJacky Wang  * Licensed under the Apache License, Version 2.0 (the "License");
5*f585d8a3SJacky Wang  * you may not use this file except in compliance with the License.
6*f585d8a3SJacky Wang  * You may obtain a copy of the License at
7*f585d8a3SJacky Wang  *
8*f585d8a3SJacky Wang  * http://www.apache.org/licenses/LICENSE-2.0
9*f585d8a3SJacky Wang  *
10*f585d8a3SJacky Wang  * Unless required by applicable law or agreed to in writing, software
11*f585d8a3SJacky Wang  * distributed under the License is distributed on an "AS IS" BASIS,
12*f585d8a3SJacky Wang  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*f585d8a3SJacky Wang  * See the License for the specific language governing permissions and
14*f585d8a3SJacky Wang  * limitations under the License.
15*f585d8a3SJacky Wang  */
16*f585d8a3SJacky Wang 
17*f585d8a3SJacky Wang package dagger.spi.model;
18*f585d8a3SJacky Wang 
19*f585d8a3SJacky Wang import static com.google.common.base.Preconditions.checkArgument;
20*f585d8a3SJacky Wang 
21*f585d8a3SJacky Wang import com.google.auto.common.MoreElements;
22*f585d8a3SJacky Wang import com.google.auto.value.AutoValue;
23*f585d8a3SJacky Wang 
24*f585d8a3SJacky Wang /** A representation of a {@link javax.inject.Scope}. */
25*f585d8a3SJacky Wang @AutoValue
26*f585d8a3SJacky Wang public abstract class Scope {
27*f585d8a3SJacky Wang   /**
28*f585d8a3SJacky Wang    * Creates a {@link Scope} object from the {@link javax.inject.Scope}-annotated annotation type.
29*f585d8a3SJacky Wang    */
scope(DaggerAnnotation scopeAnnotation)30*f585d8a3SJacky Wang   public static Scope scope(DaggerAnnotation scopeAnnotation) {
31*f585d8a3SJacky Wang     checkArgument(isScope(scopeAnnotation));
32*f585d8a3SJacky Wang     return new AutoValue_Scope(scopeAnnotation);
33*f585d8a3SJacky Wang   }
34*f585d8a3SJacky Wang 
35*f585d8a3SJacky Wang   /**
36*f585d8a3SJacky Wang    * Returns {@code true} if {@link #scopeAnnotation()} is a {@link javax.inject.Scope} annotation.
37*f585d8a3SJacky Wang    */
isScope(DaggerAnnotation scopeAnnotation)38*f585d8a3SJacky Wang   public static boolean isScope(DaggerAnnotation scopeAnnotation) {
39*f585d8a3SJacky Wang     return isScope(scopeAnnotation.annotationTypeElement());
40*f585d8a3SJacky Wang   }
41*f585d8a3SJacky Wang 
42*f585d8a3SJacky Wang   /**
43*f585d8a3SJacky Wang    * Returns {@code true} if {@code scopeAnnotationType} is a {@link javax.inject.Scope} annotation.
44*f585d8a3SJacky Wang    */
isScope(DaggerTypeElement scopeAnnotationType)45*f585d8a3SJacky Wang   public static boolean isScope(DaggerTypeElement scopeAnnotationType) {
46*f585d8a3SJacky Wang     switch (scopeAnnotationType.backend()) {
47*f585d8a3SJacky Wang       case JAVAC:
48*f585d8a3SJacky Wang         return MoreElements.isAnnotationPresent(scopeAnnotationType.javac(), SCOPE)
49*f585d8a3SJacky Wang             || MoreElements.isAnnotationPresent(scopeAnnotationType.javac(), SCOPE_JAVAX);
50*f585d8a3SJacky Wang       case KSP:
51*f585d8a3SJacky Wang         return KspUtilsKt.hasAnnotation(scopeAnnotationType.ksp(), SCOPE)
52*f585d8a3SJacky Wang             || KspUtilsKt.hasAnnotation(scopeAnnotationType.ksp(), SCOPE_JAVAX);
53*f585d8a3SJacky Wang     }
54*f585d8a3SJacky Wang     throw new IllegalStateException(
55*f585d8a3SJacky Wang         String.format("Backend %s not supported yet.", scopeAnnotationType.backend()));
56*f585d8a3SJacky Wang   }
57*f585d8a3SJacky Wang 
isScope(String annotationName)58*f585d8a3SJacky Wang   private boolean isScope(String annotationName) {
59*f585d8a3SJacky Wang     return scopeAnnotation().toString().equals(annotationName);
60*f585d8a3SJacky Wang   }
61*f585d8a3SJacky Wang 
62*f585d8a3SJacky Wang   /** The {@link DaggerAnnotation} that represents the scope annotation. */
scopeAnnotation()63*f585d8a3SJacky Wang   public abstract DaggerAnnotation scopeAnnotation();
64*f585d8a3SJacky Wang 
65*f585d8a3SJacky Wang   private static final String PRODUCTION_SCOPE = "dagger.producers.ProductionScope";
66*f585d8a3SJacky Wang   private static final String SINGLETON = "jakarta.inject.Singleton";
67*f585d8a3SJacky Wang   private static final String SINGLETON_JAVAX = "javax.inject.Singleton";
68*f585d8a3SJacky Wang   private static final String REUSABLE = "dagger.Reusable";
69*f585d8a3SJacky Wang   private static final String SCOPE = "jakarta.inject.Scope";
70*f585d8a3SJacky Wang   private static final String SCOPE_JAVAX = "javax.inject.Scope";
71*f585d8a3SJacky Wang 
72*f585d8a3SJacky Wang   /** Returns {@code true} if this scope is the {@link javax.inject.Singleton @Singleton} scope. */
isSingleton()73*f585d8a3SJacky Wang   public final boolean isSingleton() {
74*f585d8a3SJacky Wang     return isScope(SINGLETON) || isScope(SINGLETON_JAVAX);
75*f585d8a3SJacky Wang   }
76*f585d8a3SJacky Wang 
77*f585d8a3SJacky Wang   /** Returns {@code true} if this scope is the {@link dagger.Reusable @Reusable} scope. */
isReusable()78*f585d8a3SJacky Wang   public final boolean isReusable() {
79*f585d8a3SJacky Wang     return isScope(REUSABLE);
80*f585d8a3SJacky Wang   }
81*f585d8a3SJacky Wang 
82*f585d8a3SJacky Wang   /**
83*f585d8a3SJacky Wang    * Returns {@code true} if this scope is the {@code @ProductionScope} scope.
84*f585d8a3SJacky Wang    */
isProductionScope()85*f585d8a3SJacky Wang   public final boolean isProductionScope() {
86*f585d8a3SJacky Wang     return isScope(PRODUCTION_SCOPE);
87*f585d8a3SJacky Wang   }
88*f585d8a3SJacky Wang 
89*f585d8a3SJacky Wang   /** Returns a debug representation of the scope. */
90*f585d8a3SJacky Wang   @Override
toString()91*f585d8a3SJacky Wang   public final String toString() {
92*f585d8a3SJacky Wang     return scopeAnnotation().toString();
93*f585d8a3SJacky Wang   }
94*f585d8a3SJacky Wang }
95