Using lazy resolve when building light classes

This commit is contained in:
Andrey Breslav
2013-09-26 11:05:17 -07:00
committed by Nikolay Krasko
parent b1b83a0ecb
commit a2c66f7cc4
2 changed files with 48 additions and 5 deletions
@@ -96,6 +96,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
if (classLikeInfo.getCorrespondingClassOrObject() != null) { if (classLikeInfo.getCorrespondingClassOrObject() != null) {
this.resolveSession.getTrace().record(BindingContext.CLASS, classLikeInfo.getCorrespondingClassOrObject(), this); this.resolveSession.getTrace().record(BindingContext.CLASS, classLikeInfo.getCorrespondingClassOrObject(), this);
} }
this.resolveSession.getTrace().record(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, DescriptorUtils.getFqName(this), this);
this.originalClassInfo = classLikeInfo; this.originalClassInfo = classLikeInfo;
this.declarationProvider = resolveSession.getDeclarationProviderFactory().getClassMemberDeclarationProvider(classLikeInfo); this.declarationProvider = resolveSession.getDeclarationProviderFactory().getClassMemberDeclarationProvider(classLikeInfo);
@@ -18,6 +18,7 @@ package org.jetbrains.jet.plugin.caches.resolve;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.LibraryUtil; import com.intellij.openapi.roots.libraries.LibraryUtil;
import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Condition;
@@ -34,37 +35,78 @@ import org.jetbrains.jet.asJava.LightClassGenerationSupport;
import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.libraries.JetSourceNavigationHelper; import org.jetbrains.jet.plugin.libraries.JetSourceNavigationHelper;
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies;
import org.jetbrains.jet.plugin.stubindex.JetAllPackagesIndex; import org.jetbrains.jet.plugin.stubindex.JetAllPackagesIndex;
import org.jetbrains.jet.plugin.stubindex.JetClassByPackageIndex; import org.jetbrains.jet.plugin.stubindex.JetClassByPackageIndex;
import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex; import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex;
import org.jetbrains.jet.util.QualifiedNamesUtil; import org.jetbrains.jet.util.QualifiedNamesUtil;
import org.jetbrains.jet.utils.Profiler;
import java.util.Collection; import java.util.*;
import java.util.Set;
import static org.jetbrains.jet.plugin.stubindex.JetSourceFilterScope.kotlinSources; import static org.jetbrains.jet.plugin.stubindex.JetSourceFilterScope.kotlinSources;
public class IDELightClassGenerationSupport extends LightClassGenerationSupport { public class IDELightClassGenerationSupport extends LightClassGenerationSupport {
private static final Logger LOG = Logger.getInstance(IDELightClassGenerationSupport.class);
private static boolean USE_LAZY = true;
public static IDELightClassGenerationSupport getInstanceForIDE(@NotNull Project project) { public static IDELightClassGenerationSupport getInstanceForIDE(@NotNull Project project) {
return (IDELightClassGenerationSupport) ServiceManager.getService(project, LightClassGenerationSupport.class); return (IDELightClassGenerationSupport) ServiceManager.getService(project, LightClassGenerationSupport.class);
} }
private final Project project; private final Project project;
private final Comparator<JetFile> jetFileComparator;
public IDELightClassGenerationSupport(@NotNull Project project) { public IDELightClassGenerationSupport(@NotNull Project project) {
this.project = project; this.project = project;
final GlobalSearchScope searchScope = GlobalSearchScope.allScope(project);
this.jetFileComparator = new Comparator<JetFile>() {
@Override
public int compare(@NotNull JetFile o1, @NotNull JetFile o2) {
VirtualFile f1 = o1.getVirtualFile();
VirtualFile f2 = o2.getVirtualFile();
if (f1 == f2) return 0;
if (f1 == null) return -1;
if (f2 == null) return 1;
return searchScope.compare(f1, f2);
}
};
} }
@NotNull @NotNull
@Override @Override
public LightClassConstructionContext analyzeRelevantCode(@NotNull Collection<JetFile> files) { public LightClassConstructionContext analyzeRelevantCode(@NotNull Collection<JetFile> files) {
KotlinCacheManager cacheManager = KotlinCacheManager.getInstance(project); if (files.isEmpty()) {
KotlinDeclarationsCache declarationsCache = cacheManager.getPossiblyIncompleteDeclarationsForLightClassGeneration(); return new LightClassConstructionContext(BindingContext.EMPTY, null);
return new LightClassConstructionContext(declarationsCache.getBindingContext(), null); }
List<JetFile> sortedFiles = new ArrayList<JetFile>(files);
Collections.sort(sortedFiles, jetFileComparator);
Profiler p = Profiler.create((USE_LAZY ? "lazy" : "eager") + "analyze", LOG).start();
try {
if (USE_LAZY) {
ResolveSessionForBodies session = AnalyzerFacadeWithCache.getLazyResolveSessionForFile(sortedFiles.get(0));
session.forceResolveAll();
return new LightClassConstructionContext(session.getBindingContext(), null);
}
else {
KotlinCacheManager cacheManager = KotlinCacheManager.getInstance(project);
KotlinDeclarationsCache declarationsCache = cacheManager.getPossiblyIncompleteDeclarationsForLightClassGeneration();
return new LightClassConstructionContext(declarationsCache.getBindingContext(), null);
}
}
finally {
p.end();
}
} }
@NotNull @NotNull