| // Copyright (c) 2023, 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.lens; |
| |
| import com.android.tools.r8.graph.DexField; |
| import com.android.tools.r8.graph.DexMethod; |
| import com.android.tools.r8.graph.DexType; |
| import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription; |
| import com.android.tools.r8.ir.code.InvokeType; |
| import com.android.tools.r8.utils.IterableUtils; |
| |
| final class IdentityGraphLens extends GraphLens { |
| |
| private static IdentityGraphLens INSTANCE = new IdentityGraphLens(); |
| |
| private IdentityGraphLens() {} |
| |
| static IdentityGraphLens getInstance() { |
| return INSTANCE; |
| } |
| |
| @Override |
| public boolean isIdentityLens() { |
| return true; |
| } |
| |
| @Override |
| public boolean isIdentityLensForFields(GraphLens codeLens) { |
| return true; |
| } |
| |
| @Override |
| public boolean isNonIdentityLens() { |
| return false; |
| } |
| |
| @Override |
| public Iterable<DexType> getOriginalTypes(DexType type) { |
| return IterableUtils.singleton(type); |
| } |
| |
| @Override |
| public String lookupPackageName(String pkg) { |
| return pkg; |
| } |
| |
| @Override |
| public DexType lookupType(DexType type, GraphLens applied) { |
| return type; |
| } |
| |
| @Override |
| public MethodLookupResult lookupMethod( |
| DexMethod method, DexMethod context, InvokeType type, GraphLens codeLens) { |
| assert codeLens == null || codeLens.isIdentityLens(); |
| return MethodLookupResult.builder(this, codeLens).setReference(method).setType(type).build(); |
| } |
| |
| @Override |
| public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition( |
| DexMethod method, GraphLens codeLens) { |
| return RewrittenPrototypeDescription.none(); |
| } |
| |
| @Override |
| protected FieldLookupResult internalLookupField( |
| DexField reference, GraphLens codeLens, LookupFieldContinuation continuation) { |
| // Passes the field reference back to the next graph lens. The identity lens intentionally |
| // does not set the rebound field reference, since it does not know what that is. |
| return continuation.lookupField( |
| FieldLookupResult.builder(this).setReference(reference).build()); |
| } |
| |
| @Override |
| protected MethodLookupResult internalLookupMethod( |
| DexMethod reference, |
| DexMethod context, |
| InvokeType type, |
| GraphLens codeLens, |
| LookupMethodContinuation continuation) { |
| // Passes the method reference back to the next graph lens. The identity lens intentionally |
| // does not set the rebound method reference, since it does not know what that is. |
| return continuation.lookupMethod(lookupMethod(reference, context, type, codeLens)); |
| } |
| |
| @Override |
| public boolean isContextFreeForMethods(GraphLens codeLens) { |
| return true; |
| } |
| |
| @Override |
| public boolean hasCodeRewritings() { |
| return false; |
| } |
| } |