@@ -98,22 +98,13 @@ void CGenerator::generateOutputFiles(const string &fileName)
98
98
generateServerCSourceFile (fileName);
99
99
}
100
100
101
- void CGenerator::generateCommonCHeaderFiles (string fileName)
102
- {
103
- fileName += " _common.h" ;
104
- m_templateData[" commonGuardMacro" ] = generateIncludeGuardName (fileName);
105
- m_templateData[" commonCHeaderName" ] = fileName;
106
- m_templateData[" cCommonHeaderFile" ] = true ;
107
- generateOutputFile (fileName, " c_common_header" , m_templateData, kCCommonHeader );
108
- }
109
-
110
101
void CGenerator::generateCommonCppHeaderFiles (string fileName)
111
102
{
112
103
fileName += " _common.hpp" ;
113
104
m_templateData[" commonGuardMacro" ] = generateIncludeGuardName (fileName);
114
105
m_templateData[" commonCppHeaderName" ] = fileName;
115
106
m_templateData[" cCommonHeaderFile" ] = false ;
116
- generateOutputFile (fileName, " c_common_header " , m_templateData, kCCommonHeader );
107
+ generateOutputFile (fileName, " cpp_common_header " , m_templateData, kCppCommonHeader );
117
108
}
118
109
119
110
void CGenerator::generateInterfaceCppHeaderFile (string fileName)
@@ -163,6 +154,15 @@ void CGenerator::generateServerCppSourceFile(string fileName)
163
154
generateOutputFile (fileName, " cpp_server_source" , m_templateData, kCppServerSource );
164
155
}
165
156
157
+ void CGenerator::generateCommonCHeaderFiles (string fileName)
158
+ {
159
+ fileName = " c_" + fileName + " _common.h" ;
160
+ m_templateData[" commonGuardMacro" ] = generateIncludeGuardName (fileName);
161
+ m_templateData[" commonCHeaderName" ] = fileName;
162
+ m_templateData[" cCommonHeaderFile" ] = true ;
163
+ generateOutputFile (fileName, " c_common_header" , m_templateData, kCCommonHeader );
164
+ }
165
+
166
166
void CGenerator::generateClientCHeaderFile (string fileName)
167
167
{
168
168
fileName = " c_" + fileName + " _client.h" ;
@@ -760,38 +760,52 @@ void CGenerator::makeAliasesTemplateData()
760
760
761
761
if (elementDataType->getName () != " " )
762
762
{
763
- string realType;
763
+ string realTypeC;
764
+ string realTypeCpp;
764
765
if (elementDataType->isFunction ())
765
766
{
766
- realType = getOutputName (aliasType);
767
+ realTypeC = getOutputName (aliasType);
767
768
aliasInfo[" name" ] = elementDataType->getName ();
768
769
}
769
770
else
770
771
{
771
- realType = getTypenameName (elementDataType, getOutputName (aliasType));
772
+ realTypeC = getTypenameName (elementDataType, getOutputName (aliasType));
772
773
aliasInfo[" name" ] = getOutputName (aliasType);
773
774
}
774
775
775
- Log::info (" %s\n " , realType .c_str ());
776
+ Log::info (" %s\n " , realTypeC .c_str ());
776
777
777
778
/* For case typedef struct/union */
778
779
if (elementDataType->getName () == aliasType->getName () ||
779
780
getOutputName (elementDataType, false ) == aliasType->getName ())
780
781
{
781
782
if (elementDataType->isStruct ())
782
783
{
783
- realType = " struct " + realType;
784
+ realTypeC = " struct " + realTypeC;
785
+ realTypeCpp = " struct " + aliasType->getName ();
784
786
}
785
787
else
786
788
{
787
- realType = " union " + realType;
789
+ realTypeC = " union " + realTypeC;
790
+ realTypeCpp = " union " + aliasType->getName ();
788
791
}
789
792
}
790
793
791
- aliasInfo[" typenameName" ] = realType;
794
+ if (elementDataType->getName () == aliasType->getName ())
795
+ {
796
+ aliasInfo[" forwardDecl" ] = realTypeC;
797
+ aliasInfo[" forwardDeclCpp" ] = realTypeCpp;
798
+ aliasInfo[" typenameName" ] = " " ;
799
+ }
800
+ else
801
+ {
802
+ aliasInfo[" typenameName" ] = realTypeC;
803
+ aliasInfo[" forwardDecl" ] = " " ;
804
+ }
792
805
}
793
806
else
794
807
{
808
+ aliasInfo[" forwardDecl" ] = " " ;
795
809
aliasInfo[" typenameName" ] = " " ;
796
810
aliasInfo[" unnamedName" ] = getOutputName (aliasType);
797
811
switch (elementDataType->getDataType ())
@@ -1351,11 +1365,18 @@ data_map CGenerator::getFunctionBaseTemplateData(Group *group, FunctionBase *fn)
1351
1365
info[" isNonExternalFunction" ] = !findAnnotation (fnSymbol, EXTERNAL_ANNOTATION);
1352
1366
1353
1367
// Get return value info
1354
- data_map returnInfo;
1355
- returnInfo[" type" ] = getTypeInfo (fn->getReturnType (), true );
1356
- StructMember *structMember = fn->getReturnStructMemberType ();
1357
1368
DataType *dataType = fn->getReturnType ();
1358
1369
DataType *trueDataType = dataType->getTrueDataType ();
1370
+ data_map returnInfo;
1371
+ returnInfo[" type" ] = getTypeInfo (dataType, true );
1372
+ StructMember *structMember = fn->getReturnStructMemberType ();
1373
+ // TODO: in case we want distinguish cpp and c type macro
1374
+ // std::string retypeName = "";
1375
+ // if (dataType->isArray())
1376
+ // {
1377
+ // retypeName = "*";
1378
+ // }
1379
+ // returnInfo["typename"] = getTypenameName(dataType, retypeName);
1359
1380
if (!trueDataType->isVoid ())
1360
1381
{
1361
1382
string result = " result" ;
@@ -1568,6 +1589,29 @@ data_map CGenerator::getFunctionBaseTemplateData(Group *group, FunctionBase *fn)
1568
1589
paramInfo[" shared" ] = isShared;
1569
1590
paramInfo[" pureName" ] = name;
1570
1591
paramInfo[" pureNameC" ] = pureCName;
1592
+ // TODO: in case we want distinguish cpp and c type macro
1593
+ // std::string retypeParamName = "";
1594
+ // bool isDoubleArray = false;
1595
+ // if (paramType->isArray())
1596
+ // {
1597
+ // ArrayType *paramArrayType = dynamic_cast<ArrayType *>(paramType);
1598
+ // retypeParamName = getTypenameName(paramArrayType->getElementType(), "*");
1599
+ // isDoubleArray = paramArrayType->getElementType()->isArray();
1600
+ // }
1601
+ // else
1602
+ // {
1603
+ // retypeParamName = getTypenameName(paramType, "");
1604
+ // }
1605
+ // if (!paramType->getTrueContainerDataType()->isBuiltin() || paramType->isAlias())
1606
+ // {
1607
+ // retypeParamName = m_templateData["namespace"].get().get()->getvalue() + "::" + retypeParamName;
1608
+ // }
1609
+ // if ((param->getDirection() == kInDirection) && (isDoubleArray == false) &&
1610
+ // (!paramType->getTrueContainerDataType()->isString()))
1611
+ // {
1612
+ // retypeParamName = "const " + retypeParamName;
1613
+ // }
1614
+ // paramInfo["typename"] = retypeParamName;
1571
1615
string encodeDecodeName;
1572
1616
if (isShared)
1573
1617
{
@@ -1886,6 +1930,10 @@ string CGenerator::getErrorReturnValue(FunctionBase *fn)
1886
1930
return (integerValue->getValue ()) ? " true" : " false" ;
1887
1931
}
1888
1932
}
1933
+ else if (dataType->isEnum ())
1934
+ {
1935
+ return fn->getReturnType ()->getName () + " ::" + returnVal->toString ();
1936
+ }
1889
1937
return returnVal->toString ();
1890
1938
}
1891
1939
else
@@ -2747,7 +2795,39 @@ data_map CGenerator::getEncodeDecodeCall(const string &name, Group *group, DataT
2747
2795
for (auto unionCase : unionType->getCases ())
2748
2796
{
2749
2797
data_map caseData;
2750
- caseData[" name" ] = unionCase->getCaseName ();
2798
+ DataType *caseDataType = unionCase->getCaseDataType ();
2799
+ std::string caseName;
2800
+ caseData[" caseCast" ] = " " ;
2801
+ if (caseDataType == nullptr )
2802
+ {
2803
+ caseName = " " ;
2804
+ }
2805
+ else
2806
+ {
2807
+ if (unionType->isNonEncapsulatedUnion ())
2808
+ {
2809
+ caseData[" caseCast" ] = " int32_t" ;
2810
+ }
2811
+ else
2812
+ {
2813
+ DataType *disType = getDiscriminatorType (unionType, structType, structMember);
2814
+ if (disType != nullptr )
2815
+ {
2816
+ std::string disName;
2817
+ if (disType->isBuiltin ())
2818
+ {
2819
+ disName = getBuiltinTypename (dynamic_cast <BuiltinType *>(disType));
2820
+ }
2821
+ else
2822
+ {
2823
+ disName = disType->getName ();
2824
+ }
2825
+ caseData[" caseCast" ] = (disName == caseDataType->getName ()) ? " " : disName;
2826
+ }
2827
+ }
2828
+ caseName = caseDataType->getName () + " ::" ;
2829
+ }
2830
+ caseData[" name" ] = caseName + unionCase->getCaseName ();
2751
2831
caseData[" value" ] = unionCase->getCaseValue ();
2752
2832
// if current case need call free function, default false
2753
2833
caseData[" needCaseFreeingCall" ] = false ;
@@ -3337,6 +3417,37 @@ bool CGenerator::setDiscriminatorTemp(UnionType *unionType, StructType *structTy
3337
3417
return needTempVariableI32;
3338
3418
}
3339
3419
3420
+ DataType *CGenerator::getDiscriminatorType (UnionType *unionType, StructType *structType, StructMember *structMember)
3421
+ {
3422
+ DataType *retVal = nullptr ;
3423
+
3424
+ if (structType)
3425
+ {
3426
+ string discriminatorName;
3427
+ Symbol *disSymbol;
3428
+
3429
+ if (unionType->isNonEncapsulatedUnion ())
3430
+ {
3431
+ discriminatorName = getAnnStringValue (structMember, DISCRIMINATOR_ANNOTATION);
3432
+ disSymbol = m_globals->getSymbol (discriminatorName, false );
3433
+ ConstType *constType = dynamic_cast <ConstType *>(disSymbol);
3434
+ assert (constType);
3435
+ retVal = constType->getDataType ();
3436
+ }
3437
+ else
3438
+ {
3439
+ discriminatorName = unionType->getDiscriminatorName ();
3440
+ disSymbol = structType->getScope ().getSymbol (discriminatorName);
3441
+ assert (disSymbol);
3442
+ StructMember *disMember = dynamic_cast <StructMember *>(disSymbol);
3443
+ assert (disMember);
3444
+ retVal = disMember->getDataType ();
3445
+ }
3446
+ }
3447
+
3448
+ return retVal;
3449
+ }
3450
+
3340
3451
string CGenerator::getScalarTypename (DataType *dataType)
3341
3452
{
3342
3453
if (dataType->getTrueDataType ()->isScalar ())
0 commit comments