| /* |
| * Copyright 2011 Google Inc. |
| * |
| * 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 com.google.web.bindery.requestfactory.apt; |
| |
| import com.google.gwt.core.ext.typeinfo.JniConstants; |
| import com.google.gwt.dev.util.Name.BinaryName; |
| |
| import javax.lang.model.element.TypeElement; |
| import javax.lang.model.type.ArrayType; |
| import javax.lang.model.type.DeclaredType; |
| import javax.lang.model.type.ExecutableType; |
| import javax.lang.model.type.NoType; |
| import javax.lang.model.type.PrimitiveType; |
| import javax.lang.model.type.TypeKind; |
| import javax.lang.model.type.TypeMirror; |
| import javax.lang.model.type.TypeVariable; |
| import javax.lang.model.type.WildcardType; |
| import javax.lang.model.util.SimpleTypeVisitor6; |
| |
| /** |
| * Builds descriptors from TypeMirrors for both simple types and methods. Used |
| * by {@link DeobfuscatorBuilder} to construct client-to-server method mappings. |
| */ |
| class DescriptorBuilder extends SimpleTypeVisitor6<String, State> { |
| |
| /** |
| * Arrays aren't actually used anywhere in RequestFactory, but it's trivial to |
| * implement and might be useful later on. |
| */ |
| @Override |
| public String visitArray(ArrayType x, State state) { |
| return "[" + x.getComponentType().accept(this, state); |
| } |
| |
| @Override |
| public String visitDeclared(DeclaredType x, State state) { |
| return "L" |
| + BinaryName.toInternalName(state.elements.getBinaryName((TypeElement) x.asElement()) |
| .toString()) + ";"; |
| } |
| |
| /** |
| * Only generates the method descriptor, which does not include the method's |
| * name. |
| */ |
| @Override |
| public String visitExecutable(ExecutableType x, State state) { |
| StringBuilder sb = new StringBuilder(); |
| sb.append("("); |
| for (TypeMirror param : x.getParameterTypes()) { |
| sb.append(param.accept(this, state)); |
| } |
| sb.append(")"); |
| sb.append(x.getReturnType().accept(this, state)); |
| return sb.toString(); |
| } |
| |
| @Override |
| public String visitNoType(NoType x, State state) { |
| if (x.getKind().equals(TypeKind.VOID)) { |
| return "V"; |
| } |
| // The mythical NONE or PACKAGE type |
| return super.visitNoType(x, state); |
| } |
| |
| @Override |
| public String visitPrimitive(PrimitiveType x, State state) { |
| switch (x.getKind()) { |
| case BOOLEAN: |
| return String.valueOf(JniConstants.DESC_BOOLEAN); |
| case BYTE: |
| return String.valueOf(JniConstants.DESC_BYTE); |
| case CHAR: |
| return String.valueOf(JniConstants.DESC_CHAR); |
| case DOUBLE: |
| return String.valueOf(JniConstants.DESC_DOUBLE); |
| case FLOAT: |
| return String.valueOf(JniConstants.DESC_FLOAT); |
| case INT: |
| return String.valueOf(JniConstants.DESC_INT); |
| case LONG: |
| return String.valueOf(JniConstants.DESC_LONG); |
| case SHORT: |
| return String.valueOf(JniConstants.DESC_SHORT); |
| } |
| return super.visitPrimitive(x, state); |
| } |
| |
| @Override |
| public String visitTypeVariable(TypeVariable x, State state) { |
| return state.types.erasure(x).accept(this, state); |
| } |
| |
| @Override |
| public String visitWildcard(WildcardType x, State state) { |
| return state.types.erasure(x).accept(this, state); |
| } |
| |
| @Override |
| protected String defaultAction(TypeMirror x, State state) { |
| throw new RuntimeException("Unhandled type: " + x.toString()); |
| } |
| } |