| // Copyright (c) 2019, 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.utils.collections.ProgramMethodSet; | 
 | import java.util.function.BiConsumer; | 
 | import java.util.function.Consumer; | 
 | import java.util.function.Predicate; | 
 |  | 
 | /** Provides immutable access to {@link FieldAccessInfoImpl}. */ | 
 | public interface FieldAccessInfo { | 
 |  | 
 |   FieldAccessInfoImpl asMutable(); | 
 |  | 
 |   DexField getField(); | 
 |  | 
 |   int getNumberOfReadContexts(); | 
 |  | 
 |   int getNumberOfWriteContexts(); | 
 |  | 
 |   AbstractAccessContexts getReadsWithContexts(); | 
 |  | 
 |   AbstractAccessContexts getWritesWithContexts(); | 
 |  | 
 |   ProgramMethod getUniqueReadContext(); | 
 |  | 
 |   boolean hasKnownReadContexts(); | 
 |  | 
 |   boolean hasKnownWriteContexts(); | 
 |  | 
 |   void forEachIndirectAccess(Consumer<DexField> consumer); | 
 |  | 
 |   void forEachIndirectAccessWithContexts(BiConsumer<DexField, ProgramMethodSet> consumer); | 
 |  | 
 |   void forEachAccessContext(Consumer<ProgramMethod> consumer); | 
 |  | 
 |   void forEachReadContext(Consumer<ProgramMethod> consumer); | 
 |  | 
 |   void forEachWriteContext(Consumer<ProgramMethod> consumer); | 
 |  | 
 |   boolean hasReflectiveAccess(); | 
 |  | 
 |   boolean hasReflectiveRead(); | 
 |  | 
 |   boolean hasReflectiveWrite(); | 
 |  | 
 |   default boolean isAccessedFromMethodHandle() { | 
 |     return isReadFromMethodHandle() || isWrittenFromMethodHandle(); | 
 |   } | 
 |  | 
 |   boolean isRead(); | 
 |  | 
 |   boolean isReadFromAnnotation(); | 
 |  | 
 |   boolean isReadFromRecordInvokeDynamic(); | 
 |  | 
 |   boolean isReadFromMethodHandle(); | 
 |  | 
 |   boolean isReadOnlyInMethodSatisfying(Predicate<ProgramMethod> predicate); | 
 |  | 
 |   boolean isWritten(); | 
 |  | 
 |   boolean isWrittenFromMethodHandle(); | 
 |  | 
 |   boolean isWrittenInMethodSatisfying(Predicate<ProgramMethod> predicate); | 
 |  | 
 |   boolean isWrittenOnlyInMethodSatisfying(Predicate<ProgramMethod> predicate); | 
 |  | 
 |   boolean isWrittenOutside(DexEncodedMethod method); | 
 | } |