]> OCCT Git - occt-copy.git/commitdiff
0031481: Data Exchange - provide parser of STEP EXPRESS schema for generation of...
authorskl <skl@opencascade.com>
Tue, 1 Dec 2020 08:40:51 +0000 (11:40 +0300)
committerskl <skl@opencascade.com>
Mon, 7 Dec 2020 09:01:23 +0000 (12:01 +0300)
Next changes for correspondence generated files to OCCT Code Rules.

src/Express/Express_Entity.cxx

index 20ec9f5b533ff9a7941f19856b6f79eabc0252eb..764116b5aa7d2c84072755f3211d55a4ac9e8dd4 100644 (file)
@@ -275,7 +275,8 @@ Standard_Boolean Express_Entity::GenerateClass () const
     else
     {
       os << "  Standard_EXPORT void Set" << field->Name()->ToCString() << " (const "
-        << field->Type()->CPPName()->ToCString() << " the" << field->Name()->ToCString() << ");" << std::endl;
+        << field->Type()->CPPName()->ToCString() << (field->Type()->IsSimple() ? "" : "&")
+        << " the" << field->Name()->ToCString() << ");" << std::endl;
     }
     if (field->IsOptional())
     {
@@ -396,7 +397,13 @@ Standard_Boolean Express_Entity::GenerateClass () const
 
   // close
   os.close();
-  if (AbstractFlag()) return Standard_True;
+
+  if (AbstractFlag())
+  {
+    // generation of RW class is not needed
+    return Standard_True;
+  }
+
   //===============================
   // Step 3: generating HXX for Reader/Writer class
 
@@ -446,20 +453,20 @@ Standard_Boolean Express_Entity::GenerateClass () const
   os << "  Standard_EXPORT " << RWCPPName->ToCString() << "();" << std::endl << std::endl;
 
   // read step
-  os << "  Standard_EXPORT void ReadStep(const Handle(StepData_StepReaderData)& data," << std::endl;
-  os << "                                const Standard_Integer num," << std::endl;
-  os << "                                Handle(Interface_Check)& ach," << std::endl;
-  os << "                                const Handle(" << CPPName()->ToCString() << ")& ent) const;"
+  os << "  Standard_EXPORT void ReadStep(const Handle(StepData_StepReaderData)& theData," << std::endl;
+  os << "                                const Standard_Integer theNum," << std::endl;
+  os << "                                Handle(Interface_Check)& theCheck," << std::endl;
+  os << "                                const Handle(" << CPPName()->ToCString() << ")& theEnt) const;"
     << std::endl << std::endl;
 
   // write step
-  os << "  Standard_EXPORT void WriteStep(StepData_StepWriter& SW," << std::endl;
-  os << "                                 const Handle(" << CPPName()->ToCString() << ")& ent) const;"
+  os << "  Standard_EXPORT void WriteStep(StepData_StepWriter& theSW," << std::endl;
+  os << "                                 const Handle(" << CPPName()->ToCString() << ")& theEnt) const;"
     << std::endl << std::endl;
 
   // share
-  os << "  Standard_EXPORT void Share(const Handle(" << CPPName()->ToCString() << ")& ent," << std::endl;
-  os << "                             Interface_EntityIterator& iter) const;" << std::endl << std::endl;
+  os << "  Standard_EXPORT void Share(const Handle(" << CPPName()->ToCString() << ")& theEnt," << std::endl;
+  os << "                             Interface_EntityIterator& theIter) const;" << std::endl << std::endl;
 
   // write end
   os << "};" << std::endl << std::endl;
@@ -492,27 +499,27 @@ Standard_Boolean Express_Entity::GenerateClass () const
   Express::WriteMethodStamp(os, new TCollection_HAsciiString("ReadStep"));
   if (RWCPPName->Length() < 40)
   {
-    os << "void " << RWCPPName->ToCString() << "::ReadStep (const Handle(StepData_StepReaderData)& data," << std::endl;
+    os << "void " << RWCPPName->ToCString() << "::ReadStep (const Handle(StepData_StepReaderData)& theData," << std::endl;
     writeSpaces(os, 17 + RWCPPName->Length());
-    os << "const Standard_Integer num," << std::endl;
+    os << "const Standard_Integer theNum," << std::endl;
     writeSpaces(os, 17 + RWCPPName->Length());
-    os << "Handle(Interface_Check)& ach," << std::endl;
+    os << "Handle(Interface_Check)& theCheck," << std::endl;
     writeSpaces(os, 17 + RWCPPName->Length());
-    os << "const Handle(" << CPPname->ToCString() << ")& ent) const" << std::endl;
+    os << "const Handle(" << CPPname->ToCString() << ")& theEnt) const" << std::endl;
   }
   else
   {
     os << "void " << RWCPPName->ToCString() << "::ReadStep(" << std::endl; 
-    os << "  const Handle(StepData_StepReaderData)& data," << std::endl;
-    os << "  const Standard_Integer num," << std::endl;
-    os << "  Handle(Interface_Check)& ach," << std::endl;
-    os << "  const Handle(" << CPPname->ToCString() << ")& ent) const" << std::endl;
+    os << "  const Handle(StepData_StepReaderData)& theData," << std::endl;
+    os << "  const Standard_Integer theNum," << std::endl;
+    os << "  Handle(Interface_Check)& theCheck," << std::endl;
+    os << "  const Handle(" << CPPname->ToCString() << ")& theEnt) const" << std::endl;
   }
   os << "{" << std::endl;
   Standard_Integer nbFld = NbFields ( Standard_True );
   
   os << "  // Check number of parameters" << std::endl;
-  os << "  if (!data->CheckNbParams(num, " << nbFld << ", ach, \"" <<
+  os << "  if (!theData->CheckNbParams(theNum, " << nbFld << ", theCheck, \"" <<
     Express::ToStepName(Name())->ToCString() << "\"))" << std::endl;
   os << "  {" << std::endl;
   os << "    return;" << std::endl;
@@ -520,23 +527,23 @@ Standard_Boolean Express_Entity::GenerateClass () const
   writeRWReadCode(os, 1, Standard_True); // write code for reading inherited and own fields
   os << std::endl;
   os << "  // Initialize entity" << std::endl;
-  os << "  ent->Init(";
-  makeInit(os, 12, Standard_True, 4);
+  os << "  theEnt->Init(";
+  makeInit(os, 15, Standard_True, 4);
   os << ");\n}" << std::endl;
 
   // write method WriteStep
   Express::WriteMethodStamp(os, new TCollection_HAsciiString("WriteStep"));
   if (RWCPPName->Length() < 40)
   {
-    os << "void " << RWCPPName->ToCString() << "::WriteStep (StepData_StepWriter& SW," << std::endl;
+    os << "void " << RWCPPName->ToCString() << "::WriteStep (StepData_StepWriter& theSW," << std::endl;
     writeSpaces(os, 18 + RWCPPName->Length());
-    os << "const Handle(" << CPPname->ToCString() << ")& ent) const" << std::endl;
+    os << "const Handle(" << CPPname->ToCString() << ")& theEnt) const" << std::endl;
   }
   else
   {
     os << "void " << RWCPPName->ToCString() << "::WriteStep(" << std::endl; 
-    os << "  StepData_StepWriter& SW," << std::endl;
-    os << "  const Handle(" << CPPname->ToCString() << ")& ent) const" << std::endl;
+    os << "  StepData_StepWriter& theSW," << std::endl;
+    os << "  const Handle(" << CPPname->ToCString() << ")& theEnt) const" << std::endl;
   }
   os << "{" << std::endl;
   
@@ -545,20 +552,41 @@ Standard_Boolean Express_Entity::GenerateClass () const
 
   // write method Share
   Express::WriteMethodStamp(os, new TCollection_HAsciiString("Share"));
+  std::ostringstream oos;
+  Standard_Integer nbF = writeRWShareCode(oos, 1, Standard_True); // write code for filling graph of references
   if (RWCPPName->Length() < 40)
   {
-    os << "void " << RWCPPName->ToCString() << "::Share (const Handle(" << CPPname->ToCString() << ")& ent," << std::endl;
+    os << "void " << RWCPPName->ToCString() << "::Share (const Handle(" << CPPname->ToCString() << ")&";
+    os << ((nbF > 1) ? "theEnt," : ",") << std::endl;
     writeSpaces(os, 14 + RWCPPName->Length());
-    os << "Interface_EntityIterator& iter) const" << std::endl;
+    if (nbF > 1)
+    {
+      os << "Interface_EntityIterator& theIter) const" << std::endl;
+    }
+    else
+    {
+      os << "Interface_EntityIterator&) const" << std::endl;
+    }
   }
   else
   {
     os << "void " << RWCPPName->ToCString() << "::Share(" << std::endl; 
-    os << "  const Handle(" << CPPname->ToCString() << ")& ent," << std::endl;
-    os << "  Interface_EntityIterator& iter) const" << std::endl;
+    os << "  const Handle(" << CPPname->ToCString() << ")&";
+    os<< ((nbF > 1) ? "theEnt," : ",") << std::endl;
+    if (nbF > 1)
+    {
+      os << "Interface_EntityIterator& theIter) const" << std::endl;
+    }
+    else
+    {
+      os << "Interface_EntityIterator&) const" << std::endl;
+    }
   }
   os << "{" << std::endl;
-  writeRWShareCode ( os, 1, Standard_True ); // write code for filling graph of references
+  if (nbF > 1)
+  {
+    os << oos.str();
+  }
   os << "}" << std::endl;
   if(CheckFlag())
   {
@@ -699,7 +727,7 @@ Standard_Boolean Express_Entity::writeIncludes(
   Standard_OStream& theOs,
   DataMapOfStringInteger& theDict) const
 {
-  for (Standard_Integer i = 1; i <= myInherit->Length(); i++)
+  for (Standard_Integer i = 2; i <= myInherit->Length(); i++)
   {
     Handle(Express_Entity) it = myInherit->Value(i);
     it->writeIncludes(theOs, theDict);
@@ -812,9 +840,10 @@ static void writeRWReadField(
   level += 2;
 
   // name of variable identifying number of parameter in data
-  TCollection_AsciiString param("num");
+  TCollection_AsciiString param("theNum");
   if (lev > 0)
   {
+    param = TCollection_AsciiString("num");
     param += TCollection_AsciiString(lev);
   }
   
@@ -845,7 +874,7 @@ static void writeRWReadField(
   if (optional)
   {
     theOs << shift << "Standard_Boolean has" << varname << " = Standard_True;" << std::endl;
-    theOs << shift << "if (data->IsParamDefined(" << param << ", " << index << "))" << std::endl;
+    theOs << shift << "if (theData->IsParamDefined(" << param << ", " << index << "))" << std::endl;
     theOs << shift << "{" << std::endl;
     shift += "  ";
     level++;
@@ -857,20 +886,20 @@ static void writeRWReadField(
     Handle(Express_NamedType) named = Handle(Express_NamedType)::DownCast(type);
     if (named->Item()->IsKind(STANDARD_TYPE(Express_Entity)))
     {
-      theOs << shift << "data->ReadEntity(" << param << ", " << index << ", \"" << STEPName << "\", ach," << std::endl;
+      theOs << shift << "theData->ReadEntity(" << param << ", " << index << ", \"" << STEPName << "\", theCheck," << std::endl;
       theOs << shift << "  STANDARD_TYPE(" << named->CPPName()->ToCString() << "), a" << varname << ");" << std::endl;
     }
     else if (named->Item()->IsKind(STANDARD_TYPE(Express_Select)))
     {
-      theOs << shift << "data->ReadEntity(" << param << ", " << index << ", \"" << STEPName <<
-        "\", ach, a" << varname << ");" << std::endl;
+      theOs << shift << "theData->ReadEntity(" << param << ", " << index << ", \"" << STEPName <<
+        "\", theCheck, a" << varname << ");" << std::endl;
     }
     else if (named->Item()->IsKind(STANDARD_TYPE(Express_Enum)))
     {
-      theOs << shift << "if (data->ParamType(" << param << ", " <<
+      theOs << shift << "if (theData->ParamType(" << param << ", " <<
         index << ") == Interface_ParamEnum)" << std::endl;
       theOs << shift << "{" << std::endl;
-      theOs << shift << "  Standard_CString text = data->ParamCValue(" <<
+      theOs << shift << "  Standard_CString text = theData->ParamCValue(" <<
         param << ", " << index << ");" << std::endl;
       Handle(Express_Enum) en = Handle(Express_Enum)::DownCast(named->Item());
       Handle(TCollection_HAsciiString) prefix = Express::EnumPrefix(en->Name());
@@ -887,13 +916,13 @@ static void writeRWReadField(
       }
       theOs << shift << "  else" << std::endl;
       theOs << shift << "  {" << std::endl;
-      theOs << shift << "    ach->AddFail(\"Parameter #" << index << " (" << STEPName 
+      theOs << shift << "    theCheck->AddFail(\"Parameter #" << index << " (" << STEPName 
         << ") has not allowed value\");" << std::endl;
       theOs << shift << "  }" << std::endl;
       theOs << shift << "}" << std::endl;
       theOs << shift << "else" << std::endl;
       theOs << shift << "{" << std::endl;
-      theOs << shift << "  ach->AddFail(\"Parameter #" << index << " (" << STEPName
+      theOs << shift << "  theCheck->AddFail(\"Parameter #" << index << " (" << STEPName
         << ") is not enumeration\");" << std::endl;
       theOs << shift << "}" << std::endl;
       //theOs << "!!! READING/WRITING ENUM NOT IMPLEMENTED !!!" << std::endl;
@@ -905,10 +934,10 @@ static void writeRWReadField(
   {
     Handle(Express_ComplexType) complex = Handle(Express_ComplexType)::DownCast(type);
     theOs << shift << "Standard_Integer sub" << index << " = 0;" << std::endl;
-    theOs << shift << "if (data->ReadSubList(" << param << ", " << index << ", \"" <<
-      STEPName << "\", ach, sub" << index << "))" << std::endl;
+    theOs << shift << "if (theData->ReadSubList(" << param << ", " << index << ", \"" <<
+      STEPName << "\", theCheck, sub" << index << "))" << std::endl;
     theOs << shift << "{" << std::endl;
-    theOs << shift << "  Standard_Integer nb" << lev << " = data->NbParams(sub" << index << ");" << std::endl;
+    theOs << shift << "  Standard_Integer nb" << lev << " = theData->NbParams(sub" << index << ");" << std::endl;
     TCollection_AsciiString iter = lev;
     iter.Prepend("i");
     TCollection_AsciiString var = lev;
@@ -919,15 +948,15 @@ static void writeRWReadField(
       TCollection_AsciiString jter = lev;
       jter.Prepend("j");
       theOs << shift << "  Standard_Integer nbj" << lev <<
-        " = data->NbParams(data->ParamNumber(sub" << index << ",1));" << std::endl;
+        " = theData->NbParams(theData->ParamNumber(sub" << index << ",1));" << std::endl;
       theOs << shift << "  a" << varname << " = new " << type->CPPName()->ToCString() <<
         "(1, nb" << lev << ", 1, nbj" << lev << ");" << std::endl;
       theOs << shift << "  for (Standard_Integer " << iter << " = 1; " << iter << " <= nb" 
         << lev << "; " << iter << "++)" << std::endl;
       theOs << shift << "  {" << std::endl;
       theOs << shift << "    Standard_Integer subj" << index << " = 0;" << std::endl;
-      theOs << shift << "    if ( data->ReadSubList (sub" << index << ", " << iter << ", \"sub-part(" <<
-        STEPName << ")\", ach, subj" << index << ") ) {" << std::endl;
+      theOs << shift << "    if ( theData->ReadSubList (sub" << index << ", " << iter << ", \"sub-part(" <<
+        STEPName << ")\", theCheck, subj" << index << ") ) {" << std::endl;
       theOs << shift << "      Standard_Integer num" << level + 2 << " = subj" << index << ";" << std::endl;
       theOs << shift << "      for (Standard_Integer " << jter << " = 1; " << jter << " <= nbj" << lev <<
         "; " << jter << "++)" << std::endl;
@@ -960,34 +989,35 @@ static void writeRWReadField(
   {
     if (strlen(STEPName) + strlen(varname) < 70)
     {
-      theOs << shift << "data->ReadString(" << param << ", " << index << ", \"" << STEPName <<
-        "\", ach, a" << varname << ");" << std::endl;
+      theOs << shift << "theData->ReadString(" << param << ", " << index << ", \"" << STEPName
+        << "\", theCheck, a" << varname << ");" << std::endl;
     }
     else
     {
-      theOs << shift << "data->ReadString(" << param << ", " << index << ", \"" << STEPName << "\", ach," << std::endl;
+      theOs << shift << "theData->ReadString(" << param << ", " << index << ", \"" << STEPName
+        << "\", theCheck," << std::endl;
       theOs << shift << "  a" << varname << ");" << std::endl;
     }
   }
   else if (type->IsKind(STANDARD_TYPE(Express_Logical)))
   {
-    theOs << shift << "data->ReadLogical(" << param << ", " << index << ", \"" << STEPName <<
-      "\", ach, a" << varname << ");" << std::endl;
+    theOs << shift << "theData->ReadLogical(" << param << ", " << index << ", \"" << STEPName <<
+      "\", theCheck, a" << varname << ");" << std::endl;
   }
   else if (type->IsKind(STANDARD_TYPE(Express_Boolean)))
   {
-    theOs << shift << "data->ReadBoolean(" << param << ", " << index << ", \"" << STEPName <<
-      "\", ach, a" << varname << ");" << std::endl;
+    theOs << shift << "theData->ReadBoolean(" << param << ", " << index << ", \"" << STEPName <<
+      "\", theCheck, a" << varname << ");" << std::endl;
   }
   else if (type->IsKind(STANDARD_TYPE(Express_Number)) || type->IsKind(STANDARD_TYPE(Express_Integer)))
   {
-    theOs << shift << "data->ReadInteger(" << param << ", " << index << ", \"" << STEPName <<
-      "\", ach, a" << varname << ");" << std::endl;
+    theOs << shift << "theData->ReadInteger(" << param << ", " << index << ", \"" << STEPName <<
+      "\", theCheck, a" << varname << ");" << std::endl;
   }
   else if (type->IsKind(STANDARD_TYPE(Express_Real)))
   {
-    theOs << shift << "data->ReadReal(" << param << ", " << index << ", \"" << STEPName <<
-      "\", ach, a" << varname << ");" << std::endl;
+    theOs << shift << "theData->ReadReal(" << param << ", " << index << ", \"" << STEPName <<
+      "\", theCheck, a" << varname << ");" << std::endl;
   }
 
   if (optional)
@@ -1101,7 +1131,7 @@ static void writeRWWriteField(
     type = complex->Type();
     TCollection_AsciiString var(lev);
     var.Prepend("Var");
-    theOs << shift << "SW.OpenSub();" << std::endl;
+    theOs << shift << "theSW.OpenSub();" << std::endl;
     theOs << shift << "for (Standard_Integer i" << index << " = 1; i" << index << " <= ";
     if (type->IsKind(STANDARD_TYPE(Express_ComplexType)))
     { // array 2 
@@ -1109,8 +1139,8 @@ static void writeRWWriteField(
       type = complex2->Type();
       theOs << varname << "->RowLength(); i" << index << "++)" << std::endl;
       theOs << shift << "{" << std::endl;
-      theOs << shift << "  SW.NewLine(Standard_False);" << std::endl;
-      theOs << shift << "  SW.OpenSub();" << std::endl;
+      theOs << shift << "  theSW.NewLine(Standard_False);" << std::endl;
+      theOs << shift << "  theSW.OpenSub();" << std::endl;
       theOs << shift << "  for (Standard_Integer j" << index << " = 1; j" << index << " <= " <<
         varname << "->ColLength(); j" << index << "++)" << std::endl;
       theOs << shift << "  {" << std::endl;
@@ -1119,7 +1149,7 @@ static void writeRWWriteField(
         varname << "->Value(i" << index << ",j" << index << ");" << std::endl;
       writeRWWriteField(theOs, var.ToCString(), type, index + 1, level + 1);
       theOs << shift << "  }" << std::endl;
-      theOs << shift << "  SW.CloseSub();" << std::endl;
+      theOs << shift << "  theSW.CloseSub();" << std::endl;
     }
     else
     { // simple array
@@ -1131,15 +1161,15 @@ static void writeRWWriteField(
       writeRWWriteField(theOs, var.ToCString(), type, index + 1, level);
     }
     theOs << shift << "}" << std::endl;
-    theOs << shift << "SW.CloseSub();" << std::endl;
+    theOs << shift << "theSW.CloseSub();" << std::endl;
   }
   else if (type->IsKind(STANDARD_TYPE(Express_Boolean)))
   {
-    theOs << shift << "SW.SendBoolean(" << varname << ");" << std::endl;
+    theOs << shift << "theSW.SendBoolean(" << varname << ");" << std::endl;
   }
   else if (type->IsKind(STANDARD_TYPE(Express_Logical)))
   {
-    theOs << shift << "SW.SendLogical(" << varname << ");" << std::endl;
+    theOs << shift << "theSW.SendLogical(" << varname << ");" << std::endl;
   }
   else
   {
@@ -1157,14 +1187,14 @@ static void writeRWWriteField(
         Handle(TCollection_HAsciiString) ename = Express::ToStepName(names->Value(i));
         ename->UpperCase();
         theOs << shift << "  case " << enpack.ToCString() << "_" << prefix->ToCString() <<
-          names->Value(i)->ToCString() << ": SW.SendEnum(\"." <<
+          names->Value(i)->ToCString() << ": theSW.SendEnum(\"." <<
           ename->ToCString() << ".\"); break;" << std::endl;
       }
       theOs << shift << "}" << std::endl;
     }
     else
     {
-      theOs << shift << "SW.Send(" << varname;
+      theOs << shift << "theSW.Send(" << varname;
       if (!named.IsNull() && named->Item()->IsKind(STANDARD_TYPE(Express_Select)))
       {
         theOs << ".Value()";
@@ -1211,13 +1241,13 @@ Standard_Integer Express_Entity::writeRWWriteCode(
     { // inherited base class implemented as field
       varName.Prepend ( Name()->Cat ( "()->" )->String() );
     }
-    varName.Prepend ( "ent->" );
+    varName.Prepend ( "theEnt->" );
     varName.AssignCat ( "()" );
     theOs << std::endl;
     
     if (field->IsOptional())
     {
-      theOs << "  if (ent->";
+      theOs << "  if (theEnt->";
       if (!theOwn)
       {
         theOs << CPPName()->ToCString() << "::";
@@ -1235,7 +1265,7 @@ Standard_Integer Express_Entity::writeRWWriteCode(
       theOs << "  }" << std::endl;
       theOs << "  else" << std::endl;
       theOs << "  {" << std::endl;
-      theOs << "    SW.SendUndef();" << std::endl;
+      theOs << "    theSW.SendUndef();" << std::endl;
       theOs << "  }" << std::endl;
     }
     num++;
@@ -1306,12 +1336,12 @@ static Standard_Boolean writeRWShareField(
     Handle(Express_NamedType) named = Handle(Express_NamedType)::DownCast(type);
     if (named->Item()->IsKind(STANDARD_TYPE(Express_Entity)))
     {
-      theOs << shift << "iter.AddItem(" << varname << ");" << std::endl;
+      theOs << shift << "theIter.AddItem(" << varname << ");" << std::endl;
       return Standard_True;
     }
     if (named->Item()->IsKind(STANDARD_TYPE(Express_Select)))
     {
-      theOs << shift << "iter.AddItem(" << varname << ".Value());" << std::endl;
+      theOs << shift << "theIter.AddItem(" << varname << ".Value());" << std::endl;
       return Standard_True;
     }
   }
@@ -1355,7 +1385,7 @@ Standard_Integer Express_Entity::writeRWShareCode(
     { // inherited base class implemented as field
       varName.Prepend(Name()->Cat("()->")->String());
     }
-    varName.Prepend("ent->");
+    varName.Prepend("theEnt->");
     varName.AssignCat("()");
 
     std::ostringstream oos;
@@ -1367,7 +1397,7 @@ Standard_Integer Express_Entity::writeRWShareCode(
     theOs << std::endl;
     if (field->IsOptional())
     {
-      theOs << "  if (ent->";
+      theOs << "  if (theEnt->";
       if (!theOwn) theOs << CPPName()->ToCString() << "::";
       else if (theOwn == -1) theOs << Name()->ToCString() << "()->";
       theOs << "Has" << field->Name()->ToCString() << "())" << std::endl;
@@ -1447,6 +1477,10 @@ Standard_Integer Express_Entity::makeInit (Standard_OStream &theOs,
         theOs << delim << space;
 
       }
+      else if (theMode == 4)
+      {
+        theOs << ", ";
+      }
       else
       {
         theOs << delim << "\n" << space;
@@ -1467,10 +1501,14 @@ Standard_Integer Express_Entity::makeInit (Standard_OStream &theOs,
       {
         theOs << "const Standard_Boolean theHas" << varName->ToCString() << ",\n" << space;
       }
-      else if (theMode == 2 || theMode == 4)
+      else if (theMode == 2)
       {
         theOs << "has" << varName->ToCString() << ",\n" << space;
       }
+      else if (theMode == 4)
+      {
+        theOs << "has" << varName->ToCString() << ", ";
+      }
     }
 
     // write field