15d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin/* 25d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * Copyright (C) 2014 Google, Inc. 35d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * 45d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 55d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * you may not use this file except in compliance with the License. 65d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * You may obtain a copy of the License at 75d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * 85d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 95d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * 105d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * Unless required by applicable law or agreed to in writing, software 115d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 125d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * See the License for the specific language governing permissions and 145d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * limitations under the License. 155d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin */ 165d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinpackage dagger.internal.codegen.writer; 175d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 185d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport com.google.common.base.Function; 195d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport com.google.common.collect.FluentIterable; 205d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport javax.lang.model.element.TypeElement; 215d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport javax.lang.model.type.ArrayType; 225d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport javax.lang.model.type.DeclaredType; 235d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport javax.lang.model.type.NoType; 245d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport javax.lang.model.type.NullType; 255d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport javax.lang.model.type.PrimitiveType; 265d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport javax.lang.model.type.TypeMirror; 275d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport javax.lang.model.type.TypeVariable; 285d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport javax.lang.model.type.WildcardType; 295d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport javax.lang.model.util.SimpleTypeVisitor6; 305d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 315d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinpublic final class TypeNames { 325d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin static final Function<TypeMirror, TypeName> FOR_TYPE_MIRROR = 335d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin new Function<TypeMirror, TypeName>() { 345d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override public TypeName apply(TypeMirror input) { 355d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return forTypeMirror(input); 365d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 375d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin }; 385d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 395d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public static TypeName forClass(Class<?> clazz) { 405d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin if (clazz.isPrimitive()) { 415d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return PrimitiveName.forClass(clazz); 425d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } else if (void.class.equals(clazz)) { 435d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return VoidName.VOID; 445d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } else if (clazz.isArray()) { 455d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return new ArrayTypeName(forClass(clazz.getComponentType())); 465d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } else { 475d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return ClassName.fromClass(clazz); 485d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 495d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 505d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 515d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public static TypeName forTypeMirror(TypeMirror mirror) { 525d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return mirror.accept(new SimpleTypeVisitor6<TypeName, Void>() { 535d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override 545d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin protected TypeName defaultAction(TypeMirror e, Void p) { 555d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin throw new IllegalArgumentException(e.toString()); 565d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 575d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 585d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override 595d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public TypeName visitTypeVariable(TypeVariable t, Void p) { 605d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return TypeVariableName.fromTypeVariable(t); 615d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 625d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 635d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override 645d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public ArrayTypeName visitArray(ArrayType t, Void p) { 655d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return new ArrayTypeName(t.getComponentType().accept(this, null)); 665d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 675d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 685d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override 695d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public TypeName visitDeclared(DeclaredType t, Void p) { 705d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return t.getTypeArguments().isEmpty() 715d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin ? ClassName.fromTypeElement((TypeElement) t.asElement()) 725d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin : new ParameterizedTypeName( 735d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin ClassName.fromTypeElement((TypeElement) t.asElement()), 745d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin FluentIterable.from(t.getTypeArguments()).transform(FOR_TYPE_MIRROR)); 755d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 765d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 775d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override 785d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public PrimitiveName visitPrimitive(PrimitiveType t, Void p) { 795d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return PrimitiveName.forTypeMirror(t); 805d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 815d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 825d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override 835d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public WildcardName visitWildcard(WildcardType t, Void p) { 845d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return WildcardName.forTypeMirror(t); 855d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 865d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 875d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override 885d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public NullName visitNull(NullType t, Void p) { 895d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return NullName.NULL; 905d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 915d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 925d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override 935d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public TypeName visitNoType(NoType t, Void p) { 945d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin switch (t.getKind()) { 955d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin case VOID: 965d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return VoidName.VOID; 975d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin case PACKAGE: 985d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin throw new IllegalArgumentException(); 995d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin default: 1005d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin throw new IllegalStateException(); 1015d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 1025d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 1035d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin }, null); 1045d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 1055d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 1065d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin private TypeNames() { 1075d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 1085d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin} 109