Skip to content

Instantly share code, notes, and snippets.

@alextkachman
Created December 11, 2010 19:39
Show Gist options
  • Save alextkachman/737601 to your computer and use it in GitHub Desktop.
Save alextkachman/737601 to your computer and use it in GitHub Desktop.
Some code on Java & Groovy++ (real piece of Groovy++ compiler)
// Java version
Parameter param = new Parameter(ClassHelper.OBJECT_TYPE, "$it");
VariableExpression ve = new VariableExpression(param);
ve.setSourcePosition(originalProperty);
PropertyExpression prop = new PropertyExpression(ve, originalProperty);
prop.setSourcePosition(originalProperty);
ReturnStatement retStat = new ReturnStatement(prop);
retStat.setSourcePosition(originalProperty);
ClosureExpression ce = new ClosureExpression(new Parameter[]{param}, retStat);
ce.setVariableScope(new VariableScope(compiler.compileStack.getScope()));
MethodCallExpression mce = new MethodCallExpression(exp.getObjectExpression(), "map", ce);
mce.setSourcePosition(exp);
return compiler.transform(mce);
// Groovy++ version
Parameter param = [ClassHelper.OBJECT_TYPE, "$it"]
VariableExpression ve = [param]
ve.sourcePosition = originalProperty
PropertyExpression prop = [ve, originalProperty]
prop.sourcePosition = originalProperty
def retStat = new ReturnStatement(prop)
retStat.sourcePosition = originalProperty
def ce = new ClosureExpression([param], retStat)
ce.variableScope = [compiler.compileStack.scope]
MethodCallExpression mce = [exp.objectExpression, "map", ce]
mce.sourcePosition = exp
return compiler.transform(mce)
// Groovy++ version commented
// new object creation inferred
Parameter param = [ClassHelper.OBJECT_TYPE, "$it"]
// new object creation inferred
VariableExpression ve = [param]
// property setter
ve.sourcePosition = originalProperty
// new object creation inferred
PropertyExpression prop = [ve, originalProperty]
// property setter
prop.sourcePosition = originalProperty
// variable type inferred
def retStat = new ReturnStatement(prop)
// property setter
retStat.sourcePosition = originalProperty
// variable type and 1st parameter inferred
def ce = new ClosureExpression([param], retStat)
// property setter and new object creation
ce.variableScope = [compiler.compileStack.scope]
// new object creation inferred
MethodCallExpression mce = [exp.objectExpression, "map", ce]
// property setter
mce.sourcePosition = exp
return compiler.transform(mce)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment