getDeclarationsFromProject() is replaced by lazy resolve

This commit is contained in:
Andrey Breslav
2014-04-22 19:22:51 +04:00
parent 54f3dd20b3
commit 7ee483fbc8
3 changed files with 17 additions and 37 deletions
@@ -17,7 +17,6 @@
package org.jetbrains.jet.plugin.caches.resolve; package org.jetbrains.jet.plugin.caches.resolve;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
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.openapi.util.DefaultModificationTracker; import com.intellij.openapi.util.DefaultModificationTracker;
@@ -42,16 +41,6 @@ public class KotlinCacheManager {
cacheProviders.put(TargetPlatform.JS, new JSDeclarationsCacheProvider(project)); cacheProviders.put(TargetPlatform.JS, new JSDeclarationsCacheProvider(project));
} }
/**
* Should be called under read lock.
*/
@NotNull
public KotlinDeclarationsCache getDeclarationsFromProject(@NotNull TargetPlatform platform) {
// Computing declarations should be performed under read lock
ApplicationManager.getApplication().assertReadAccessAllowed();
return getRegisteredProvider(platform).getDeclarations();
}
@NotNull @NotNull
public DeclarationsCacheProvider getRegisteredProvider(@NotNull TargetPlatform platform) { public DeclarationsCacheProvider getRegisteredProvider(@NotNull TargetPlatform platform) {
DeclarationsCacheProvider provider = cacheProviders.get(platform); DeclarationsCacheProvider provider = cacheProviders.get(platform);
@@ -62,10 +51,6 @@ public class KotlinCacheManager {
return provider; return provider;
} }
public void invalidateCache() {
kotlinDeclarationsTracker.incModificationCount();
}
public ModificationTracker getDeclarationsTracker() { public ModificationTracker getDeclarationsTracker() {
return kotlinDeclarationsTracker; return kotlinDeclarationsTracker;
} }
@@ -57,6 +57,10 @@ fun JetElement.getLazyResolveSession(): ResolveSessionForBodies {
return KotlinCacheService.getInstance(getProject()).getLazyResolveSession(this) return KotlinCacheService.getInstance(getProject()).getLazyResolveSession(this)
} }
fun Project.getLazyResolveSession(platform: TargetPlatform): ResolveSessionForBodies {
return KotlinCacheService.getInstance(this).getGlobalLazyResolveSession(platform)
}
fun JetElement.getAnalysisResults(): AnalyzeExhaust { fun JetElement.getAnalysisResults(): AnalyzeExhaust {
return KotlinCacheService.getInstance(getProject()).getAnalysisResults(listOf(this)) return KotlinCacheService.getInstance(getProject()).getAnalysisResults(listOf(this))
} }
@@ -140,6 +144,10 @@ class KotlinCacheService(val project: Project) {
} }
public fun getGlobalLazyResolveSession(platform: TargetPlatform): ResolveSessionForBodies {
return globalCachesPerPlatform[platform]!!.getLazyResolveSession()
}
public fun getLazyResolveSession(element: JetElement): ResolveSessionForBodies { public fun getLazyResolveSession(element: JetElement): ResolveSessionForBodies {
val file = element.getContainingJetFile() val file = element.getContainingJetFile()
if (!isFileInScope(file)) { if (!isFileInScope(file)) {
@@ -148,7 +156,7 @@ class KotlinCacheService(val project: Project) {
} }
} }
return globalCachesPerPlatform[TargetPlatformDetector.getPlatform(file)]!!.getLazyResolveSession() return getGlobalLazyResolveSession(TargetPlatformDetector.getPlatform(file))
} }
public fun getAnalysisResults(elements: Collection<JetElement>): AnalyzeExhaust { public fun getAnalysisResults(elements: Collection<JetElement>): AnalyzeExhaust {
@@ -255,9 +263,6 @@ private class KotlinResolveCache(
catch (e: Throwable) { catch (e: Throwable) {
handleError(e) handleError(e)
// Exception during body resolve analyze can harm internal caches in declarations cache
KotlinCacheManager.getInstance(project).invalidateCache()
val bindingTraceContext = BindingTraceContext() val bindingTraceContext = BindingTraceContext()
return AnalyzeExhaust.error(bindingTraceContext.getBindingContext(), e) return AnalyzeExhaust.error(bindingTraceContext.getBindingContext(), e)
} }
@@ -39,8 +39,6 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace;
import org.jetbrains.jet.lang.resolve.java.JavaBindingContext; import org.jetbrains.jet.lang.resolve.java.JavaBindingContext;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor;
@@ -49,8 +47,7 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.plugin.JetIcons; import org.jetbrains.jet.plugin.JetIcons;
import org.jetbrains.jet.plugin.caches.resolve.JavaResolveExtension; import org.jetbrains.jet.plugin.caches.resolve.JavaResolveExtension;
import org.jetbrains.jet.plugin.caches.resolve.KotlinCacheManager; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
import org.jetbrains.jet.plugin.caches.resolve.KotlinDeclarationsCache;
import org.jetbrains.jet.plugin.project.ProjectStructureUtil; import org.jetbrains.jet.plugin.project.ProjectStructureUtil;
import org.jetbrains.jet.plugin.project.TargetPlatform; import org.jetbrains.jet.plugin.project.TargetPlatform;
@@ -96,7 +93,7 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
return; return;
} }
BindingTrace trace = createDelegatingTrace(project); BindingContext bindingContext = ResolvePackage.getLazyResolveSession(project, TargetPlatform.JVM).getBindingContext();
JavaDescriptorResolver javaDescriptorResolver = JavaResolveExtension.instance$.get(project); JavaDescriptorResolver javaDescriptorResolver = JavaResolveExtension.instance$.get(project);
@@ -110,11 +107,11 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
continue; continue;
} }
DeclarationDescriptor memberDescriptor = getDescriptorForMember(javaDescriptorResolver, member, trace); DeclarationDescriptor memberDescriptor = getDescriptorForMember(javaDescriptorResolver, member, bindingContext);
if (memberDescriptor == null) continue; if (memberDescriptor == null) continue;
List<String> errors = trace.get(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, memberDescriptor); List<String> errors = bindingContext.get(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, memberDescriptor);
boolean hasSignatureAnnotation = KotlinSignatureUtil.findKotlinSignatureAnnotation(element) != null; boolean hasSignatureAnnotation = KotlinSignatureUtil.findKotlinSignatureAnnotation(element) != null;
if (errors != null || hasSignatureAnnotation) { if (errors != null || hasSignatureAnnotation) {
@@ -123,18 +120,11 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
} }
} }
@NotNull
static BindingTrace createDelegatingTrace(@NotNull Project project) {
KotlinDeclarationsCache declarationsCache = KotlinCacheManager.getInstance(project).getDeclarationsFromProject(TargetPlatform.JVM);
BindingContext bindingContext = declarationsCache.getBindingContext();
return new DelegatingBindingTrace(bindingContext, "wrapped context of declarations cache");
}
@Nullable @Nullable
private static DeclarationDescriptor getDescriptorForMember( private static DeclarationDescriptor getDescriptorForMember(
@NotNull JavaDescriptorResolver javaDescriptorResolver, @NotNull JavaDescriptorResolver javaDescriptorResolver,
@NotNull PsiMember member, @NotNull PsiMember member,
@NotNull BindingTrace trace @NotNull BindingContext bindingContext
) { ) {
PsiClass containingClass = member.getContainingClass(); PsiClass containingClass = member.getContainingClass();
if (containingClass == null) { // e.g., type parameter if (containingClass == null) { // e.g., type parameter
@@ -153,7 +143,7 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
if (memberScope == null) { if (memberScope == null) {
return null; return null;
} }
return getDescriptorForMember(member, memberScope, trace); return getDescriptorForMember(member, memberScope, bindingContext);
} }
@Nullable @Nullable
@@ -184,7 +174,7 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
private static DeclarationDescriptor getDescriptorForMember( private static DeclarationDescriptor getDescriptorForMember(
@NotNull PsiMember member, @NotNull PsiMember member,
@NotNull JetScope memberScope, @NotNull JetScope memberScope,
@NotNull BindingTrace trace @NotNull BindingContext bindingContext
) { ) {
if (!(member instanceof PsiMethod) && !(member instanceof PsiField)) { if (!(member instanceof PsiMethod) && !(member instanceof PsiField)) {
return null; return null;
@@ -211,7 +201,7 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
} }
PsiModifierListOwner annotationOwner = KotlinSignatureUtil.getAnnotationOwner(member); PsiModifierListOwner annotationOwner = KotlinSignatureUtil.getAnnotationOwner(member);
return trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, annotationOwner); return bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, annotationOwner);
} }
public static boolean isMarkersEnabled(@NotNull Project project) { public static boolean isMarkersEnabled(@NotNull Project project) {