用勺子在方法中生成一个类

时间:2016-08-05 06:58:57

标签: java inria-spoon

我一直在处理一个处理器,它在一个方法中注入一个内部类 ,并且我很难搞清楚如何生成类和随附对象初始化,不会导致自动生成不正确的完全限定名称。

例如,我一直在处理以下内容: 我一直在上新课:

CtClass internal = getFactory().Core().createClass();

然后将其插入方法

中的元素之前
element.insertBefore(internal);

但是当我做一个初始化语句时:

CtConstructorCall call = getFactory().Core().createConstructorCall();
call.setType(internal);
internal.insertAfter(call);

我接到一个看起来像是的电话:

Main.internal initializedInternalObject = new Main.internal();

其中Main是所有内容的整个类的名称,即使internal仅在特定方法中声明。我尝试过对内部类使用getFactory()。Class()。create()方法,但该方法似乎只针对嵌套在类中的类,而不是方法中的delcared类。

我是否在做类声明时出错了?我是否只是因为限制了勺子生成内部课程的能力?有什么建议吗?

谢谢大家!

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是用数字为内部类名添加前缀。

这有用吗?

不要犹豫,使用Github issues报告奇怪的行为。

答案 1 :(得分:0)

虽然它有点像黑客,但代码片段表达式允许手动覆盖涉及给定内部类的类型名称和构造函数调用的表达式。例如:

String constructorCallSnippet = 
    "new " + classType.toString() + "(" 
    + String.join(", ", args.stream().map(a -> a.toString()).collect(toList()))
    + ")";
CtExpression constructorCall =
    getFactory().Code().createCodeSnippetExpression(constructorCallSnippet);