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);