Skip to content

Commit 47665aa

Browse files
eaferwing328
andauthored
Fix a few issues with the C generator (part 1 version 2) (#14434)
* C: add a template for an empty any_type.h header Some generated C apis fail to build because the source files get '#include "any_type.h"' lines, but no such header gets generated. As a simple fix, add a new template for an empty file with that name. This is enough to fix the problem for us, because all the generic type stuff is handled by object_t. * C: fix enums I'm guessing that enums have not been used much with the C generator before, because they always seem to produce code that doesn't build, or that tries to free them after use. This patch fixes all the problems we've encountered so far, except for those that need checking the return type. I'll come back to that later. * C: fix confusion of 'classname'/'classFilename' * C: fix issues with returned enums Currently, the C templates never check if a function returns an enum inside mustache, so when that happens the generated code has broken return types and doesn't build. I originally tried to fix this by extending CodegenOperation to implement a 'returnTypeIsEnum' check, but William Cheng suggested[1] that I use the existing 'returnProperty' instead: #14379 (comment) So do that. * C: update the samples As required for a pull request, run the generate-samples.sh script and commit the changes. * update samples --------- Co-authored-by: William Cheng <[email protected]>
1 parent 8a94fc6 commit 47665aa

File tree

12 files changed

+73
-13
lines changed

12 files changed

+73
-13
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CLibcurlClientCodegen.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ public void processOpts() {
368368
// Object files in model folder
369369
supportingFiles.add(new SupportingFile("object-body.mustache", "model", "object.c"));
370370
supportingFiles.add(new SupportingFile("object-header.mustache", "model", "object.h"));
371+
supportingFiles.add(new SupportingFile("any_type-header.mustache", "model", "any_type.h"));
371372
}
372373

373374
@Override

modules/openapi-generator/src/main/resources/C-libcurl/CMakeLists.txt.mustache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ set(HDRS
7676
include/keyValuePair.h
7777
external/cJSON.h
7878
model/object.h
79+
model/any_type.h
7980
{{#models}}
8081
{{#model}}
8182
model/{{classFilename}}.h
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/*
2+
* any_type.h
3+
*
4+
* A placeholder for now, this type isn't really needed.
5+
*/

modules/openapi-generator/src/main/resources/C-libcurl/api-body.mustache

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ end:
9898
// {{{.}}}
9999
//
100100
{{/notes}}
101-
{{#returnType}}{{#returnTypeIsPrimitive}}{{#returnSimpleType}}{{{.}}}*{{/returnSimpleType}}{{^returnSimpleType}}{{#isArray}}{{{.}}}_t*{{/isArray}}{{#isMap}}{{{.}}}{{/isMap}}{{/returnSimpleType}}{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}{{{.}}}_t*{{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}void{{/returnType}}
101+
{{#returnType}}{{#returnTypeIsPrimitive}}{{#returnSimpleType}}{{{.}}}*{{/returnSimpleType}}{{^returnSimpleType}}{{#isArray}}{{{.}}}_t*{{/isArray}}{{#isMap}}{{{.}}}{{/isMap}}{{/returnSimpleType}}{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}{{#returnProperty}}{{^isEnum}}{{{returnType}}}_t*{{/isEnum}}{{#isEnum}}{{projectName}}_{{{returnType}}}_{{returnEnumName}}_e{{/isEnum}}{{/returnProperty}}{{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}void{{/returnType}}
102102
{{{classname}}}_{{{operationId}}}(apiClient_t *apiClient{{#allParams}}, {{#isPrimitiveType}}{{#isNumber}}{{{dataType}}} {{/isNumber}}{{#isLong}}{{{dataType}}} {{/isLong}}{{#isInteger}}{{{dataType}}} *{{/isInteger}}{{#isDouble}}{{{dataType}}} {{/isDouble}}{{#isFloat}}{{{dataType}}} {{/isFloat}}{{#isBoolean}}{{dataType}} *{{/isBoolean}}{{#isEnum}}{{#isString}}{{projectName}}_{{operationId}}_{{baseName}}_e {{/isString}}{{/isEnum}}{{^isEnum}}{{#isString}}{{{dataType}}} *{{/isString}}{{/isEnum}}{{#isByteArray}}{{{dataType}}} *{{/isByteArray}}{{#isDate}}{{{dataType}}} {{/isDate}}{{#isDateTime}}{{{dataType}}} {{/isDateTime}}{{#isFile}}{{{dataType}}} {{/isFile}}{{#isFreeFormObject}}{{dataType}}_t *{{/isFreeFormObject}}{{/isPrimitiveType}}{{^isArray}}{{^isPrimitiveType}}{{#isModel}}{{#isEnum}}{{datatypeWithEnum}}_e {{/isEnum}}{{^isEnum}}{{{dataType}}}_t *{{/isEnum}}{{/isModel}}{{^isModel}}{{#isEnum}}{{datatypeWithEnum}}_e {{/isEnum}}{{/isModel}}{{#isUuid}}{{dataType}} *{{/isUuid}}{{#isEmail}}{{dataType}} {{/isEmail}}{{/isPrimitiveType}}{{/isArray}}{{#isContainer}}{{#isArray}}{{dataType}}_t *{{/isArray}}{{#isMap}}{{dataType}} {{/isMap}}{{/isContainer}}{{{paramName}}}{{/allParams}})
103103
{
104104
list_t *localVarQueryParameters = {{#hasQueryParams}}list_createList();{{/hasQueryParams}}{{^hasQueryParams}}NULL;{{/hasQueryParams}}
@@ -263,7 +263,7 @@ end:
263263
{{#isPrimitiveType}}{{#isNumber}}{{{dataType}}}{{/isNumber}}{{#isLong}}{{{dataType}}}{{/isLong}}{{#isInteger}}{{{dataType}}}{{/isInteger}}{{#isDouble}}{{{dataType}}}{{/isDouble}}{{#isFloat}}{{{dataType}}}{{/isFloat}}{{#isBoolean}}{{dataType}}{{/isBoolean}}{{#isEnum}}{{#isString}}{{projectName}}_{{operationId}}_{{baseName}}_e{{/isString}}{{/isEnum}}{{^isEnum}}{{#isString}}{{{dataType}}} *{{/isString}}{{/isEnum}}{{#isByteArray}}{{{dataType}}} *{{/isByteArray}}{{#isDate}}{{{dataType}}}{{/isDate}}{{#isDateTime}}{{{dataType}}}{{/isDateTime}}{{#isFile}}{{{dataType}}}{{/isFile}}{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isModel}}{{#isEnum}}{{datatypeWithEnum}}_e{{/isEnum}}{{^isEnum}}{{{dataType}}}_t *{{/isEnum}}{{/isModel}}{{^isModel}}{{#isEnum}}{{datatypeWithEnum}}_e{{/isEnum}}{{/isModel}}{{#isUuid}}{{dataType}} *{{/isUuid}}{{#isEmail}}{{dataType}}{{/isEmail}}{{/isPrimitiveType}} valueForm_{{paramName}} = 0;
264264
keyValuePair_t *keyPairForm_{{paramName}} = 0;
265265
{{/isFile}}
266-
if ({{paramName}} != NULL)
266+
if ({{paramName}} != {{^isEnum}}NULL{{/isEnum}}{{#isEnum}}0{{/isEnum}})
267267
{
268268
{{#isFile}}
269269
keyForm_{{paramName}} = strdup("{{{baseName}}}");
@@ -399,9 +399,9 @@ end:
399399
{{^returnContainer}}
400400
//nonprimitive not container
401401
cJSON *{{classname}}localVarJSON = cJSON_Parse(apiClient->dataReceived);
402-
{{{returnBaseType}}}_t *elementToReturn = {{{returnBaseType}}}_parseFromJSON({{classname}}localVarJSON);
402+
{{#returnProperty}}{{^isEnum}}{{{returnBaseType}}}_t *{{/isEnum}}{{#isEnum}}{{projectName}}_{{{returnType}}}_{{returnEnumName}}_e {{/isEnum}}{{/returnProperty}}elementToReturn = {{{returnBaseType}}}_parseFromJSON({{classname}}localVarJSON);
403403
cJSON_Delete({{classname}}localVarJSON);
404-
if(elementToReturn == NULL) {
404+
if(elementToReturn == {{#returnProperty}}{{^isEnum}}NULL{{/isEnum}}{{#isEnum}}0{{/isEnum}}{{/returnProperty}}) {
405405
// return 0;
406406
}
407407

@@ -524,8 +524,10 @@ end:
524524
keyForm_{{{paramName}}} = NULL;
525525
}
526526
if (valueForm_{{{paramName}}}) {
527+
{{^isEnum}}
527528
free(valueForm_{{{paramName}}});
528-
valueForm_{{{paramName}}} = NULL;
529+
{{/isEnum}}
530+
valueForm_{{{paramName}}} = {{^isEnum}}NULL{{/isEnum}}{{#isEnum}}0{{/isEnum}};
529531
}
530532
free(keyPairForm_{{paramName}});
531533
{{/isString}}
@@ -541,7 +543,7 @@ end:
541543
return elementToReturn;
542544
end:
543545
free(localVarPath);
544-
return NULL;
546+
return {{#returnProperty}}{{^isEnum}}NULL{{/isEnum}}{{#isEnum}}0{{/isEnum}}{{/returnProperty}};
545547
{{/returnType}}
546548
{{^returnType}}
547549
//No return type

modules/openapi-generator/src/main/resources/C-libcurl/api-header.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ typedef enum { {{projectName}}_{{operationId}}_{{enumName}}_NULL = 0{{#enumVars
3232
// {{{.}}}
3333
//
3434
{{/notes}}
35-
{{#returnType}}{{#returnTypeIsPrimitive}}{{#returnSimpleType}}{{{.}}}*{{/returnSimpleType}}{{^returnSimpleType}}{{#isArray}}{{{.}}}_t*{{/isArray}}{{#isMap}}{{{.}}}{{/isMap}}{{/returnSimpleType}}{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}{{{.}}}_t*{{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}void{{/returnType}}
35+
{{#returnType}}{{#returnTypeIsPrimitive}}{{#returnSimpleType}}{{{.}}}*{{/returnSimpleType}}{{^returnSimpleType}}{{#isArray}}{{{.}}}_t*{{/isArray}}{{#isMap}}{{{.}}}{{/isMap}}{{/returnSimpleType}}{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}{{#returnProperty}}{{^isEnum}}{{{returnType}}}_t*{{/isEnum}}{{#isEnum}}{{projectName}}_{{{returnType}}}_{{returnEnumName}}_e{{/isEnum}}{{/returnProperty}}{{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}void{{/returnType}}
3636
{{{classname}}}_{{{operationId}}}(apiClient_t *apiClient{{#allParams}}, {{#isPrimitiveType}}{{#isNumber}}{{{dataType}}} {{/isNumber}}{{#isLong}}{{{dataType}}} {{/isLong}}{{#isInteger}}{{{dataType}}} *{{/isInteger}}{{#isDouble}}{{{dataType}}} {{/isDouble}}{{#isFloat}}{{{dataType}}} {{/isFloat}}{{#isBoolean}}{{dataType}} *{{/isBoolean}}{{#isEnum}}{{#isString}}{{projectName}}_{{operationId}}_{{baseName}}_e {{/isString}}{{/isEnum}}{{^isEnum}}{{#isString}}{{{dataType}}} *{{/isString}}{{/isEnum}}{{#isByteArray}}{{{dataType}}} *{{/isByteArray}}{{#isDate}}{{{dataType}}} {{/isDate}}{{#isDateTime}}{{{dataType}}} {{/isDateTime}}{{#isFile}}{{{dataType}}} {{/isFile}}{{#isFreeFormObject}}{{dataType}}_t *{{/isFreeFormObject}}{{/isPrimitiveType}}{{^isArray}}{{^isPrimitiveType}}{{#isModel}}{{#isEnum}}{{datatypeWithEnum}}_e {{/isEnum}}{{^isEnum}}{{{dataType}}}_t *{{/isEnum}}{{/isModel}}{{^isModel}}{{#isEnum}}{{datatypeWithEnum}}_e {{/isEnum}}{{/isModel}}{{#isUuid}}{{dataType}} *{{/isUuid}}{{#isEmail}}{{dataType}} {{/isEmail}}{{/isPrimitiveType}}{{/isArray}}{{#isContainer}}{{#isArray}}{{dataType}}_t *{{/isArray}}{{#isMap}}{{dataType}} {{/isMap}}{{/isContainer}}{{{paramName}}}{{/allParams}});
3737

3838

modules/openapi-generator/src/main/resources/C-libcurl/model-body.mustache

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ char* {{classFilename}}_{{classname}}_ToString({{projectName}}_{{classVarName}}_
2525
return 0;
2626
}
2727

28-
cJSON *{{classFilename}}_{{classname}}_convertToJSON({{projectName}}_{{classVarName}}_{{enumName}}_e {{classname}}) {
28+
cJSON *{{classname}}_convertToJSON({{projectName}}_{{classVarName}}_{{enumName}}_e {{classname}}) {
2929
cJSON *item = cJSON_CreateObject();
3030
{{#isString}}
3131
if(cJSON_AddStringToObject(item, "{{{classname}}}", {{classFilename}}_{{{classname}}}_ToString({{{classname}}})) == NULL) {
@@ -48,7 +48,7 @@ fail:
4848
return NULL;
4949
}
5050

51-
{{projectName}}_{{classVarName}}_{{enumName}}_e {{classFilename}}_{{classname}}_parseFromJSON(cJSON *{{classname}}JSON) {
51+
{{projectName}}_{{classVarName}}_{{enumName}}_e {{classname}}_parseFromJSON(cJSON *{{classname}}JSON) {
5252
{{projectName}}_{{classVarName}}_{{enumName}}_e *{{classname}} = NULL;
5353
{{#isEnum}}
5454
{{#isNumeric}}
@@ -75,6 +75,7 @@ end:
7575
{{^isEnum}}
7676
{{#vars}}
7777
{{^isContainer}}
78+
{{#isPrimitiveType}}
7879
{{^isModel}}
7980
{{#isEnum}}
8081
char* {{classname}}_{{name}}_ToString({{projectName}}_{{classVarName}}_{{enumName}}_e {{name}}) {
@@ -96,6 +97,7 @@ char* {{classname}}_{{name}}_ToString({{projectName}}_{{classVarName}}_{{enumNam
9697
}
9798
{{/isEnum}}
9899
{{/isModel}}
100+
{{/isPrimitiveType}}
99101
{{/isContainer}}
100102
{{#isContainer}}
101103
{{#items}}
@@ -138,7 +140,12 @@ char* {{classname}}_{{name}}_ToString({{projectName}}_{{classVarName}}_{{enumNam
138140
{{/isModel}}
139141
{{^isModel}}
140142
{{^isFreeFormObject}}
143+
{{^isEnum}}
141144
{{datatype}}_t *{{name}}{{^-last}},{{/-last}}
145+
{{/isEnum}}
146+
{{#isEnum}}
147+
{{projectName}}_{{dataType}}_{{enumName}}_e {{name}}{{^-last}},{{/-last}}
148+
{{/isEnum}}
142149
{{/isFreeFormObject}}
143150
{{/isModel}}
144151
{{#isUuid}}
@@ -227,10 +234,12 @@ void {{classname}}_free({{classname}}_t *{{classname}}) {
227234
{{/isModel}}
228235
{{^isModel}}
229236
{{^isFreeFormObject}}
237+
{{^isEnum}}
230238
if ({{{classname}}}->{{{name}}}) {
231239
{{{complexType}}}_free({{{classname}}}->{{{name}}});
232240
{{classname}}->{{name}} = NULL;
233241
}
242+
{{/isEnum}}
234243
{{/isFreeFormObject}}
235244
{{/isModel}}
236245
{{#isUuid}}
@@ -337,7 +346,12 @@ cJSON *{{classname}}_convertToJSON({{classname}}_t *{{classname}}) {
337346
}
338347
{{/isEnum}}
339348
{{#isEnum}}
349+
{{#isPrimitiveType}}
340350
if ({{projectName}}_{{classVarName}}_{{enumName}}_NULL == {{{classname}}}->{{{name}}}) {
351+
{{/isPrimitiveType}}
352+
{{^isPrimitiveType}}
353+
if ({{projectName}}_{{dataType}}_{{enumName}}_NULL == {{{classname}}}->{{{name}}}) {
354+
{{/isPrimitiveType}}
341355
goto fail;
342356
}
343357
{{/isEnum}}
@@ -347,7 +361,12 @@ cJSON *{{classname}}_convertToJSON({{classname}}_t *{{classname}}) {
347361
if({{{classname}}}->{{{name}}}) {
348362
{{/isEnum}}
349363
{{#isEnum}}
364+
{{#isPrimitiveType}}
350365
if({{{classname}}}->{{{name}}} != {{projectName}}_{{classVarName}}_{{enumName}}_NULL) {
366+
{{/isPrimitiveType}}
367+
{{^isPrimitiveType}}
368+
if({{{classname}}}->{{{name}}} != {{projectName}}_{{dataType}}_{{enumName}}_NULL) {
369+
{{/isPrimitiveType}}
351370
{{/isEnum}}
352371
{{/required}}
353372
{{^isContainer}}
@@ -589,7 +608,12 @@ fail:
589608
{{^isModel}}
590609
{{^isFreeFormObject}}
591610
// define the local variable for {{{classname}}}->{{{name}}}
611+
{{^isEnum}}
592612
{{complexType}}_t *{{name}}_local_nonprim = NULL;
613+
{{/isEnum}}
614+
{{#isEnum}}
615+
{{projectName}}_{{dataType}}_{{enumName}}_e {{name}}_local_nonprim = 0;
616+
{{/isEnum}}
593617

594618
{{/isFreeFormObject}}
595619
{{/isModel}}
@@ -853,7 +877,7 @@ fail:
853877
{{/isModel}}
854878
{{^isModel}}
855879
{{^isFreeFormObject}}
856-
{{^required}}{{{name}}} ? {{/required}}{{{name}}}_local_nonprim{{^required}} : NULL{{/required}}{{^-last}},{{/-last}}
880+
{{^required}}{{{name}}} ? {{/required}}{{{name}}}_local_nonprim{{^required}} : {{^isEnum}}NULL{{/isEnum}}{{#isEnum}}0{{/isEnum}}{{/required}}{{^-last}},{{/-last}}
857881
{{/isFreeFormObject}}
858882
{{/isModel}}
859883
{{#isUuid}}
@@ -929,8 +953,10 @@ end:
929953
{{^isModel}}
930954
{{^isFreeFormObject}}
931955
if ({{{name}}}_local_nonprim) {
956+
{{^isEnum}}
932957
{{complexType}}_free({{{name}}}_local_nonprim);
933-
{{{name}}}_local_nonprim = NULL;
958+
{{/isEnum}}
959+
{{{name}}}_local_nonprim = {{^isEnum}}NULL{{/isEnum}}{{#isEnum}}0{{/isEnum}};
934960
}
935961
{{/isFreeFormObject}}
936962
{{/isModel}}

modules/openapi-generator/src/main/resources/C-libcurl/model-header.mustache

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,15 @@ char* {{classFilename}}_{{classname}}_ToString({{projectName}}_{{classVarName}}_
3030

3131
{{projectName}}_{{classVarName}}_{{enumName}}_e {{classFilename}}_{{classname}}_FromString(char* {{classname}});
3232

33-
//cJSON *{{classFilename}}_{{classname}}_convertToJSON({{projectName}}_{{classVarName}}_{{enumName}}_e {{classname}});
33+
cJSON *{{classname}}_convertToJSON({{projectName}}_{{classVarName}}_{{enumName}}_e {{classname}});
3434

35-
//{{projectName}}_{{classVarName}}_{{enumName}}_e {{classFilename}}_{{classname}}_parseFromJSON(cJSON *{{classname}}JSON);
35+
{{projectName}}_{{classVarName}}_{{enumName}}_e {{classname}}_parseFromJSON(cJSON *{{classname}}JSON);
3636

3737
{{/isEnum}}
3838
{{^isEnum}}
3939
{{#vars}}
4040
{{^isContainer}}
41+
{{#isPrimitiveType}}
4142
{{^isModel}}
4243
{{#isEnum}}
4344
// Enum {{enumName}} for {{classVarName}}
@@ -52,6 +53,7 @@ char* {{classFilename}}_{{name}}_ToString({{projectName}}_{{classVarName}}_{{enu
5253

5354
{{/isEnum}}
5455
{{/isModel}}
56+
{{/isPrimitiveType}}
5557
{{/isContainer}}
5658
{{#isContainer}}
5759
{{#items}}
@@ -88,7 +90,12 @@ typedef struct {{classname}}_t {
8890
{{/isModel}}
8991
{{^isModel}}
9092
{{^isFreeFormObject}}
93+
{{^isEnum}}
9194
{{datatype}}_t *{{name}}; // custom
95+
{{/isEnum}}
96+
{{#isEnum}}
97+
{{projectName}}_{{dataType}}_{{enumName}}_e {{name}}; //referenced enum
98+
{{/isEnum}}
9299
{{/isFreeFormObject}}
93100
{{/isModel}}
94101
{{#isUuid}}
@@ -163,7 +170,12 @@ typedef struct {{classname}}_t {
163170
{{/isModel}}
164171
{{^isModel}}
165172
{{^isFreeFormObject}}
173+
{{^isEnum}}
166174
{{datatype}}_t *{{name}}{{^-last}},{{/-last}}
175+
{{/isEnum}}
176+
{{#isEnum}}
177+
{{projectName}}_{{dataType}}_{{enumName}}_e {{name}}{{^-last}},{{/-last}}
178+
{{/isEnum}}
167179
{{/isFreeFormObject}}
168180
{{/isModel}}
169181
{{#isUuid}}

samples/client/petstore/c-useJsonUnformatted/.openapi-generator/FILES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ include/binary.h
2626
include/keyValuePair.h
2727
include/list.h
2828
libcurl.licence
29+
model/any_type.h
2930
model/api_response.c
3031
model/api_response.h
3132
model/category.c

samples/client/petstore/c-useJsonUnformatted/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ set(HDRS
7575
include/keyValuePair.h
7676
external/cJSON.h
7777
model/object.h
78+
model/any_type.h
7879
model/mapped_model.h
7980
model/api_response.h
8081
model/category.h
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/*
2+
* any_type.h
3+
*
4+
* A placeholder for now, this type isn't really needed.
5+
*/

samples/client/petstore/c/.openapi-generator/FILES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ include/binary.h
2525
include/keyValuePair.h
2626
include/list.h
2727
libcurl.licence
28+
model/any_type.h
2829
model/api_response.c
2930
model/api_response.h
3031
model/category.c
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/*
2+
* any_type.h
3+
*
4+
* A placeholder for now, this type isn't really needed.
5+
*/

0 commit comments

Comments
 (0)