1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4//*****************************************************************************
5// ImportHelper.h
6//
7
8//
9// contains utility code to MD directory
10//
11//*****************************************************************************
12#ifndef __IMPORTHELPER__h__
13#define __IMPORTHELPER__h__
14
15class CMiniMdRW;
16class MDTOKENMAP;
17
18//*********************************************************************
19// Class to handle merge
20//*********************************************************************
21class ImportHelper
22{
23public:
24 // Options for code:FindMemberRef.
25 enum HashSearchOption
26 {
27 DoNotCreateHash, // Do not create hash if it does not exist (faster for isolated calls)
28 CreateHash // Create hash if it does not exist (faster for multiple calls)
29 };
30
31
32 static HRESULT FindMethodSpecByMethodAndInstantiation(
33 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
34 /*mdMethodDefOrRef*/ mdToken tkMethod, // [IN] MethodSpec method field
35 PCCOR_SIGNATURE pInstantiation, // [IN] MethodSpec instantiation (a signature)
36 ULONG cbInstantiation, // [IN] Size of instantiation.
37 mdMethodSpec *pMethodSpec, // [OUT] Put the MethodSpec token here.
38 RID rid = 0); // [IN] Optional rid to be ignored.
39
40
41 static HRESULT FindGenericParamConstraintByOwnerAndConstraint(
42 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
43 mdGenericParam tkOwner, // [IN] GenericParamConstraint Owner
44 mdToken tkConstraint, // [IN] GenericParamConstraint Constraint
45 mdGenericParamConstraint *pGenericParamConstraint, // [OUT] Put the GenericParamConstraint token here.
46 RID rid = 0); // [IN] Optional rid to be ignored.
47
48
49 static HRESULT FindGenericParamByOwner(
50 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
51 mdToken tkOwner, // [IN] GenericParam Owner
52 LPCUTF8 szUTF8Name, // [IN] GeneriParam Name, may be NULL if not used for search
53 ULONG *pNumber, // [IN] GeneriParam Number, may be NULL if not used for search
54 mdGenericParam *pGenericParam, // [OUT] Put the GenericParam token here.
55 RID rid = 0); // [IN] Optional rid to be ignored.
56
57 static HRESULT FindMethod(
58 CMiniMdRW * pMiniMd, // [IN] the minimd to lookup
59 mdTypeDef td, // [IN] parent.
60 LPCUTF8 szName, // [IN] MethodDef name.
61 PCCOR_SIGNATURE pSig, // [IN] Signature.
62 ULONG cbSig, // [IN] Size of signature.
63 mdMethodDef * pmb, // [OUT] Put the MethodDef token here.
64 RID rid = 0, // [IN] Optional rid to be ignored.
65 PSIGCOMPARE pSignatureCompare = NULL, // [IN] Optional Routine to compare signatures
66 void * pCompareContext = NULL); // [IN] Optional context for the compare function
67
68 static HRESULT FindField(
69 CMiniMdRW * pMiniMd, // [IN] the minimd to lookup
70 mdTypeDef td, // [IN] parent.
71 LPCUTF8 szName, // [IN] FieldDef name.
72 PCCOR_SIGNATURE pSig, // [IN] Signature.
73 ULONG cbSig, // [IN] Size of signature.
74 mdFieldDef * pfd, // [OUT] Put the FieldDef token here.
75 RID rid = 0); // [IN] Optional rid to be ignored.
76
77 static HRESULT FindMember(
78 CMiniMdRW * pMiniMd, // [IN] the minimd to lookup
79 mdTypeDef td, // [IN] parent.
80 LPCUTF8 szName, // [IN] Member name.
81 PCCOR_SIGNATURE pSig, // [IN] Signature.
82 ULONG cbSig, // [IN] Size of signature.
83 mdToken * ptk); // [OUT] Put the token here.
84
85 static HRESULT FindMemberRef(
86 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
87 mdToken tkParent, // [IN] the parent token
88 LPCUTF8 szName, // [IN] memberref name
89 const COR_SIGNATURE *pSig, // [IN] Signature.
90 ULONG cbSig, // [IN] Size of signature.
91 mdMemberRef *pmr, // [OUT] Put the MemberRef token found
92 RID rid = 0, // [IN] Optional rid to be ignored.
93 HashSearchOption fCreateHash = DoNotCreateHash); // [IN] Should we create hash first? (Optimize for multiple calls vs. single isolated call)
94
95 static HRESULT FindStandAloneSig(
96 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
97 const COR_SIGNATURE *pbSig, // [IN] Signature.
98 ULONG cbSig, // [IN] Size of signature.
99 mdSignature *psa); // [OUT] Put the StandAloneSig token found
100
101 static HRESULT FindTypeSpec(
102 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
103 const COR_SIGNATURE *pbSig, // [IN] Signature.
104 ULONG cbSig, // [IN] Size of signature.
105 mdTypeSpec *ptypespec); // [OUT] Put the TypeSpec token found
106
107 static HRESULT FindMethodImpl(
108 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
109 mdTypeDef tkClass, // [IN] The parent TypeDef token.
110 mdToken tkBody, // [IN] Method body token.
111 mdToken tkDecl, // [IN] Method declaration token.
112 RID *pRid); // [OUT] Put the MethodImpl rid here
113
114 static HRESULT FindCustomAttributeCtorByName(
115 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
116 LPCUTF8 szAssemblyName, // [IN] Assembly Name.
117 LPCUTF8 szNamespace, // [IN] TypeRef Namespace.
118 LPCUTF8 szName, // [IN] TypeRef Name.
119 mdTypeDef *ptk, // [OUT] Put the TypeRef token here.
120 RID rid = 0); // [IN] Optional rid to be ignored.
121
122 static HRESULT FindTypeRefByName(
123 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
124 mdToken tkResolutionScope, // [IN] ResolutionScope, mdAssemblyRef or mdModuleRef.
125 LPCUTF8 szNamespace, // [IN] TypeRef Namespace.
126 LPCUTF8 szName, // [IN] TypeRef Name.
127 mdTypeDef *ptk, // [OUT] Put the TypeRef token here.
128 RID rid = 0); // [IN] Optional rid to be ignored.
129
130 static HRESULT FindModuleRef(
131 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
132 LPCUTF8 szUTF8Name, // [IN] ModuleRef name.
133 mdModuleRef *pmur, // [OUT] Put the ModuleRef token here.
134 RID rid = 0); // [IN] Optional rid to be ignored.
135
136 static HRESULT FindTypeDefByName(
137 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
138 LPCUTF8 szNamespace, // [IN] Namespace of the TypeDef.
139 LPCUTF8 szName, // [IN] Name of the TypeDef.
140 mdToken tkEnclosingClass, // [IN] TypeDef/TypeRef enclosing class.
141 mdTypeDef *ptk, // [OUT] Put the TypeDef token here.
142 RID rid = 0); // [IN] Optional rid to be ignored.
143
144 static HRESULT FindInterfaceImpl(
145 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
146 mdToken tkClass, // [IN] TypeDef of the type
147 mdToken tkInterface, // [IN] could be typedef/typeref
148 mdInterfaceImpl *ptk, // [OUT] Put the interface token here.
149 RID rid = 0); // [IN] Optional rid to be ignored.
150
151 static HRESULT FindPermission(
152 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
153 mdToken tkParent, // [IN] Token with the Permission
154 USHORT usAction, // [IN] The action of the permission
155 mdPermission *ppm); // [OUT] Put permission token here
156
157 static HRESULT FindProperty(
158 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
159 mdToken tkTypeDef, // [IN] typedef token
160 LPCUTF8 szName, // [IN] name of the property
161 const COR_SIGNATURE *pbSig, // [IN] Signature.
162 ULONG cbSig, // [IN] Size of signature.
163 mdProperty *ppr); // [OUT] Property token
164
165 static HRESULT FindEvent(
166 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
167 mdToken tkTypeDef, // [IN] typedef token
168 LPCUTF8 szName, // [IN] name of the event
169 mdProperty *pev); // [OUT] Event token
170
171 static HRESULT FindCustomAttributeByToken(
172 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
173 mdToken tkParent, // [IN] the parent that custom value is associated with
174 mdToken tkType, // [IN] type of the CustomAttribute
175 const void *pCustBlob, // [IN] custom value blob
176 ULONG cbCustBlob, // [IN] size of the blob.
177 mdCustomAttribute *pcv); // [OUT] CustomAttribute token
178
179 static HRESULT GetCustomAttributeByName(// S_OK or error.
180 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
181 mdToken tkObj, // [IN] Object with Custom Attribute.
182 LPCUTF8 szName, // [IN] Name of desired Custom Attribute.
183 const void **ppData, // [OUT] Put pointer to data here.
184 ULONG *pcbData); // [OUT] Put size of data here.
185
186 static HRESULT GetCustomAttributeByName(// S_OK or error.
187 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
188 mdToken tkObj, // [IN] Object with Custom Attribute.
189 LPCUTF8 szName, // [IN] Name of desired Custom Attribute.
190 mdCustomAttribute pca); // [OUT] found CA token
191
192 static HRESULT MergeUpdateTokenInFieldSig(
193 CMiniMdRW *pMiniMdAssemEmit, // [IN] The assembly emit scope.
194 CMiniMdRW *pMiniMdEmit, // [IN] The emit scope.
195 IMetaModelCommon *pCommonAssemImport, // [IN] Assembly scope where the signature is from.
196 const void *pbHashValue, // [IN] Hash value for the import assembly.
197 ULONG cbHashValue, // [IN] Size in bytes for the hash value.
198 IMetaModelCommon *pCommonImport, // [IN] The scope to merge into the emit scope.
199 PCCOR_SIGNATURE pbSigImp, // [IN] signature from the imported scope
200 MDTOKENMAP *ptkMap, // [IN] Internal OID mapping structure.
201 CQuickBytes *pqkSigEmit, // [OUT] buffer for translated signature
202 ULONG cbStartEmit, // [IN] start point of buffer to write to
203 ULONG *pcbImp, // [OUT] total number of bytes consumed from pbSigImp
204 ULONG *pcbEmit); // [OUT] total number of bytes write to pqkSigEmit
205
206 static HRESULT MergeUpdateTokenInSig( // S_OK or error.
207 CMiniMdRW *pMiniMdAssemEmit, // [IN] The assembly emit scope.
208 CMiniMdRW *pMiniMdEmit, // [IN] The emit scope.
209 IMetaModelCommon *pCommonAssemImport, // [IN] Assembly scope where the signature is from.
210 const void *pbHashValue, // [IN] Hash value for the import assembly.
211 ULONG cbHashValue, // [IN] Size in bytes for the hash value.
212 IMetaModelCommon *pCommonImport, // [IN] The scope to merge into the emit scope.
213 PCCOR_SIGNATURE pbSigImp, // [IN] signature from the imported scope
214 MDTOKENMAP *ptkMap, // [IN] Internal OID mapping structure.
215 CQuickBytes *pqkSigEmit, // [OUT] translated signature
216 ULONG cbStartEmit, // [IN] start point of buffer to write to
217 ULONG *pcbImp, // [OUT] total number of bytes consumed from pbSigImp
218 ULONG *pcbEmit); // [OUT] total number of bytes write to pqkSigEmit
219
220 // This is implemented in a satellite lib because it is only used in emit and depends on
221 // strong name support in mscorwks.dll.
222 static HRESULT FindAssemblyRef(
223 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup.
224 LPCUTF8 szName, // [IN] Name.
225 LPCUTF8 szLocale, // [IN] Locale.
226 const void *pbPublicKeyOrToken, // [IN] Public key or token (based on flags).
227 ULONG cbPublicKeyOrToken, // [IN] Byte count of public key or token.
228 USHORT usMajorVersion, // [IN] Major version.
229 USHORT usMinorVersion, // [IN] Minor version.
230 USHORT usBuildNumber, // [IN] Build number.
231 USHORT usRevisionNumber, // [IN] Revision number.
232 DWORD dwFlags, // [IN] Flags.
233 mdAssemblyRef *pmar); // [OUT] returned AssemblyRef token.
234
235 static HRESULT FindFile(
236 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup.
237 LPCUTF8 szName, // [IN] name for the File.
238 mdFile *pmf, // [OUT] returned File token.
239 RID rid = 0); // [IN] Optional rid to be ignored.
240
241 static HRESULT FindExportedType(
242 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup.
243 LPCUTF8 szNamespace, // [IN] namespace for the ExportedType.
244 LPCUTF8 szName, // [IN] name for the ExportedType.
245 mdExportedType tkEnclosingType, // [IN] enclosing ExportedType token.
246 mdExportedType *pmct, // [OUT] returned ExportedType token.
247 RID rid = 0); // [IN] Optional rid to be ignored.
248
249 static HRESULT FindManifestResource(
250 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup.
251 LPCUTF8 szName, // [IN] name for the ManifestResource.
252 mdManifestResource *pmmr, // [OUT] returned ManifestResource token.
253 RID rid = 0); // [IN] Optional rid to be ignored.
254
255 static HRESULT GetNesterHierarchy(
256 IMetaModelCommon *pCommon, // Scope in which to find the hierarchy.
257 mdTypeDef td, // TypeDef whose hierarchy is needed.
258 CQuickArray<mdTypeDef> &cqaTdNesters, // Array of Nesters.
259 CQuickArray<LPCUTF8> &cqaNamespaces, // Namespaces of the nesters.
260 CQuickArray<LPCUTF8> &cqaNames); // Names of the nesters.
261
262 static HRESULT FindNestedTypeRef(
263 CMiniMdRW *pMiniMd, // [IN] Scope in which to find the TypeRef.
264 CQuickArray<LPCUTF8> &cqaNesterNamespaces, // [IN] Array of Namespaces.
265 CQuickArray<LPCUTF8> &cqaNesterNames, // [IN] Array of Names.
266 mdToken tkResolutionScope, // [IN] Resolution scope for the outermost TypeRef.
267 mdTypeRef *ptr); // [OUT] Inner most TypeRef token.
268
269 static HRESULT FindNestedTypeDef(
270 CMiniMdRW *pMiniMd, // [IN] Scope in which to find the TypeRef.
271 CQuickArray<LPCUTF8> &cqaNesterNamespaces, // [IN] Array of Namespaces.
272 CQuickArray<LPCUTF8> &cqaNesterNames, // [IN] Array of Names.
273 mdTypeDef tdNester, // [IN] Enclosing class for the Outermost TypeDef.
274 mdTypeDef *ptd); // [OUT] Inner most TypeRef token.
275
276 static HRESULT CreateNesterHierarchy(
277 CMiniMdRW *pMiniMdEmit, // [IN] Emit scope to create the Nesters in.
278 CQuickArray<LPCUTF8> &cqaNesterNamespaces, // [IN] Array of Nester namespaces.
279 CQuickArray<LPCUTF8> &cqaNesterNames, // [IN] Array of Nester names.
280 mdToken tkResolutionScope, // [IN] ResolutionScope for the innermost TypeRef.
281 mdTypeRef *ptr); // [OUT] Token for the innermost TypeRef.
282
283 static HRESULT ImportTypeDef(
284 CMiniMdRW *pMiniMdAssemEmit, // [IN] Assembly emit scope.
285 CMiniMdRW *pMiniMdEmit, // [IN] Module emit scope.
286 IMetaModelCommon *pCommonAssemImport, // [IN] Assembly import scope.
287 const void *pbHashValue, // [IN] Hash value for import assembly.
288 ULONG cbHashValue, // [IN] Size in bytes of hash value.
289 IMetaModelCommon *pCommonImport, // [IN] Module import scope.
290 mdTypeDef tdImport, // [IN] Imported TypeDef.
291 bool bReturnTd, // [IN] If the import and emit scopes are identical, return the TypeDef.
292 mdToken *ptkType); // [OUT] Output token for the imported type in the emit scope.
293
294 static HRESULT ImportTypeRef(
295 CMiniMdRW *pMiniMdAssemEmit, // [IN] Assembly emit scope.
296 CMiniMdRW *pMiniMdEmit, // [IN] Module emit scope.
297 IMetaModelCommon *pCommonAssemImport, // [IN] Assembly import scope.
298 const void *pbHashValue, // [IN] Hash value for import assembly.
299 ULONG cbHashValue, // [IN] Size in bytes of hash value.
300 IMetaModelCommon *pCommonImport, // [IN] Module import scope.
301 mdTypeRef trImport, // [IN] Imported TypeRef.
302 mdToken *ptkType); // [OUT] Output token for the imported type in the emit scope.
303
304private:
305 /*
306 static bool ImportHelper::CompareCustomAttribute( //
307 CMiniMdRW *pMiniMd, // [IN] the minimd to lookup
308 mdToken tkObj, // [IN] Object with Custom Attribute.
309 LPCUTF8 szName, // [IN] Name of desired Custom Attribute.
310 ULONG rid); // [IN] the rid of the custom attribute to compare to
311 */
312
313 static HRESULT GetTDNesterHierarchy(
314 IMetaModelCommon *pCommon, // Scope in which to find the hierarchy.
315 mdTypeDef td, // TypeDef whose hierarchy is needed.
316 CQuickArray<mdTypeDef> &cqaTdNesters,// Array of Nesters.
317 CQuickArray<LPCUTF8> &cqaNamespaces, // Namespaces of the nesters.
318 CQuickArray<LPCUTF8> &cqaNames); // Names of the nesters.
319
320 static HRESULT GetTRNesterHierarchy(
321 IMetaModelCommon *pCommon, // Scope in which to find the hierarchy.
322 mdTypeRef tr, // TypeRef whose hierarchy is needed.
323 CQuickArray<mdTypeRef> &cqaTrNesters,// Array of Nesters.
324 CQuickArray<LPCUTF8> &cqaNamespaces, // Namespaces of the nesters.
325 CQuickArray<LPCUTF8> &cqaNames); // Names of the nesters.
326
327 static HRESULT CreateModuleRefFromScope(
328 CMiniMdRW *pMiniMdEmit, // [IN] Emit scope in which the ModuleRef is to be created.
329 IMetaModelCommon *pCommonImport, // [IN] Import scope.
330 mdModuleRef *ptkModuleRef); // [OUT] Output token for ModuleRef.
331
332 static HRESULT CreateModuleRefFromModuleRef( // S_OK or error.
333 CMiniMdRW *pMiniMdEmit, // [IN] Emit scope.
334 IMetaModelCommon *pCommon, // [IN] Import scope.
335 mdModuleRef tkModuleRef, // [IN] ModuleRef token.
336 mdModuleRef *ptkModuleRef); // [OUT] ModuleRef token in the emit scope.
337
338 static HRESULT CreateModuleRefFromExportedType( // S_OK, S_FALSE or error.
339 CMiniMdRW *pAssemEmit, // [IN] Import assembly scope.
340 CMiniMdRW *pMiniMdEmit, // [IN] Emit scope.
341 mdExportedType tkExportedType, // [IN] ExportedType token in Assembly emit scope.
342 mdModuleRef *ptkModuleRef); // [OUT] ModuleRef token in the emit scope.
343
344 // CreateAssemblyRefFromAssembly, CompareAssemblyRefToAssembly are in satellite libs because
345 // they are only used in emit cases and need strong-name support in mscorwks.dll.
346
347 static HRESULT CreateAssemblyRefFromAssembly( // S_OK or error.
348 CMiniMdRW *pMiniMdAssemEmit, // [IN] Emit assembly scope.
349 CMiniMdRW *pMiniMdModuleEmit, // [IN] Emit module scope.
350 IMetaModelCommon *pCommonAssemImport, // [IN] Assembly import scope.
351 const void *pbHashValue, // [IN] Hash Blob for Assembly.
352 ULONG cbHashValue, // [IN] Count of bytes.
353 mdAssemblyRef *ptkAssemblyRef); // [OUT] AssemblyRef token.
354
355 static HRESULT CompareAssemblyRefToAssembly( // S_OK, S_FALSE or error.
356 IMetaModelCommon *pCommonAssem1, // [IN] Assembly that defines the AssemblyRef.
357 mdAssemblyRef tkAssemRef, // [IN] AssemblyRef.
358 IMetaModelCommon *pCommonAssem2); // [IN] Assembly against which the Ref is compared.
359
360 static HRESULT CreateAssemblyRefFromAssemblyRef(
361 CMiniMdRW *pMiniMdAssemEmit, // [IN] Assembly emit scope.
362 CMiniMdRW *pMiniMdModuleEmit, // [IN] Module emit scope
363 IMetaModelCommon *pCommonImport, // [IN] Scope to import the assembly ref from.
364 mdAssemblyRef tkAssemRef, // [IN] Assembly ref to be imported.
365 mdAssemblyRef *ptkAssemblyRef); // [OUT] AssemblyRef in the emit scope.
366};
367
368#endif // __IMPORTHELPER__h__
369