/* * Copyright 2010-2015 JetBrains s.r.o. * * 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 kotlin.jvm.internal; import kotlin.Function; import kotlin.jvm.functions.*; import kotlin.jvm.internal.markers.*; import java.util.*; @SuppressWarnings({"unused", "WeakerAccess"}) public class TypeIntrinsics { private static <T extends Throwable> T sanitizeStackTrace(T throwable) { return Intrinsics.sanitizeStackTrace(throwable, TypeIntrinsics.class.getName()); } public static void throwCce(Object argument, String requestedClassName) { String argumentClassName = argument == null ? "null" : argument.getClass().getName(); throwCce(argumentClassName + " cannot be cast to " + requestedClassName); } public static void throwCce(String message) { throw throwCce(new ClassCastException(message)); } public static ClassCastException throwCce(ClassCastException e) { throw sanitizeStackTrace(e); } public static boolean isMutableIterator(Object obj) { return obj instanceof Iterator && (!(obj instanceof KMappedMarker) || obj instanceof KMutableIterator); } public static Iterator asMutableIterator(Object obj) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableIterator)) { throwCce(obj, "kotlin.collections.MutableIterator"); } return castToIterator(obj); } public static Iterator asMutableIterator(Object obj, String message) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableIterator)) { throwCce(message); } return castToIterator(obj); } public static Iterator castToIterator(Object obj) { try { return (Iterator) obj; } catch (ClassCastException e) { throw throwCce(e); } } public static boolean isMutableListIterator(Object obj) { return obj instanceof ListIterator && (!(obj instanceof KMappedMarker) || obj instanceof KMutableListIterator); } public static ListIterator asMutableListIterator(Object obj) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableListIterator)) { throwCce(obj, "kotlin.collections.MutableListIterator"); } return castToListIterator(obj); } public static ListIterator asMutableListIterator(Object obj, String message) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableListIterator)) { throwCce(message); } return castToListIterator(obj); } public static ListIterator castToListIterator(Object obj) { try { return (ListIterator) obj; } catch (ClassCastException e) { throw throwCce(e); } } public static boolean isMutableIterable(Object obj) { return obj instanceof Iterable && (!(obj instanceof KMappedMarker) || obj instanceof KMutableIterable); } public static Iterable asMutableIterable(Object obj) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableIterable)) { throwCce(obj, "kotlin.collections.MutableIterable"); } return castToIterable(obj); } public static Iterable asMutableIterable(Object obj, String message) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableIterable)) { throwCce(message); } return castToIterable(obj); } public static Iterable castToIterable(Object obj) { try { return (Iterable) obj; } catch (ClassCastException e) { throw throwCce(e); } } public static boolean isMutableCollection(Object obj) { return obj instanceof Collection && (!(obj instanceof KMappedMarker) || obj instanceof KMutableCollection); } public static Collection asMutableCollection(Object obj) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableCollection)) { throwCce(obj, "kotlin.collections.MutableCollection"); } return castToCollection(obj); } public static Collection asMutableCollection(Object obj, String message) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableCollection)) { throwCce(message); } return castToCollection(obj); } public static Collection castToCollection(Object obj) { try { return (Collection) obj; } catch (ClassCastException e) { throw throwCce(e); } } public static boolean isMutableList(Object obj) { return obj instanceof List && (!(obj instanceof KMappedMarker) || obj instanceof KMutableList); } public static List asMutableList(Object obj) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableList)) { throwCce(obj, "kotlin.collections.MutableList"); } return castToList(obj); } public static List asMutableList(Object obj, String message) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableList)) { throwCce(message); } return castToList(obj); } public static List castToList(Object obj) { try { return (List) obj; } catch (ClassCastException e) { throw throwCce(e); } } public static boolean isMutableSet(Object obj) { return obj instanceof Set && (!(obj instanceof KMappedMarker) || obj instanceof KMutableSet); } public static Set asMutableSet(Object obj) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableSet)) { throwCce(obj, "kotlin.collections.MutableSet"); } return castToSet(obj); } public static Set asMutableSet(Object obj, String message) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableSet)) { throwCce(message); } return castToSet(obj); } public static Set castToSet(Object obj) { try { return (Set) obj; } catch (ClassCastException e) { throw throwCce(e); } } public static boolean isMutableMap(Object obj) { return obj instanceof Map && (!(obj instanceof KMappedMarker) || obj instanceof KMutableMap); } public static Map asMutableMap(Object obj) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableMap)) { throwCce(obj, "kotlin.collections.MutableMap"); } return castToMap(obj); } public static Map asMutableMap(Object obj, String message) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableMap)) { throwCce(message); } return castToMap(obj); } public static Map castToMap(Object obj) { try { return (Map) obj; } catch (ClassCastException e) { throw throwCce(e); } } public static boolean isMutableMapEntry(Object obj) { return obj instanceof Map.Entry && (!(obj instanceof KMappedMarker) || obj instanceof KMutableMap.Entry); } public static Map.Entry asMutableMapEntry(Object obj) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableMap.Entry)) { throwCce(obj, "kotlin.collections.MutableMap.MutableEntry"); } return castToMapEntry(obj); } public static Map.Entry asMutableMapEntry(Object obj, String message) { if (obj instanceof KMappedMarker && !(obj instanceof KMutableMap.Entry)) { throwCce(message); } return castToMapEntry(obj); } public static Map.Entry castToMapEntry(Object obj) { try { return (Map.Entry) obj; } catch (ClassCastException e) { throw throwCce(e); } } public static int getFunctionArity(Object obj) { if (obj instanceof FunctionBase) { return ((FunctionBase) obj).getArity(); } else if (obj instanceof Function0) { return 0; } else if (obj instanceof Function1) { return 1; } else if (obj instanceof Function2) { return 2; } else if (obj instanceof Function3) { return 3; } else if (obj instanceof Function4) { return 4; } else if (obj instanceof Function5) { return 5; } else if (obj instanceof Function6) { return 6; } else if (obj instanceof Function7) { return 7; } else if (obj instanceof Function8) { return 8; } else if (obj instanceof Function9) { return 9; } else if (obj instanceof Function10) { return 10; } else if (obj instanceof Function11) { return 11; } else if (obj instanceof Function12) { return 12; } else if (obj instanceof Function13) { return 13; } else if (obj instanceof Function14) { return 14; } else if (obj instanceof Function15) { return 15; } else if (obj instanceof Function16) { return 16; } else if (obj instanceof Function17) { return 17; } else if (obj instanceof Function18) { return 18; } else if (obj instanceof Function19) { return 19; } else if (obj instanceof Function20) { return 20; } else if (obj instanceof Function21) { return 21; } else if (obj instanceof Function22) { return 22; } else { return -1; } } public static boolean isFunctionOfArity(Object obj, int arity) { return obj instanceof Function && getFunctionArity(obj) == arity; } public static Object beforeCheckcastToFunctionOfArity(Object obj, int arity) { // TODO should we instead inline bytecode for this in TypeIntrinsics.kt? if (obj != null && !isFunctionOfArity(obj, arity)) { throwCce(obj, "kotlin.jvm.functions.Function" + arity); } return obj; } public static Object beforeCheckcastToFunctionOfArity(Object obj, int arity, String message) { if (obj != null && !isFunctionOfArity(obj, arity)) { throwCce(message); } return obj; } }