use of com.squareup.javapoet.ClassName in project tiger by google.
the class NewInjectorGenerator method generateAll.
private void generateAll() {
for (ComponentInfo component : orderedComponents) {
Set<ClassName> injected = new HashSet<>();
Set<TypeElement> allMembersInjectors = Sets.newHashSet(memberInjectors.get(component));
while (!allMembersInjectors.isEmpty()) {
TypeElement injector = Iterables.getFirst(allMembersInjectors, null);
Preconditions.checkNotNull(injector, String.format("Empty allMembersInjector."));
allMembersInjectors.remove(injector);
for (TypeMirror parentInterface : injector.getInterfaces()) {
allMembersInjectors.add((TypeElement) ((DeclaredType) parentInterface).asElement());
}
for (Element method : injector.getEnclosedElements()) {
if (Utils.isInjectionMethod(method)) {
VariableElement var = Iterables.getOnlyElement(((ExecutableElement) method).getParameters());
if (var.asType().getKind().equals(TypeKind.TYPEVAR)) {
// TODO(freeman): support generic injection method.
continue;
}
TypeElement varTypeElement = (TypeElement) ((DeclaredType) var.asType()).asElement();
if (!injected.add(ClassName.get(varTypeElement))) {
continue;
}
generateInjectionMethod(varTypeElement, component.getScope());
} else if (Utils.isProvisionMethodInInjector(method)) {
generateProvisionMethodIfNeeded(Utils.getKeyProvidedByMethod((ExecutableElement) method), injector);
} else {
messager.printMessage(Kind.WARNING, String.format("Unknown element %s from injector %s.", method, injector));
}
}
}
}
for (ComponentInfo component : orderedComponents) {
if (componentTree.get(component) == null) {
continue;
}
for (Map.Entry<ClassName, TypeSpec.Builder> entry : packagedInjectorBuilders.entrySet()) {
ClassName packagedInjectorClassName = entry.getKey();
if (!component.equals(getComponentFromPackagedInjectorClassName(packagedInjectorClassName))) {
continue;
}
generateInheritedProvisionMethods(packagedInjectorClassName);
}
}
for (ComponentInfo component : orderedComponents) {
if (componentTree.get(component) == null) {
continue;
}
for (Map.Entry<ClassName, TypeSpec.Builder> entry : packagedInjectorBuilders.entrySet()) {
ClassName packagedInjectorClassName = entry.getKey();
if (!component.equals(getComponentFromPackagedInjectorClassName(packagedInjectorClassName))) {
continue;
}
generateInheritedInjectionMethods(packagedInjectorClassName);
}
}
for (Map.Entry<ClassName, TypeSpec.Builder> entry : packagedInjectorBuilders.entrySet()) {
String packageString = entry.getKey().packageName();
TypeSpec.Builder builder = entry.getValue();
JavaFile javaFile = JavaFile.builder(packageString, builder.build()).build();
// messager.printMessage(Kind.NOTE, String.format("java file: %s", javaFile));
try {
javaFile.writeTo(processingEnv.getFiler());
} catch (IOException e) {
Throwables.propagate(e);
}
}
generateTopLevelInjectors();
}
use of com.squareup.javapoet.ClassName in project tiger by google.
the class NewDependencyCollector method addDependenciesForRequiredKeys.
/**
* Add dependencies from ctor injected classes needed by requiredKeys recursively to result.
*/
private void addDependenciesForRequiredKeys(SetMultimap<NewBindingKey, NewDependencyInfo> result, Set<NewBindingKey> requiredKeys) {
// Added all the required dependencies from ctor injected classes.
while (!requiredKeys.isEmpty()) {
NewBindingKey key = Iterables.getFirst(requiredKeys, null);
Preconditions.checkNotNull(key);
requiredKeys.remove(key);
if (result.containsKey(key)) {
continue;
}
TypeName typeName = key.getTypeName();
if (Utils.hasBuiltinBinding(typeName)) {
key = Utils.getElementKeyForBuiltinBinding(key);
requiredKeys.add(key);
continue;
}
if (Utils.isMapWithBuiltinValueType(key)) {
NewBindingKey peeledMapKey = Preconditions.checkNotNull(Utils.peelMapWithBuiltinValue(key));
requiredKeys.add(peeledMapKey);
continue;
}
ClassName className;
if (typeName instanceof ClassName) {
className = (ClassName) typeName;
} else {
Preconditions.checkState(typeName instanceof ParameterizedTypeName, "Expect a %s but get %s", ParameterizedTypeName.class, typeName);
ParameterizedTypeName parameterizedTypeName = (ParameterizedTypeName) typeName;
for (TypeName parameter : parameterizedTypeName.typeArguments) {
Preconditions.checkState(parameter instanceof ClassName || parameter instanceof ParameterizedTypeName, String.format("Unexpected parameter type %s for type %s.", parameter, typeName));
}
NewDependencyInfo dependencyInfo = Utils.getDependencyInfoByGeneric(result, key);
if (dependencyInfo != null) {
requiredKeys.addAll(dependencyInfo.getDependencies());
continue;
} else {
className = ((ParameterizedTypeName) typeName).rawType;
}
}
TypeElement classTypeElement = env.getElementUtils().getTypeElement(Utils.getClassCanonicalName(className));
Preconditions.checkNotNull(classTypeElement, String.format("Class %s not found.", className));
Collection<NewDependencyInfo> dependencies = collectFromCtorInjectedClass(classTypeElement);
if (dependencies == null) {
messager.printMessage(Kind.ERROR, String.format("Binding not found for %s", key));
continue;
}
NewDependencyInfo dependency = Iterables.getOnlyElement(dependencies);
if (typeName instanceof ParameterizedTypeName) {
Map<TypeVariableName, TypeName> parameterMap = Utils.getMapFromTypeVariableToSpecialized((ParameterizedTypeName) typeName, (ParameterizedTypeName) dependency.getDependant().getTypeName());
requiredKeys.addAll(Utils.specializeIfNeeded(dependency.getDependencies(), parameterMap));
} else {
requiredKeys.addAll(dependency.getDependencies());
}
checkOneDependency(result, dependency);
addDependencyInfo(result, dependency);
}
}
use of com.squareup.javapoet.ClassName in project tiger by google.
the class NewInjectorGenerator method getGetModuleMethod.
private MethodSpec getGetModuleMethod(TypeElement scope, NewDependencyInfo dependencyInfo) {
Preconditions.checkArgument(dependencyInfo.getProvisionMethodElement() != null, String.format("Expect one from module but get %s.", dependencyInfo));
TypeElement module = dependencyInfo.getSourceClassElement();
ClassName packagedInjectorClassName = getPackagedInjectorForNewDependencyInfo(scope, dependencyInfo);
if (!modulesWithGetter.containsKey(packagedInjectorClassName)) {
modulesWithGetter.put(packagedInjectorClassName, new HashMap<ClassName, MethodSpec>());
}
if (!modulesWithGetter.get(packagedInjectorClassName).containsKey(ClassName.get(module))) {
generateGetModuleMethod(scope, dependencyInfo);
}
return modulesWithGetter.get(packagedInjectorClassName).get(ClassName.get(module));
}
use of com.squareup.javapoet.ClassName in project tiger by google.
the class NewInjectorGenerator method generateProvisionMethodForSet.
private void generateProvisionMethodForSet(NewBindingKey key, TypeElement referencingClass, String suffix) {
TypeSpec.Builder componentSpecBuilder = getInjectorTypeSpecBuilder(getInjectorFor(key, referencingClass));
// messager.printMessage(Kind.NOTE, "generateProvisionMethodForSet: " + key +
// " PackagedInjector: "
// + getInjectorFor(key, referencingClass) + " SpecBuilder: " + componentSpecBuilder);
ParameterizedTypeName type = (ParameterizedTypeName) key.getTypeName();
Preconditions.checkArgument(type.rawType.equals(ClassName.get(Set.class)));
TypeName elementType = Iterables.getOnlyElement(type.typeArguments);
MethodSpec.Builder methodSpecBuilder = MethodSpec.methodBuilder(getProvisionMethodName(key) + suffix).addModifiers(suffix.isEmpty() ? Modifier.PUBLIC : Modifier.PRIVATE).returns(type);
methodSpecBuilder.addStatement("$T result = new $T<>()", type, HashSet.class);
methodSpecBuilder.addStatement("$T setVar", type);
methodSpecBuilder.addStatement("$T elementVar", elementType);
SetMultimap<PackageElement, NewDependencyInfo> packageToDependencyInfoMap = HashMultimap.create();
for (NewDependencyInfo dependencyInfo : dependencies.get(key)) {
packageToDependencyInfoMap.put(Utils.getPackage(dependencyInfo.getSourceClassElement()), dependencyInfo);
}
for (PackageElement pkg : packageToDependencyInfoMap.keySet()) {
// messager.printMessage(Kind.NOTE, String.format("generateProvisionMethodForSet for %s from"
// +
// " %s", key, packageToDependencyInfoMap.get(pkg)));
generateSetTypeProvisionMethodForPackage(key, packageToDependencyInfoMap.get(pkg), suffix);
NewDependencyInfo dependencyInfo = Iterables.getFirst(packageToDependencyInfoMap.get(pkg), null);
Preconditions.checkNotNull(dependencyInfo, String.format("no dependencyInfo for set key %s in module %s", key, pkg));
ClassName packagedInjectorClassName = getPackagedInjectorForNewDependencyInfo(key, dependencyInfo);
methodSpecBuilder.addStatement("setVar = $L.$N().$N()", TOP_LEVEL_INJECTOR_FIELD, Utils.getGetMethodName(packagedInjectorClassName), getProvisionMethodName(key));
methodSpecBuilder.addStatement("result.addAll($L)", "setVar");
}
methodSpecBuilder.addStatement("return result");
componentSpecBuilder.addMethod(methodSpecBuilder.build());
}
use of com.squareup.javapoet.ClassName in project tiger by google.
the class NewInjectorGenerator method getClassFromKey.
// Handles generic case.
private TypeElement getClassFromKey(NewBindingKey key) {
Preconditions.checkArgument(Iterables.getOnlyElement(Utils.getDependencyInfo(dependencies, key)).getProvisionMethodElement() == null, String.format("Key: %s", key));
ClassName className;
TypeName typeName = key.getTypeName();
if (typeName instanceof ClassName) {
className = (ClassName) typeName;
} else {
Preconditions.checkState(typeName instanceof ParameterizedTypeName, String.format("typeName: %s", typeName));
className = ((ParameterizedTypeName) typeName).rawType;
}
String classNameString = Utils.getClassCanonicalName(className);
TypeElement result = processingEnv.getElementUtils().getTypeElement(classNameString);
Preconditions.checkNotNull(result, String.format("Did not find TypeElement for %s", classNameString));
return result;
}
Aggregations