/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package getters;

import resolved.PublicSubclassOfUnresolvedClass;
import unresolved.UnresolvedPublicClass;
import unresolved.UnresolvedPublicClazz;

public class GetUnresolvedPublicClassFromDifferentDexFile {
  // TODO: Make $inline$ when we relax the verifier. b/28313047
  public static Class<?> get() {
    return UnresolvedPublicClass.class;
  }

  // TODO: Make $inline$ when we relax the verifier. b/28313047
  public static Class<?> getOtherClass() {
    return PublicSubclassOfUnresolvedClass.class;
  }

  // TODO: Make $inline$ when we relax the verifier. b/28313047
  public static Class<?> getOtherClassWithSameDescriptorLength() {
    return UnresolvedPublicClazz.class;
  }
}
