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