| // Copyright (c) 2020, 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.tracereferences; | |
| import com.android.tools.r8.references.MethodReference; | |
| import com.android.tools.r8.tracereferences.TraceReferencesConsumer.TracedClass; | |
| import com.android.tools.r8.tracereferences.TraceReferencesConsumer.TracedField; | |
| import com.android.tools.r8.tracereferences.TraceReferencesConsumer.TracedMethod; | |
| import com.android.tools.r8.utils.StringUtils; | |
| import java.util.List; | |
| class KeepRuleFormatter extends Formatter { | |
| final boolean allowObfuscation; | |
| KeepRuleFormatter(boolean allowObfuscation) { | |
| this.allowObfuscation = allowObfuscation; | |
| } | |
| @Override | |
| protected void printTypeHeader(TracedClass tracedClass) { | |
| if (tracedClass.isMissingDefinition()) { | |
| appendLine("# Missing class: " + tracedClass.getReference().getTypeName()); | |
| return; | |
| } | |
| append(allowObfuscation ? "-keep,allowobfuscation" : "-keep"); | |
| if (tracedClass.getAccessFlags().isInterface()) { | |
| appendLine(" interface " + tracedClass.getReference().getTypeName() + " {"); | |
| } else if (tracedClass.getAccessFlags().isEnum()) { | |
| appendLine(" enum " + tracedClass.getReference().getTypeName() + " {"); | |
| } else { | |
| appendLine(" class " + tracedClass.getReference().getTypeName() + " {"); | |
| } | |
| } | |
| @Override | |
| protected void printConstructorName(MethodReference method) { | |
| append("<init>"); | |
| } | |
| @Override | |
| protected void printField(TracedField field) { | |
| append( | |
| " " | |
| + field.getReference().getFieldType().getTypeName() | |
| + " " | |
| + field.getReference().getFieldName() | |
| + ";" | |
| + System.lineSeparator()); | |
| } | |
| @Override | |
| protected void printMethod(TracedMethod tracedMethod) { | |
| if (tracedMethod.getReference().getMethodName().equals("<clinit>")) { | |
| return; | |
| } | |
| append(" "); | |
| if (tracedMethod.getAccessFlags().isPublic()) { | |
| append("public "); | |
| } else if (tracedMethod.getAccessFlags().isPrivate()) { | |
| append("private "); | |
| } else if (tracedMethod.getAccessFlags().isProtected()) { | |
| append("protected "); | |
| } | |
| if (tracedMethod.getAccessFlags().isStatic()) { | |
| append("static "); | |
| } | |
| printNameAndReturn(tracedMethod.getReference()); | |
| printArguments(tracedMethod.getReference()); | |
| appendLine(";"); | |
| } | |
| @Override | |
| protected void printPackageNames(List<String> packageNames) { | |
| if (!packageNames.isEmpty()) { | |
| append("-keeppackagenames " + StringUtils.join(",", packageNames) + System.lineSeparator()); | |
| } | |
| } | |
| @Override | |
| protected void printTypeFooter() { | |
| appendLine("}"); | |
| } | |
| } |