blob: 3bb712ea80411e5b90db1cf82faa76c12804fce6 [file] [log] [blame]
// Copyright (c) 2024, 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.kotlin;
import java.util.HashMap;
import java.util.Map;
import kotlin.metadata.Attributes;
import kotlin.metadata.KmClass;
import kotlin.metadata.KmConstructor;
import kotlin.metadata.KmEffectExpression;
import kotlin.metadata.KmFunction;
import kotlin.metadata.KmProperty;
import kotlin.metadata.KmPropertyAccessorAttributes;
import kotlin.metadata.KmType;
import kotlin.metadata.KmTypeAlias;
import kotlin.metadata.KmTypeParameter;
import kotlin.metadata.KmValueParameter;
import kotlin.metadata.jvm.JvmAttributes;
public class KotlinFlagUtils {
private static final String ANNOTATIONS_KEY = "hasAnnotations";
private static final String VISIBILITY_KEY = "visibility";
private static final String MODALITY_KEY = "modality";
private static final String KIND_KEY = "kind";
private static final String INNER_KEY = "inner";
private static final String DATA_KEY = "data";
private static final String VALUE_KEY = "value";
private static final String FUN_INTERFACE_KEY = "funInterface";
private static final String ENUM_ENTRIES_KEY = "enumEntries";
private static final String VAR_KEY = "var";
private static final String CONST_KEY = "const";
private static final String LATE_INIT_KEY = "lateInit";
private static final String CONSTANT_KEY = "hasConstant";
private static final String EXTERNAL_KEY = "external";
private static final String DELEGATED_KEY = "delegated";
private static final String EXPECT_KEY = "expect";
private static final String NOT_DEFAULT_KEY = "notDefault";
private static final String INLINE_KEY = "inline";
private static final String SECONDARY_KEY = "secondary";
private static final String NON_STABLE_PARAMETER_NAMES_KEY = "nonStableParameterNames";
private static final String NEGATED_KEY = "negated";
private static final String NULL_CHECK_PREDICATE_KEY = "nullCheckPredicate";
private static final String OPERATOR_KEY = "operator";
private static final String INFIX_KEY = "infix";
private static final String TAIL_REC_KEY = "tailRec";
private static final String SUSPEND_KEY = "suspend";
private static final String NULLABLE_KEY = "nullable";
private static final String DEFINITELY_NON_NULL_KEY = "definitelyNonNull";
private static final String DECLARES_DEFAULT_VALUE_KEY = "declaresDefaultValue";
private static final String CROSS_INLINE_KEY = "crossInline";
private static final String NO_INLINE_KEY = "noInline";
public static final String REIFIED_KEY = "reified";
public static Map<String, Object> extractFlags(KmProperty src) {
Map<String, Object> map = new HashMap<>();
map.put(ANNOTATIONS_KEY, Attributes.getHasAnnotations(src));
map.put(VISIBILITY_KEY, Attributes.getVisibility(src));
map.put(MODALITY_KEY, Attributes.getModality(src));
map.put(KIND_KEY, Attributes.getKind(src));
map.put(VAR_KEY, Attributes.isVar(src));
map.put(CONST_KEY, Attributes.isConst(src));
map.put(LATE_INIT_KEY, Attributes.isLateinit(src));
map.put(CONSTANT_KEY, Attributes.getHasConstant(src));
map.put(EXTERNAL_KEY, Attributes.isExternal(src));
map.put(DELEGATED_KEY, Attributes.isDelegated(src));
map.put(EXPECT_KEY, Attributes.isExpect(src));
map.put("movedFromInterfaceCompanion", JvmAttributes.isMovedFromInterfaceCompanion(src));
return map;
}
static void copyAllFlags(KmProperty src, KmProperty dest) {
Attributes.setHasAnnotations(dest, Attributes.getHasAnnotations(src));
Attributes.setVisibility(dest, Attributes.getVisibility(src));
Attributes.setModality(dest, Attributes.getModality(src));
Attributes.setKind(dest, Attributes.getKind(src));
Attributes.setVar(dest, Attributes.isVar(src));
Attributes.setConst(dest, Attributes.isConst(src));
Attributes.setLateinit(dest, Attributes.isLateinit(src));
Attributes.setHasConstant(dest, Attributes.getHasConstant(src));
Attributes.setExternal(dest, Attributes.isExternal(src));
Attributes.setDelegated(dest, Attributes.isDelegated(src));
Attributes.setExpect(dest, Attributes.isExpect(src));
JvmAttributes.setMovedFromInterfaceCompanion(
dest, JvmAttributes.isMovedFromInterfaceCompanion(src));
}
public static Map<String, Object> extractFlags(KmType src) {
Map<String, Object> map = new HashMap<>();
map.put(NULLABLE_KEY, Attributes.isNullable(src));
map.put(SUSPEND_KEY, Attributes.isSuspend(src));
map.put(DEFINITELY_NON_NULL_KEY, Attributes.isDefinitelyNonNull(src));
return map;
}
static void copyAllFlags(KmType src, KmType dest) {
Attributes.setNullable(dest, Attributes.isNullable(src));
Attributes.setSuspend(dest, Attributes.isSuspend(src));
Attributes.setDefinitelyNonNull(dest, Attributes.isDefinitelyNonNull(src));
}
public static Map<String, Object> extractFlags(KmPropertyAccessorAttributes src) {
Map<String, Object> map = new HashMap<>();
map.put(ANNOTATIONS_KEY, Attributes.getHasAnnotations(src));
map.put(VISIBILITY_KEY, Attributes.getVisibility(src));
map.put(MODALITY_KEY, Attributes.getModality(src));
map.put(NOT_DEFAULT_KEY, Attributes.isNotDefault(src));
map.put(EXTERNAL_KEY, Attributes.isExternal(src));
map.put(INLINE_KEY, Attributes.isInline(src));
return map;
}
static void copyAllFlags(KmPropertyAccessorAttributes src, KmPropertyAccessorAttributes dest) {
Attributes.setHasAnnotations(dest, Attributes.getHasAnnotations(src));
Attributes.setVisibility(dest, Attributes.getVisibility(src));
Attributes.setModality(dest, Attributes.getModality(src));
Attributes.setNotDefault(dest, Attributes.isNotDefault(src));
Attributes.setExternal(dest, Attributes.isExternal(src));
Attributes.setInline(dest, Attributes.isInline(src));
}
public static Map<String, Object> extractFlags(KmClass src) {
Map<String, Object> map = new HashMap<>();
map.put(ANNOTATIONS_KEY, Attributes.getHasAnnotations(src));
map.put(VISIBILITY_KEY, Attributes.getVisibility(src));
map.put(MODALITY_KEY, Attributes.getModality(src));
map.put(KIND_KEY, Attributes.getKind(src));
map.put(INNER_KEY, Attributes.isInner(src));
map.put(DATA_KEY, Attributes.isData(src));
map.put(EXTERNAL_KEY, Attributes.isExternal(src));
map.put(EXPECT_KEY, Attributes.isExpect(src));
map.put(VALUE_KEY, Attributes.isValue(src));
map.put(FUN_INTERFACE_KEY, Attributes.isFunInterface(src));
map.put(ENUM_ENTRIES_KEY, Attributes.getHasEnumEntries(src));
map.put("compiledInCompatibilityMode", JvmAttributes.isCompiledInCompatibilityMode(src));
map.put("hasMethodBodiesInInterface", JvmAttributes.getHasMethodBodiesInInterface(src));
return map;
}
static void copyAllFlags(KmClass src, KmClass dest) {
Attributes.setHasAnnotations(dest, Attributes.getHasAnnotations(src));
Attributes.setVisibility(dest, Attributes.getVisibility(src));
Attributes.setModality(dest, Attributes.getModality(src));
Attributes.setKind(dest, Attributes.getKind(src));
Attributes.setInner(dest, Attributes.isInner(src));
Attributes.setData(dest, Attributes.isData(src));
Attributes.setExternal(dest, Attributes.isExternal(src));
Attributes.setExpect(dest, Attributes.isExpect(src));
Attributes.setValue(dest, Attributes.isValue(src));
Attributes.setFunInterface(dest, Attributes.isFunInterface(src));
Attributes.setHasEnumEntries(dest, Attributes.getHasEnumEntries(src));
JvmAttributes.setCompiledInCompatibilityMode(
dest, JvmAttributes.isCompiledInCompatibilityMode(src));
JvmAttributes.setHasMethodBodiesInInterface(
dest, JvmAttributes.getHasMethodBodiesInInterface(src));
}
public static Map<String, Object> extractFlags(KmConstructor src) {
Map<String, Object> map = new HashMap<>();
map.put(ANNOTATIONS_KEY, Attributes.getHasAnnotations(src));
map.put(VISIBILITY_KEY, Attributes.getVisibility(src));
map.put(SECONDARY_KEY, Attributes.isSecondary(src));
map.put(NON_STABLE_PARAMETER_NAMES_KEY, Attributes.getHasNonStableParameterNames(src));
return map;
}
static void copyAllFlags(KmConstructor src, KmConstructor dest) {
Attributes.setHasAnnotations(dest, Attributes.getHasAnnotations(src));
Attributes.setVisibility(dest, Attributes.getVisibility(src));
Attributes.setSecondary(dest, Attributes.isSecondary(src));
Attributes.setHasNonStableParameterNames(dest, Attributes.getHasNonStableParameterNames(src));
}
public static Map<String, Object> extractFlags(KmFunction src) {
Map<String, Object> map = new HashMap<>();
map.put(ANNOTATIONS_KEY, Attributes.getHasAnnotations(src));
map.put(KIND_KEY, Attributes.getKind(src));
map.put(MODALITY_KEY, Attributes.getModality(src));
map.put(OPERATOR_KEY, Attributes.isOperator(src));
map.put(INFIX_KEY, Attributes.isInfix(src));
map.put(INLINE_KEY, Attributes.isInline(src));
map.put(TAIL_REC_KEY, Attributes.isTailrec(src));
map.put(EXTERNAL_KEY, Attributes.isExternal(src));
map.put(SUSPEND_KEY, Attributes.isSuspend(src));
map.put(EXPECT_KEY, Attributes.isExpect(src));
map.put(VISIBILITY_KEY, Attributes.getVisibility(src));
map.put(NON_STABLE_PARAMETER_NAMES_KEY, Attributes.getHasNonStableParameterNames(src));
return map;
}
static void copyAllFlags(KmFunction src, KmFunction dest) {
Attributes.setHasAnnotations(dest, Attributes.getHasAnnotations(src));
Attributes.setKind(dest, Attributes.getKind(src));
Attributes.setModality(dest, Attributes.getModality(src));
Attributes.setOperator(dest, Attributes.isOperator(src));
Attributes.setInfix(dest, Attributes.isInfix(src));
Attributes.setInline(dest, Attributes.isInline(src));
Attributes.setTailrec(dest, Attributes.isTailrec(src));
Attributes.setExternal(dest, Attributes.isExternal(src));
Attributes.setSuspend(dest, Attributes.isSuspend(src));
Attributes.setExpect(dest, Attributes.isExpect(src));
Attributes.setVisibility(dest, Attributes.getVisibility(src));
Attributes.setHasNonStableParameterNames(dest, Attributes.getHasNonStableParameterNames(src));
}
public static Map<String, Object> extractFlags(KmEffectExpression src) {
Map<String, Object> map = new HashMap<>();
map.put(NEGATED_KEY, Attributes.isNegated(src));
map.put(NULL_CHECK_PREDICATE_KEY, Attributes.isNullCheckPredicate(src));
return map;
}
static void copyAllFlags(KmEffectExpression src, KmEffectExpression dest) {
Attributes.setNegated(dest, Attributes.isNegated(src));
Attributes.setNullCheckPredicate(dest, Attributes.isNullCheckPredicate(src));
}
public static Map<String, Object> extractFlags(KmTypeAlias src) {
Map<String, Object> map = new HashMap<>();
map.put(ANNOTATIONS_KEY, Attributes.getHasAnnotations(src));
map.put(VISIBILITY_KEY, Attributes.getVisibility(src));
return map;
}
static void copyAllFlags(KmTypeAlias src, KmTypeAlias dest) {
Attributes.setHasAnnotations(dest, Attributes.getHasAnnotations(src));
Attributes.setVisibility(dest, Attributes.getVisibility(src));
}
public static Map<String, Object> extractFlags(KmValueParameter src) {
Map<String, Object> map = new HashMap<>();
map.put(ANNOTATIONS_KEY, Attributes.getHasAnnotations(src));
map.put(DECLARES_DEFAULT_VALUE_KEY, Attributes.getDeclaresDefaultValue(src));
map.put(CROSS_INLINE_KEY, Attributes.isCrossinline(src));
map.put(NO_INLINE_KEY, Attributes.isNoinline(src));
return map;
}
static void copyAllFlags(KmValueParameter src, KmValueParameter dest) {
Attributes.setHasAnnotations(dest, Attributes.getHasAnnotations(src));
Attributes.setDeclaresDefaultValue(dest, Attributes.getDeclaresDefaultValue(src));
Attributes.setCrossinline(dest, Attributes.isCrossinline(src));
Attributes.setNoinline(dest, Attributes.isNoinline(src));
}
public static Map<String, Object> extractFlags(KmTypeParameter src) {
Map<String, Object> map = new HashMap<>();
map.put(REIFIED_KEY, Attributes.isReified(src));
return map;
}
static void copyAllFlags(KmTypeParameter src, KmTypeParameter dest) {
Attributes.setReified(dest, Attributes.isReified(src));
}
}