ide; compiler/libec: Auto completion improvements
authorJerome St-Louis <jerome@ecere.com>
Fri, 20 Jun 2014 16:56:00 +0000 (12:56 -0400)
committerJerome St-Louis <jerome@ecere.com>
Fri, 20 Jun 2014 17:04:16 +0000 (13:04 -0400)
- Not converting identifiers to constants from ProcessExpressionType(), only from ComputeExpression()

compiler/bootstrap/ecere/bootstrap/System.c
compiler/bootstrap/libec/bootstrap/ecdefs.c
compiler/bootstrap/libec/bootstrap/loadSymbols.c
compiler/bootstrap/libec/bootstrap/pass15.c
compiler/libec/src/ecdefs.ec
compiler/libec/src/pass15.ec
ide/src/debugger/Debugger.ec

index fc19756..26cf317 100644 (file)
@@ -883,8 +883,8 @@ __ecereNameSpace__ecere__com__eInstance_IncRef(__ecereNameSpace__ecere__sys__err
 
 void __ecereDestroyModuleInstances_System()
 {
-(__ecereNameSpace__ecere__com__eInstance_DecRef(__ecereNameSpace__ecere__sys__sysErrorMessages), __ecereNameSpace__ecere__sys__sysErrorMessages = 0);
-(__ecereNameSpace__ecere__com__eInstance_DecRef(__ecereNameSpace__ecere__sys__guiErrorMessages), __ecereNameSpace__ecere__sys__guiErrorMessages = 0);
 (__ecereNameSpace__ecere__com__eInstance_DecRef(__ecereNameSpace__ecere__sys__errorMessages), __ecereNameSpace__ecere__sys__errorMessages = 0);
+(__ecereNameSpace__ecere__com__eInstance_DecRef(__ecereNameSpace__ecere__sys__guiErrorMessages), __ecereNameSpace__ecere__sys__guiErrorMessages = 0);
+(__ecereNameSpace__ecere__com__eInstance_DecRef(__ecereNameSpace__ecere__sys__sysErrorMessages), __ecereNameSpace__ecere__sys__sysErrorMessages = 0);
 }
 
index 289be61..88ae093 100644 (file)
@@ -1279,6 +1279,13 @@ void SetInCompiler(unsigned int b)
 inCompiler = b;
 }
 
+unsigned int inDebugger = 0;
+
+void SetInDebugger(unsigned int b)
+{
+inDebugger = b;
+}
+
 struct Context * curContext;
 
 struct Context * globalContext;
@@ -2236,6 +2243,7 @@ class = __ecereNameSpace__ecere__com__eSystem_RegisterClass(5, "DBIndexItem", 0,
 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + structSize_Instance)))->application == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + structSize_Instance)))->application && class)
 __ecereClass_DBIndexItem = class;
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetInCompiler", "void SetInCompiler(bool b)", SetInCompiler, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetInDebugger", "void SetInDebugger(bool b)", SetInDebugger, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetPrivateModule", "void SetPrivateModule(ecere::com::Module module)", SetPrivateModule, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetPrivateModule", "ecere::com::Module GetPrivateModule(void)", GetPrivateModule, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetMainModule", "void SetMainModule(ModuleImport moduleImport)", SetMainModule, module, 1);
index 5318451..c7e6669 100644 (file)
@@ -656,6 +656,13 @@ void SetInSymbolGen(unsigned int b)
 inSymbolGen = b;
 }
 
+unsigned int inDocumentor = 0;
+
+void SetInDocumentor(unsigned int b)
+{
+inDocumentor = b;
+}
+
 struct __ecereNameSpace__ecere__sys__OldList * precompDefines;
 
 void SetPrecompDefines(struct __ecereNameSpace__ecere__sys__OldList * list)
@@ -1789,7 +1796,7 @@ if(ext[0] || !__ecereNameSpace__ecere__sys__FileExists(symFile))
 unsigned int skipLoad = 0;
 struct __ecereNameSpace__ecere__com__Instance * list = (((void *)0));
 
-if(!inCompiler && !inPreCompiler && !inSymbolGen)
+if(!inCompiler && !inPreCompiler && !inSymbolGen && !inDocumentor)
 {
 struct __ecereNameSpace__ecere__com__MapIterator it = (it.container = (void *)0, it.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map(&it, loadedModules), it);
 
@@ -2061,6 +2068,7 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetEcereImported", "void
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetEcereImported", "bool GetEcereImported(void)", GetEcereImported, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetInPreCompiler", "void SetInPreCompiler(bool b)", SetInPreCompiler, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetInSymbolGen", "void SetInSymbolGen(bool b)", SetInSymbolGen, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetInDocumentor", "void SetInDocumentor(bool b)", SetInDocumentor, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetPrecompDefines", "void SetPrecompDefines(ecere::sys::OldList * list)", SetPrecompDefines, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DummyMethod", "bool DummyMethod(void)", DummyMethod, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("LoadSymbols", "bool LoadSymbols(const char * fileName, ecere::com::ImportType importType, bool loadDllOnly)", LoadSymbols, module, 1);
index f500bc1..334e9cb 100644 (file)
@@ -5421,6 +5421,10 @@ char *  name;
 long long data;
 } __attribute__ ((gcc_struct));
 
+extern unsigned int inPreCompiler;
+
+extern unsigned int inDebugger;
+
 extern void FreeExpContents(struct Expression * exp);
 
 struct __ecereNameSpace__ecere__sys__BTNode * __ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(struct __ecereNameSpace__ecere__sys__BinaryTree * this);
@@ -5473,13 +5477,14 @@ break;
 }
 if(value)
 {
-FreeExpContents(sourceExp);
 FreeType(sourceExp->expType);
 sourceExp->isConstant = 1;
 sourceExp->expType = MkClassType(baseClass->fullName);
+if(inCompiler || inPreCompiler || inDebugger)
 {
 char constant[256];
 
+FreeExpContents(sourceExp);
 sourceExp->type = 2;
 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "short") || !strcmp(baseClass->dataTypeString, "char"))
 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
@@ -6011,11 +6016,12 @@ break;
 }
 if(value)
 {
-FreeExpContents(sourceExp);
 FreeType(sourceExp->expType);
 sourceExp->isConstant = 1;
 sourceExp->expType = MkClassType(_class->fullName);
+if(inCompiler || inPreCompiler || inDebugger)
 {
+FreeExpContents(sourceExp);
 sourceExp->type = 2;
 if(_class->dataTypeString && (!strcmp(_class->dataTypeString, "int") || !strcmp(_class->dataTypeString, "int64") || !strcmp(_class->dataTypeString, "short") || !strcmp(_class->dataTypeString, "char")))
 sourceExp->__anon1.__anon1.constant = PrintInt64(value->data);
@@ -13687,16 +13693,19 @@ break;
 }
 if(value)
 {
+exp->isConstant = 1;
+if(inCompiler || inPreCompiler || inDebugger)
+{
 char constant[256];
 
 FreeExpContents(exp);
 exp->type = 2;
-exp->isConstant = 1;
 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "char") || !strcmp(baseClass->dataTypeString, "short"))
 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
 else
 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), value->data);
 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
+}
 exp->expType = MkClassType(baseClass->fullName);
 break;
 }
index 911bc60..73b71b0 100644 (file)
@@ -183,6 +183,9 @@ class DBIndexItem : struct
 bool inCompiler = false;
 public void SetInCompiler(bool b) { inCompiler = b; }
 
+bool inDebugger = false;
+public void SetInDebugger(bool b) { inDebugger = b; }
+
 Context curContext;
 Context globalContext;
 OldList * excludedSymbols;
index f255ff4..bfd39ac 100644 (file)
@@ -3609,14 +3609,15 @@ bool MatchWithEnums_NameSpace(NameSpace nameSpace, Expression sourceExp, Type de
                   }
                   if(value)
                   {
-                     FreeExpContents(sourceExp);
                      FreeType(sourceExp.expType);
 
                      sourceExp.isConstant = true;
                      sourceExp.expType = MkClassType(baseClass.fullName);
-                     //if(inCompiler)
+                     if(inCompiler || inPreCompiler || inDebugger)
                      {
                         char constant[256];
+                        FreeExpContents(sourceExp);
+
                         sourceExp.type = constantExp;
                         if(!strcmp(baseClass.dataTypeString, "int") || !strcmp(baseClass.dataTypeString, "int64") || !strcmp(baseClass.dataTypeString, "short") || !strcmp(baseClass.dataTypeString, "char"))
                            sprintf(constant, FORMAT64D, value.data);
@@ -4206,13 +4207,14 @@ bool MatchTypeExpression(Expression sourceExp, Type dest, OldList conversions, b
                      }
                      if(value)
                      {
-                        FreeExpContents(sourceExp);
                         FreeType(sourceExp.expType);
 
                         sourceExp.isConstant = true;
                         sourceExp.expType = MkClassType(_class.fullName);
-                        //if(inCompiler)
+                        if(inCompiler || inPreCompiler || inDebugger)
                         {
+                           FreeExpContents(sourceExp);
+
                            sourceExp.type = constantExp;
                            if(_class.dataTypeString && (!strcmp(_class.dataTypeString, "int") || !strcmp(_class.dataTypeString, "int64") || !strcmp(_class.dataTypeString, "short") || !strcmp(_class.dataTypeString, "char"))) // _class cannot be null here!
                               sourceExp.constant = PrintInt64(value.data);
@@ -5543,6 +5545,36 @@ void ComputeExpression(Expression exp)
 
    switch(exp.type)
    {
+      case identifierExp:
+      {
+         Identifier id = exp.identifier;
+         if(id && exp.isConstant && !inCompiler && !inPreCompiler && !inDebugger)
+         {
+            Class c = (exp.expType && exp.expType.kind == classType && exp.expType._class) ? exp.expType._class.registered : null;
+            if(c && c.type == enumClass)
+            {
+               Class enumClass = eSystem_FindClass(privateModule, "enum");
+               if(enumClass)
+               {
+                  NamedLink64 value;
+                  EnumClassData e = ACCESS_CLASSDATA(c, enumClass);
+                  for(value = e.values.first; value; value = value.next)
+                  {
+                     if(!strcmp(value.name, id.string))
+                        break;
+                  }
+                  if(value)
+                  {
+                     const String dts = c.dataTypeString;
+                     FreeExpContents(exp);
+                     exp.type = constantExp;
+                     exp.constant = (dts && (!strcmp(dts, "int") || !strcmp(dts, "int64") || !strcmp(dts, "short") || !strcmp(dts, "char"))) ? PrintInt64(value.data) : PrintUInt64(value.data);
+                  }
+               }
+            }
+         }
+         break;
+      }
       case instanceExp:
       {
          ComputeInstantiation(exp);
@@ -7293,17 +7325,19 @@ static bool ResolveIdWithClass(Expression exp, Class _class, bool skipIDClassChe
             }
             if(value)
             {
-               char constant[256];
-
-               FreeExpContents(exp);
-
-               exp.type = constantExp;
                exp.isConstant = true;
-               if(!strcmp(baseClass.dataTypeString, "int") || !strcmp(baseClass.dataTypeString, "int64") || !strcmp(baseClass.dataTypeString, "char") || !strcmp(baseClass.dataTypeString, "short"))
-                  sprintf(constant, FORMAT64D, value.data);
-               else
-                  sprintf(constant, FORMAT64HEX, value.data);
-               exp.constant = CopyString(constant);
+               if(inCompiler || inPreCompiler || inDebugger)
+               {
+                  char constant[256];
+                  FreeExpContents(exp);
+
+                  exp.type = constantExp;
+                  if(!strcmp(baseClass.dataTypeString, "int") || !strcmp(baseClass.dataTypeString, "int64") || !strcmp(baseClass.dataTypeString, "char") || !strcmp(baseClass.dataTypeString, "short"))
+                     sprintf(constant, FORMAT64D, value.data);
+                  else
+                     sprintf(constant, FORMAT64HEX, value.data);
+                  exp.constant = CopyString(constant);
+               }
                //for(;_class.base && _class.base.type != systemClass; _class = _class.base);
                exp.expType = MkClassType(baseClass.fullName);
                break;
index 3b64be2..0b028eb 100644 (file)
@@ -2627,6 +2627,8 @@ class Debugger
                expString[0] = 0;
                PrintExpression(exp, expString);
 
+               SetInDebugger(true);
+
                SetThisClass(null);
                if(codeEditor && activeFrame)
                   DebugFindCtxTree(codeEditor.ast, activeFrame.line, 0);
@@ -3184,6 +3186,8 @@ class Debugger
                      break;
                   }
                }
+
+               SetInDebugger(false);
             }
             else
                snprintf(watchmsg, sizeof(watchmsg), $"Invalid expression: \"%s\"", wh.expression);