dagger.internal.codegen.xprocessing.XFunSpecs Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of dagger-compiler Show documentation
Show all versions of dagger-compiler Show documentation
A fast dependency injector for Android and Java.
/*
* Copyright (C) 2025 The Dagger Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dagger.internal.codegen.xprocessing;
import static androidx.room.compiler.codegen.compat.XConverters.toJavaPoet;
import static androidx.room.compiler.codegen.compat.XConverters.toKotlinPoet;
import static com.google.common.base.Preconditions.checkState;
import static javax.lang.model.element.Modifier.PROTECTED;
import static javax.lang.model.element.Modifier.PUBLIC;
import androidx.room.compiler.codegen.VisibilityModifier;
import androidx.room.compiler.codegen.XAnnotationSpec;
import androidx.room.compiler.codegen.XClassName;
import androidx.room.compiler.codegen.XCodeBlock;
import androidx.room.compiler.codegen.XFunSpec;
import androidx.room.compiler.codegen.XName;
import androidx.room.compiler.codegen.XParameterSpec;
import androidx.room.compiler.codegen.XTypeName;
import androidx.room.compiler.processing.XExecutableParameterElement;
import androidx.room.compiler.processing.XMethodElement;
import androidx.room.compiler.processing.XMethodType;
import androidx.room.compiler.processing.XType;
import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeVariableName;
import com.squareup.kotlinpoet.KModifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.lang.model.element.Modifier;
// TODO(bcorso): Consider moving these methods into XProcessing library.
/** A utility class for {@link XFunSpec} helper methods. */
public final class XFunSpecs {
/** Returns a {@link Builder} that overrides the given method. */
public static Builder overriding(XMethodElement method, XType owner) {
Builder builder = overridingWithoutParameters(method, owner);
XMethodType methodType = method.asMemberOf(owner);
for (int i = 0; i < methodType.getParameterTypes().size(); i++) {
XExecutableParameterElement parameter = method.getParameters().get(i);
XType parameterType = methodType.getParameterTypes().get(i);
builder.addParameter(XParameterSpecs.parameterSpecOf(parameter, parameterType));
}
return builder;
}
/** Returns a {@link Builder} that overrides the given method without parameters. */
public static Builder overridingWithoutParameters(XMethodElement method, XType owner) {
XMethodType methodType = method.asMemberOf(owner);
Nullability nullability = Nullability.of(method);
TypeName returnType =
Nullability.getTypeNameWithNullableAnnotations(methodType.getReturnType());
Builder builder =
// We're overriding the method so we have to use the jvm name here.
methodBuilder(method.getJvmName())
.addAnnotation(Override.class)
.addAnnotationNames(nullability.nonTypeUseNullableAnnotations())
.addTypeVariables(methodType.getTypeVariables())
.varargs(method.isVarArgs())
.returns(returnType);
if (method.isPublic()) {
builder.addModifiers(PUBLIC);
} else if (method.isProtected()) {
builder.addModifiers(PROTECTED);
}
return builder;
}
public static Builder methodBuilder(String name) {
return new Builder(Builder.Kind.FUNCTION).name(name);
}
public static Builder constructorBuilder() {
return new Builder(Builder.Kind.CONSTRUCTOR);
}
/** Builds an {@link XFunSpec} in a way that is more similar to the JavaPoet API. */
public static class Builder {
private static enum Kind {
FUNCTION,
CONSTRUCTOR
}
private final Kind kind;
private final XCodeBlock.Builder bodyBuilder = XCodeBlock.builder();
private String name;
private VisibilityModifier visibility = null;
private boolean isStatic = false;
private boolean isAbstract = false;
private boolean isOpen = false;
private boolean isOverride = false;
private boolean isVarArgs = false;
private final List javadocs = new ArrayList<>();
private final List parameters = new ArrayList<>();
// For now, we use a Object to allow for both XPoet and JavaPoet types.
private Object returnType = null;
private final List © 2015 - 2025 Weber Informatics LLC | Privacy Policy