From cad93cfabd3bd94ac1c42b98929363a3fd26fc45 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Tue, 27 Mar 2012 19:04:08 +0400 Subject: [PATCH] support @PostConstruct in our magnificent injector --- .../di/InjectorForJavaSemanticServices.java | 2 ++ .../di/InjectorForTopDownAnalyzerForJvm.java | 2 ++ .../resolve/java/PsiClassFinderForJvm.java | 7 +++-- .../jet/di/DependencyInjectorGenerator.java | 26 +++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java index 58b15636f2b..d6c7ed17984 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java @@ -74,6 +74,8 @@ public class InjectorForJavaSemanticServices { namespaceFactoryImpl.setModuleDescriptor(moduleDescriptor); namespaceFactoryImpl.setTrace(bindingTrace); + psiClassFinderForJvm.initialize(); + } public JavaSemanticServices getJavaSemanticServices() { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index 9ca2ccc1e28..f810b914ece 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -204,6 +204,8 @@ public class InjectorForTopDownAnalyzerForJvm { javaTypeTransformer.setJavaSemanticServices(javaSemanticServices); javaTypeTransformer.setResolver(javaDescriptorResolver); + psiClassFinderForJvm.initialize(); + } public TopDownAnalyzer getTopDownAnalyzer() { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java index ed2409eeca9..2075ba86b46 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java @@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder; import org.jetbrains.jet.plugin.JetFileType; +import javax.annotation.PostConstruct; import javax.inject.Inject; /** @@ -46,6 +47,10 @@ public class PsiClassFinderForJvm implements PsiClassFinder { @Inject public void setProject(Project project) { this.project = project; + } + + @PostConstruct + public void initialize() { this.altClassFinder = new AltClassFinder(project); this.javaSearchScope = new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(project)) { @Override @@ -57,8 +62,6 @@ public class PsiClassFinderForJvm implements PsiClassFinder { } - - @Override @Nullable public PsiClass findPsiClass(@NotNull FqName qualifiedName) { diff --git a/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java b/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java index d4811f7d6c5..f5f9f269753 100644 --- a/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java +++ b/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java @@ -25,6 +25,7 @@ import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.annotation.PostConstruct; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -243,11 +244,36 @@ public class DependencyInjectorGenerator { out.println(); } } + + // call @PostConstruct + for (Field field : fields) { + // TODO: type of field may be different from type of object + List postConstructMethods = getPostConstructMethods(field.getType()); + for (Method postConstruct : postConstructMethods) { + out.println(indent + field.getName() + "." + postConstruct.getName() + "();"); + } + if (postConstructMethods.size() > 0) { + out.println(); + } + } } out.println(" }"); } + private static List getPostConstructMethods(Class clazz) { + List r = Lists.newArrayList(); + for (Method method : clazz.getMethods()) { + if (method.getAnnotation(PostConstruct.class) != null) { + if (method.getParameterTypes().length != 0) { + throw new IllegalStateException("@PostConstruct method must have no arguments: " + method); + } + r.add(method); + } + } + return r; + } + private void generateGetters(PrintStream out) { String indent0 = " "; String indent1 = indent0 + INDENT_STEP;