| // 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.experimental.graphinfo; | 
 |  | 
 | public class GraphEdgeInfo { | 
 |  | 
 |   private static GraphEdgeInfo UNKNOWN = new GraphEdgeInfo(EdgeKind.Unknown); | 
 |  | 
 |   public static GraphEdgeInfo unknown() { | 
 |     return UNKNOWN; | 
 |   } | 
 |  | 
 |   // TODO(b/120959039): Simplify these. Most of the information is present in the source node. | 
 |   public enum EdgeKind { | 
 |     // Prioritized list of edge types. | 
 |     KeepRule, | 
 |     CompatibilityRule, | 
 |     ConditionalKeepRule, | 
 |     KeepRulePrecondition, | 
 |     InstantiatedIn, | 
 |     InvokedViaSuper, | 
 |     TargetedBySuper, | 
 |     InvokedFrom, | 
 |     InvokedFromLambdaCreatedIn, | 
 |     AnnotatedOn, | 
 |     ReferencedFrom, | 
 |     ReflectiveUseFrom, | 
 |     ReachableFromLiveType, | 
 |     ReferencedInAnnotation, | 
 |     IsLibraryMethod, | 
 |     OverridingMethod, | 
 |     MethodHandleUseFrom, | 
 |     CompanionClass, | 
 |     CompanionMethod, | 
 |     Unknown | 
 |   } | 
 |  | 
 |   private final EdgeKind kind; | 
 |  | 
 |   public GraphEdgeInfo(EdgeKind kind) { | 
 |     this.kind = kind; | 
 |   } | 
 |  | 
 |   public EdgeKind edgeKind() { | 
 |     return kind; | 
 |   } | 
 |  | 
 |   public String getInfoPrefix() { | 
 |     switch (edgeKind()) { | 
 |       case KeepRule: | 
 |       case CompatibilityRule: | 
 |       case ConditionalKeepRule: | 
 |         return "referenced in keep rule"; | 
 |       case KeepRulePrecondition: | 
 |         return "satisfied with precondition"; | 
 |       case InstantiatedIn: | 
 |         return "instantiated in"; | 
 |       case InvokedViaSuper: | 
 |         return "invoked via super from"; | 
 |       case TargetedBySuper: | 
 |         return "targeted by super from"; | 
 |       case InvokedFrom: | 
 |         return "invoked from"; | 
 |       case InvokedFromLambdaCreatedIn: | 
 |         return "invoked from lambda created in"; | 
 |       case AnnotatedOn: | 
 |         return "annotated on"; | 
 |       case ReferencedFrom: | 
 |         return "referenced from"; | 
 |       case ReflectiveUseFrom: | 
 |         return "reflected from"; | 
 |       case ReachableFromLiveType: | 
 |         return "reachable from"; | 
 |       case ReferencedInAnnotation: | 
 |         return "referenced in annotation"; | 
 |       case OverridingMethod: | 
 |         return "overriding method"; | 
 |       case IsLibraryMethod: | 
 |         // TODO(b/120959039): It would be good to also surface the defining library type. | 
 |         return "defined in library method overridden by"; | 
 |       case MethodHandleUseFrom: | 
 |         return "referenced by method handle"; | 
 |       case CompanionClass: | 
 |         return "companion class for"; | 
 |       case CompanionMethod: | 
 |         return "companion method for"; | 
 |       default: | 
 |         assert false : "Unknown edge kind: " + edgeKind(); | 
 |         // fall through | 
 |       case Unknown: | 
 |         return "kept for unknown reasons"; | 
 |     } | 
 |   } | 
 |  | 
 |   @Override | 
 |   public String toString() { | 
 |     return "{edge-type:" + kind.toString() + "}"; | 
 |   } | 
 |  | 
 |   @Override | 
 |   public boolean equals(Object o) { | 
 |     return this == o || (o instanceof GraphEdgeInfo && ((GraphEdgeInfo) o).kind == kind); | 
 |   } | 
 |  | 
 |   @Override | 
 |   public int hashCode() { | 
 |     return kind.hashCode(); | 
 |   } | 
 | } |