Extracted method for creating injector.

Using delegating binding trace instead of original binding context.
This commit is contained in:
Evgeny Gerashchenko
2013-04-02 22:30:09 +04:00
parent f59701a6c4
commit 8c45d50a86
@@ -39,6 +39,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
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.DelegatingBindingTrace;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope;
@@ -85,12 +86,10 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
return; return;
} }
KotlinDeclarationsCache declarationsCache = KotlinCacheManager.getInstance(project).getDeclarationsFromProject(TargetPlatform.JVM); InjectorForJavaDescriptorResolver injector = createInjector(project);
BindingContext bindingContext = declarationsCache.getBindingContext();
DelegatingBindingTrace bindingTrace = new DelegatingBindingTrace(bindingContext, "wrapped context of declarations cache");
InjectorForJavaDescriptorResolver injector = new InjectorForJavaDescriptorResolver(project, bindingTrace, new ModuleDescriptor(Name.special("<fake>")));
JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver(); JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver();
BindingTrace trace = injector.getBindingTrace();
for (PsiElement element : elements) { for (PsiElement element : elements) {
if (!(element instanceof PsiMember)) { if (!(element instanceof PsiMember)) {
@@ -102,11 +101,11 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
continue; continue;
} }
DeclarationDescriptor memberDescriptor = getDescriptorForMember(javaDescriptorResolver, member, bindingContext); DeclarationDescriptor memberDescriptor = getDescriptorForMember(javaDescriptorResolver, member, trace);
if (memberDescriptor == null) continue; if (memberDescriptor == null) continue;
List<String> errors = bindingContext.get(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, memberDescriptor); List<String> errors = trace.get(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, memberDescriptor);
boolean hasSignatureAnnotation = findKotlinSignatureAnnotation(element) != null; boolean hasSignatureAnnotation = findKotlinSignatureAnnotation(element) != null;
if (errors != null || hasSignatureAnnotation) { if (errors != null || hasSignatureAnnotation) {
@@ -115,11 +114,19 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
} }
} }
private static InjectorForJavaDescriptorResolver createInjector(Project project) {
KotlinDeclarationsCache declarationsCache = KotlinCacheManager.getInstance(project).getDeclarationsFromProject(TargetPlatform.JVM);
BindingContext bindingContext = declarationsCache.getBindingContext();
DelegatingBindingTrace delegatingTrace = new DelegatingBindingTrace(bindingContext, "wrapped context of declarations cache");
return new InjectorForJavaDescriptorResolver(project, delegatingTrace, new ModuleDescriptor(Name.special("<fake>")));
}
@Nullable @Nullable
private static DeclarationDescriptor getDescriptorForMember( private static DeclarationDescriptor getDescriptorForMember(
@NotNull JavaDescriptorResolver javaDescriptorResolver, @NotNull JavaDescriptorResolver javaDescriptorResolver,
@NotNull PsiMember member, @NotNull PsiMember member,
@NotNull BindingContext bindingContext @NotNull BindingTrace trace
) { ) {
PsiClass containingClass = member.getContainingClass(); PsiClass containingClass = member.getContainingClass();
if (containingClass == null) { // e.g., type parameter if (containingClass == null) { // e.g., type parameter
@@ -138,7 +145,7 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
if (memberScope == null) { if (memberScope == null) {
return null; return null;
} }
return getDescriptorForMember(member, memberScope, bindingContext); return getDescriptorForMember(member, memberScope, trace);
} }
@Nullable @Nullable
@@ -169,7 +176,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 BindingContext bindingContext @NotNull BindingTrace trace
) { ) {
if (!(member instanceof PsiMethod) && !(member instanceof PsiField)) { if (!(member instanceof PsiMethod) && !(member instanceof PsiField)) {
return null; return null;
@@ -193,7 +200,7 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
} }
PsiModifierListOwner annotationOwner = getAnnotationOwner(member); PsiModifierListOwner annotationOwner = getAnnotationOwner(member);
return bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, annotationOwner); return trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, annotationOwner);
} }
public static boolean isMarkersEnabled(@NotNull Project project) { public static boolean isMarkersEnabled(@NotNull Project project) {