| // Copyright (c) 2018, 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 java.util.function.Function; | 
 | import java.util.function.Predicate; | 
 | import java.util.stream.Stream; | 
 |  | 
 | /** | 
 |  * A common interface for {@link DexClass}, {@link DexEncodedField}, and {@link DexEncodedMethod}. | 
 |  */ | 
 | public abstract class DexDefinition extends DexItem { | 
 |  | 
 |   @Override | 
 |   public boolean isDexDefinition() { | 
 |     return true; | 
 |   } | 
 |  | 
 |   @Override | 
 |   public DexDefinition asDexDefinition() { | 
 |     return this; | 
 |   } | 
 |  | 
 |   public boolean isDexClass() { | 
 |     return false; | 
 |   } | 
 |  | 
 |   public DexClass asDexClass() { | 
 |     return null; | 
 |   } | 
 |  | 
 |   public boolean isDexEncodedField() { | 
 |     return false; | 
 |   } | 
 |  | 
 |   public DexEncodedField asDexEncodedField() { | 
 |     return null; | 
 |   } | 
 |  | 
 |   public boolean isDexEncodedMethod() { | 
 |     return false; | 
 |   } | 
 |  | 
 |   public DexEncodedMethod asDexEncodedMethod() { | 
 |     return null; | 
 |   } | 
 |  | 
 |   public static Stream<DexDefinition> filterDexDefinition(Stream<DexItem> stream) { | 
 |     return DexItem.filter(stream, DexDefinition.class); | 
 |   } | 
 |  | 
 |   public abstract DexReference toReference(); | 
 |  | 
 |   public static Stream<DexReference> mapToReference(Stream<DexDefinition> definitions) { | 
 |     return definitions.map(DexDefinition::toReference); | 
 |   } | 
 |  | 
 |   private static <T extends DexDefinition> Stream<T> filter( | 
 |       Stream<DexDefinition> stream, | 
 |       Predicate<DexDefinition> pred, | 
 |       Function<DexDefinition, T> f) { | 
 |     return stream.filter(pred).map(f); | 
 |   } | 
 |  | 
 |   public static Stream<DexClass> filterDexClass(Stream<DexDefinition> stream) { | 
 |     return filter(stream, DexDefinition::isDexClass, DexDefinition::asDexClass); | 
 |   } | 
 |  | 
 |   public static Stream<DexEncodedField> filterDexEncodedField(Stream<DexDefinition> stream) { | 
 |     return filter(stream, DexDefinition::isDexEncodedField, DexDefinition::asDexEncodedField); | 
 |   } | 
 |  | 
 |   public static Stream<DexEncodedMethod> filterDexEncodedMethod(Stream<DexDefinition> stream) { | 
 |     return filter(stream, DexDefinition::isDexEncodedMethod, DexDefinition::asDexEncodedMethod); | 
 |   } | 
 |  | 
 |   public abstract boolean isStatic(); | 
 |  | 
 |   public abstract boolean isStaticMember(); | 
 | } |