compiler/libec Improvements to conversion from AST->Type class, and to outputting...
[sdk] / compiler / ecc / ecc.ec
index ecbbada..0dfdc21 100644 (file)
@@ -115,6 +115,93 @@ static void OutputImports(char * fileName)
    delete f;
 }
 
+bool TestType(String string, String expected)
+{
+   bool result = true;
+   char typeString[1024] = { 0 };
+   Type type = ProcessTypeString(string, false);
+   PrintType(type, typeString, true, true);
+   if(strcmp(typeString, expected ? expected : string))
+   {
+      PrintLn("FAILED: ", string, " -> ", typeString);
+      result = false;
+   }
+   return result;
+}
+
+void TestTypes()
+{
+   int succeeded = 0, count = 0;
+   
+   //count++, succeeded += TestType("int (* f[8])[10]", null);
+   count++, succeeded += TestType("void (* signal(int, void (*)(int)))(int)", null);
+   count++, succeeded += TestType("void (* signal(double))()", null);
+   count++, succeeded += TestType("void (* bla)(int)", null);
+   count++, succeeded += TestType("int f(void (*[10])())", null);
+   count++, succeeded += TestType("void (*[10])()", null);
+   count++, succeeded += TestType("void (* converters_table[10])()", null);
+   count++, succeeded += TestType("int (* f[8])[10]", null);
+   
+   count++, succeeded += TestType("int f[8][10]", null);
+   count++, succeeded += TestType("int f[10]", null);
+   count++, succeeded += TestType("void *", null);
+   count++, succeeded += TestType("char * x", "char * x");
+   count++, succeeded += TestType("char * x", null);
+   count++, succeeded += TestType("char (* x[3])()", null);
+   count++, succeeded += TestType("char (*(* x[3])())", "char * (* x[3])()");
+   count++, succeeded += TestType("char (* x())", "char * x()");
+   count++, succeeded += TestType("char (* (* x[3])())[5]", null);
+   count++, succeeded += TestType("char (* f())[5]", null);
+   count++, succeeded += TestType("char * (* f())[5]", null);
+   count++, succeeded += TestType("char * (* * f())[5][2][3]", null);
+   count++, succeeded += TestType("char * (* * (* f)())[5][2][3]", null);
+   count++, succeeded += TestType("char * (* (* * (* f)())[5][2])[3]", null);
+   count++, succeeded += TestType("void (* (* bar)[5])()", null);
+   count++, succeeded += TestType("const int * (* const f)(char[10])", null);
+   count++, succeeded += TestType("const int", null);
+   count++, succeeded += TestType("int * const *", null);
+   count++, succeeded += TestType("int * const", null);
+   count++, succeeded += TestType("const int *", null);
+   
+   count++, succeeded += TestType("char * const (* (* const bar)[5])(int)", null);
+   count++, succeeded += TestType("char * const (* (* (* const bar)[5][6])(int))[2]", null);
+   count++, succeeded += TestType("int * * a", null);
+
+   count++, succeeded += TestType("char * const (* bar)()", null);
+
+   count++, succeeded += TestType("char * const (* const (* const bar)[5])(int)", null);
+   
+   count++, succeeded += TestType("char * (* const (* bar)[5])(int)", null);
+   count++, succeeded += TestType("void (* * const bar[5])()", null);
+   count++, succeeded += TestType("void (* * const bar)()", null);
+   count++, succeeded += TestType("void (* const * bar)()", null);
+   count++, succeeded += TestType("const int * * foo", null); // this prevents you from doing: **foo = 0;
+   count++, succeeded += TestType("int * const * bar", null); // this prevents you from doing: *bar = 0;
+   count++, succeeded += TestType("int * * const two", null); // this prevents you from doing: two = 0;
+
+   count++, succeeded += TestType("dllexport int TestFunction()", null); // this prevents you from doing: two = 0;
+   count++, succeeded += TestType("any_object TestFunction(any_object, typed_object & param)", null); // this prevents you from doing: two = 0;
+
+   count++, succeeded += TestType("void typed_object::OnDisplay(Surface surface, int x, int y, int width, void * fieldData, Alignment alignment, DataDisplayFlags displayFlags)", null);
+   count++, succeeded += TestType("int typed_object::OnCompare(any_object object)", null);
+   count++, succeeded += TestType("void typed_object&::OnCopy(any_object newData)", null);
+   count++, succeeded += TestType("void typed_object::OnFree(void)", null);
+   count++, succeeded += TestType("char * typed_object::OnGetString(char * tempString, void * fieldData, bool * needClass)", null);
+   count++, succeeded += TestType("bool typed_object&::OnGetDataFromString(char * string)", null);
+   count++, succeeded += TestType("Window typed_object::OnEdit(DataBox dataBox, DataBox obsolete, int x, int y, int w, int h, void * userData)", null);
+   count++, succeeded += TestType("void typed_object::OnSerialize(IOChannel channel)", null);
+   count++, succeeded += TestType("void typed_object&::OnUnserialize(IOChannel channel)", null);
+   count++, succeeded += TestType("bool typed_object&::OnSaveEdit(Window window, void * object)", null);
+
+   count++, succeeded += TestType("void PrintLn(typed_object object, ...)", null);
+   count++, succeeded += TestType("void PrintLn(typed_object object, ...)", null);
+   count++, succeeded += TestType("thisclass RemoveSwapRight()", null);
+   count++, succeeded += TestType("LinkElement<thisclass> link", null);
+   count++, succeeded += TestType("struct { thisclass prev; thisclass next; }", null);
+
+   PrintLn("\n", succeeded, " / ", count, " tests succeeded.");
+}
+
 class CompilerApp : Application
 {
    void Main()
@@ -329,6 +416,10 @@ class CompilerApp : Application
          SetTargetBits(targetBits);
          SetEchoOn(false);
 
+#ifdef _DEBUG
+         TestTypes();
+#endif
+
          privateModule = (Module)__ecere_COM_Initialize(true | (targetBits == sizeof(uintptr)*8 ? 0 : targetBits == 64 ? 2 : targetBits==32 ? 4 : 0) | 8, 1, null);
          SetPrivateModule(privateModule);