LTDA: Assert context was created for light class generation

This commit is contained in:
Nikolay Krasko
2014-09-27 17:06:25 +04:00
parent 571f3c8524
commit a42edb9c8f
15 changed files with 50 additions and 30 deletions
@@ -18,7 +18,6 @@ package org.jetbrains.jet.cli.jvm.compiler;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.Collections2; import com.google.common.collect.Collections2;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClass;
@@ -30,6 +29,7 @@ import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import org.jetbrains.jet.asJava.KotlinLightClassForExplicitDeclaration; import org.jetbrains.jet.asJava.KotlinLightClassForExplicitDeclaration;
import org.jetbrains.jet.asJava.LightClassConstructionContext; import org.jetbrains.jet.asJava.LightClassConstructionContext;
import org.jetbrains.jet.asJava.LightClassGenerationSupport; import org.jetbrains.jet.asJava.LightClassGenerationSupport;
@@ -79,12 +79,11 @@ public class CliLightClassGenerationSupport extends LightClassGenerationSupport
this.bindingContext = trace.getBindingContext(); this.bindingContext = trace.getBindingContext();
this.module = module; this.module = module;
if (trace instanceof CliBindingTrace) { if (!(trace instanceof CliBindingTrace)) {
((CliBindingTrace) trace).setKotlinCodeAnalyzer(analyzer); throw new IllegalArgumentException("Shared trace is expected to be subclass of " + CliBindingTrace.class.getSimpleName() + " class");
}
else {
assert ApplicationManager.getApplication().isUnitTestMode();
} }
((CliBindingTrace) trace).setKotlinCodeAnalyzer(analyzer);
} }
@NotNull @NotNull
@@ -217,13 +216,13 @@ public class CliLightClassGenerationSupport extends LightClassGenerationSupport
return KotlinLightClassForExplicitDeclaration.create(classOrObject.getManager(), classOrObject); return KotlinLightClassForExplicitDeclaration.create(classOrObject.getManager(), classOrObject);
} }
public static BindingTrace createTrace() { @NotNull
return new CliBindingTrace(); @Override
public BindingTraceContext createTrace() {
return new NoScopeRecordCliBindingTrace();
} }
public static class CliBindingTrace extends BindingTraceContext { public static class NoScopeRecordCliBindingTrace extends CliBindingTrace {
private KotlinCodeAnalyzer kotlinCodeAnalyzer;
@Override @Override
public <K, V> void record(WritableSlice<K, V> slice, K key, V value) { public <K, V> void record(WritableSlice<K, V> slice, K key, V value) {
if (slice == BindingContext.RESOLUTION_SCOPE || slice == BindingContext.TYPE_RESOLUTION_SCOPE) { if (slice == BindingContext.RESOLUTION_SCOPE || slice == BindingContext.TYPE_RESOLUTION_SCOPE) {
@@ -233,6 +232,19 @@ public class CliLightClassGenerationSupport extends LightClassGenerationSupport
super.record(slice, key, value); super.record(slice, key, value);
} }
@Override
public String toString() {
return NoScopeRecordCliBindingTrace.class.getName();
}
}
public static class CliBindingTrace extends BindingTraceContext {
private KotlinCodeAnalyzer kotlinCodeAnalyzer;
@TestOnly
public CliBindingTrace() {
}
@Override @Override
public String toString() { public String toString() {
return CliBindingTrace.class.getName(); return CliBindingTrace.class.getName();
@@ -291,7 +291,7 @@ public class KotlinToJVMBytecodeCompiler {
@NotNull @NotNull
@Override @Override
public AnalysisResult invoke() { public AnalysisResult invoke() {
BindingTrace sharedTrace = CliLightClassGenerationSupport.createTrace(); BindingTrace sharedTrace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace();
ModuleDescriptorImpl analyzeModule = TopDownAnalyzerFacadeForJVM.createAnalyzeModule(); ModuleDescriptorImpl analyzeModule = TopDownAnalyzerFacadeForJVM.createAnalyzeModule();
return TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( return TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
@@ -37,6 +37,7 @@ import org.jetbrains.jet.cli.common.messages.AnalyzerWithCompilerReport;
import org.jetbrains.jet.cli.common.messages.MessageCollector; import org.jetbrains.jet.cli.common.messages.MessageCollector;
import org.jetbrains.jet.cli.common.messages.MessageCollectorToString; import org.jetbrains.jet.cli.common.messages.MessageCollectorToString;
import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys; import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys;
import org.jetbrains.jet.cli.jvm.compiler.CliLightClassGenerationSupport;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.ClassBuilderFactories; import org.jetbrains.jet.codegen.ClassBuilderFactories;
import org.jetbrains.jet.codegen.CompilationErrorHandler; import org.jetbrains.jet.codegen.CompilationErrorHandler;
@@ -102,7 +103,7 @@ public class ReplInterpreter {
JetCoreEnvironment environment = JetCoreEnvironment.createForProduction(disposable, configuration); JetCoreEnvironment environment = JetCoreEnvironment.createForProduction(disposable, configuration);
Project project = environment.getProject(); Project project = environment.getProject();
this.psiFileFactory = (PsiFileFactoryImpl) PsiFileFactory.getInstance(project); this.psiFileFactory = (PsiFileFactoryImpl) PsiFileFactory.getInstance(project);
this.trace = new BindingTraceContext(); this.trace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace();
this.module = TopDownAnalyzerFacadeForJVM.createJavaModule("<repl>"); this.module = TopDownAnalyzerFacadeForJVM.createJavaModule("<repl>");
GlobalContextImpl context = ContextPackage.GlobalContext(); GlobalContextImpl context = ContextPackage.GlobalContext();
@@ -33,6 +33,7 @@ import org.jetbrains.jet.lang.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.jet.analyzer.ModuleInfo import org.jetbrains.jet.analyzer.ModuleInfo
import org.jetbrains.jet.analyzer.ModuleContent import org.jetbrains.jet.analyzer.ModuleContent
import org.jetbrains.jet.di.InjectorForLazyResolveWithJava import org.jetbrains.jet.di.InjectorForLazyResolveWithJava
import org.jetbrains.jet.lang.resolve.CodeAnalyzerInitializer
public class JvmResolverForModule( public class JvmResolverForModule(
override val lazyResolveSession: ResolveSession, override val lazyResolveSession: ResolveSession,
@@ -63,7 +64,9 @@ public object JvmAnalyzerFacade : AnalyzerFacade<JvmResolverForModule, JvmPlatfo
resolverForProject.resolverForModule(moduleInfo as M).javaDescriptorResolver resolverForProject.resolverForModule(moduleInfo as M).javaDescriptorResolver
} }
val injector = InjectorForLazyResolveWithJava( val injector = InjectorForLazyResolveWithJava(
project, globalContext, moduleDescriptor, moduleContentScope, BindingTraceContext(), declarationProviderFactory, moduleClassResolver project, globalContext, moduleDescriptor, moduleContentScope,
CodeAnalyzerInitializer.getInstance(project).createTrace(),
declarationProviderFactory, moduleClassResolver
) )
val resolveSession = injector.getResolveSession()!! val resolveSession = injector.getResolveSession()!!
@@ -17,14 +17,13 @@
package org.jetbrains.jet.lang.resolve package org.jetbrains.jet.lang.resolve
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer
import kotlin.platform.platformStatic
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.components.ServiceManager
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor import org.jetbrains.jet.lang.descriptors.ModuleDescriptor
import javax.annotation.PostConstruct
public trait CodeAnalyzerInitializer { public trait CodeAnalyzerInitializer {
public fun initialize(trace: BindingTrace, module: ModuleDescriptor, codeAnalyzer: KotlinCodeAnalyzer?) public fun initialize(trace: BindingTrace, module: ModuleDescriptor, codeAnalyzer: KotlinCodeAnalyzer?)
public fun createTrace(): BindingTrace
class object { class object {
public fun getInstance(project: Project): CodeAnalyzerInitializer = public fun getInstance(project: Project): CodeAnalyzerInitializer =
@@ -36,4 +35,6 @@ public class DummyCodeAnalyzerInitializer: CodeAnalyzerInitializer {
public override fun initialize(trace: BindingTrace, module: ModuleDescriptor, codeAnalyzer: KotlinCodeAnalyzer?) { public override fun initialize(trace: BindingTrace, module: ModuleDescriptor, codeAnalyzer: KotlinCodeAnalyzer?) {
// Do nothing // Do nothing
} }
public override fun createTrace(): BindingTrace = BindingTraceContext()
} }
@@ -98,7 +98,7 @@ public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest {
allJetFiles.addAll(jetFiles); allJetFiles.addAll(jetFiles);
ModuleDescriptorImpl module = modules.get(testModule); ModuleDescriptorImpl module = modules.get(testModule);
BindingTrace moduleTrace = CliLightClassGenerationSupport.createTrace(); BindingTrace moduleTrace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace();
moduleBindings.put(testModule, moduleTrace.getBindingContext()); moduleBindings.put(testModule, moduleTrace.getBindingContext());
@@ -145,7 +145,7 @@ public abstract class AbstractLoadJavaTest extends TestCaseWithTmpdir {
configuration.add(JVMConfigurationKeys.CLASSPATH_KEY, new File("compiler/tests")); // for @ExpectLoadError annotation configuration.add(JVMConfigurationKeys.CLASSPATH_KEY, new File("compiler/tests")); // for @ExpectLoadError annotation
JetCoreEnvironment environment = JetCoreEnvironment.createForTests(getTestRootDisposable(), configuration); JetCoreEnvironment environment = JetCoreEnvironment.createForTests(getTestRootDisposable(), configuration);
BindingTrace trace = CliLightClassGenerationSupport.createTrace(); BindingTrace trace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace();
ModuleDescriptorImpl module = TopDownAnalyzerFacadeForJVM.createAnalyzeModule(); ModuleDescriptorImpl module = TopDownAnalyzerFacadeForJVM.createAnalyzeModule();
TopDownAnalysisParameters parameters = TopDownAnalysisParameters.create( TopDownAnalysisParameters parameters = TopDownAnalysisParameters.create(
@@ -21,6 +21,7 @@ import com.intellij.openapi.Disposable;
import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Disposer;
import com.intellij.testFramework.UsefulTestCase; import com.intellij.testFramework.UsefulTestCase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.cli.jvm.compiler.CliLightClassGenerationSupport;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver; import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil; import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil;
@@ -69,7 +70,7 @@ public abstract class AbstractSdkAnnotationsValidityTest extends UsefulTestCase
try { try {
JetCoreEnvironment commonEnvironment = createEnvironment(parentDisposable); JetCoreEnvironment commonEnvironment = createEnvironment(parentDisposable);
BindingTrace trace = new BindingTraceContext(); BindingTrace trace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace();
InjectorForJavaDescriptorResolver injector = InjectorForJavaDescriptorResolver injector =
InjectorForJavaDescriptorResolverUtil.create(commonEnvironment.getProject(), trace, false); InjectorForJavaDescriptorResolverUtil.create(commonEnvironment.getProject(), trace, false);
@@ -41,7 +41,7 @@ import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.ModuleDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTraceContext; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.lazy.JvmResolveUtil; import org.jetbrains.jet.lang.resolve.lazy.JvmResolveUtil;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -90,7 +90,7 @@ public final class LoadDescriptorUtil {
new File("compiler/tests") // for @ExpectLoadError annotation new File("compiler/tests") // for @ExpectLoadError annotation
); );
JetCoreEnvironment jetCoreEnvironment = JetCoreEnvironment.createForTests(disposable, configuration); JetCoreEnvironment jetCoreEnvironment = JetCoreEnvironment.createForTests(disposable, configuration);
BindingTraceContext trace = new BindingTraceContext(); BindingTrace trace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace();
InjectorForJavaDescriptorResolver injector = InjectorForJavaDescriptorResolver injector =
InjectorForJavaDescriptorResolverUtil.create(jetCoreEnvironment.getProject(), trace, true); InjectorForJavaDescriptorResolverUtil.create(jetCoreEnvironment.getProject(), trace, true);
ModuleDescriptorImpl module = injector.getModule(); ModuleDescriptorImpl module = injector.getModule();
@@ -80,8 +80,7 @@ public class JvmResolveUtil {
module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()); module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule());
module.seal(); module.seal();
CliLightClassGenerationSupport lightClassGenerationSupport = CliLightClassGenerationSupport.getInstanceForCli(project); BindingTrace trace = new CliLightClassGenerationSupport.CliBindingTrace();
BindingTrace trace = lightClassGenerationSupport != null ? CliLightClassGenerationSupport.createTrace() : new BindingTraceContext();
return TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( return TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
project, files, trace, filesToAnalyzeCompletely, module, null, null); project, files, trace, filesToAnalyzeCompletely, module, null, null);
@@ -53,7 +53,7 @@ public class LazyResolveTestUtil {
globalContext.getExceptionTracker(), globalContext.getExceptionTracker(),
Predicates.<PsiFile>alwaysTrue(), Predicates.<PsiFile>alwaysTrue(),
false, false); false, false);
BindingTrace trace = CliLightClassGenerationSupport.createTrace(); BindingTrace trace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace();
ModuleDescriptorImpl sharedModule = TopDownAnalyzerFacadeForJVM.createAnalyzeModule(); ModuleDescriptorImpl sharedModule = TopDownAnalyzerFacadeForJVM.createAnalyzeModule();
TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
@@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.*; import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.cli.jvm.compiler.CliLightClassGenerationSupport;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver; import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil; import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil;
import org.jetbrains.jet.di.InjectorForTests; import org.jetbrains.jet.di.InjectorForTests;
@@ -116,7 +117,8 @@ public class JetExpectedResolveDataUtil {
@NotNull @NotNull
private static PsiClass findClass(String qualifiedName, Project project) { private static PsiClass findClass(String qualifiedName, Project project) {
InjectorForJavaDescriptorResolver injector = InjectorForJavaDescriptorResolverUtil.create(project, new BindingTraceContext(), false); BindingTraceContext trace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace();
InjectorForJavaDescriptorResolver injector = InjectorForJavaDescriptorResolverUtil.create(project, trace, false);
JavaClass javaClass = injector.getJavaClassFinder().findClass(ClassId.topLevel(new FqName(qualifiedName))); JavaClass javaClass = injector.getJavaClassFinder().findClass(ClassId.topLevel(new FqName(qualifiedName)));
Assert.assertNotNull("Class wasn't found: " + qualifiedName, javaClass); Assert.assertNotNull("Class wasn't found: " + qualifiedName, javaClass);
assertInstanceOf(javaClass, JavaClassImpl.class); assertInstanceOf(javaClass, JavaClassImpl.class);
@@ -55,7 +55,7 @@ abstract public class AbstractConstraintSystemTest() : JetLiteFixture() {
override fun setUp() { override fun setUp() {
super.setUp() super.setUp()
val injector = InjectorForTests(getProject(), JetTestUtils.createEmptyModule()!!) val injector = InjectorForTests(getProject(), JetTestUtils.createEmptyModule())
_typeResolver = injector.getTypeResolver()!! _typeResolver = injector.getTypeResolver()!!
_myDeclarations = analyzeDeclarations() _myDeclarations = analyzeDeclarations()
} }
@@ -24,6 +24,7 @@ import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetLiteFixture; import org.jetbrains.jet.JetLiteFixture;
import org.jetbrains.jet.JetTestCaseBuilder; import org.jetbrains.jet.JetTestCaseBuilder;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.cli.jvm.compiler.CliLightClassGenerationSupport;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver; import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil; import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil;
@@ -600,8 +601,8 @@ public class JetTypeCheckerTest extends JetLiteFixture {
private WritableScopeImpl addImports(JetScope scope) { private WritableScopeImpl addImports(JetScope scope) {
WritableScopeImpl writableScope = new WritableScopeImpl( WritableScopeImpl writableScope = new WritableScopeImpl(
scope, scope.getContainingDeclaration(), RedeclarationHandler.DO_NOTHING, "JetTypeCheckerTest.addImports"); scope, scope.getContainingDeclaration(), RedeclarationHandler.DO_NOTHING, "JetTypeCheckerTest.addImports");
InjectorForJavaDescriptorResolver injector = BindingTraceContext trace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace();
InjectorForJavaDescriptorResolverUtil.create(getProject(), new BindingTraceContext(), true); InjectorForJavaDescriptorResolver injector = InjectorForJavaDescriptorResolverUtil.create(getProject(), trace, true);
ModuleDescriptor module = injector.getModule(); ModuleDescriptor module = injector.getModule();
for (ImportPath defaultImport : module.getDefaultImports()) { for (ImportPath defaultImport : module.getDefaultImports()) {
writableScope.importScope(module.getPackage(defaultImport.fqnPart()).getMemberScope()); writableScope.importScope(module.getPackage(defaultImport.fqnPart()).getMemberScope());
@@ -120,7 +120,7 @@ class NoInternalVisibilityInStdLibTest {
TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
environment.getProject(), environment.getProject(),
environment.getSourceFiles(), environment.getSourceFiles(),
BindingTraceContext(), CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(),
{ true }, { true },
module, module,
null, null,