github.com/bytedance/mockey@v1.2.10/mock_generics.go (about) 1 /* 2 * Copyright 2022 ByteDance Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package mockey 18 19 import ( 20 "reflect" 21 "unsafe" 22 ) 23 24 // MockGeneric mocks generic function 25 // 26 // Target must be generic method or method of generic types 27 func MockGeneric(target interface{}) *MockBuilder { 28 return Mock(target, OptGeneric) 29 } 30 31 type GenericInfo uintptr 32 33 var genericInfoType = reflect.TypeOf(GenericInfo(0)) 34 35 func (g GenericInfo) Equal(other GenericInfo) bool { 36 return g == other 37 } 38 39 // UsedParamType get the type of used parameter in generic function/struct 40 // 41 // For example: assume we have generic function "f[int, float64](x int, y T1) T2" and derived type f[int, float64]: 42 // 43 // UsedParamType(0) == reflect.TypeOf(int(0)) 44 // UsedParamType(1) == reflect.TypeOf(float64(0)) 45 // 46 // If index n is out of range, or the derived types have more complex structure(for example: define an generic struct 47 // in a generic function using generic types, unused parameterized type etc.), this function may return unexpected value 48 // or cause unrecoverable runtime error . So it is NOT RECOMMENDED to use this function unless you actually knows what 49 // you are doing. 50 func (g GenericInfo) UsedParamType(n uintptr) reflect.Type { 51 var vt interface{} 52 *(*uintptr)(unsafe.Pointer(&vt)) = *(*uintptr)(unsafe.Pointer(uintptr(g) + 8*n)) 53 return reflect.TypeOf(vt) 54 }