Explorar el Código

Fixed missing error for outer static instance-qualified lookup

Brian Fiete hace 8 meses
padre
commit
40a9dbf25c

+ 19 - 5
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -5206,7 +5206,13 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe
 
 	if (fieldDef->mIsStatic)
 	{
-		if ((target) && ((flags & BfLookupFieldFlag_IsImplicitThis) == 0) && (!typeInstance->mTypeDef->IsGlobalsContainer()))
+		if (target)
+		{
+			//BF_ASSERT((flags & BfLookupFieldFlag_HasInstance) != 0);
+			flags = (BfLookupFieldFlags)(flags | BfLookupFieldFlag_HasInstance);
+		}
+
+		if (((flags & BfLookupFieldFlag_HasInstance) != 0) && ((flags & BfLookupFieldFlag_IsImplicitThis) == 0) && (!typeInstance->mTypeDef->IsGlobalsContainer()))
 		{
 			//CS0176: Member 'Program.sVal' cannot be accessed with an instance reference; qualify it with a type name instead
 			mModule->Fail(StrFormat("Member '%s.%s' cannot be accessed with an instance reference; qualify it with a type name instead",
@@ -5507,6 +5513,9 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe
 
 BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue target, const StringImpl& fieldName, BfLookupFieldFlags flags)
 {
+ 	if (target)
+ 		flags = (BfLookupFieldFlags)(flags | BfLookupFieldFlag_HasInstance);
+
 	if ((target.mType != NULL && (target.mType->IsGenericParam())))
 	{
 		auto genericParamType = (BfGenericParamType*)target.mType;
@@ -5726,7 +5735,7 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
 				auto checkProtection = field->mProtection;
 				if (checkProtection == BfProtection_Hidden)
 				{
-					// Allow acessing hidden fields
+					// Allow accessing hidden fields
 					checkProtection = BfProtection_Private;
 				}
 
@@ -6016,13 +6025,18 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
 			curCheckType = curCheckType->mBaseType;
 		}
 	}
-
+	
 	auto outerTypeDef = mModule->GetOuterType(startCheckType);
 	if (outerTypeDef != NULL)
 	{
+		BfLookupFieldFlags newFlags = BfLookupFieldFlag_CheckingOuter;
+		if (((flags & BfLookupFieldFlag_HasInstance) != 0) &&
+			((flags & BfLookupFieldFlag_IsImplicitThis) == 0))
+			newFlags = (BfLookupFieldFlags)(newFlags | BfLookupFieldFlag_HasInstance);
+
 		// Check statics in outer type
-		return LookupField(targetSrc, BfTypedValue(outerTypeDef), fieldName, BfLookupFieldFlag_CheckingOuter);
-	}
+		return LookupField(targetSrc, BfTypedValue(outerTypeDef), fieldName, newFlags);
+	}	
 
 	return BfTypedValue();
 }

+ 2 - 1
IDEHelper/Compiler/BfExprEvaluator.h

@@ -379,7 +379,8 @@ enum BfLookupFieldFlags
 	BfLookupFieldFlag_IgnoreProtection = 8,
 	BfLookupFieldFlag_BindOnly = 0x10,
 	BfLookupFieldFlag_IsFailurePass = 0x20,
-	BfLookupFieldFlag_IsAnonymous = 0x40
+	BfLookupFieldFlag_IsAnonymous = 0x40,
+	BfLookupFieldFlag_HasInstance = 0x80
 };
 
 enum BfUnaryOpFlags

+ 9 - 9
IDEHelper/Tests/src/FuncRefs.bf

@@ -129,8 +129,8 @@ namespace Tests
 		{
 			public int Test;
 		}
-		public static List<CTest> mList = new .() ~ delete _;
-		private static Event<EventHandler> mEvent;
+		public static List<CTest> sList = new .() ~ delete _;
+		private static Event<EventHandler> sEvent;
 
 		[Test]
 		public static void TestBasics()
@@ -161,17 +161,17 @@ namespace Tests
 			TestA ta = scope .();
 			ta.Vec = .(33, 44);
 
-			mList.Add(scope .());
-			mEvent.Add(new (sender, e) =>
+			sList.Add(scope .());
+			sEvent.Add(new (sender, e) =>
 			{
-			    mList.ForEach((b) => { b.Test = 1; });
+			    sList.ForEach((b) => { b.Test = 1; });
 			});
-			mEvent(null, .Empty);
-			mEvent.Dispose();
-			Test.Assert(mList.Back.Test == 1);
+			sEvent(null, .Empty);
+			sEvent.Dispose();
+			Test.Assert(sList.Back.Test == 1);
 
 			int i = 0;
-			mList.ForEach((l) => l.mList.ForEach((l) =>
+			sList.ForEach((l) => sList.ForEach((l) =>
 			{
 				i++;
 			}));