blob: 1697f4355bdf6e372044a26284d314c9862f258c [file] [log] [blame]
// Copyright (c) 2017, 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.graph;
import com.android.tools.r8.dex.Constants;
import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.function.BooleanSupplier;
public class FieldAccessFlags extends AccessFlags<FieldAccessFlags> {
private static final int FLAGS
= AccessFlags.BASE_FLAGS
| Constants.ACC_VOLATILE
| Constants.ACC_TRANSIENT
| Constants.ACC_ENUM;
@Override
protected List<String> getNames() {
return new ImmutableList.Builder<String>()
.addAll(super.getNames())
.add("volatile")
.add("transient")
.add("enum")
.build();
}
@Override
protected List<BooleanSupplier> getPredicates() {
return new ImmutableList.Builder<BooleanSupplier>()
.addAll(super.getPredicates())
.add(this::isVolatile)
.add(this::isTransient)
.add(this::isEnum)
.build();
}
private FieldAccessFlags(int flags) {
this(flags, flags);
}
private FieldAccessFlags(int originalFlags, int modifiedFlags) {
super(originalFlags, modifiedFlags);
}
public static Builder builder() {
return new Builder();
}
@Override
public FieldAccessFlags copy() {
return new FieldAccessFlags(originalFlags, modifiedFlags);
}
@Override
public FieldAccessFlags self() {
return this;
}
public static FieldAccessFlags createPublicStaticSynthetic() {
return fromSharedAccessFlags(
Constants.ACC_PUBLIC | Constants.ACC_STATIC | Constants.ACC_SYNTHETIC);
}
public static FieldAccessFlags createPublicFinalSynthetic() {
return fromSharedAccessFlags(
Constants.ACC_PUBLIC | Constants.ACC_FINAL | Constants.ACC_SYNTHETIC);
}
public static FieldAccessFlags fromSharedAccessFlags(int access) {
assert (access & FLAGS) == access;
return new FieldAccessFlags(access & FLAGS);
}
public static FieldAccessFlags fromDexAccessFlags(int access) {
return new FieldAccessFlags(access & FLAGS);
}
public static FieldAccessFlags fromCfAccessFlags(int access) {
return new FieldAccessFlags(access & FLAGS);
}
@Override
public int getAsCfAccessFlags() {
return materialize();
}
@Override
public int getAsDexAccessFlags() {
return materialize();
}
public boolean isVolatile() {
return isSet(Constants.ACC_VOLATILE);
}
public void setVolatile() {
set(Constants.ACC_VOLATILE);
}
public boolean isTransient() {
return isSet(Constants.ACC_TRANSIENT);
}
public void setTransient() {
set(Constants.ACC_TRANSIENT);
}
public boolean isEnum() {
return isSet(Constants.ACC_ENUM);
}
public void setEnum() {
set(Constants.ACC_ENUM);
}
public static class Builder extends BuilderBase<Builder, FieldAccessFlags> {
public Builder() {
super(FieldAccessFlags.fromSharedAccessFlags(0));
}
@Override
public Builder self() {
return this;
}
}
}