onelang
Version:
OneLang transpiler framework core
201 lines (189 loc) • 6.01 kB
YAML
name: java
extension: java
casing:
class: pascal_case
enum: pascal_case
enumMember: upper_case
method: camel_case
field: camel_case
property: camel_case
variable: camel_case
primitiveTypes:
any: Object
void: void
templates:
testGenerator: |-
class Program {
public static void main(String[] args) throws Exception {
try {
new {{class}}().{{method}}();
} catch (Exception err) {
System.out.println("Exception: " + err.getMessage());
}
}
}
main: |-
{{for inc in includes|sep=\n}}
import {{inc.name}};
{{/for}}
{{for enum in enums|sep=\n}}
enum {{enum.name}} {
{{for item in enum.values|inline sep=", "}}
{{item.name}}
{{/for}}
};
{{/for}}
{{for interface in interfaces|sep=\n\n}}
interface {{genTypeArgs(interface, "extends")}} {
{{for method in interface.methods|sep="\n \n"}}
{{method.returnType}} {{method.name}}({{genArgs(method)}}) throws Exception;
{{/for}}
}
{{/for}}
{{for class in classes|sep=\n\n}}
class {{genTypeArgs(class, "implements")}} {
{{beginClass(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)}}) throws Exception {
{{genBody(class.constructor.body)}}
}
{{/if}}
{{for method in class.methods|sep="\n \n"}}
{{method.visibility}} {{if method.static}}static {{/if}}{{method.returnType}} {{method.name}}({{genArgs(method)}}) throws Exception
{
{{genBody(method.body)}}
}
{{/for}}
}
{{/for}}
{{if mainBlock.statements.length > 0}}
class Program {
public static void main(String[] args) throws Exception {
{{genBody(mainBlock)}}
}
}
{{/if}}
genTypeArgs:
args: [{name: class}, {name: inheritText}]
template: |-
{{class.name}}
{{if class.typeArguments|inline}}
<
{{for arg in class.typeArguments|inline sep=", "}}
{{arg}}
{{/for}}
>
{{/if}}
{{if class.baseClass|inline}}
extends {{class.baseClass}}
{{/if}}
{{for name in class.baseInterfaces|inline}}
{{inheritText}} {{name}}
{{/for}}
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: "{{typeName(itemVar.type)}} {{itemVar.outName}} = {{gen(itemVar.initializer)}}"
genWithParen:
args: [{ name: expr }]
template: |-
{{if expr.exprKind == "Binary" or expr.exprKind == "Conditional"}}
({{gen(expr)}})
{{else}}
{{gen(expr)}}
{{/if}}
expressions:
call: |-
{{gen(expr.method)}}(
{{for arg in expr.arguments|sep=", " inline}}
{{gen(arg)}}
{{/for}}
)
propertyAccess: "{{gen(expr.object)}}.{{gen(expr.propertyName)}}"
identifier: "{{expr.text}}"
stringLiteral: '"{{expr.escapedText}}"'
characterLiteral: "'{{expr.escapedTextSingle}}'"
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)}})"
numericLiteral: "{{expr.value}}"
variableDeclaration: "{{genVar(expr)}};"
new: "new {{gen(expr.cls)}}({{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: "{{gen(expr.thisExpr)}}.{{expr.varRef.outName}}"
falseLiteral: "false"
trueLiteral: "true"
elementAccess: "{{gen(expr.object)}}.get({{gen(expr.elementExpr)}})"
thisReference: this
conditional: "{{gen(expr.condition)}} ? {{gen(expr.whenTrue)}} : {{gen(expr.whenFalse)}}"
break: break;
templateString: |-
{{for part in expr.parts|sep=" + " inline}}
{{if part.literal|inline}}
"{{escapeQuotes(part.text)}}"
{{else}}
{{genWithParen(part.expr)}}
{{/if}}
{{/for}}
foreach: |-
for ({{typeName(expr.itemVariable.type)}} {{expr.itemVariable.outName}} : {{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|inline}}
{{" "}}
{{if isIfBlock(expr.else)|inline}}
else {{genBody(expr.else)}}
{{else}}
else {
{{genBody(expr.else)}}
}
{{/if}}
{{/if}}