1 module bamboo.codegen.field_declarations.molecular; 2 3 import bamboo.codegen.field_declarations; 4 5 string generateMolecular(MolecularField field) 6 { 7 string format; 8 format ~= "@FieldId(" ~ field.id.to!string ~ ")"; 9 format ~= "void "; 10 format ~= field.symbol; 11 12 format ~= "("; 13 14 foreach (reference; field.references) 15 { 16 format ~= generateParameterListFor(reference); 17 } 18 19 format ~= ") {"; 20 foreach (reference; field.references) 21 { 22 format ~= generateCallFor(reference) ~ ";"; 23 } 24 25 format ~= "}"; 26 27 return format; 28 } 29 30 string generateCallFor(FieldDeclaration field) 31 { 32 if (auto molecular = cast(MolecularField) field) 33 { 34 return generateMolecularCall(molecular); 35 } 36 else if (auto atomic = cast(AtomicField) field) 37 { 38 return generateAtomicCall(atomic); 39 } 40 else if (auto parameter = cast(ParameterField) field) 41 { 42 return generateParameterFieldCall(parameter); 43 } 44 else 45 { 46 assert(0); 47 } 48 49 } 50 51 string[] flattenArgs(MolecularField field) 52 { 53 string[] args; 54 foreach (reference; field.references) 55 { 56 if (auto molecular = cast(MolecularField) field) 57 { 58 args ~= flattenArgs(molecular); 59 } 60 else if (auto atomic = cast(AtomicField) field) 61 { 62 foreach (arg; atomic.parameters) 63 { 64 args ~= arg.symbol; 65 } 66 } 67 else if (auto paraField = cast(ParameterField) field) 68 { 69 args ~= paraField.parameter.symbol; 70 } 71 } 72 return args; 73 } 74 75 string generateMolecularCall(MolecularField field) 76 { 77 string[] args = flattenArgs(field); 78 string format; 79 format ~= field.symbol; 80 format ~= "("; 81 foreach (arg; args) 82 { 83 format ~= arg ~ ","; 84 } 85 format ~= ")"; 86 87 return format; 88 } 89 90 string generateAtomicCall(AtomicField field) 91 { 92 string format; 93 if (field.parameters.length > 1) 94 { 95 format ~= field.symbol; 96 } 97 else 98 { 99 format ~= "this." ~ cast(char)(field.name[3].toLower) ~ field.name[4 .. $]; 100 } 101 format ~= "("; 102 foreach (arg; field.parameters) 103 { 104 format ~= arg.symbol ~ ","; 105 } 106 format ~= ")"; 107 108 return format; 109 } 110 111 string generateParameterFieldCall(ParameterField field) 112 { 113 return "this." ~ field.name ~ "=" ~ field.name; 114 }