|
|
|
Solved How to extend xbase::XBlockExpression? [message #1278384 is a reply to message #1278322] |
Thu, 27 March 2014 09:00 |
peter luthardt Messages: 22 Registered: March 2014 |
Junior Member |
|
|
I do not know if this is the best solution but now it works. Maybe it will help others.
I changed the copiler to
class MyDslCompiler extends XbaseCompiler {
@Inject extension JvmTypesBuilder
override protected doInternalToJavaStatement (XExpression expr, ITreeAppendable it, boolean isReferenced) {
switch (expr)
{
MyBlockExpression:
{
val greeting = EcoreUtil2::getContainerOfType(expr, Greeting)
if (greeting != null)
{
newLine.append('''final String MN = "«greeting.name»";''')
newLine.append('''System.out.println("entering <«greeting.name»>");''')
}
super.doInternalToJavaStatement(expr as XBlockExpression, it, isReferenced)
}
MyLog : {
_toJavaStatement(expr, it, isReferenced)
}
default : super.doInternalToJavaStatement(expr, it, isReferenced)
}
}
def void _toJavaStatement(MyLog expr, ITreeAppendable b, boolean isReferenced) {
val it = b.trace(expr, false);
if (expr.getExpressions().isEmpty())
return;
if (isReferenced)
declareSyntheticVariable(expr, it);
newLine().append("if (1==1) {//trace is enabled")
increaseIndentation();
openPseudoScope();
val expressions = expr.getExpressions();
for (ex:expressions)
{
if (ex == expressions.last)
{
internalMyLogToJavaStatement(ex, it);
if (isReferenced) {
newLine().append(getVarName(expr, it)).append(" = ");
internalToConvertedExpression(ex, it, getType(expr));
append(";");
}
} else
{
internalMyLogToJavaStatement(ex, it)
}
}
newLine.append ('''System.out.println ("logging in "+MN+" -> "«FOR varName :expressions.map[ex|ex.getVarName(it)]»+«varName»«ENDFOR»);''')
it.closeScope();
it.decreaseIndentation()
newLine().append("}");
}
def void internalMyLogToJavaStatement (XExpression expr, ITreeAppendable it)
{
switch (expr)
{
XStringLiteral : declareFreshLocalVariable(expr, it, [append('''«_toJavaExpression(expr, it)»''')])
XAbstractFeatureCall:{
declareFreshLocalVariable(expr, it, [append('''«featureCalltoJavaExpression(expr, it, true)»''')])
}
default : internalToJavaStatement(expr, it, true)
}
}
}
Now I had to change my grammer to add the new Literal
...
XPrimaryExpression returns xbase::XExpression:
XConstructorCall |
XBlockExpression |
XSwitchExpression |
XFeatureCall |
XLiteral |
XIfExpression |
XForLoopExpression |
XWhileExpression |
XDoWhileExpression |
XThrowExpression |
XReturnExpression |
XTryCatchFinallyExpression |
XParenthesizedExpression|
MyLog;
...
Can anyone mark this as solved?
Xtext 2.8.1
|
|
|
|
Powered by
FUDForum. Page generated in 0.02873 seconds