瀏覽代碼

Added field and instantiation restrictions to extended opaques

Brian Fiete 5 月之前
父節點
當前提交
765906dd70
共有 3 個文件被更改,包括 19 次插入10 次删除
  1. 1 0
      IDEHelper/Compiler/BfCompiler.cpp
  2. 17 10
      IDEHelper/Compiler/BfModuleTypeUtils.cpp
  3. 1 0
      IDEHelper/Compiler/BfSystem.cpp

+ 1 - 0
IDEHelper/Compiler/BfCompiler.cpp

@@ -3488,6 +3488,7 @@ void BfCompiler::UpdateRevisedTypes()
 							compositeTypeDef->mTypeCode = rootTypeDef->mTypeCode;
 						compositeTypeDef->mFullName = rootTypeDef->mFullName;
 						compositeTypeDef->mFullNameEx = rootTypeDef->mFullNameEx;
+						compositeTypeDef->mIsOpaque = rootTypeDef->mIsOpaque;
 						compositeTypeDef->mIsFunction = rootTypeDef->mIsFunction;
 						compositeTypeDef->mIsDelegate = rootTypeDef->mIsDelegate;
 						compositeTypeDef->mIsCombinedPartial = true;

+ 17 - 10
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -5595,6 +5595,21 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
 
 					if ((!fieldDef->mIsConst) && (!fieldDef->mIsStatic))
 					{
+						BfAstNode* nameRefNode = NULL;
+						if (auto fieldDecl = fieldDef->GetFieldDeclaration())
+							nameRefNode = fieldDecl->mNameNode;
+						else if (auto paramDecl = fieldDef->GetParamDeclaration())
+							nameRefNode = paramDecl->mNameNode;
+						if (nameRefNode == NULL)
+							nameRefNode = fieldDef->mTypeRef;
+
+						if ((!resolvedFieldType->IsValuelessType()) && (typeDef->mIsOpaque))
+						{
+							Fail(StrFormat("Opaque type '%s' attempted to declare non-static field '%s'", TypeToString(typeInstance).c_str(), fieldDef->mName.c_str()), nameRefNode, true);
+							resolvedFieldType = GetPrimitiveType(BfTypeCode_None);
+							fieldInstance->mResolvedType = resolvedFieldType;
+						}
+
 						PopulateType(resolvedFieldType, resolvedFieldType->IsValueType() ? BfPopulateType_Data : BfPopulateType_Declaration);
 						if (resolvedFieldType->WantsGCMarking())
 							typeInstance->mWantsGCMarking = true;
@@ -5611,15 +5626,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
 						if (fieldDef->mIsExtern)
 						{
 							Fail("Cannot declare instance member as 'extern'", fieldDef->GetFieldDeclaration()->mExternSpecifier, true);
-						}
-
-						BfAstNode* nameRefNode = NULL;
-						if (auto fieldDecl = fieldDef->GetFieldDeclaration())
-							nameRefNode = fieldDecl->mNameNode;
-						else if (auto paramDecl = fieldDef->GetParamDeclaration())
-							nameRefNode = paramDecl->mNameNode;
-						if (nameRefNode == NULL)
-							nameRefNode = fieldDef->mTypeRef;
+						}						
 
 						if (!allowInstanceFields)
 						{
@@ -5677,7 +5684,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
 							}
 							else if (!resolvedFieldType->IsObject())
 								Fail("Append fields must be classes", nameRefNode, true);
-						}
+						}						
 
 						BF_ASSERT(dataSize >= 0);
 						fieldInstance->mDataSize = dataSize;

+ 1 - 0
IDEHelper/Compiler/BfSystem.cpp

@@ -3207,6 +3207,7 @@ void BfSystem::AddToCompositePartial(BfPassInstance* passInstance, BfTypeDef* co
 		typeDef->mSystem = partialTypeDef->mSystem;
 		typeDef->mTypeCode = partialTypeDef->mTypeCode;
 		typeDef->mShow = partialTypeDef->mShow;
+		typeDef->mIsOpaque = partialTypeDef->mIsOpaque;
 		typeDef->mIsFunction = partialTypeDef->mIsFunction;
 		typeDef->mIsDelegate = partialTypeDef->mIsDelegate;
 		typeDef->mNestDepth = partialTypeDef->mNestDepth;