DependencyInjectorGenerator: reified extensions

1. Introduced reified extensions
2. Replaced extensions accepting varargs with ones
that accept single reified argument (it's looks more concise)
This commit is contained in:
Denis Zharkov
2014-11-30 17:11:23 +03:00
parent b3bf8933df
commit 0d03253f4e
2 changed files with 130 additions and 160 deletions
@@ -84,60 +84,52 @@ public fun createInjectorGenerators(): List<DependencyInjectorGenerator> =
private fun generatorForTopDownAnalyzerBasic() = private fun generatorForTopDownAnalyzerBasic() =
generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerBasic") { generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerBasic") {
parameter(javaClass<Project>()) parameter<Project>()
parameter(javaClass<GlobalContext>(), useAsContext = true) parameter<GlobalContext>(useAsContext = true)
parameter(javaClass<BindingTrace>()) parameter<BindingTrace>()
publicParameter(javaClass<ModuleDescriptor>(), useAsContext = true) publicParameter<ModuleDescriptor>(useAsContext = true)
publicFields( publicField<TopDownAnalyzer>()
javaClass<TopDownAnalyzer>()
)
field(javaClass<MutablePackageFragmentProvider>()) field<MutablePackageFragmentProvider>()
parameter(javaClass<AdditionalCheckerProvider>()) parameter<AdditionalCheckerProvider>()
parameter(javaClass<DynamicTypesSettings>()) parameter<DynamicTypesSettings>()
} }
private fun generatorForLazyTopDownAnalyzerBasic() = private fun generatorForLazyTopDownAnalyzerBasic() =
generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyTopDownAnalyzerBasic") { generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyTopDownAnalyzerBasic") {
commonForResolveSessionBased() commonForResolveSessionBased()
publicFields( publicField<LazyTopDownAnalyzer>()
javaClass<LazyTopDownAnalyzer>()
)
field(javaClass<AdditionalCheckerProvider>(), field<AdditionalCheckerProvider>(
init = GivenExpression(javaClass<AdditionalCheckerProvider.Empty>().getCanonicalName() + ".INSTANCE$")) init = GivenExpression(javaClass<AdditionalCheckerProvider.Empty>().getCanonicalName() + ".INSTANCE$"))
} }
private fun generatorForLazyBodyResolve() = private fun generatorForLazyBodyResolve() =
generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyBodyResolve") { generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyBodyResolve") {
parameter(javaClass<Project>()) parameter<Project>()
parameter(javaClass<GlobalContext>(), useAsContext = true) parameter<GlobalContext>(useAsContext = true)
parameter(javaClass<KotlinCodeAnalyzer>(), name = "analyzer") parameter<KotlinCodeAnalyzer>(name = "analyzer")
parameter(javaClass<BindingTrace>()) parameter<BindingTrace>()
parameter(javaClass<AdditionalCheckerProvider>()) parameter<AdditionalCheckerProvider>()
field(javaClass<ModuleDescriptor>(), init = GivenExpression("analyzer.getModuleDescriptor()"), useAsContext = true) field<ModuleDescriptor>(init = GivenExpression("analyzer.getModuleDescriptor()"), useAsContext = true)
publicFields( publicField<LazyTopDownAnalyzer>()
javaClass<LazyTopDownAnalyzer>()
)
} }
private fun generatorForTopDownAnalyzerForJs() = private fun generatorForTopDownAnalyzerForJs() =
generator("js/js.frontend/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJs") { generator("js/js.frontend/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJs") {
commonForResolveSessionBased() commonForResolveSessionBased()
publicFields( publicField<LazyTopDownAnalyzer>()
javaClass<LazyTopDownAnalyzer>()
)
field(javaClass<MutablePackageFragmentProvider>()) field<MutablePackageFragmentProvider>()
field(javaClass<AdditionalCheckerProvider>(), field<AdditionalCheckerProvider>(
init = GivenExpression(javaClass<KotlinJsDeclarationCheckerProvider>().getName() + ".INSTANCE$")) init = GivenExpression(javaClass<KotlinJsDeclarationCheckerProvider>().getName() + ".INSTANCE$"))
field(javaClass<DynamicTypesAllowed>()) field<DynamicTypesAllowed>()
} }
private fun generatorForTopDownAnalyzerForJvm() = private fun generatorForTopDownAnalyzerForJvm() =
@@ -147,34 +139,31 @@ private fun generatorForTopDownAnalyzerForJvm() =
private fun generatorForJavaDescriptorResolver() = private fun generatorForJavaDescriptorResolver() =
generator("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForJavaDescriptorResolver") { generator("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForJavaDescriptorResolver") {
parameters( parameter<Project>()
javaClass<Project>(), parameter<BindingTrace>()
javaClass<BindingTrace>()
)
publicField(javaClass<GlobalContextImpl>(), useAsContext = true, publicField<GlobalContextImpl>(useAsContext = true,
init = GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()")) init = GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()"))
publicField(javaClass<ModuleDescriptorImpl>(), name = "module", publicField<ModuleDescriptorImpl>(name = "module",
init = GivenExpression(javaClass<TopDownAnalyzerFacadeForJVM>().getName() + ".createJavaModule(\"<fake-jdr-module>\")")) init = GivenExpression(javaClass<TopDownAnalyzerFacadeForJVM>().getName() + ".createJavaModule(\"<fake-jdr-module>\")"))
publicField(javaClass<JavaDescriptorResolver>()) publicField<JavaDescriptorResolver>()
publicField(javaClass<JavaClassFinderImpl>()) publicField<JavaClassFinderImpl>()
field(javaClass <GlobalSearchScope>(), field<GlobalSearchScope>(
init = GivenExpression(javaClass<GlobalSearchScope>().getName() + ".allScope(project)")) init = GivenExpression(javaClass<GlobalSearchScope>().getName() + ".allScope(project)"))
fields( field<TraceBasedExternalSignatureResolver>()
javaClass<TraceBasedExternalSignatureResolver>(), field<TraceBasedJavaResolverCache>()
javaClass<TraceBasedJavaResolverCache>(), field<TraceBasedErrorReporter>()
javaClass<TraceBasedErrorReporter>(), field<PsiBasedMethodSignatureChecker>()
javaClass<PsiBasedMethodSignatureChecker>(), field<PsiBasedExternalAnnotationResolver>()
javaClass<PsiBasedExternalAnnotationResolver>(), field<JavaPropertyInitializerEvaluatorImpl>()
javaClass<JavaPropertyInitializerEvaluatorImpl>(), field<SamConversionResolverImpl>()
javaClass<SamConversionResolverImpl>(), field<JavaSourceElementFactoryImpl>()
javaClass<JavaSourceElementFactoryImpl>(), field<SingleModuleClassResolver>()
javaClass<SingleModuleClassResolver>(), field<JavaDescriptorResolverPostConstruct>()
javaClass<JavaDescriptorResolverPostConstruct>()
) field<VirtualFileFinder>(
field(javaClass<VirtualFileFinder>(),
init = GivenExpression(javaClass<VirtualFileFinder>().getName() + ".SERVICE.getInstance(project)")) init = GivenExpression(javaClass<VirtualFileFinder>().getName() + ".SERVICE.getInstance(project)"))
} }
@@ -182,150 +171,141 @@ private fun generatorForLazyResolveWithJava() =
generator("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForLazyResolveWithJava") { generator("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForLazyResolveWithJava") {
commonForResolveSessionBased() commonForResolveSessionBased()
parameter(javaClass<GlobalSearchScope>(), name = "moduleContentScope") parameter<GlobalSearchScope>(name = "moduleContentScope")
parameters( parameter<ModuleClassResolver>()
javaClass<ModuleClassResolver>()
)
publicFields( publicField<JavaDescriptorResolver>()
javaClass<JavaDescriptorResolver>()
)
field(javaClass<VirtualFileFinder>(), field<VirtualFileFinder>(
init = GivenExpression(javaClass<VirtualFileFinderFactory>().getName() init = GivenExpression(javaClass<VirtualFileFinderFactory>().getName()
+ ".SERVICE.getInstance(project).create(moduleContentScope)") + ".SERVICE.getInstance(project).create(moduleContentScope)")
) )
fields(
javaClass<JavaClassFinderImpl>(), field<JavaClassFinderImpl>()
javaClass<TraceBasedExternalSignatureResolver>(), field<TraceBasedExternalSignatureResolver>()
javaClass<LazyResolveBasedCache>(), field<LazyResolveBasedCache>()
javaClass<TraceBasedErrorReporter>(), field<TraceBasedErrorReporter>()
javaClass<PsiBasedMethodSignatureChecker>(), field<PsiBasedMethodSignatureChecker>()
javaClass<PsiBasedExternalAnnotationResolver>(), field<PsiBasedExternalAnnotationResolver>()
javaClass<JavaPropertyInitializerEvaluatorImpl>(), field<JavaPropertyInitializerEvaluatorImpl>()
javaClass<SamConversionResolverImpl>(), field<SamConversionResolverImpl>()
javaClass<JavaSourceElementFactoryImpl>(), field<JavaSourceElementFactoryImpl>()
javaClass<JavaFlexibleTypeCapabilitiesProvider>(), field<JavaFlexibleTypeCapabilitiesProvider>()
javaClass<LazyResolveToken>(), field<LazyResolveToken>()
javaClass<JavaLazyAnalyzerPostConstruct>() field<JavaLazyAnalyzerPostConstruct>()
)
field(javaClass<AdditionalCheckerProvider>(), field<AdditionalCheckerProvider>(
init = GivenExpression(javaClass<JavaDeclarationCheckerProvider>().getName() + ".INSTANCE$")) init = GivenExpression(javaClass<JavaDeclarationCheckerProvider>().getName() + ".INSTANCE$"))
} }
private fun generatorForReplWithJava() = private fun generatorForReplWithJava() =
generator("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForReplWithJava") { generator("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForReplWithJava") {
commonForJavaTopDownAnalyzer() commonForJavaTopDownAnalyzer()
parameter(javaClass<ScopeProvider.AdditionalFileScopeProvider>()) parameter<ScopeProvider.AdditionalFileScopeProvider>()
} }
private fun generatorForMacro() = private fun generatorForMacro() =
generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForMacros") { generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForMacros") {
parameter(javaClass<Project>()) parameter<Project>()
parameter(javaClass<ModuleDescriptor>(), useAsContext = true) parameter<ModuleDescriptor>(useAsContext = true)
publicField(javaClass<ExpressionTypingServices>()) publicField<ExpressionTypingServices>()
publicField(javaClass<ExpressionTypingComponents>()) publicField<ExpressionTypingComponents>()
publicField(javaClass<CallResolver>()) publicField<CallResolver>()
field(javaClass<GlobalContext>(), useAsContext = true, field<GlobalContext>(useAsContext = true,
init = GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()")) init = GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()"))
field(javaClass<AdditionalCheckerProvider>(), field<AdditionalCheckerProvider>(
init = GivenExpression(javaClass<AdditionalCheckerProvider.Empty>().getCanonicalName() + ".INSTANCE$")) init = GivenExpression(javaClass<AdditionalCheckerProvider.Empty>().getCanonicalName() + ".INSTANCE$"))
} }
private fun generatorForTests() = private fun generatorForTests() =
generator("compiler/tests", "org.jetbrains.jet.di", "InjectorForTests") { generator("compiler/tests", "org.jetbrains.jet.di", "InjectorForTests") {
parameter(javaClass<Project>()) parameter<Project>()
parameter(javaClass<ModuleDescriptor>(), useAsContext = true) parameter<ModuleDescriptor>(useAsContext = true)
publicFields( publicField<DescriptorResolver>()
javaClass<DescriptorResolver>(), publicField<ExpressionTypingServices>()
javaClass<ExpressionTypingServices>(), publicField<ExpressionTypingUtils>()
javaClass<ExpressionTypingUtils>(), publicField<TypeResolver>()
javaClass<TypeResolver>()
)
field(javaClass<GlobalContext>(), init = GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()"), field<GlobalContext>(init = GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()"),
useAsContext = true) useAsContext = true)
field(javaClass<AdditionalCheckerProvider>(), field<AdditionalCheckerProvider>(
init = GivenExpression(javaClass<JavaDeclarationCheckerProvider>().getName() + ".INSTANCE$")) init = GivenExpression(javaClass<JavaDeclarationCheckerProvider>().getName() + ".INSTANCE$"))
} }
private fun generatorForBodyResolve() = private fun generatorForBodyResolve() =
generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForBodyResolve") { generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForBodyResolve") {
parameter(javaClass<Project>()) parameter<Project>()
parameter(javaClass<GlobalContext>(), useAsContext = true) parameter<GlobalContext>(useAsContext = true)
parameter(javaClass<BindingTrace>()) parameter<BindingTrace>()
parameter(javaClass<ModuleDescriptor>(), useAsContext = true) parameter<ModuleDescriptor>(useAsContext = true)
parameter(javaClass<AdditionalCheckerProvider>()) parameter<AdditionalCheckerProvider>()
parameter(javaClass<PartialBodyResolveProvider>()) parameter<PartialBodyResolveProvider>()
publicField(javaClass<BodyResolver>()) publicField<BodyResolver>()
} }
private fun generatorForLazyResolve() = private fun generatorForLazyResolve() =
generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyResolve") { generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyResolve") {
parameter(javaClass<Project>()) parameter<Project>()
parameter(javaClass<GlobalContext>(), useAsContext = true) parameter<GlobalContext>(useAsContext = true)
parameter(javaClass<ModuleDescriptorImpl>(), useAsContext = true) parameter<ModuleDescriptorImpl>(useAsContext = true)
parameter(javaClass<DeclarationProviderFactory>()) parameter<DeclarationProviderFactory>()
parameter(javaClass<BindingTrace>()) parameter<BindingTrace>()
parameter(javaClass<AdditionalCheckerProvider>()) parameter<AdditionalCheckerProvider>()
publicField(javaClass<ResolveSession>()) publicField<ResolveSession>()
field(javaClass<LazyResolveToken>()) field<LazyResolveToken>()
} }
private fun DependencyInjectorGenerator.commonForResolveSessionBased() { private fun DependencyInjectorGenerator.commonForResolveSessionBased() {
parameter(javaClass<Project>()) parameter<Project>()
parameter(javaClass<GlobalContext>(), useAsContext = true) parameter<GlobalContext>(useAsContext = true)
parameter(javaClass<BindingTrace>()) parameter<BindingTrace>()
parameter(javaClass<ModuleDescriptorImpl>(), name = "module", useAsContext = true) parameter<ModuleDescriptorImpl>(name = "module", useAsContext = true)
parameter(javaClass<DeclarationProviderFactory>()) parameter<DeclarationProviderFactory>()
publicField(javaClass<ResolveSession>()) publicField<ResolveSession>()
} }
private fun DependencyInjectorGenerator.commonForJavaTopDownAnalyzer() { private fun DependencyInjectorGenerator.commonForJavaTopDownAnalyzer() {
commonForResolveSessionBased() commonForResolveSessionBased()
parameter(javaClass<GlobalSearchScope>(), name = "moduleContentScope") parameter<GlobalSearchScope>(name = "moduleContentScope")
publicFields( publicField<LazyTopDownAnalyzer>()
javaClass<LazyTopDownAnalyzer>(), publicField<JavaDescriptorResolver>()
javaClass<JavaDescriptorResolver>(), publicField<DeserializationComponentsForJava>()
javaClass<DeserializationComponentsForJava>()
)
field(javaClass<VirtualFileFinder>(), field<VirtualFileFinder>(
init = GivenExpression(javaClass<VirtualFileFinderFactory>().getName() init = GivenExpression(javaClass<VirtualFileFinderFactory>().getName()
+ ".SERVICE.getInstance(project).create(moduleContentScope)") + ".SERVICE.getInstance(project).create(moduleContentScope)")
) )
fields(
javaClass<JavaClassFinderImpl>(),
javaClass<TraceBasedExternalSignatureResolver>(),
javaClass<LazyResolveBasedCache>(),
javaClass<TraceBasedErrorReporter>(),
javaClass<PsiBasedMethodSignatureChecker>(),
javaClass<PsiBasedExternalAnnotationResolver>(),
javaClass<JavaPropertyInitializerEvaluatorImpl>(),
javaClass<SamConversionResolverImpl>(),
javaClass<JavaSourceElementFactoryImpl>(),
javaClass<MutablePackageFragmentProvider>(),
javaClass<SingleModuleClassResolver>(),
javaClass<JavaLazyAnalyzerPostConstruct>(),
javaClass<JavaFlexibleTypeCapabilitiesProvider>()
)
field(javaClass<AdditionalCheckerProvider>(), field<JavaClassFinderImpl>()
field<TraceBasedExternalSignatureResolver>()
field<LazyResolveBasedCache>()
field<TraceBasedErrorReporter>()
field<PsiBasedMethodSignatureChecker>()
field<PsiBasedExternalAnnotationResolver>()
field<JavaPropertyInitializerEvaluatorImpl>()
field<SamConversionResolverImpl>()
field<JavaSourceElementFactoryImpl>()
field<MutablePackageFragmentProvider>()
field<SingleModuleClassResolver>()
field<JavaLazyAnalyzerPostConstruct>()
field<JavaFlexibleTypeCapabilitiesProvider>()
field<AdditionalCheckerProvider>(
init = GivenExpression(javaClass<JavaDeclarationCheckerProvider>().getName() + ".INSTANCE$")) init = GivenExpression(javaClass<JavaDeclarationCheckerProvider>().getName() + ".INSTANCE$"))
field(javaClass<VirtualFileFinder>(), init = GivenExpression(javaClass<VirtualFileFinder>().getName() + ".SERVICE.getInstance(project)")) field<VirtualFileFinder>(init = GivenExpression(javaClass<VirtualFileFinder>().getName() + ".SERVICE.getInstance(project)"))
} }
@@ -29,44 +29,34 @@ public fun generator(
return generator return generator
} }
public fun DependencyInjectorGenerator.field( inline public fun <reified T> DependencyInjectorGenerator.field(
fieldType: Class<*>, name: String = defaultName(javaClass<T>()),
name: String = defaultName(fieldType),
init: Expression? = null, init: Expression? = null,
useAsContext: Boolean = false useAsContext: Boolean = false
) { ) {
addField(false, DiType(fieldType), name, init, useAsContext) addField(false, DiType(javaClass<T>()), name, init, useAsContext)
} }
public fun DependencyInjectorGenerator.publicField( inline public fun <reified T> DependencyInjectorGenerator.publicField(
fieldType: Class<*>, name: String = defaultName(javaClass<T>()),
name: String = defaultName(fieldType),
init: Expression? = null, init: Expression? = null,
useAsContext: Boolean = false useAsContext: Boolean = false
) { ) {
addField(true, DiType(fieldType), name, init, useAsContext) addField(true, DiType(javaClass<T>()), name, init, useAsContext)
} }
public fun DependencyInjectorGenerator.fields(vararg types: Class<*>): Unit = types.forEach { field(it) } inline public fun <reified T> DependencyInjectorGenerator.parameter(
public fun DependencyInjectorGenerator.publicFields(vararg types: Class<*>): Unit = types.forEach { publicField(it) } name: String = defaultName(javaClass<T>()),
public fun DependencyInjectorGenerator.parameter(
parameterType: Class<*>,
name: String = defaultName(parameterType),
useAsContext: Boolean = false useAsContext: Boolean = false
) { ) {
addParameter(false, DiType(parameterType), name, true, useAsContext) addParameter(false, DiType(javaClass<T>()), name, true, useAsContext)
} }
public fun DependencyInjectorGenerator.publicParameter( inline public fun <reified T> DependencyInjectorGenerator.publicParameter(
parameterType: Class<*>, name: String = defaultName(javaClass<T>()),
name: String = defaultName(parameterType),
useAsContext: Boolean = false useAsContext: Boolean = false
) { ) {
addParameter(true, DiType(parameterType), name, true, useAsContext) addParameter(true, DiType(javaClass<T>()), name, true, useAsContext)
} }
public fun DependencyInjectorGenerator.parameters(vararg types: Class<*>): Unit = types.forEach { parameter(it) } public fun defaultName(entityType: Class<*>): String = InjectorGeneratorUtil.`var`(DiType(entityType))
public fun DependencyInjectorGenerator.publicParameters(vararg types: Class<*>): Unit = types.forEach { publicParameter(it) }
private fun defaultName(entityType: Class<*>) = InjectorGeneratorUtil.`var`(DiType(entityType))