onelang
Version:
OneLang transpiler framework core
225 lines (215 loc) • 6.64 kB
YAML
name: csharp
extension: cs
casing: # based on https://msdn.microsoft.com/en-us/library/x2dbyw72(v=vs.71).aspx
class: pascal_case
method: pascal_case
enum: pascal_case
enumMember: pascal_case
variable: camel_case
field: pascal_case # TODO: private
property: pascal_case
primitiveTypes:
void: void
any: object
templates:
testGenerator: |-
public class Program
{
static public void Main(string[] args)
{
try
{
new {{class}}().{{method}}();
}
catch (System.Exception e)
{
System.Console.WriteLine($"Exception: {e.Message}");
}
}
}
main: |-
{{for inc in includes|sep=\n}}
using {{inc.name}};
{{/for}}
{{for enum in enums|sep=\n}}
public enum {{enum.name}} {
{{for item in enum.values|inline sep=", "}}
{{item.name}}
{{/for}}
}
{{/for}}
{{for interface in interfaces|sep=\n\n}}
public interface {{genTypeArgs(interface)}}
{
{{for method in interface.methods|sep="\n \n"}}
{{method.returnType}} {{method.name}}({{genArgs(method)}});
{{/for}}
}
{{/for}}
{{for class in classes|sep=\n\n}}
public class {{genTypeArgs(class)}}
{
{{beforeFields(class)}}
{{for field in class.fields|sep=\n}}
{{field.visibility}} {{if field.static}}static {{/if}}{{field.type}} {{field.name}}{{if field.initializer}} = {{gen(field.initializer)}}{{/if}};
{{/for}}
{{if class.constructor}}
public {{class.name}}({{genArgs(class.constructor)}})
{
{{genBody(class.constructor.body)}}
}
{{/if}}
{{for method in class.methods|sep="\n \n"}}
{{method.visibility}} {{if method.attributes["virtual"]}}virtual {{/if}}{{if method.attributes["override"]}}override {{/if}}{{if method.static}}static {{/if}}{{method.returnType}} {{method.name}}({{genArgs(method)}})
{
{{genBody(method.body)}}
}
{{/for}}
}
{{/for}}
{{if mainBlock.statements.length > 0}}
public class Program
{
static public void Main(string[] args)
{
{{genBody(mainBlock)}}
}
}
{{/if}}
genTypeArgs:
args: [{name: class}]
template: |-
{{class.name}}
{{if class.typeArguments|inline}}
<
{{for arg in class.typeArguments|inline sep=", "}}
{{arg}}
{{/for}}
>
{{/if}}
{{if class.baseClasses.length > 0|inline}}
:
{{for item in class.baseClasses|inline sep=", "}}
{{item}}
{{/for}}
{{/if}}
genBody:
args:
- name: body
template: |-
{{for statement in body.statements|sep=\n}}
{{statement.leadingTrivia}}{{gen(statement)}}
{{/for}}
genArgs:
args:
- name: method
template: |-
{{for param in method.parameters|sep=", "}}
{{param.type}} {{param.name}}
{{/for}}
genParams:
args:
- name: params
template: |-
{{for param in params|sep=", " inline}}
{{gen(param)}}
{{/for}}
genVar:
args:
- name: itemVar
template: "{{if itemVar.isUnused}}/* UNUSED: {{/if}}var {{itemVar.outName}} = {{if itemVar.isUnused}}*/ {{/if}}{{gen(itemVar.initializer)}}"
genWithParen:
args: [{ name: expr }]
template: |-
{{if expr.exprKind == "Binary" or expr.exprKind == "Conditional"}}
({{gen(expr)}})
{{else}}
{{gen(expr)}}
{{/if}}
beforeFields: { args: [class], template: "" }
expressions:
call: "{{gen(expr.method)}}({{genParams(expr.arguments)}})"
propertyAccess: "{{gen(expr.object)}}.{{gen(expr.propertyName)}}"
identifier: "{{expr.text}}"
stringLiteral: '"{{expr.escapedText}}"'
characterLiteral: "'{{expr.escapedTextSingle}}'"
numericLiteral: "{{expr.value}}"
nullLiteral: "null"
return: "return{{if expr.expression}} {{gen(expr.expression)}}{{/if}};"
binary: "{{gen(expr.left)}} {{expr.operator}} {{gen(expr.right)}}"
postfix: "{{gen(expr.operand)}}{{expr.operator}}"
prefix: "{{expr.operator}}{{gen(expr.operand)}}"
throw: "throw {{gen(expr.expression)}};"
parenthesized: "({{gen(expr.expression)}})"
variableDeclaration: "{{genVar(expr)}};"
new: |-
new {{gen(expr.cls)}}
{{if expr.typeArguments.length > 0|inline}}
<
{{for arg in expr.typeArguments|inline sep=", "}}
{{typeName(arg)}}
{{/for}}
>
{{/if}}
({{genParams(expr.arguments)}})
classReference: "{{expr.classRef.outName}}"
enumReference: "{{expr.enumRef.outName}}"
enumMemberReference: "{{expr.enumRef.outName}}.{{expr.enumMemberRef.outName}}"
expressionStatement: "{{gen(expr.expression)}};"
instanceMethod: "{{gen(expr.thisExpr)}}.{{expr.methodRef.outName}}"
staticMethod: "{{expr.methodRef.classRef.outName}}.{{expr.methodRef.outName}}"
localVar: "{{expr.varRef.outName}}"
methodArgument: "{{expr.varRef.outName}}"
instanceField: "{{gen(expr.thisExpr)}}.{{expr.varRef.outName}}"
staticField: "{{if expr.thisExpr.exprKind != 'ThisReference'}}{{gen(expr.thisExpr)}}.{{/if}}{{expr.varRef.outName}}"
falseLiteral: "false"
trueLiteral: "true"
elementAccess: "{{gen(expr.object)}}[{{gen(expr.elementExpr)}}]"
thisReference: this
cast: "({{typeName(expr.newType)}})({{gen(expr.expression)}})"
conditional: "{{gen(expr.condition)}} ? {{gen(expr.whenTrue)}} : {{gen(expr.whenFalse)}}"
break: break;
templateString: |-
$"
{{for part in expr.parts|inline}}
{{if part.literal|inline}}
{{escapeQuotes(part.text)}}
{{else}}
{{if part.expr.valueType.isBoolean|inline}}
{({{genWithParen(part.expr)}} ? "true" : "false")}
{{else}}
{{{gen(part.expr)}}}
{{/if}}
{{/if}}
{{/for}}
"
foreach: |-
foreach (var {{expr.itemVariable.outName}} in {{gen(expr.items)}})
{
{{genBody(expr.body)}}
}
for: |-
for ({{genVar(expr.itemVariable)}}; {{gen(expr.condition)}}; {{gen(expr.incrementor)}})
{
{{genBody(expr.body)}}
}
while: |-
while ({{gen(expr.condition)}})
{
{{genBody(expr.body)}}
}
if: |-
if ({{gen(expr.condition)}})
{
{{genBody(expr.then)}}
}
{{if expr.else}}
{{if isIfBlock(expr.else)}}
else {{genBody(expr.else)|inline}}
{{else}}
else
{
{{genBody(expr.else)}}
}
{{/if}}
{{/if}}