Generate Injectors: rewrite facade to Kotlin
This commit is contained in:
@@ -1,244 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2013 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.jet.generators.injectors;
|
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project;
|
|
||||||
import org.jetbrains.jet.context.GlobalContext;
|
|
||||||
import org.jetbrains.jet.context.GlobalContextImpl;
|
|
||||||
import org.jetbrains.jet.di.DependencyInjectorGenerator;
|
|
||||||
import org.jetbrains.jet.di.GivenExpression;
|
|
||||||
import org.jetbrains.jet.di.InjectorForTopDownAnalyzer;
|
|
||||||
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
|
|
||||||
import org.jetbrains.jet.lang.resolve.*;
|
|
||||||
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
|
||||||
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
|
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl;
|
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
|
||||||
import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap;
|
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.*;
|
|
||||||
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
|
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
|
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFactory;
|
|
||||||
import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolverDummyImpl;
|
|
||||||
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
|
|
||||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
|
||||||
import org.jetbrains.jet.storage.StorageManager;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
// NOTE: After making changes, you need to re-generate the injectors.
|
|
||||||
// To do that, you can run main in this class.
|
|
||||||
public class GenerateInjectors {
|
|
||||||
|
|
||||||
private GenerateInjectors() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Throwable {
|
|
||||||
for (DependencyInjectorGenerator generator : createGenerators()) {
|
|
||||||
try {
|
|
||||||
generator.generate();
|
|
||||||
}
|
|
||||||
catch (Throwable e) {
|
|
||||||
System.err.println(generator.getOutputFile());
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<DependencyInjectorGenerator> createGenerators() throws IOException {
|
|
||||||
return Arrays.asList(
|
|
||||||
generateInjectorForTopDownAnalyzerBasic(),
|
|
||||||
generateInjectorForTopDownAnalyzerForJvm(),
|
|
||||||
generateInjectorForJavaDescriptorResolver(),
|
|
||||||
generateInjectorForTopDownAnalyzerForJs(),
|
|
||||||
generateMacroInjector(),
|
|
||||||
generateTestInjector(),
|
|
||||||
generateInjectorForLazyResolve(),
|
|
||||||
generateInjectorForBodyResolve()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DependencyInjectorGenerator generateInjectorForLazyResolve() throws IOException {
|
|
||||||
DependencyInjectorGenerator generator = new DependencyInjectorGenerator();
|
|
||||||
|
|
||||||
generator.addParameter(Project.class);
|
|
||||||
generator.addParameter(GlobalContextImpl.class);
|
|
||||||
generator.addParameter(ModuleDescriptorImpl.class);
|
|
||||||
generator.addParameter(DeclarationProviderFactory.class);
|
|
||||||
generator.addParameter(BindingTrace.class);
|
|
||||||
|
|
||||||
generator.addPublicField(ResolveSession.class);
|
|
||||||
|
|
||||||
generator.addField(CallResolverExtensionProvider.class);
|
|
||||||
generator.addField(false, StorageManager.class, null, new GivenExpression("resolveSession.getStorageManager()"));
|
|
||||||
generator.addField(false, PlatformToKotlinClassMap.class, null, new GivenExpression("moduleDescriptor.getPlatformToKotlinClassMap()"));
|
|
||||||
|
|
||||||
generator.configure("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyResolve", GenerateInjectors.class);
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DependencyInjectorGenerator generateInjectorForTopDownAnalyzerBasic() throws IOException {
|
|
||||||
DependencyInjectorGenerator generator = new DependencyInjectorGenerator();
|
|
||||||
generateInjectorForTopDownAnalyzerCommon(generator);
|
|
||||||
generator.addField(DependencyClassByQualifiedNameResolverDummyImpl.class);
|
|
||||||
generator.addField(MutablePackageFragmentProvider.class);
|
|
||||||
generator.addParameter(PlatformToKotlinClassMap.class);
|
|
||||||
generator.configure("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerBasic", GenerateInjectors.class);
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DependencyInjectorGenerator generateInjectorForTopDownAnalyzerForJs() throws IOException {
|
|
||||||
DependencyInjectorGenerator generator = new DependencyInjectorGenerator();
|
|
||||||
generateInjectorForTopDownAnalyzerCommon(generator);
|
|
||||||
generator.addField(DependencyClassByQualifiedNameResolverDummyImpl.class);
|
|
||||||
generator.addField(MutablePackageFragmentProvider.class);
|
|
||||||
generator.addField(false, PlatformToKotlinClassMap.class, null, new GivenExpression("org.jetbrains.jet.lang.PlatformToKotlinClassMap.EMPTY"));
|
|
||||||
generator.configure("js/js.translator/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJs", GenerateInjectors.class);
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DependencyInjectorGenerator generateInjectorForTopDownAnalyzerForJvm() throws IOException {
|
|
||||||
DependencyInjectorGenerator generator = new DependencyInjectorGenerator();
|
|
||||||
generator.implementInterface(InjectorForTopDownAnalyzer.class);
|
|
||||||
generateInjectorForTopDownAnalyzerCommon(generator);
|
|
||||||
generator.addPublicField(JavaDescriptorResolver.class);
|
|
||||||
generator.addField(false, JavaToKotlinClassMap.class, null,
|
|
||||||
new GivenExpression("org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap.getInstance()"));
|
|
||||||
generator.addField(JavaClassFinderImpl.class);
|
|
||||||
generator.addField(TraceBasedExternalSignatureResolver.class);
|
|
||||||
generator.addField(TraceBasedJavaResolverCache.class);
|
|
||||||
generator.addField(TraceBasedErrorReporter.class);
|
|
||||||
generator.addField(PsiBasedMethodSignatureChecker.class);
|
|
||||||
generator.addField(PsiBasedExternalAnnotationResolver.class);
|
|
||||||
generator.addField(MutablePackageFragmentProvider.class);
|
|
||||||
generator.addField(false, VirtualFileFinder.class, "virtualFileFinder",
|
|
||||||
new GivenExpression(
|
|
||||||
VirtualFileFinder.class.getName() + ".SERVICE.getInstance(project)"));
|
|
||||||
generator.configure("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJvm",
|
|
||||||
GenerateInjectors.class);
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DependencyInjectorGenerator generateInjectorForJavaDescriptorResolver() throws IOException {
|
|
||||||
DependencyInjectorGenerator generator = new DependencyInjectorGenerator();
|
|
||||||
|
|
||||||
// Parameters
|
|
||||||
generator.addParameter(Project.class);
|
|
||||||
generator.addParameter(BindingTrace.class);
|
|
||||||
|
|
||||||
// Fields
|
|
||||||
generator.addField(true, GlobalContextImpl.class, null, new GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()"));
|
|
||||||
generator.addField(false, StorageManager.class, null, new GivenExpression("globalContext.getStorageManager()"));
|
|
||||||
generator.addPublicField(JavaClassFinderImpl.class);
|
|
||||||
generator.addField(TraceBasedExternalSignatureResolver.class);
|
|
||||||
generator.addField(TraceBasedJavaResolverCache.class);
|
|
||||||
generator.addField(TraceBasedErrorReporter.class);
|
|
||||||
generator.addField(PsiBasedMethodSignatureChecker.class);
|
|
||||||
generator.addField(PsiBasedExternalAnnotationResolver.class);
|
|
||||||
generator.addPublicField(JavaDescriptorResolver.class);
|
|
||||||
generator.addField(false, VirtualFileFinder.class, "virtualFileFinder",
|
|
||||||
new GivenExpression(VirtualFileFinder.class.getName() + ".SERVICE.getInstance(project)"));
|
|
||||||
generator.addField(true, ModuleDescriptorImpl.class, "module",
|
|
||||||
new GivenExpression("org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM.createJavaModule(\"<fake-jdr-module>\")"));
|
|
||||||
|
|
||||||
generator.configure("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForJavaDescriptorResolver",
|
|
||||||
GenerateInjectors.class);
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DependencyInjectorGenerator generateInjectorForTopDownAnalyzerCommon(DependencyInjectorGenerator generator) {
|
|
||||||
// Fields
|
|
||||||
generator.addPublicField(TopDownAnalyzer.class);
|
|
||||||
generator.addPublicField(TopDownAnalysisContext.class);
|
|
||||||
generator.addPublicField(BodyResolver.class);
|
|
||||||
generator.addPublicField(ControlFlowAnalyzer.class);
|
|
||||||
generator.addPublicField(DeclarationsChecker.class);
|
|
||||||
generator.addPublicField(DescriptorResolver.class);
|
|
||||||
generator.addField(false, StorageManager.class, null, new GivenExpression("topDownAnalysisParameters.getStorageManager()"));
|
|
||||||
generator.addField(CallResolverExtensionProvider.class);
|
|
||||||
|
|
||||||
// Parameters
|
|
||||||
generator.addPublicParameter(Project.class);
|
|
||||||
generator.addParameter(TopDownAnalysisParameters.class);
|
|
||||||
generator.addPublicParameter(BindingTrace.class);
|
|
||||||
generator.addPublicParameter(ModuleDescriptorImpl.class);
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DependencyInjectorGenerator generateMacroInjector() throws IOException {
|
|
||||||
DependencyInjectorGenerator generator = new DependencyInjectorGenerator();
|
|
||||||
|
|
||||||
// Fields
|
|
||||||
generator.addPublicField(ExpressionTypingServices.class);
|
|
||||||
generator.addField(CallResolverExtensionProvider.class);
|
|
||||||
generator.addField(false, GlobalContext.class, null, new GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()"));
|
|
||||||
generator.addField(false, StorageManager.class, null, new GivenExpression("globalContext.getStorageManager()"));
|
|
||||||
generator.addField(false, PlatformToKotlinClassMap.class, null, new GivenExpression("moduleDescriptor.getPlatformToKotlinClassMap()"));
|
|
||||||
|
|
||||||
// Parameters
|
|
||||||
generator.addPublicParameter(Project.class);
|
|
||||||
generator.addParameter(ModuleDescriptor.class);
|
|
||||||
|
|
||||||
generator.configure("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForMacros", GenerateInjectors.class);
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DependencyInjectorGenerator generateTestInjector() throws IOException {
|
|
||||||
DependencyInjectorGenerator generator = new DependencyInjectorGenerator();
|
|
||||||
|
|
||||||
// Fields
|
|
||||||
generator.addPublicField(DescriptorResolver.class);
|
|
||||||
generator.addPublicField(ExpressionTypingServices.class);
|
|
||||||
generator.addPublicField(TypeResolver.class);
|
|
||||||
generator.addPublicField(CallResolver.class);
|
|
||||||
generator.addField(CallResolverExtensionProvider.class);
|
|
||||||
generator.addField(false, StorageManager.class, null, new GivenExpression("globalContext.getStorageManager()"));
|
|
||||||
generator.addField(true, KotlinBuiltIns.class, null, new GivenExpression("KotlinBuiltIns.getInstance()"));
|
|
||||||
generator.addField(false, PlatformToKotlinClassMap.class, null, new GivenExpression("moduleDescriptor.getPlatformToKotlinClassMap()"));
|
|
||||||
generator.addField(false, GlobalContext.class, null, new GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()"));
|
|
||||||
|
|
||||||
// Parameters
|
|
||||||
generator.addPublicParameter(Project.class);
|
|
||||||
generator.addParameter(ModuleDescriptor.class);
|
|
||||||
|
|
||||||
generator.configure("compiler/tests", "org.jetbrains.jet.di", "InjectorForTests", GenerateInjectors.class);
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DependencyInjectorGenerator generateInjectorForBodyResolve() throws IOException {
|
|
||||||
DependencyInjectorGenerator generator = new DependencyInjectorGenerator();
|
|
||||||
// Fields
|
|
||||||
generator.addPublicField(BodyResolver.class);
|
|
||||||
generator.addField(CallResolverExtensionProvider.class);
|
|
||||||
generator.addField(false, PlatformToKotlinClassMap.class, null, new GivenExpression("moduleDescriptor.getPlatformToKotlinClassMap()"));
|
|
||||||
generator.addField(FunctionAnalyzerExtension.class);
|
|
||||||
generator.addField(false, StorageManager.class, null, new GivenExpression("topDownAnalysisParameters.getStorageManager()"));
|
|
||||||
|
|
||||||
// Parameters
|
|
||||||
generator.addPublicParameter(Project.class);
|
|
||||||
generator.addParameter(TopDownAnalysisParameters.class);
|
|
||||||
generator.addPublicParameter(BindingTrace.class);
|
|
||||||
generator.addPublicParameter(BodiesResolveContext.class);
|
|
||||||
generator.addParameter(ModuleDescriptor.class);
|
|
||||||
generator.configure("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForBodyResolve", GenerateInjectors.class);
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,219 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.generators.injectors
|
||||||
|
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import org.jetbrains.jet.context.GlobalContext
|
||||||
|
import org.jetbrains.jet.context.GlobalContextImpl
|
||||||
|
import org.jetbrains.jet.lang.PlatformToKotlinClassMap
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl
|
||||||
|
import org.jetbrains.jet.lang.resolve.*
|
||||||
|
import org.jetbrains.jet.lang.resolve.calls.CallResolver
|
||||||
|
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.resolver.*
|
||||||
|
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder
|
||||||
|
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession
|
||||||
|
import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFactory
|
||||||
|
import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolverDummyImpl
|
||||||
|
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices
|
||||||
|
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
|
||||||
|
import org.jetbrains.jet.storage.StorageManager
|
||||||
|
import org.jetbrains.jet.di.*
|
||||||
|
import kotlin.properties.Delegates
|
||||||
|
|
||||||
|
// NOTE: After making changes, you need to re-generate the injectors.
|
||||||
|
// To do that, you can run main in this file.
|
||||||
|
public fun main(args: Array<String>) {
|
||||||
|
for (generator in injectorGenerators) {
|
||||||
|
try {
|
||||||
|
generator.generate()
|
||||||
|
}
|
||||||
|
catch (e: Throwable) {
|
||||||
|
System.err.println(generator.getOutputFile())
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public val injectorGenerators: List<DependencyInjectorGenerator> by Delegates.lazy {
|
||||||
|
GenerateInjectors().generators
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GenerateInjectors {
|
||||||
|
|
||||||
|
private fun DependencyInjectorGenerator.commonForTopDownAnalyzer() {
|
||||||
|
publicFields(
|
||||||
|
javaClass<TopDownAnalyzer>(),
|
||||||
|
javaClass<TopDownAnalysisContext>(),
|
||||||
|
javaClass<BodyResolver>(),
|
||||||
|
javaClass<ControlFlowAnalyzer>(),
|
||||||
|
javaClass<DeclarationsChecker>(),
|
||||||
|
javaClass<DescriptorResolver>()
|
||||||
|
)
|
||||||
|
field(javaClass<StorageManager>(), init = GivenExpression("topDownAnalysisParameters.getStorageManager()"))
|
||||||
|
field(javaClass<CallResolverExtensionProvider>())
|
||||||
|
|
||||||
|
publicParameter(javaClass<Project>())
|
||||||
|
parameter(javaClass<TopDownAnalysisParameters>())
|
||||||
|
publicParameters(
|
||||||
|
javaClass<BindingTrace>(),
|
||||||
|
javaClass<ModuleDescriptorImpl>()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val generatorForTopDownAnalyzerBasic =
|
||||||
|
generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerBasic", javaClass<GenerateInjectors>()) {
|
||||||
|
commonForTopDownAnalyzer()
|
||||||
|
fields(
|
||||||
|
javaClass<DependencyClassByQualifiedNameResolverDummyImpl>(),
|
||||||
|
javaClass<MutablePackageFragmentProvider>()
|
||||||
|
)
|
||||||
|
parameter(javaClass<PlatformToKotlinClassMap>())
|
||||||
|
}
|
||||||
|
|
||||||
|
private val generatorForTopDownAnalyzerForJs =
|
||||||
|
generator("js/js.translator/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJs", javaClass<GenerateInjectors>()) {
|
||||||
|
commonForTopDownAnalyzer()
|
||||||
|
fields(
|
||||||
|
javaClass<DependencyClassByQualifiedNameResolverDummyImpl>(),
|
||||||
|
javaClass<MutablePackageFragmentProvider>()
|
||||||
|
)
|
||||||
|
field(javaClass<PlatformToKotlinClassMap>(), init = GivenExpression("org.jetbrains.jet.lang.PlatformToKotlinClassMap.EMPTY"))
|
||||||
|
}
|
||||||
|
|
||||||
|
private val generatorForTopDownAnalyzerForJvm =
|
||||||
|
generator("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJvm", javaClass<GenerateInjectors>()) {
|
||||||
|
implementInterface(javaClass<InjectorForTopDownAnalyzer>())
|
||||||
|
commonForTopDownAnalyzer()
|
||||||
|
publicField(javaClass<JavaDescriptorResolver>())
|
||||||
|
field(javaClass<JavaToKotlinClassMap>(), init = GivenExpression("org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap.getInstance()"))
|
||||||
|
fields(
|
||||||
|
javaClass<JavaClassFinderImpl>(),
|
||||||
|
javaClass<TraceBasedExternalSignatureResolver>(),
|
||||||
|
javaClass<TraceBasedJavaResolverCache>(),
|
||||||
|
javaClass<TraceBasedErrorReporter>(),
|
||||||
|
javaClass<PsiBasedMethodSignatureChecker>(),
|
||||||
|
javaClass<PsiBasedExternalAnnotationResolver>(),
|
||||||
|
javaClass<MutablePackageFragmentProvider>()
|
||||||
|
)
|
||||||
|
field(javaClass<VirtualFileFinder>(), init = GivenExpression(javaClass<VirtualFileFinder>().getName() + ".SERVICE.getInstance(project)"))
|
||||||
|
}
|
||||||
|
|
||||||
|
private val generatorForJavaDescriptorResolver =
|
||||||
|
generator("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForJavaDescriptorResolver", javaClass<GenerateInjectors>()) {
|
||||||
|
|
||||||
|
parameters(
|
||||||
|
javaClass<Project>(),
|
||||||
|
javaClass<BindingTrace>()
|
||||||
|
)
|
||||||
|
|
||||||
|
publicField(javaClass<GlobalContextImpl>(),
|
||||||
|
init = GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()"))
|
||||||
|
field(javaClass<StorageManager>(), init = GivenExpression("globalContext.getStorageManager()"))
|
||||||
|
publicField(javaClass<JavaClassFinderImpl>())
|
||||||
|
fields(
|
||||||
|
javaClass<TraceBasedExternalSignatureResolver>(),
|
||||||
|
javaClass<TraceBasedJavaResolverCache>(),
|
||||||
|
javaClass<TraceBasedErrorReporter>(),
|
||||||
|
javaClass<PsiBasedMethodSignatureChecker>(),
|
||||||
|
javaClass<PsiBasedExternalAnnotationResolver>()
|
||||||
|
)
|
||||||
|
publicField(javaClass<JavaDescriptorResolver>())
|
||||||
|
field(javaClass<VirtualFileFinder>(),
|
||||||
|
init = GivenExpression(javaClass<VirtualFileFinder>().getName() + ".SERVICE.getInstance(project)"))
|
||||||
|
publicField(javaClass<ModuleDescriptorImpl>(), name = "module",
|
||||||
|
init = GivenExpression("org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM.createJavaModule(\"<fake-jdr-module>\")"))
|
||||||
|
}
|
||||||
|
|
||||||
|
private val generatorForMacro =
|
||||||
|
generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForMacros", javaClass<GenerateInjectors>()) {
|
||||||
|
publicField(javaClass<ExpressionTypingServices>())
|
||||||
|
field(javaClass<CallResolverExtensionProvider>())
|
||||||
|
field(javaClass<GlobalContext>(), init = GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()"))
|
||||||
|
field(javaClass<StorageManager>(), init = GivenExpression("globalContext.getStorageManager()"))
|
||||||
|
field(javaClass<PlatformToKotlinClassMap>(), init = GivenExpression("moduleDescriptor.getPlatformToKotlinClassMap()"))
|
||||||
|
|
||||||
|
publicParameter(javaClass<Project>())
|
||||||
|
parameter(javaClass<ModuleDescriptor>())
|
||||||
|
}
|
||||||
|
|
||||||
|
private val generatorForTests =
|
||||||
|
generator("compiler/tests", "org.jetbrains.jet.di", "InjectorForTests", javaClass<GenerateInjectors>()) {
|
||||||
|
publicFields(
|
||||||
|
javaClass<DescriptorResolver>(),
|
||||||
|
javaClass<ExpressionTypingServices>(),
|
||||||
|
javaClass<TypeResolver>(),
|
||||||
|
javaClass<CallResolver>()
|
||||||
|
)
|
||||||
|
field(javaClass<CallResolverExtensionProvider>())
|
||||||
|
field(javaClass<StorageManager>(), init = GivenExpression("globalContext.getStorageManager()"))
|
||||||
|
publicField(javaClass<KotlinBuiltIns>(), init = GivenExpression("KotlinBuiltIns.getInstance()"))
|
||||||
|
field(javaClass<PlatformToKotlinClassMap>(), init = GivenExpression("moduleDescriptor.getPlatformToKotlinClassMap()"))
|
||||||
|
field(javaClass<GlobalContext>(), init = GivenExpression("org.jetbrains.jet.context.ContextPackage.GlobalContext()"))
|
||||||
|
|
||||||
|
publicParameter(javaClass<Project>())
|
||||||
|
parameter(javaClass<ModuleDescriptor>())
|
||||||
|
}
|
||||||
|
|
||||||
|
private val generatorForBodyResolve =
|
||||||
|
generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForBodyResolve", javaClass<GenerateInjectors>()) {
|
||||||
|
publicField(javaClass<BodyResolver>())
|
||||||
|
field(javaClass<CallResolverExtensionProvider>())
|
||||||
|
field(javaClass<PlatformToKotlinClassMap>(), init = GivenExpression("moduleDescriptor.getPlatformToKotlinClassMap()"))
|
||||||
|
field(javaClass<FunctionAnalyzerExtension>())
|
||||||
|
field(javaClass<StorageManager>(), init = GivenExpression("topDownAnalysisParameters.getStorageManager()"))
|
||||||
|
|
||||||
|
publicParameter(javaClass<Project>())
|
||||||
|
parameter(javaClass<TopDownAnalysisParameters>())
|
||||||
|
publicParameters(
|
||||||
|
javaClass<BindingTrace>(),
|
||||||
|
javaClass<BodiesResolveContext>()
|
||||||
|
)
|
||||||
|
parameter(javaClass<ModuleDescriptor>())
|
||||||
|
}
|
||||||
|
|
||||||
|
private val generatorForLazyResolve =
|
||||||
|
generator("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyResolve", javaClass<GenerateInjectors>()) {
|
||||||
|
parameters(
|
||||||
|
javaClass<Project>(),
|
||||||
|
javaClass<GlobalContextImpl>(),
|
||||||
|
javaClass<ModuleDescriptorImpl>(),
|
||||||
|
javaClass<DeclarationProviderFactory>(),
|
||||||
|
javaClass<BindingTrace>()
|
||||||
|
)
|
||||||
|
|
||||||
|
publicField(javaClass<ResolveSession>())
|
||||||
|
field(javaClass<CallResolverExtensionProvider>())
|
||||||
|
field(javaClass<StorageManager>(), init = GivenExpression("resolveSession.getStorageManager()"))
|
||||||
|
field(javaClass<PlatformToKotlinClassMap>(), init = GivenExpression("moduleDescriptor.getPlatformToKotlinClassMap()"))
|
||||||
|
}
|
||||||
|
|
||||||
|
val generators = listOf(
|
||||||
|
generatorForTopDownAnalyzerBasic,
|
||||||
|
generatorForTopDownAnalyzerForJvm,
|
||||||
|
generatorForJavaDescriptorResolver,
|
||||||
|
generatorForTopDownAnalyzerForJs,
|
||||||
|
generatorForMacro,
|
||||||
|
generatorForTests,
|
||||||
|
generatorForLazyResolve,
|
||||||
|
generatorForBodyResolve
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -30,7 +30,7 @@ public class GenerateInjectorsTest extends TestCase {
|
|||||||
|
|
||||||
public static TestSuite suite() throws IOException {
|
public static TestSuite suite() throws IOException {
|
||||||
TestSuite suite = new TestSuite();
|
TestSuite suite = new TestSuite();
|
||||||
for (DependencyInjectorGenerator generator : GenerateInjectors.createGenerators()) {
|
for (DependencyInjectorGenerator generator : InjectorsPackage.getInjectorGenerators()) {
|
||||||
suite.addTest(new GenerateInjectorsTest(generator));
|
suite.addTest(new GenerateInjectorsTest(generator));
|
||||||
}
|
}
|
||||||
return suite;
|
return suite;
|
||||||
|
|||||||
@@ -154,37 +154,6 @@ public class DependencyInjectorGenerator {
|
|||||||
implementsList.add(superInterface);
|
implementsList.add(superInterface);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addPublicParameter(Class<?> type) {
|
|
||||||
addPublicParameter(new DiType(type));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addPublicParameter(DiType type) {
|
|
||||||
addPublicParameter(type, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addPublicParameter(DiType type, boolean required) {
|
|
||||||
addParameter(true, type, var(type), required);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void addParameter(Class<?> type) {
|
|
||||||
addParameter(DiType.fromReflectionType(type));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addParameter(DiType type) {
|
|
||||||
addParameter(type, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addParameter(Class<?> type, boolean required) {
|
|
||||||
addParameter(new DiType(type), required);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addParameter(DiType type, boolean required) {
|
|
||||||
addParameter(false, type, var(type), required);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void addParameter(boolean reexport, @NotNull DiType type, @Nullable String name, boolean required) {
|
public void addParameter(boolean reexport, @NotNull DiType type, @Nullable String name, boolean required) {
|
||||||
Field field = addField(reexport, type, name, null);
|
Field field = addField(reexport, type, name, null);
|
||||||
Parameter parameter = new Parameter(type, name, field, required);
|
Parameter parameter = new Parameter(type, name, field, required);
|
||||||
@@ -194,31 +163,6 @@ public class DependencyInjectorGenerator {
|
|||||||
dependencies.addSatisfiedField(field);
|
dependencies.addSatisfiedField(field);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Field addPublicField(Class<?> type) {
|
|
||||||
return addPublicField(new DiType(type));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Field addPublicField(DiType type) {
|
|
||||||
return addField(true, type, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Field addField(Class<?> type) {
|
|
||||||
return addField(new DiType(type));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Field addField(DiType type) {
|
|
||||||
return addField(false, type, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Field addField(Enum<?> enu) {
|
|
||||||
Class<? extends Enum> clazz = enu.getClass();
|
|
||||||
return addField(false, clazz, null, new GivenExpression(clazz.getSimpleName() + "." + enu.name()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Field addField(boolean isPublic, Class<?> type, @Nullable String name, @Nullable Expression init) {
|
|
||||||
return addField(isPublic, new DiType(type), name, init);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Field addField(boolean isPublic, DiType type, @Nullable String name, @Nullable Expression init) {
|
public Field addField(boolean isPublic, DiType type, @Nullable String name, @Nullable Expression init) {
|
||||||
Field field = Field.create(isPublic, type, name == null ? var(type) : name, init);
|
Field field = Field.create(isPublic, type, name == null ? var(type) : name, init);
|
||||||
fields.add(field);
|
fields.add(field);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
interface Expression {
|
public interface Expression {
|
||||||
@NotNull
|
@NotNull
|
||||||
String renderAsCode();
|
String renderAsCode();
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.di
|
||||||
|
|
||||||
|
public fun generator(
|
||||||
|
targetSourceRoot: String,
|
||||||
|
injectorPackageName: String,
|
||||||
|
injectorClassName: String,
|
||||||
|
generatorClass: Class<*>,
|
||||||
|
body: DependencyInjectorGenerator.() -> Unit
|
||||||
|
): DependencyInjectorGenerator {
|
||||||
|
val generator = DependencyInjectorGenerator()
|
||||||
|
generator.configure(targetSourceRoot, injectorPackageName, injectorClassName, generatorClass)
|
||||||
|
generator.body()
|
||||||
|
return generator
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun DependencyInjectorGenerator.field(
|
||||||
|
fieldType: Class<*>,
|
||||||
|
name: String = defaultName(fieldType),
|
||||||
|
init: Expression? = null
|
||||||
|
) {
|
||||||
|
addField(false, DiType(fieldType), name, init)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun DependencyInjectorGenerator.publicField(
|
||||||
|
fieldType: Class<*>,
|
||||||
|
name: String = defaultName(fieldType),
|
||||||
|
init: Expression? = null
|
||||||
|
) {
|
||||||
|
addField(true, DiType(fieldType), name, init)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun DependencyInjectorGenerator.fields(vararg types: Class<*>): Unit = types.forEach { field(it) }
|
||||||
|
public fun DependencyInjectorGenerator.publicFields(vararg types: Class<*>): Unit = types.forEach { publicField(it) }
|
||||||
|
|
||||||
|
public fun DependencyInjectorGenerator.parameter(
|
||||||
|
parameterType: Class<*>,
|
||||||
|
name: String = defaultName(parameterType)
|
||||||
|
) {
|
||||||
|
addParameter(false, DiType(parameterType), name, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun DependencyInjectorGenerator.publicParameter(
|
||||||
|
parameterType: Class<*>,
|
||||||
|
name: String = defaultName(parameterType)
|
||||||
|
) {
|
||||||
|
addParameter(true, DiType(parameterType), name, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun DependencyInjectorGenerator.parameters(vararg types: Class<*>): Unit = types.forEach { parameter(it) }
|
||||||
|
public fun DependencyInjectorGenerator.publicParameters(vararg types: Class<*>): Unit = types.forEach { publicParameter(it) }
|
||||||
|
|
||||||
|
private fun defaultName(entityType: Class<*>) = InjectorGeneratorUtil.`var`(DiType(entityType))
|
||||||
@@ -53,6 +53,7 @@ public class InjectorGeneratorUtil {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
public static String var(@NotNull DiType type) {
|
public static String var(@NotNull DiType type) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append(StringUtil.decapitalize(type.getClazz().getSimpleName().replaceFirst("(?<=.)Impl$", "")));
|
sb.append(StringUtil.decapitalize(type.getClazz().getSimpleName().replaceFirst("(?<=.)Impl$", "")));
|
||||||
|
|||||||
Reference in New Issue
Block a user