From 6c659934014a8099220f36d962a5f7201d18407f Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 12 May 2020 09:16:17 -0700 Subject: [PATCH] Fixed extensions issues with changing root def, extending dlg/functions --- IDEHelper/Compiler/BfCompiler.cpp | 134 ++++++++++++++--------- IDEHelper/Compiler/BfDefBuilder.cpp | 6 +- IDEHelper/Compiler/BfMangler.cpp | 3 +- IDEHelper/Compiler/BfModule.cpp | 4 +- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 23 +++- IDEHelper/Compiler/BfStmtEvaluator.cpp | 2 +- IDEHelper/Compiler/BfSystem.cpp | 12 +- 7 files changed, 121 insertions(+), 63 deletions(-) diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 752d1eb3..571b7402 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -2954,9 +2954,21 @@ void BfCompiler::UpdateRevisedTypes() continue; } - rootTypeDef = checkTypeDef; - rootTypeDefEntry = checkTypeDefEntry; + // Only allow extending structs and objects + if ((checkTypeDef->mTypeCode == BfTypeCode_Struct) || + (checkTypeDef->mTypeCode == BfTypeCode_Object) || + (checkTypeDef->mTypeCode == BfTypeCode_Enum)) + { + rootTypeDef = checkTypeDef; + rootTypeDefEntry = checkTypeDefEntry; + } + checkTypeDefEntry = checkTypeDefEntry->mNext; + + if (compositeTypeDef != NULL) + { + BF_ASSERT(rootTypeDef->mFullNameEx == compositeTypeDef->mFullNameEx); + } } } else if ((outerTypeDef->mIsExplicitPartial) && (!outerTypeDef->mPartialUsed)) @@ -2983,6 +2995,10 @@ void BfCompiler::UpdateRevisedTypes() } compositeTypeDef = checkTypeDef; + if (rootTypeDef != NULL) + { + BF_ASSERT(rootTypeDef->mFullNameEx == compositeTypeDef->mFullNameEx); + } if (compositeTypeDef->mNextRevision != NULL) { // This is an old 'next revision' @@ -3004,7 +3020,12 @@ void BfCompiler::UpdateRevisedTypes() if (compositeTypeDef == NULL) { - if ((rootTypeDef->mIsExplicitPartial) || (rootTypeDefEntry->mNext == NULL) || (!rootTypeDefEntry->mNext->mValue->mIsCombinedPartial)) + if ((rootTypeDef->mIsExplicitPartial) || (rootTypeDefEntry->mNext == NULL) || + (!rootTypeDefEntry->mNext->mValue->mIsCombinedPartial) || + (rootTypeDefEntry->mNext->mValue->mTypeCode != rootTypeDef->mTypeCode) || + (rootTypeDefEntry->mNext->mValue->mIsFunction != rootTypeDef->mIsFunction) || + (rootTypeDefEntry->mNext->mValue->mIsDelegate != rootTypeDef->mIsDelegate) || + (rootTypeDefEntry->mNext->mValue->mGenericParamDefs.size() != rootTypeDef->mGenericParamDefs.size())) { compositeTypeDef = new BfTypeDef(); compositeTypeDef->mSystem = rootTypeDef->mSystem; @@ -3016,9 +3037,11 @@ void BfCompiler::UpdateRevisedTypes() compositeTypeDef->mNameEx->Ref(); compositeTypeDef->mProtection = rootTypeDef->mProtection; compositeTypeDef->mNamespace = rootTypeDef->mNamespace; - compositeTypeDef->mTypeCode = BfTypeCode_Extension; + compositeTypeDef->mTypeCode = rootTypeDef->mTypeCode; compositeTypeDef->mFullName = rootTypeDef->mFullName; compositeTypeDef->mFullNameEx = rootTypeDef->mFullNameEx; + compositeTypeDef->mIsFunction = rootTypeDef->mIsFunction; + compositeTypeDef->mIsDelegate = rootTypeDef->mIsDelegate; compositeTypeDef->mIsCombinedPartial = true; for (auto prevGenericParam : rootTypeDef->mGenericParamDefs) @@ -3039,6 +3062,10 @@ void BfCompiler::UpdateRevisedTypes() { BF_ASSERT(rootTypeDefEntry->mNext->mValue->NameEquals(rootTypeDef)); compositeTypeDef = rootTypeDefEntry->mNext->mValue; + if (rootTypeDef != NULL) + { + BF_ASSERT(rootTypeDef->mFullNameEx == compositeTypeDef->mFullNameEx); + } if (compositeTypeDef->mNextRevision != NULL) { // This is an old 'next revision' @@ -3168,6 +3195,7 @@ void BfCompiler::UpdateRevisedTypes() if (compositeIsNew) { compositeTypeDef->mDefState = BfTypeDef::DefState_New; + compositeTypeDef->mTypeCode = compositeTypeDef->mNextRevision->mTypeCode; mSystem->InjectNewRevision(compositeTypeDef); // Reset 'New' state compositeTypeDef->mDefState = BfTypeDef::DefState_New; @@ -3259,21 +3287,6 @@ void BfCompiler::UpdateRevisedTypes() } } } - } - - if (outerTypeDef->mDefState != BfTypeDef::DefState_Deleted) - checkMasterTypeDef = outerTypeDef; - - if ((deletedCombinedPartial != NULL) && (checkMasterTypeDef != NULL) && - (deletedCombinedPartial->NameEquals(checkMasterTypeDef))) - { - // Remap nested types to their master typeDef - for (auto nestedType : deletedCombinedPartial->mNestedTypes) - { - nestedType->mOuterType = checkMasterTypeDef; - } - deletedCombinedPartial = NULL; - checkMasterTypeDef = NULL; } outerTypeDefEntry = nextTypeDefEntry; @@ -3701,53 +3714,68 @@ void BfCompiler::ProcessAutocompleteTempType() typeState.mCurTypeDef = tempTypeDef; SetAndRestoreValue prevTypeState(module->mContext->mCurTypeState, &typeState); - BfTypeDef* actualTypeDef = NULL; - auto typeName = tempTypeDef->mFullName; - int wantNumGenericParams = (int)tempTypeDef->mGenericParamDefs.size(); - auto actualTypeDefItr = mSystem->mTypeDefs.TryGet(typeName); - while (actualTypeDefItr) - { - auto checkTypeDef = *actualTypeDefItr; - if ((!checkTypeDef->mIsPartial) /*&& (checkTypeDef->mTypeCode != BfTypeCode_Extension)*/ && - ((checkTypeDef->mTypeCode == tempTypeDef->mTypeCode) || (tempTypeDef->mTypeCode == BfTypeCode_Extension))) + auto _FindAcutalTypeDef = [&](BfTypeDef* tempTypeDef) + { + auto typeName = tempTypeDef->mFullName; + int wantNumGenericParams = (int)tempTypeDef->mGenericParamDefs.size(); + auto actualTypeDefItr = mSystem->mTypeDefs.TryGet(typeName); + while (actualTypeDefItr) { - if ((checkTypeDef->NameEquals(tempTypeDef)) && (checkTypeDef->mIsCombinedPartial) && - (checkTypeDef->mGenericParamDefs.size() == tempTypeDef->mGenericParamDefs.size()) && - (tempTypeDef->mProject->ContainsReference(checkTypeDef->mProject))) + auto checkTypeDef = *actualTypeDefItr; + if ((!checkTypeDef->mIsPartial) /*&& (checkTypeDef->mTypeCode != BfTypeCode_Extension)*/ && + ((checkTypeDef->mTypeCode == tempTypeDef->mTypeCode) || (tempTypeDef->mTypeCode == BfTypeCode_Extension))) { - actualTypeDef = mSystem->FilterDeletedTypeDef(checkTypeDef); - break; + if ((checkTypeDef->NameEquals(tempTypeDef)) && (checkTypeDef->mIsCombinedPartial) && + (checkTypeDef->mGenericParamDefs.size() == tempTypeDef->mGenericParamDefs.size()) && + (tempTypeDef->mProject->ContainsReference(checkTypeDef->mProject))) + { + return mSystem->FilterDeletedTypeDef(checkTypeDef); + } + + if ((checkTypeDef->mGenericParamDefs.size() == wantNumGenericParams) && + (FileNameEquals(tempTypeDef->mSource->mSourceData->ToParserData()->mFileName, checkTypeDef->mSource->mSourceData->ToParserData()->mFileName)) && + (tempTypeDef->mProject == checkTypeDef->mProject)) + { + return mSystem->FilterDeletedTypeDef(checkTypeDef); + } } - if ((checkTypeDef->mGenericParamDefs.size() == wantNumGenericParams) && - (FileNameEquals(tempTypeDef->mSource->mSourceData->ToParserData()->mFileName, checkTypeDef->mSource->mSourceData->ToParserData()->mFileName)) && - (tempTypeDef->mProject == checkTypeDef->mProject)) + actualTypeDefItr.MoveToNextHashMatch(); + } + return (BfTypeDef*)NULL; + }; + + if (tempTypeDef->mTypeCode == BfTypeCode_Extension) + { + BfTypeInstance* outerTypeInstance; + + if (tempTypeDef->mOuterType != NULL) + { + auto outerTypeDef = _FindAcutalTypeDef(tempTypeDef->mOuterType); + if (outerTypeDef != NULL) { - actualTypeDef = mSystem->FilterDeletedTypeDef(checkTypeDef); - break; + outerTypeInstance = (BfTypeInstance*)module->ResolveTypeDef(outerTypeDef, BfPopulateType_IdentityNoRemapAlias); + if ((outerTypeInstance != NULL) && (outerTypeInstance->IsIncomplete())) + module->PopulateType(outerTypeInstance, BfPopulateType_Full); } } - - actualTypeDefItr.MoveToNextHashMatch(); - } - if ((actualTypeDef == NULL) || (actualTypeDef->mTypeDeclaration == NULL)) - { + SetAndRestoreValue prevCurTypeInstance(module->mCurTypeInstance, outerTypeInstance); + auto autoComplete = mResolvePassData->mAutoComplete; if (autoComplete->IsAutocompleteNode(tempTypeDef->mTypeDeclaration->mNameNode)) { - BfIdentifierNode* nameNode = tempTypeDef->mTypeDeclaration->mNameNode; - if (tempTypeDef->mTypeCode == BfTypeCode_Extension) - { - autoComplete->AddTopLevelNamespaces(nameNode); - autoComplete->AddTopLevelTypes(nameNode); - autoComplete->mInsertStartIdx = nameNode->GetSrcStart(); - autoComplete->mInsertEndIdx = nameNode->GetSrcEnd(); - } + BfIdentifierNode* nameNode = tempTypeDef->mTypeDeclaration->mNameNode; + autoComplete->AddTopLevelNamespaces(nameNode); + autoComplete->AddTopLevelTypes(nameNode); + autoComplete->mInsertStartIdx = nameNode->GetSrcStart(); + autoComplete->mInsertEndIdx = nameNode->GetSrcEnd(); } + } - //mResolvePassData->mSourceClassifier->MarkSkipped(tempTypeDef->mTypeDeclaration); - + BfTypeDef* actualTypeDef = _FindAcutalTypeDef(tempTypeDef); + if ((actualTypeDef == NULL) || (actualTypeDef->mTypeDeclaration == NULL)) + { GenerateAutocompleteInfo(); return; } diff --git a/IDEHelper/Compiler/BfDefBuilder.cpp b/IDEHelper/Compiler/BfDefBuilder.cpp index e34e2729..e7c7cc9f 100644 --- a/IDEHelper/Compiler/BfDefBuilder.cpp +++ b/IDEHelper/Compiler/BfDefBuilder.cpp @@ -1541,6 +1541,8 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration) bool isCompatible = (isExtension == (checkTypeDef->mTypeCode == BfTypeCode_Extension)) && (checkTypeDef->mTypeCode == mCurTypeDef->mTypeCode) && + (checkTypeDef->mIsDelegate == mCurTypeDef->mIsDelegate) && + (checkTypeDef->mIsFunction == mCurTypeDef->mIsFunction) && (checkTypeDef->mOuterType == actualOuterTypeDef); if (isCompatible) @@ -1655,6 +1657,8 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration) // Map methods into the correct index from previous revision if (prevRevisionTypeDef != NULL) { + BF_ASSERT(mCurTypeDef->mTypeCode == prevRevisionTypeDef->mTypeCode); + if ((mCurTypeDef->mFullHash == prevRevisionTypeDef->mFullHash) && (!mFullRefresh)) { BfLogSys(bfParser->mSystem, "DefBuilder deleting typeDef with no changes %p\n", prevRevisionTypeDef); @@ -1669,7 +1673,7 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration) else if (mCurTypeDef->mInlineHash != prevRevisionTypeDef->mInlineHash) prevRevisionTypeDef->mDefState = BfTypeDef::DefState_InlinedInternals_Changed; else - prevRevisionTypeDef->mDefState = BfTypeDef::DefState_Internals_Changed; + prevRevisionTypeDef->mDefState = BfTypeDef::DefState_Internals_Changed; } // There's a new type with this name... diff --git a/IDEHelper/Compiler/BfMangler.cpp b/IDEHelper/Compiler/BfMangler.cpp index ae7215df..6039c789 100644 --- a/IDEHelper/Compiler/BfMangler.cpp +++ b/IDEHelper/Compiler/BfMangler.cpp @@ -1320,7 +1320,8 @@ void BfMSMangler::Mangle(MangleContext& mangleContext, StringImpl& name, BfTypeI } else { - auto outerType = useModule->GetOuterType(typeInstance); + auto unreifiedModule = useModule->mContext->mUnreifiedModule; + auto outerType = unreifiedModule->GetOuterType(typeInstance); if (outerType != NULL) Mangle(mangleContext, name, outerType, true, true); else diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 5ea6ab0c..6c08641f 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -5309,7 +5309,7 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary& usedStrin } } - checkTypeInstance = GetOuterType(checkTypeInstance); + checkTypeInstance = mContext->mUnreifiedModule->GetOuterType(checkTypeInstance); } } @@ -5986,7 +5986,7 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary& usedStrin } int outerTypeId = 0; - auto outerType = GetOuterType(typeInstance); + auto outerType = mContext->mUnreifiedModule->GetOuterType(typeInstance); if (outerType != NULL) outerTypeId = outerType->mTypeId; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index b9401d1e..c40258c8 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -1351,8 +1351,15 @@ int BfModule::GenerateTypeOptions(BfCustomAttributes* customAttributes, BfTypeIn if (typeInstance->IsTypedPrimitive()) { auto underlyingType = typeInstance->GetUnderlyingType(); - String typeName = TypeToString(underlyingType); - _CheckTypeName(typeName); + if (underlyingType != NULL) + { + String typeName = TypeToString(underlyingType); + _CheckTypeName(typeName); + } + else + { + // Can this only happen for functions that are being extended? + } } if ((!typeInstance->IsBoxed()) && (typeInstance->mTypeDef == mCompiler->mPointerTTypeDef)) @@ -1612,6 +1619,10 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } } } +// else if (typeInstance->IsFunction()) +// { +// underlyingType = GetPrimitiveType(BfTypeCode_NullPtr); +// } else if (((typeInstance->IsStruct()) || (typeInstance->IsTypedPrimitive())) && (!typeInstance->mTypeFailed)) { @@ -2529,6 +2540,10 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy BfSizedVector dataFieldVec; + bool allowInstanceFields = (underlyingType == NULL); + if (typeInstance->IsTypedPrimitive()) + allowInstanceFields = false; + // We've resolved all the 'var' entries, so now build the actual composite type for (auto& fieldInstanceRef : typeInstance->mFieldInstances) { @@ -2618,10 +2633,12 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if (nameRefNode == NULL) nameRefNode = fieldDef->mTypeRef; - if (underlyingType != NULL) + if (!allowInstanceFields) { if (typeInstance->IsEnum()) Fail("Cannot declare instance members in an enum", nameRefNode, true); + else if (typeInstance->IsFunction()) + Fail("Cannot declare instance members in a function", nameRefNode, true); else Fail("Cannot declare instance members in a typed primitive struct", nameRefNode, true); TypeFailed(typeInstance); diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 0461e567..e5bc2504 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -6133,7 +6133,7 @@ void BfModule::Visit(BfForEachStatement* forEachStmt) { AssertErrorState(); } - if (retVal) + if ((retVal) && (!retVal.mType->IsVar())) { auto i8Result = ExtractValue(nextResult, NULL, 2); i8Result = LoadValue(i8Result); diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index 2eca4df2..dc195f09 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -2587,6 +2587,7 @@ void BfSystem::InjectNewRevision(BfTypeDef* typeDef) typeDef->mFullHash = nextTypeDef->mFullHash; typeDef->mInlineHash = nextTypeDef->mInlineHash; typeDef->mNestDepth = nextTypeDef->mNestDepth; + typeDef->mOuterType = nextTypeDef->mOuterType; //typeDef->mOuterType = nextTypeDef->mOuterType; typeDef->mNamespace = nextTypeDef->mNamespace; @@ -2598,6 +2599,9 @@ void BfSystem::InjectNewRevision(BfTypeDef* typeDef) typeDef->mProtection = nextTypeDef->mProtection; if ((typeDef->mTypeCode != BfTypeCode_Extension) && (!typeDef->mIsCombinedPartial)) BF_ASSERT(nextTypeDef->mTypeCode != BfTypeCode_Extension); + + BF_ASSERT(typeDef->mTypeCode == nextTypeDef->mTypeCode); + typeDef->mTypeCode = nextTypeDef->mTypeCode; typeDef->mIsAlwaysInclude = nextTypeDef->mIsAlwaysInclude; typeDef->mIsNoDiscard = nextTypeDef->mIsNoDiscard; @@ -2679,6 +2683,8 @@ void BfSystem::AddToCompositePartial(BfPassInstance* passInstance, BfTypeDef* co bool isFirst = false; + BF_ASSERT(compositeTypeDef->mFullNameEx == partialTypeDef->mFullNameEx); + auto typeDef = compositeTypeDef->mNextRevision; if (typeDef == NULL) { @@ -2693,6 +2699,8 @@ void BfSystem::AddToCompositePartial(BfPassInstance* passInstance, BfTypeDef* co typeDef->mSystem = partialTypeDef->mSystem; typeDef->mTypeCode = partialTypeDef->mTypeCode; + typeDef->mIsFunction = partialTypeDef->mIsFunction; + typeDef->mIsDelegate = partialTypeDef->mIsDelegate; typeDef->mNestDepth = partialTypeDef->mNestDepth; typeDef->mOuterType = partialTypeDef->mOuterType; typeDef->mNamespace = partialTypeDef->mNamespace; @@ -2732,8 +2740,8 @@ void BfSystem::AddToCompositePartial(BfPassInstance* passInstance, BfTypeDef* co if (partialTypeDef->mTypeCode != BfTypeCode_Extension) { typeDef->mTypeCode = partialTypeDef->mTypeCode; - typeDef->mTypeDeclaration = partialTypeDef->mTypeDeclaration; - } + typeDef->mTypeDeclaration = partialTypeDef->mTypeDeclaration; + } } // Merge attributes together