diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java index b242b1beded..daa0d730004 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java @@ -103,22 +103,23 @@ public class CliLightClassGenerationSupport extends LightClassGenerationSupport module = null; } - private LightClassConstructionContext analyzeRelevantCode() { + @NotNull + @Override + public LightClassConstructionContext getContextForPackage(@NotNull Collection files) { + return getContext(); + } + + @NotNull + @Override + public LightClassConstructionContext getContextForClassOrObject(@NotNull JetClassOrObject classOrObject) { + return getContext(); + } + + @NotNull + private LightClassConstructionContext getContext() { return new LightClassConstructionContext(getTrace().getBindingContext(), null); } - @NotNull - @Override - public LightClassConstructionContext analyzeRelevantCode(@NotNull Collection files) { - return analyzeRelevantCode(); - } - - @NotNull - @Override - public LightClassConstructionContext analyzeRelevantCode(@NotNull JetClassOrObject classOrObject) { - return analyzeRelevantCode(); - } - @NotNull @Override public Collection findClassOrObjectDeclarations(@NotNull FqName fqName, @NotNull GlobalSearchScope searchScope) { diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java index d7f6b5acfbb..bb65ff6fd75 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java @@ -70,8 +70,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider files) { - return LightClassGenerationSupport.getInstance(project).analyzeRelevantCode(files); + public LightClassConstructionContext getContext(@NotNull Collection files) { + return LightClassGenerationSupport.getInstance(project).getContextForPackage(files); } @NotNull @@ -116,8 +116,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider files) { - return LightClassGenerationSupport.getInstance(classOrObject.getProject()).analyzeRelevantCode(classOrObject); + public LightClassConstructionContext getContext(@NotNull Collection files) { + return LightClassGenerationSupport.getInstance(classOrObject.getProject()).getContextForClassOrObject(classOrObject); } @NotNull @@ -201,7 +201,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvidercreate( stubGenerationStrategy.createLightClassStubWithData(javaFileStub, bindingContext), local ? PsiModificationTracker.MODIFICATION_COUNT : PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT ); @@ -303,11 +303,11 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider files); - @NotNull - LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext); @NotNull Collection getFiles(); @NotNull FqName getPackageFqName(); + @NotNull LightClassConstructionContext getContext(@NotNull Collection files); + @NotNull LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext); + boolean generateDeclaredClasses(); void generate(@NotNull GenerationState state, @NotNull Collection files); diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassGenerationSupport.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassGenerationSupport.java index 00d0ea5cc41..c6ac2a1a231 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassGenerationSupport.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassGenerationSupport.java @@ -36,10 +36,10 @@ public abstract class LightClassGenerationSupport { } @NotNull - public abstract LightClassConstructionContext analyzeRelevantCode(@NotNull Collection files); + public abstract LightClassConstructionContext getContextForPackage(@NotNull Collection files); @NotNull - public abstract LightClassConstructionContext analyzeRelevantCode(@NotNull JetClassOrObject classOrObject); + public abstract LightClassConstructionContext getContextForClassOrObject(@NotNull JetClassOrObject classOrObject); @NotNull public abstract Collection findClassOrObjectDeclarations(@NotNull FqName fqName, @NotNull GlobalSearchScope searchScope); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ModuleDescriptorImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ModuleDescriptorImpl.java index 6f715d61a7f..b3083f9acd6 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ModuleDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ModuleDescriptorImpl.java @@ -97,9 +97,7 @@ public class ModuleDescriptorImpl extends DeclarationDescriptorImpl implements M @Override public PackageViewDescriptor getPackage(@NotNull FqName fqName) { List fragments = packageFragmentProvider.getPackageFragments(fqName); - return !fragments.isEmpty() - ? new PackageViewDescriptorImpl(this, fqName, fragments) - : null; + return !fragments.isEmpty() ? new PackageViewDescriptorImpl(this, fqName, fragments) : null; } @NotNull diff --git a/idea/src/org/jetbrains/jet/plugin/caches/resolve/IDELightClassGenerationSupport.java b/idea/src/org/jetbrains/jet/plugin/caches/resolve/IDELightClassGenerationSupport.java index b6839ee7b81..f464c630b3e 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/resolve/IDELightClassGenerationSupport.java +++ b/idea/src/org/jetbrains/jet/plugin/caches/resolve/IDELightClassGenerationSupport.java @@ -85,7 +85,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport @NotNull @Override - public LightClassConstructionContext analyzeRelevantCode(@NotNull Collection files) { + public LightClassConstructionContext getContextForPackage(@NotNull Collection files) { if (files.isEmpty()) { return new LightClassConstructionContext(BindingContext.EMPTY, null); } @@ -97,7 +97,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport try { if (USE_LAZY) { ResolveSessionForBodies session = AnalyzerFacadeWithCache.getLazyResolveSessionForFile(sortedFiles.get(0)); - forceResolveRelevantDeclarations(files, session); + forceResolvePackageDeclarations(files, session); return new LightClassConstructionContext(session.getBindingContext(), null); } else { @@ -111,7 +111,36 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport } } - private static void forceResolveRelevantDeclarations(@NotNull Collection files, @NotNull KotlinCodeAnalyzer session) { + @NotNull + @Override + public LightClassConstructionContext getContextForClassOrObject(@NotNull JetClassOrObject classOrObject) { + Profiler p = Profiler.create((USE_LAZY ? "lazy" : "eager") + " analyze", LOG).start(); + + try { + if (USE_LAZY) { + ResolveSessionForBodies session = AnalyzerFacadeWithCache.getLazyResolveSessionForFile((JetFile) classOrObject.getContainingFile()); + + if (JetPsiUtil.isLocal(classOrObject)) { + BindingContext bindingContext = session.resolveToElement(classOrObject); + forceResolveAllContents(bindingContext.get(BindingContext.CLASS, classOrObject)); + + return new LightClassConstructionContext(bindingContext, null); + } + + forceResolveAllContents(session.getClassDescriptor(classOrObject)); + return new LightClassConstructionContext(session.getBindingContext(), null); + } + else { + KotlinCacheManager cacheManager = KotlinCacheManager.getInstance(project); + return new LightClassConstructionContext(cacheManager.getLightClassContextCache().getLightClassContext(classOrObject), null); + } + } + finally { + p.end(); + } + } + + private static void forceResolvePackageDeclarations(@NotNull Collection files, @NotNull KotlinCodeAnalyzer session) { for (JetFile file : files) { // Scripts are not supported if (file.isScript()) continue; @@ -127,11 +156,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport } for (JetDeclaration declaration : file.getDeclarations()) { - if (declaration instanceof JetClassOrObject) { - ClassDescriptor descriptor = session.getClassDescriptor((JetClassOrObject) declaration); - forceResolveAllContents(descriptor); - } - else if (declaration instanceof JetFunction) { + if (declaration instanceof JetFunction) { JetFunction jetFunction = (JetFunction) declaration; Name name = jetFunction.getNameAsSafeName(); Collection functions = packageDescriptor.getMemberScope().getFunctions(name); @@ -147,6 +172,9 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport forceResolveAllContents(descriptor); } } + else if (declaration instanceof JetClassOrObject) { + // Do nothing: we are not interested in classes + } else { LOG.error("Unsupported declaration kind: " + declaration + " in file " + file.getName() + "\n" + file.getText()); } @@ -161,13 +189,6 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport } } - @NotNull - @Override - public LightClassConstructionContext analyzeRelevantCode(@NotNull JetClassOrObject classOrObject) { - KotlinCacheManager cacheManager = KotlinCacheManager.getInstance(project); - return new LightClassConstructionContext(cacheManager.getLightClassContextCache().getLightClassContext(classOrObject), null); - } - @NotNull @Override public Collection findClassOrObjectDeclarations(@NotNull FqName fqName, @NotNull GlobalSearchScope searchScope) {