Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Types and Accessor related fixes #94

Merged
Merged
915 changes: 605 additions & 310 deletions languages/c/Types.mjs

Large diffs are not rendered by default.

392 changes: 197 additions & 195 deletions languages/c/src/types/ImplHelpers.mjs

Large diffs are not rendered by default.

67 changes: 45 additions & 22 deletions languages/c/src/types/JSONHelpers.mjs
Original file line number Diff line number Diff line change
@@ -1,31 +1,54 @@
const capitalize = str => str[0].toUpperCase() + str.substr(1)
const getSdkNameSpace = () => 'FireboltSDK'
const getJsonDataPrefix = () => 'JsonData_'
const wpeJsonNameSpace = () => 'WPEFramework::Core::JSON'

function getJsonContainerDefinition (name, props) {
name = capitalize(name)
let c = ` class ${name}: public Core::JSON::Container {
public:
${name}(const ${name}&) = delete;
${name}& operator=(const ${name}&) = delete;
~${name}() override = default;

public:
${name}()
: Core::JSON::Container()
{`
const getJsonDataStructName = (modName, name, prefix = '') => {
let result =((prefix.length > 0) && (!name.startsWith(prefix))) ? `${capitalize(modName)}::${getJsonDataPrefix()}${capitalize(prefix)}_${capitalize(name)}` : `${capitalize(modName)}::${getJsonDataPrefix()}${capitalize(name)}`

return ((result.includes(wpeJsonNameSpace()) === true) ? result : `${getSdkNameSpace()}::${result}`)
}

function getJsonContainerDefinition (schema, name, props) {
let c = schema.description ? (' /*\n * ${info.title} - ' + `${schema.description}\n */\n`) : ''
name = getJsonDataPrefix() + capitalize(name)
c += ` class ${name}: public WPEFramework::Core::JSON::Container {
public:
~${name}() override = default;

props.forEach(prop => {
c += `\n Add(_T("${prop.name}"), &${capitalize(prop.name)});`
})
public:
${name}()
: WPEFramework::Core::JSON::Container()
{`

c += `\n }\n\n public:`
props.forEach(prop => {
c += `\n Add(_T("${prop.name}"), &${capitalize(prop.name)});`
})
c += `\n }\n`
c += `\n ${name}(const ${name}& copy)
{`
props.forEach(prop => {
c += `\n Add(_T("${prop.name}"), &${capitalize(prop.name)});`
c += `\n ${capitalize(prop.name)} = copy.${capitalize(prop.name)};`
})
c += `
}\n
${name}& operator=(const ${name}& rhs)
{`
props.forEach(prop => {
c += `\n ${capitalize(prop.name)} = rhs.${capitalize(prop.name)};`
})
c += `\n return (*this);
}\n
public:`

props.forEach(prop => {
c += `\n ${prop.type} ${capitalize(prop.name)};`
})
props.forEach(prop => {
c += `\n ${prop.type} ${capitalize(prop.name)};`
})

c += '\n };'
return c
}
c += '\n };'
return c
}

export {
getJsonContainerDefinition
Expand Down
141 changes: 83 additions & 58 deletions languages/c/src/types/NativeHelpers.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ const { isObject, isArray, propEq, pathSatisfies, hasProp, propSatisfies } = pre

const getModuleName = json => getPathOr(null, ['info', 'title'], json) || json.title || 'missing'

const getFireboltStringType = () => 'FireboltTypes_StringHandle'
const getHeaderText = () => {

return `/*
Expand Down Expand Up @@ -83,35 +84,53 @@ const SdkTypesPrefix = 'Firebolt'

const Indent = ' '

const getNativeType = json => {
let type

if (json.const) {
if (typeof json.const === 'string') {
type = 'char*'
}
else if (typeof json.const === 'number') {
type = 'uint32_t'
if (json.const < 0)
type = 'int32_t'
} else if (typeof json.const === 'boolean'){
type = 'bool'
}
const getArrayElementSchema = (json, module, schemas = {}, name) => {
let result = ''
if (json.type === 'array' && json.items) {
if (Array.isArray(json.items)) {
result = json.items[0]
}
else if (json.type === 'string') {
type = 'char*'
else {
// grab the type for the non-array schema
result = json.items
}
else if (json.type === 'number' || json.type === 'integer') { //Lets keep it simple for now
type = 'uint32_t'
if ((json.minimum && json.minimum < 0)
|| (json.exclusiveMinimum && json.exclusiveMinimum < 0)) {
type = 'int32_t'
}
if (result['$ref']) {
result = getPath(result['$ref'], module, schemas)
}
else if (json.type === 'boolean') {
type = 'bool'
}
else if (json.type == 'object') {
if (json.properties) {
Object.entries(json.properties).every(([pname, prop]) => {
if (prop.type === 'array') {
result = getArrayElementSchema(prop, module, schemas)
if (name === capitalize(pname)) {
return false
}
}
return true
})
}
return type
}

return result
}

const getNativeType = json => {
let type = ''
let jsonType = json.const ? typeof json.const : json.type
if (jsonType === 'string') {
type = 'char*'
}
else if (jsonType === 'number') {
type = 'float'
}
else if (jsonType === 'integer') {
type = 'int32_t'
}
else if (jsonType === 'boolean') {
type = 'bool'
}
return type
}

const getObjectHandleManagement = varName => {
Expand All @@ -126,46 +145,51 @@ bool ${varName}Handle_IsValid(${varName}Handle handle);
}

const getPropertyAccessors = (objName, propertyName, propertyType, options = {level:0, readonly:false, optional:false}) => {

let result = `${Indent.repeat(options.level)}${propertyType} ${objName}_Get_${propertyName}(${objName}Handle handle);` + '\n'

if (!options.readonly) {
result += `${Indent.repeat(options.level)}void ${objName}_Set_${propertyName}(${objName}Handle handle, ${propertyType} ${propertyName.toLowerCase()});` + '\n'
let type = (propertyType === getFireboltStringType()) ? 'char*' : propertyType
result += `${Indent.repeat(options.level)}void ${objName}_Set_${propertyName}(${objName}Handle handle, ${type} ${propertyName.toLowerCase()});` + '\n'
}

if (options.optional === true) {
result += `${Indent.repeat(options.level)}bool ${objName}_has_${propertyName}(${objName}Handle handle);` + '\n'
result += `${Indent.repeat(options.level)}void ${objName}_clear_${propertyName}(${objName}Handle handle);` + '\n'
result += `${Indent.repeat(options.level)}bool ${objName}_Has_${propertyName}(${objName}Handle handle);` + '\n'
result += `${Indent.repeat(options.level)}void ${objName}_Clear_${propertyName}(${objName}Handle handle);` + '\n'
}

return result
}

const getMapAccessors = (typeName, nativeType, level=0) => {
const getMapAccessors = (typeName, accessorPropertyType, level = 0) => {

let res

res = `${Indent.repeat(level)}uint32_t ${typeName}_KeysCount(${typeName}Handle handle);` + '\n'
res += `${Indent.repeat(level)}void ${typeName}_AddKey(${typeName}Handle handle, char* key, ${nativeType} value);` + '\n'
res += `${Indent.repeat(level)}void ${typeName}_AddKey(${typeName}Handle handle, char* key, ${accessorPropertyType} value);` + '\n'
res += `${Indent.repeat(level)}void ${typeName}_RemoveKey(${typeName}Handle handle, char* key);` + '\n'
res += `${Indent.repeat(level)}${nativeType} ${typeName}_FindKey(${typeName}Handle handle, char* key);` + '\n'
res += `${Indent.repeat(level)}${accessorPropertyType} ${typeName}_FindKey(${typeName}Handle handle, char* key);` + '\n'

return res
}

const getTypeName = (moduleName, varName, upperCase = false) => {
let mName = upperCase ? moduleName.toUpperCase() : capitalize(moduleName)
let vName = upperCase ? varName.toUpperCase() : capitalize(varName)
const getTypeName = (moduleName, varName, prefix = '', upperCase = false, capitalCase = true) => {

return `${mName}_${vName}`
let mName = upperCase ? moduleName.toUpperCase() : capitalize(moduleName)
let vName = upperCase ? varName.toUpperCase() : capitalCase ? capitalize(varName) : varName
if (prefix.length > 0) {
prefix = (!varName.startsWith(prefix)) ? (upperCase ? prefix.toUpperCase() : capitalize(prefix)) : ''
}
prefix = (prefix.length > 0) ?(upperCase ? prefix.toUpperCase() : capitalize(prefix)) : prefix
let name = (prefix.length > 0) ? `${mName}_${prefix}_${vName}` : `${mName}_${vName}`
return name
}

const getArrayAccessors = (arrayName, valueType) => {
const getArrayAccessors = (arrayName, propertyType, valueType) => {

let res = `uint32_t ${arrayName}_Size(${arrayName}Handle handle);` + '\n'
res += `${valueType} ${arrayName}_Get(${arrayName}Handle handle, uint32_t index);` + '\n'
res += `void ${arrayName}_Add(${arrayName}Handle handle, ${valueType} value);` + '\n'
res += `void ${arrayName}_Clear(${arrayName}Handle handle);` + '\n'
let res = `uint32_t ${arrayName}Array_Size(${propertyType}Handle handle);` + '\n'
res += `${valueType} ${arrayName}Array_Get(${propertyType}Handle handle, uint32_t index);` + '\n'
res += `void ${arrayName}Array_Add(${propertyType}Handle handle, ${valueType} value);` + '\n'
res += `void ${arrayName}Array_Clear(${propertyType}Handle handle);` + '\n'

return res
}
Expand Down Expand Up @@ -201,25 +225,25 @@ const getIncludeDefinitions = (json = {}, jsonData = false) => {
.concat([`#include "Firebolt/Types.h"`])
}

function getPropertyGetterSignature(method, module, paramType) {
let m = `${capitalize(getModuleName(module))}_Get${capitalize(method.name)}`
return `${description(method.name, method.summary)}\nuint32 ${m}( ${paramType === 'char*' ? 'FireboltTypes_StringHandle' : paramType}* ${method.result.name || method.name} )`
}
function getPropertyGetterSignature(method, module, paramType) {
let m = `${capitalize(getModuleName(module))}_Get${capitalize(method.name)}`
return `${description(method.name, method.summary)}\nuint32 ${m}( ${paramType === 'char*' ? 'FireboltTypes_StringHandle' : paramType}* ${method.result.name || method.name} )`
}

function getPropertySetterSignature(method, module, paramType) {
let m = `${capitalize(getModuleName(module))}_Set${capitalize(method.name)}`
return `${description(method.name, method.summary)}\nuint32 ${m}( ${paramType} ${method.result.name || method.name} )`
}
function getPropertySetterSignature(method, module, paramType) {
let m = `${capitalize(getModuleName(module))}_Set${capitalize(method.name)}`
return `${description(method.name, method.summary)}\nuint32 ${m}( ${paramType} ${method.result.name || method.name} )`
}

function getPropertyEventCallbackSignature(method, module, paramType) {
return `typedef void (*On${capitalize(method.name)}Changed)(${paramType === 'char*' ? 'FireboltTypes_StringHandle' : paramType})`
}
function getPropertyEventCallbackSignature(method, module, paramType) {
return `typedef void (*On${capitalize(method.name)}Changed)(${paramType === 'char*' ? 'FireboltTypes_StringHandle' : paramType})`
}

function getPropertyEventSignature(method, module) {
return `${description(method.name, 'Listen to updates')}\n` + `uint32_t ${capitalize(getModuleName(module))}_Listen${capitalize(method.name)}Update(On${capitalize(method.name)}Changed notification, uint16_t* listenerId)`
}
function getPropertyEventSignature(method, module) {
return `${description(method.name, 'Listen to updates')}\n` + `uint32_t ${capitalize(getModuleName(module))}_Listen${capitalize(method.name)}Update(On${capitalize(method.name)}Changed notification, uint16_t* listenerId)`
}

export {
export {
getHeaderText,
getIncludeGuardOpen,
getStyleGuardOpen,
Expand All @@ -240,5 +264,6 @@ const getIncludeDefinitions = (json = {}, jsonData = false) => {
getObjectHandleManagement,
getPropertyAccessors,
isOptional,
generateEnum
}
generateEnum,
getArrayElementSchema
}
16 changes: 8 additions & 8 deletions languages/c/templates/methods/property.c
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
/* ${method.name} - ${method.description} */
uint32_t ${info.title}_Get${method.Name}(${method.params}${if.params}, ${end.if.params}${method.result.type}* ${method.result.name}) {
const string method = _T("${info.title}.${method.name}");
FireboltSDK::${info.title}::${method.result.type} jsonResult;
const string method = _T("${info.title}.${method.name}");
FireboltSDK::${info.title}::${method.result.type} jsonResult;

uint32_t status = FireboltSDK::Properties::Get(method, jsonResult);
if (status == FireboltSDKErrorNone) {
WPEFramework::Core::ProxyType<FireboltSDK::${info.title}::${method.result.type}>* resultPtr = new WPEFramework::Core::ProxyType<FireboltSDK::${info.title}::${method.result.type}>();
*${method.result.name} = static_cast<${info.title}_${method.result.type}Handle>(resultPtr);
}
return status;
uint32_t status = FireboltSDK::Properties::Get(method, jsonResult);
if (status == FireboltSDKErrorNone) {
WPEFramework::Core::ProxyType<FireboltSDK::${info.title}::${method.result.type}>* resultPtr = new WPEFramework::Core::ProxyType<FireboltSDK::${info.title}::${method.result.type}>();
*${method.result.name} = static_cast<${info.title}_${method.result.type}Handle>(resultPtr);
}
return status;
}
4 changes: 0 additions & 4 deletions languages/c/templates/modules/include/Module.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,6 @@ extern "C" {

/* ${ENUMS} */

// Types

/* ${TYPES} */

/* ${ACCESSORS} */

/* ${DECLARATIONS} */
Expand Down
1 change: 0 additions & 1 deletion languages/c/templates/modules/src/Module.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
namespace FireboltSDK {
namespace ${info.title} {
// Types

/* ${TYPES} */
}
}
Expand Down
3 changes: 0 additions & 3 deletions languages/c/templates/schemas/default.c
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
/*
* ${schema.description}
*/
${schema.shape}
2 changes: 1 addition & 1 deletion languages/c/templates/schemas/src/JsonData_Module.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ namespace FireboltSDK {
namespace ${info.title} {
// Types

/* ${SCHEMAS}*/
/* ${SCHEMAS} */
}
}
1 change: 0 additions & 1 deletion languages/c/templates/sections/accessors.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
// Accessors

${schema.list}
3 changes: 2 additions & 1 deletion languages/c/templates/sections/methods.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

// Methods
// Methods

${method.list}
1 change: 1 addition & 0 deletions languages/c/templates/sections/methods_accessors.c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
${schema.list}
1 change: 1 addition & 0 deletions languages/c/templates/sections/methods_types.c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
${schema.list}
Loading