blob: 33bf5be91d324db32da880b2c3b479c709bfb183 [file] [log] [blame]
// Copyright (c) 2024, 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.asm.KeepEdgeReader.Parent;
import com.android.tools.r8.keepanno.ast.AnnotationConstants;
import com.android.tools.r8.keepanno.ast.AnnotationConstants.Constraints;
import com.android.tools.r8.keepanno.ast.KeepConstraint;
import com.android.tools.r8.keepanno.ast.KeepConstraints;
import com.android.tools.r8.keepanno.ast.ParsingContext;
public class KeepConstraintsVisitor extends AnnotationVisitorBase {
private final Parent<KeepConstraints> parent;
private final KeepConstraints.Builder builder = KeepConstraints.builder();
public KeepConstraintsVisitor(ParsingContext parsingContext, Parent<KeepConstraints> parent) {
super(parsingContext);
this.parent = parent;
}
@Override
public void visitEnum(String ignore, String descriptor, String value) {
if (!descriptor.equals(AnnotationConstants.Constraints.DESCRIPTOR)) {
super.visitEnum(ignore, descriptor, value);
}
switch (value) {
case Constraints.LOOKUP:
builder.add(KeepConstraint.lookup());
break;
case Constraints.NAME:
builder.add(KeepConstraint.name());
break;
case Constraints.VISIBILITY_RELAX:
builder.add(KeepConstraint.visibilityRelax());
break;
case Constraints.VISIBILITY_RESTRICT:
builder.add(KeepConstraint.visibilityRestrict());
break;
case Constraints.VISIBILITY_INVARIANT:
builder.add(KeepConstraint.visibilityRelax());
builder.add(KeepConstraint.visibilityRestrict());
break;
case Constraints.CLASS_INSTANTIATE:
builder.add(KeepConstraint.classInstantiate());
break;
case Constraints.METHOD_INVOKE:
builder.add(KeepConstraint.methodInvoke());
break;
case Constraints.FIELD_GET:
builder.add(KeepConstraint.fieldGet());
break;
case Constraints.FIELD_SET:
builder.add(KeepConstraint.fieldSet());
break;
case Constraints.METHOD_REPLACE:
builder.add(KeepConstraint.methodReplace());
break;
case Constraints.FIELD_REPLACE:
builder.add(KeepConstraint.fieldReplace());
break;
case Constraints.NEVER_INLINE:
builder.add(KeepConstraint.neverInline());
break;
case Constraints.CLASS_OPEN_HIERARCHY:
builder.add(KeepConstraint.classOpenHierarchy());
break;
default:
super.visitEnum(ignore, descriptor, value);
}
}
@Override
public void visitEnd() {
parent.accept(builder.build());
super.visitEnd();
}
}