| // Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| package com.android.tools.r8.keepanno.asm; |
| |
| import com.android.tools.r8.keepanno.ast.KeepEdgeException; |
| import com.android.tools.r8.keepanno.ast.KeepMethodReturnTypePattern; |
| import com.android.tools.r8.keepanno.ast.KeepTypePattern; |
| |
| /** |
| * Utilities for mapping the syntax used in annotations to the keep-edge AST. |
| * |
| * <p>The AST explicitly avoids interpreting type strings as they are potentially ambiguous. These |
| * utilities define the mappings from such syntax strings into the AST. |
| */ |
| public class KeepEdgeReaderUtils { |
| |
| public static KeepTypePattern typePatternFromString(String string) { |
| if (string.equals("<any>")) { |
| return KeepTypePattern.any(); |
| } |
| return KeepTypePattern.fromDescriptor(javaTypeToDescriptor(string)); |
| } |
| |
| public static String javaTypeToDescriptor(String type) { |
| switch (type) { |
| case "boolean": |
| return "Z"; |
| case "byte": |
| return "B"; |
| case "short": |
| return "S"; |
| case "int": |
| return "I"; |
| case "long": |
| return "J"; |
| case "float": |
| return "F"; |
| case "double": |
| return "D"; |
| default: |
| { |
| StringBuilder builder = new StringBuilder(type.length()); |
| int i = type.length() - 1; |
| while (type.charAt(i) == ']') { |
| if (type.charAt(--i) != '[') { |
| throw new KeepEdgeException("Invalid type: " + type); |
| } |
| builder.append('['); |
| --i; |
| } |
| builder.append('L'); |
| for (int j = 0; j <= i; j++) { |
| char c = type.charAt(j); |
| builder.append(c == '.' ? '/' : c); |
| } |
| builder.append(';'); |
| return builder.toString(); |
| } |
| } |
| } |
| |
| public static KeepMethodReturnTypePattern methodReturnTypeFromString(String returnType) { |
| if ("void".equals(returnType)) { |
| return KeepMethodReturnTypePattern.voidType(); |
| } |
| return KeepMethodReturnTypePattern.fromType(typePatternFromString(returnType)); |
| } |
| } |