Index: tol/btol/text_type/txtgra.cpp
===================================================================
--- tol/btol/text_type/txtgra.cpp	(revision 3130ef16694dcec8271cf1414ee824242ffcb3c5)
+++ tol/btol/text_type/txtgra.cpp	(revision a1294dbea8b5ad601f1d76aa0904be7d5935fa8f)
@@ -975,22 +975,16 @@
     contens_=Arg(1)->Identify(); 
 }
-/*
+
+static BText Description_second_arg_error =
+  I2("If optional second argument <member> is specified, then must be "
+     "the name of a member of the class specified as an string in first one.",
+     "Si se especifica el segundo argumento opcional <member>, debe ser el "
+     "nombre de un miembro de la clase especificada como un texto en el primer "
+     "argumento");
+
 //--------------------------------------------------------------------
 DeclareContensClass(BText, BTxtTemporary, BTxtDescription);
-DefExtOpr(1, BTxtDescription, "Description",	 1, 2, "Anything Real",
-	  "(Anything var [, Real userType=False])",
-	  I2("Returns the description of a variable. "
-       "If first parameter <var> is a text and optional parameter "
-       "<userType> is true then searches the Class or Struct which "
-       "name is the contens of <var> and returns its description.",
-	     "Devuelve la descripción de una variable. Si el argumento "
-       "<var> es un texto y el arguemnto opcional <userType> es "
-       "cierto, entonces busca el tipo de usuario, Struct o Class, "
-       "cuyo nombre es el contenido de <var>"),
-	  BOperClassify::General_);
-*/
-DeclareContensClass(BText, BTxtTemporary, BTxtDescription);
-DefExtOpr(1, BTxtDescription, "Description",	 1, 1, "Anything",
-	  "(Anything var)",
+DefExtOpr(1, BTxtDescription, "Description",	 1, 2, "Anything Text",
+	  "(Anything var [,Text member])",
 	  I2("Returns the description of a variable. "
        "If first parameter <var> is a constant string true then "
@@ -1000,5 +994,5 @@
        "<var> es una cadena constante, entonces busca el tipo de "
        "usuario, Struct o Class, cuyo nombre es el contenido de "
-       "<var>"),
+       "<var>")+"\n"+Description_second_arg_error,
 	  BOperClassify::General_);
 //--------------------------------------------------------------------
@@ -1006,45 +1000,87 @@
 //--------------------------------------------------------------------
 {
+
   BSyntaxObject* arg1 = Arg(1);
   contens_=arg1->Description();
-
-  if(!contens_.HasName() && 
-      (arg1->Grammar()==GraText()) && 
-      (!arg1->HasName()))
-  {
-    BText& txt = Text(arg1);
-    BClass* cls = FindClass(txt,-1);
-    if(cls) { contens_ = cls->Description(); }
-    else
+  BText memberName = "";
+  if(Arg(2)) 
+  { 
+    BText err="";
+    memberName = Text(Arg(2)); 
+    bool ok = arg1->Grammar()==GraText();
+    if(ok)
     {
-      BStruct* str = FindStruct(txt);
-      if(str) { contens_ = str->Description(); }
-    }  
-  }
-  if(!contens_.HasName() && 
-      (arg1->Grammar()==GraCode()) && 
-      (arg1->Mode()==BOBJECTMODE))
-  {
-    BUserCode* uCode = UCode(arg1);
-    const BSpecialFunction* spf = uCode->Contens().SpecialFunction();
-    if(spf)
-    {
-      contens_=spf->Description();
+      BText className = Text(arg1);
+      BClass* cls = FindClass(className,1);
+      if(ok = (cls!=NULL))
+      {
+        BMember* mbr = cls->FindMember(memberName);
+        if(ok = (mbr!=NULL))
+        {
+          contens_ = mbr->description_;
+        }  
+        else
+        {
+          err = memberName+I2(" is not a member of Class ",
+                              " no es un mimebro de Class ")+className;
+        }
+      }  
+      else
+      {
+        err = className+I2(" is not a Class",
+                           " no es un Class");
+      }
     }
     else
     {
-      BOperator* opr = uCode->Contens().Operator();
-      if(opr)
+      err = I2("First argument is not a Text",
+               "El primer argumento no es un Text");
+    }
+    if(!ok)
+    {
+      Error(BText("[Description] ")+Description_second_arg_error+"\n"+err);
+    }
+  }
+  else
+  {
+    if(!contens_.HasName() && 
+        (arg1->Grammar()==GraText()) && 
+        (!arg1->HasName()))
+    {
+      BText& txt = Text(arg1);
+      BClass* cls = FindClass(txt,-1);
+      if(cls) { contens_ = cls->Description(); }
+      else
       {
-        contens_=opr->Description();
-        if(!contens_.HasName()) { contens_ = opr->Expression(); }
+        BStruct* str = FindStruct(txt);
+        if(str) { contens_ = str->Description(); }
+      }  
+    }
+    if(!contens_.HasName() && 
+        (arg1->Grammar()==GraCode()) && 
+        (arg1->Mode()==BOBJECTMODE))
+    {
+      BUserCode* uCode = UCode(arg1);
+      const BSpecialFunction* spf = uCode->Contens().SpecialFunction();
+      if(spf)
+      {
+        contens_=spf->Description();
       }
       else
       {
-        contens_="NOT FOUND";
+        BOperator* opr = uCode->Contens().Operator();
+        if(opr)
+        {
+          contens_=opr->Description();
+          if(!contens_.HasName()) { contens_ = opr->Expression(); }
+        }
+        else
+        {
+          contens_="NOT FOUND";
+        }
       }
     }
+    if(!contens_.HasName()) { contens_ = arg1->Expression(); }
   }
-  if(!contens_.HasName()) { contens_ = arg1->Expression(); }
 }
 
