CompilationUnit astRoot = ASTResolving.findParentCompilationUnit(typeDecl);
AST ast = astRoot.getAST();
ASTRewrite astRewrite = ASTRewrite.create(ast);
ImportRewrite importRewrite = StubUtility.createImportRewrite(astRoot, true);
ListRewrite listRewriter = astRewrite.getListRewrite(typeDecl, (typeDecl).getBodyDeclarationsProperty());
if (listRewriter != null) {
IJavaProject javaProject = compilationUnit.getJavaProject();
CodeGenerationSettings settings = JavaPreferencesSettings.getCodeGenerationSettings(javaProject);
MethodDeclaration methodDecl = createNewConstructor(typeDecl, ast);
IMethodBinding constructorBinding = ASTNodes.getMethodBinding(methodDecl.getName());
ITypeBinding typeBinding = ASTNodes.getTypeBinding(typeDecl.getName());
ImportRewriteContext context = new ContextSensitiveImportRewriteContext(typeDecl, importRewrite);
MethodDeclaration stub = StubUtility2.createConstructorStub(compilationUnit, astRewrite, importRewrite,
context, typeBinding, constructorBinding, this.variableBindings, Modifier.PUBLIC, settings);
if (stub != null) {
IType type = null;
// Getting the IType in question turned out to be much more
// difficult than one would hope. At this point, it appears that
// typeDecl "belongs to" a different compilation unit than the
// one which we can get at from here. Thus, we have to look
// through *this* compilation unit for the IType with the name
// we are looking for.
for (Object type2 : compilationUnit.getAllTypes()) {
if (type2 instanceof IType) {
// Allegedly, getFullyQualifiedName will return the
// fully qualified name (e.g. a.b.c.Foo), but I have
// seen it return a name without the package type.
String typeName = typeDecl.getName().getFullyQualifiedName();
String type2Name = ((IType) type2).getFullyQualifiedName();
if (type2Name.endsWith(typeName)) {
type = (IType) type2;
break;
}
}
}
if (type == null) {
return astRewrite; // this should never get hit
}
IJavaElement[] fields = type.getChildren();
IJavaElement firstField;
if (fields.length == 0) {
firstField = null;
}
else {
firstField = fields[0];
}
ASTNode insertion = StubUtility2.getNodeToInsertBefore(listRewriter, firstField);
if (insertion != null && insertion.getParent() == typeDecl) {
listRewriter.insertBefore(stub, insertion, null);
}
else {
listRewriter.insertLast(stub, null);
}
constructorBinding = ASTNodes.getMethodBinding(stub.getName());
addAutowiredAnnotation(javaProject, astRewrite, stub, constructorBinding);