Skip to content

Commit

Permalink
Fix generated code in case a variable is called "d" or "q"
Browse files Browse the repository at this point in the history
Fixes #118
  • Loading branch information
dfaure-kdab committed Mar 26, 2021
1 parent a6dec7e commit 562a6f1
Show file tree
Hide file tree
Showing 9 changed files with 94 additions and 63 deletions.
1 change: 1 addition & 0 deletions doc/CHANGES_1_11.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ CMake buildsystem:

WSDL parser / code generator changes, applying to both client and server side:
================================================================
* Fix generated code in case a variable is called "d" or "q" (#118)
* Fix generated code for an enumeration type with a length restriction (#234)
4 changes: 2 additions & 2 deletions kdwsdl2cpp/src/converter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -392,11 +392,11 @@ void Converter::convertTypes()
}

// Helper for clientstub and serverstub
KODE::Code Converter::serializePart(const Part &part, const QString &localVariableName, const QString &varName, bool append)
KODE::Code Converter::serializePart(const Part &part, const QString &localVariableName, const QString &nilVariableName, const QString &varName, bool append)
{
bool qualified, nillable;
const QName elemName = elementNameForPart(part, &qualified, &nillable);
ElementArgumentSerializer serializer(mTypeMap, part.type(), part.element(), localVariableName);
ElementArgumentSerializer serializer(mTypeMap, part.type(), part.element(), localVariableName, nilVariableName);
serializer.setElementName(elemName);
serializer.setOutputVariable(varName, append);
serializer.setIsQualified(qualified);
Expand Down
19 changes: 15 additions & 4 deletions kdwsdl2cpp/src/converter.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,21 @@ class Converter
void addMessageArgument(KODE::Code &code, const SoapBinding::Style &bindingStyle, const Part &part, const QString &localVariableName, const QByteArray &messageName, bool varIsMember = false);
void createHeader(const SoapBinding::Header &header, KODE::Class &newClass);
void addJobResultMember(KODE::Class &jobClass, const Part &part, const QString &varName, const QStringList &inputGetters);
KODE::Code serializePart(const Part &part, const QString &localVariableName, const QString &varName, bool append);
KODE::Code demarshalVarHelper(const QName &type, const QName &elementType, const QString &variableName, const QString &qtTypeName, const QString &soapValueVarName, bool optional) const;
KODE::Code demarshalVar(const QName &type, const QName &elementType, const QString &variableName, const QString &typeName, const QString &soapValueVarName, bool optional, bool usePointer) const;
KODE::Code demarshalArrayVar(const QName &type, const QString &variableName, const QString &qtTypeName, bool optional) const;
KODE::Code serializePart(const Part &part, const QString &localVariableName, const QString &nilVariableName, const QString &varName, bool append);

// TODO finish turning this into a proper class like ElementArgumentSerializer (or even merge with it)
struct VariableInfo
{
QName type;
QName elementType;
QString variableName;
QString nilVariableName;
QString qtTypeName;
};

KODE::Code demarshalVarHelper(const VariableInfo &varInfo, const QString &soapValueVarName, bool optional) const;
KODE::Code demarshalVar(const VariableInfo &varInfo, const QString &soapValueVarName, bool optional, bool usePointer) const;
KODE::Code demarshalArrayVar(const VariableInfo &varInfo, bool optional) const;
void addVariableInitializer(KODE::MemberVariable &variable) const;

// Implements default values processing ONLY for attributes
Expand Down
9 changes: 5 additions & 4 deletions kdwsdl2cpp/src/converter_clientstub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -583,15 +583,16 @@ QName Converter::elementNameForPart(const Part &part, bool *qualified, bool *nil

void Converter::addMessageArgument(KODE::Code &code, const SoapBinding::Style &bindingStyle, const Part &part, const QString &localVariableName, const QByteArray &messageName, bool varIsMember)
{
const QString partname = varIsMember ? QLatin1Char('m') + upperlize(localVariableName) : mNameMapper.escape(lowerlize(localVariableName));
const QString partname = varIsMember ? KODE::MemberVariable::memberVariableName(localVariableName) : mNameMapper.escape(lowerlize(localVariableName));
const QString nilPartname = varIsMember ? KODE::MemberVariable::memberVariableName(localVariableName + "_nil") : partname + "_nil";
// In document style, the "part" is directly added as arguments
// See https://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/
if (bindingStyle == SoapBinding::DocumentStyle) {
code.addBlock(serializePart(part, partname, messageName, false));
code.addBlock(serializePart(part, partname, nilPartname, messageName, false));
} else {
const QString argType = mTypeMap.localType(part.type(), part.element());
if (argType != QLatin1String("void")) {
code.addBlock(serializePart(part, partname, messageName + ".childValues()", true));
code.addBlock(serializePart(part, partname, nilPartname, messageName + ".childValues()", true));
}
}
}
Expand Down Expand Up @@ -710,7 +711,7 @@ bool Converter::convertClientCall(const Operation &operation, const Binding &bin

code += retType + QLatin1String(" ret;"); // local var
code += QLatin1String("const KDSoapValue val = d_ptr->m_lastReply.childValues().at(0);") + COMMENT;
code += demarshalVar(retPart.type(), retPart.element(), QLatin1String("ret"), retType, "val", false, false);
code += demarshalVar(VariableInfo{retPart.type(), retPart.element(), QLatin1String("ret"), QString(), retType}, "val", false, false);
code += "return ret;";
}
}
Expand Down
Loading

0 comments on commit 562a6f1

Please sign in to comment.