diff --git a/IDE/mintest/src/base.cs b/IDE/mintest/src/base.cs new file mode 100644 index 00000000..4c3ff65a --- /dev/null +++ b/IDE/mintest/src/base.cs @@ -0,0 +1,87 @@ +/*using System; +using System.Runtime.InteropServices; + +namespace Allegro +{ + public partial class AllegroAPI + { + //internal const string AllegroDllName = "allegro_monolith-5.2.dll"; + + public static string AllegroDllVersionName(string name) + { + var p = (int)Environment.OSVersion.Platform; + if ((p == 4) || (p == 6) || (p == 128)) + return name; // Linux + + // Windows + return name + '-' + ALLEGRO_VERSION + '.' + ALLEGRO_SUB_VERSION + ".dll"; + } + + //private const string AllegroDllName = "allegro"; + internal const string AllegroDllName = "allegro_monolith-5.2.dll"; + + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate int AppMainDelegate(int argc, string[] argv); + + + + + public const int ALLEGRO_VERSION = 5; + public const int ALLEGRO_SUB_VERSION = 2; + public const int ALLEGRO_WIP_VERSION = 2; + + + /// + /// Not sure we need it, but since ALLEGRO_VERSION_STR contains it: + /// 0 = GIT + /// 1 = first release + /// 2... = hotfixes? + /// + /// Note x.y.z (= x.y.z.0) has release number 1, and x.y.z.1 has release + /// number 2, just to confuse you. + /// + public const int ALLEGRO_RELEASE_NUMBER = 0; + + public const string ALLEGRO_VERSION_STR = "5.2.2 (GIT)"; + public const string ALLEGRO_DATE_STR = "2016"; + public const int ALLEGRO_DATE = 20160731; /* yyyymmdd */ + public const int ALLEGRO_VERSION_INT = + ((ALLEGRO_VERSION << 24) | (ALLEGRO_SUB_VERSION << 16) | + (ALLEGRO_WIP_VERSION << 8) | ALLEGRO_RELEASE_NUMBER); + + //[DllImport(AllegroDllName, CallingConvention = CallingConvention.Cdecl)] + //[Import(AllegroDllName)]Cdecl)] + public static extern UInt32 al_get_allegro_version(); + + [DllImport(AllegroDllName, CallingConvention = CallingConvention.Cdecl)] + public static extern int al_run_main(int argc, + [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0, ArraySubType = UnmanagedType.LPStr)] + string[] argv, AppMainDelegate main); + + /*******************************************/ + /************ Some global stuff ************/ + /*******************************************/ + + /// + /// ALLEGRO_PI + /// + public const double ALLEGRO_PI = 3.14159265358979323846; + + public static int AL_ID(byte a, byte b, byte c, byte d) + { + return (a << 24) | (b << 16) | (c << 8) | d; + } + + + + public static bool IsLinux + { + get + { + int p = (int) Environment.OSVersion.Platform; + return (p == 4) || (p == 6) || (p == 128); + } + } + } +}*/ diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index fcd2ab25..8561d379 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -1064,6 +1064,16 @@ namespace IDE.ui return projectItem; } + ProjectFolder GetSelectedProjectFolder() + { + let projectItem = GetSelectedProjectItem(); + if (projectItem == null) + return null; + if (let projectFolder = projectItem as ProjectFolder) + return projectFolder; + return projectItem.mParentFolder; + } + public void SelectItem(ListViewItem item, bool checkKeyStates = false) { if (item.Focused) @@ -2145,7 +2155,7 @@ namespace IDE.ui item = menu.AddItem("New Folder"); item.mOnMenuItemSelected.Add(new (item) => { - var projectFolder = GetSelectedProjectItem() as ProjectFolder; + var projectFolder = GetSelectedProjectFolder(); if (projectFolder != null) { if (CheckProjectModify(projectFolder.mProject)) @@ -2156,7 +2166,7 @@ namespace IDE.ui item = menu.AddItem("New Class..."); item.mOnMenuItemSelected.Add(new (item) => { - var projectFolder = GetSelectedProjectItem() as ProjectFolder; + var projectFolder = GetSelectedProjectFolder(); if (projectFolder != null) { if (CheckProjectModify(projectFolder.mProject)) diff --git a/IDEHelper/Compiler/BfDefBuilder.cpp b/IDEHelper/Compiler/BfDefBuilder.cpp index 67c26803..654a56b8 100644 --- a/IDEHelper/Compiler/BfDefBuilder.cpp +++ b/IDEHelper/Compiler/BfDefBuilder.cpp @@ -1467,7 +1467,12 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration) { if (checkTypeDef->mDefState == BfTypeDef::DefState_AwaitingNewVersion) { - if (isExtension == (checkTypeDef->mTypeCode == BfTypeCode_Extension)) + // We don't allow "new revision" semantics if the 'isExtension' state changes, or + // if the outer type did not use "new revision" semantics (for isExtension change on itself or other outer type) + bool isCompatible = (isExtension == (checkTypeDef->mTypeCode == BfTypeCode_Extension)) && + (checkTypeDef->mOuterType == actualOuterTypeDef); + + if (isCompatible) { if (prevRevisionTypeDef == NULL) { diff --git a/IDEHelper/Compiler/BfMangler.cpp b/IDEHelper/Compiler/BfMangler.cpp index 071bd59a..984b2141 100644 --- a/IDEHelper/Compiler/BfMangler.cpp +++ b/IDEHelper/Compiler/BfMangler.cpp @@ -259,7 +259,10 @@ void BfGNUMangler::FindOrCreateNameSub(MangleContext& mangleContext, StringImpl& if (useModule == NULL) useModule = mangleContext.mModule; auto outerType = useModule->GetOuterType(typeInst); - FindOrCreateNameSub(mangleContext, name, outerType, curMatchIdx, matchFailed); + if (outerType != NULL) + FindOrCreateNameSub(mangleContext, name, outerType, curMatchIdx, matchFailed); + else + useModule->Fail("Failed to mangle name in BfGNUMangler::FindOrCreateNameSub"); } FindOrCreateNameSub(mangleContext, name, NameSubstitute(NameSubstitute::Kind_TypeInstName, typeInst), curMatchIdx, matchFailed); @@ -1283,7 +1286,10 @@ void BfMSMangler::Mangle(MangleContext& mangleContext, StringImpl& name, BfTypeI else { auto outerType = useModule->GetOuterType(typeInstance); - Mangle(mangleContext, name, outerType, true, true); + if (outerType != NULL) + Mangle(mangleContext, name, outerType, true, true); + else + useModule->Fail("Failed to mangle name in BfMSMangler::Mangle"); } } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index c6559ea4..c11ad752 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -4902,6 +4902,9 @@ BfType* BfModule::ResolveTypeDef(BfTypeDef* typeDef, BfPopulateType populateType //BF_ASSERT(typeDef->mTypeCode != BfTypeCode_Extension); BF_ASSERT(!typeDef->mIsPartial || typeDef->mIsCombinedPartial); + BF_ASSERT(typeDef->mDefState != BfTypeDef::DefState_Deleted); + BF_ASSERT((typeDef->mOuterType == NULL) || (typeDef->mOuterType->mDefState != BfTypeDef::DefState_Deleted)); + if (typeDef->mGenericParamDefs.size() != 0) return ResolveTypeDef(typeDef, BfTypeVector(), populateType);