瀏覽代碼

Fixed some issues with types with extensions and emitted methods

Brian Fiete 3 年之前
父節點
當前提交
f7efa3466a

+ 5 - 2
IDEHelper/Compiler/BfContext.cpp

@@ -1174,8 +1174,11 @@ void BfContext::RebuildType(BfType* type, bool deleteOnDemandTypes, bool rebuild
 
 
 	if (typeInst->mTypeDef->mEmitParent != NULL)
 	if (typeInst->mTypeDef->mEmitParent != NULL)
 	{
 	{
-		auto emitTypeDef = typeInst->mTypeDef;		
-		typeInst->mTypeDef = emitTypeDef->mEmitParent;		
+		auto emitTypeDef = typeInst->mTypeDef;
+		typeInst->mTypeDef = emitTypeDef->mEmitParent;
+		if (typeInst->mTypeDef->mIsPartial)
+			typeInst->mTypeDef = mSystem->GetCombinedPartial(typeInst->mTypeDef);
+
 		BfLogSysM("Type %p queueing delete of typeDef %p, resetting typeDef to %p\n", typeInst, emitTypeDef, typeInst->mTypeDef);
 		BfLogSysM("Type %p queueing delete of typeDef %p, resetting typeDef to %p\n", typeInst, emitTypeDef, typeInst->mTypeDef);
 		if (emitTypeDef->mDefState != BfTypeDef::DefState_Deleted)
 		if (emitTypeDef->mDefState != BfTypeDef::DefState_Deleted)
 		{
 		{

+ 10 - 6
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -2352,11 +2352,6 @@ void BfModule::UpdateCEEmit(CeEmitContext* ceEmitContext, BfTypeInstance* typeIn
 	defBuilder.mCurTypeDef = typeInstance->mTypeDef;
 	defBuilder.mCurTypeDef = typeInstance->mTypeDef;
 	defBuilder.mCurDeclaringTypeDef = typeInstance->mTypeDef;
 	defBuilder.mCurDeclaringTypeDef = typeInstance->mTypeDef;
 
 
-	if (typeInstance->mTypeDef->mIsCombinedPartial)
-	{
-		// Always define generated methods on the primary type declaration
-		defBuilder.mCurDeclaringTypeDef = typeInstance->mTypeDef->mPartials[0]->GetLatest();
-	}
 	defBuilder.mPassInstance = mCompiler->mPassInstance;
 	defBuilder.mPassInstance = mCompiler->mPassInstance;
 	defBuilder.mIsComptime = true;
 	defBuilder.mIsComptime = true;
 	defBuilder.DoVisitChild(typeDeclaration->mDefineNode);
 	defBuilder.DoVisitChild(typeDeclaration->mDefineNode);
@@ -9676,7 +9671,16 @@ BfTypeDef* BfModule::GetActiveTypeDef(BfTypeInstance* typeInstanceOverride, bool
 	if ((mCurMethodState != NULL) && (mCurMethodState->mMixinState != NULL) && (useMixinDecl))
 	if ((mCurMethodState != NULL) && (mCurMethodState->mMixinState != NULL) && (useMixinDecl))
 		useTypeDef = mCurMethodState->mMixinState->mMixinMethodInstance->mMethodDef->mDeclaringType->GetDefinition();
 		useTypeDef = mCurMethodState->mMixinState->mMixinMethodInstance->mMethodDef->mDeclaringType->GetDefinition();
 	else if ((mCurMethodInstance != NULL) && (mCurMethodInstance->mMethodDef->mDeclaringType != NULL))
 	else if ((mCurMethodInstance != NULL) && (mCurMethodInstance->mMethodDef->mDeclaringType != NULL))
-		useTypeDef = mCurMethodInstance->mMethodDef->mDeclaringType->GetDefinition();
+	{
+		
+		auto declTypeDef = mCurMethodInstance->mMethodDef->mDeclaringType;
+		useTypeDef = declTypeDef->GetDefinition();
+		if ((declTypeDef->IsEmitted()) && (useTypeDef->mIsCombinedPartial))
+		{
+			// Always consider methods to belong to the primary type declaration
+			useTypeDef = useTypeDef->mPartials[0];
+		}
+	}
 	else if (mContext->mCurTypeState != NULL)
 	else if (mContext->mCurTypeState != NULL)
 	{
 	{
 		if ((mContext->mCurTypeState->mCurFieldDef != NULL) && (mContext->mCurTypeState->mCurFieldDef->mDeclaringType != NULL))
 		if ((mContext->mCurTypeState->mCurFieldDef != NULL) && (mContext->mCurTypeState->mCurFieldDef->mDeclaringType != NULL))

+ 1 - 1
IDEHelper/Tests/src/Append.bf

@@ -79,7 +79,7 @@ namespace Tests
 		class ClassF
 		class ClassF
 		{
 		{
 			public int mA = 123;
 			public int mA = 123;
-			public append String mB = .(mA);
+			public append String mB = .(1024);
 			public int mC = 234;
 			public int mC = 234;
 		}
 		}
 
 

+ 12 - 0
IDEHelper/Tests/src/Operators.bf

@@ -2,6 +2,18 @@
 
 
 using System;
 using System;
 
 
+namespace System
+{
+	extension RefCounted<T>
+	{
+		public static RefCounted<T> Attach(RefCounted<T> val)
+		{
+			val.AddRef();
+			return val;
+		}
+	}
+}
+
 namespace System
 namespace System
 {
 {
 	public extension Event<T>
 	public extension Event<T>