Kaynağa Gözat

Strip ref from comptype, rettype

Brian Fiete 3 yıl önce
ebeveyn
işleme
8922cc0c0d

+ 4 - 0
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -9780,6 +9780,8 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 						if (invokeMethodInstance != NULL)
 						{
 							resolvedType = invokeMethodInstance->mReturnType;
+							if ((resolvedType != NULL) && (resolvedType->IsRef()))
+								resolvedType = resolvedType->GetUnderlyingType();
 							return ResolveTypeResult(typeRef, resolvedType, populateType, resolveFlags);
 						}
 					}
@@ -9813,6 +9815,8 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 					{
 						auto methodRefType = (BfMethodRefType*)innerType;
 						resolvedType = methodRefType->mMethodRef->mReturnType;
+						if ((resolvedType != NULL) && (resolvedType->IsRef()))
+							resolvedType = resolvedType->GetUnderlyingType();
 						return ResolveTypeResult(typeRef, resolvedType, populateType, resolveFlags);
 					}
 				}

+ 8 - 1
IDEHelper/Compiler/BfResolvedTypeUtils.cpp

@@ -3420,6 +3420,8 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
 		if (ctx->mRootTypeRef != retTypeTypeRef)
 		{
 			auto type = ctx->mModule->ResolveTypeRef(retTypeTypeRef, BfPopulateType_Identity, ctx->mResolveFlags);
+			if ((type != NULL) && (type->IsRef()))
+				type = type->GetUnderlyingType();
 			return Hash(type, ctx, flags, hashSeed);
 		}
 
@@ -3512,7 +3514,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
 					else
 					{
 						result = ctx->mModule->CreateValueFromExpression(exprModTypeRef->mTarget, NULL, BfEvalExprFlags_DeclType);
-					}
+					}					
 				}
 								
 				if ((result) && (exprModTypeRef->mToken->mToken == BfToken_Comptype))
@@ -3538,6 +3540,9 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
 				else
 					cachedResolvedType = result.mType;
 
+				if ((cachedResolvedType != NULL) && (cachedResolvedType->IsRef()))
+					cachedResolvedType = cachedResolvedType->GetUnderlyingType();
+
 				if (cachedResolvedType != NULL)
 					ctx->SetCachedResolvedType(typeRef, cachedResolvedType);
 			}
@@ -3999,6 +4004,8 @@ bool BfResolvedTypeSet::Equals(BfType* lhs, BfTypeReference* rhs, LookupContext*
 		if (auto retTypeRef = BfNodeDynCastExact<BfModifiedTypeRef>(rhs))
 		{
 			auto resolvedType = ctx->mModule->ResolveTypeRef(rhs);
+			if ((resolvedType != NULL) && (resolvedType->IsRef()))
+				resolvedType = resolvedType->GetUnderlyingType();
 			return lhs == resolvedType;
 		}
 	}