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