Add lock for all additional resolve
This commit is contained in:
+45
-38
@@ -20,6 +20,7 @@ import com.google.common.base.Function;
|
|||||||
import com.google.common.base.Functions;
|
import com.google.common.base.Functions;
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.intellij.openapi.util.Computable;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile;
|
||||||
import com.intellij.psi.util.PsiTreeUtil;
|
import com.intellij.psi.util.PsiTreeUtil;
|
||||||
@@ -116,9 +117,9 @@ public class ResolveSessionUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @NotNull BindingContext resolveToElement(@NotNull ResolveSession resolveSession, @NotNull JetElement jetElement) {
|
public static @NotNull BindingContext resolveToElement(@NotNull final ResolveSession resolveSession, @NotNull final JetElement jetElement) {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
PsiElement resolveElement = JetPsiUtil.getTopmostParentOfTypes(jetElement,
|
final PsiElement resolveElement = JetPsiUtil.getTopmostParentOfTypes(jetElement,
|
||||||
JetNamedFunction.class, JetClassInitializer.class,
|
JetNamedFunction.class, JetClassInitializer.class,
|
||||||
JetProperty.class, JetDelegationSpecifierList.class,
|
JetProperty.class, JetDelegationSpecifierList.class,
|
||||||
JetImportDirective.class, JetAnnotationEntry.class,
|
JetImportDirective.class, JetAnnotationEntry.class,
|
||||||
@@ -127,46 +128,52 @@ public class ResolveSessionUtils {
|
|||||||
|
|
||||||
if (resolveElement != null) {
|
if (resolveElement != null) {
|
||||||
// All additional resolve should be done to separate trace
|
// All additional resolve should be done to separate trace
|
||||||
BindingTrace trace = resolveSession.getStorageManager().createSafeTrace(
|
final BindingTrace trace = resolveSession.getStorageManager().createSafeTrace(
|
||||||
new DelegatingBindingTrace(resolveSession.getBindingContext(), "trace to resolve element", jetElement));
|
new DelegatingBindingTrace(resolveSession.getBindingContext(), "trace to resolve element", jetElement));
|
||||||
|
|
||||||
JetFile file = (JetFile) jetElement.getContainingFile();
|
final JetFile file = (JetFile) jetElement.getContainingFile();
|
||||||
|
|
||||||
if (resolveElement instanceof JetNamedFunction) {
|
resolveSession.getStorageManager().compute(new Computable<Object>() {
|
||||||
functionAdditionalResolve(resolveSession, (JetNamedFunction) resolveElement, trace, file);
|
@Override
|
||||||
}
|
public Object compute() {
|
||||||
else if (resolveElement instanceof JetClassInitializer) {
|
if (resolveElement instanceof JetNamedFunction) {
|
||||||
initializerAdditionalResolve(resolveSession, (JetClassInitializer) resolveElement, trace, file);
|
functionAdditionalResolve(resolveSession, (JetNamedFunction) resolveElement, trace, file);
|
||||||
}
|
}
|
||||||
else if (resolveElement instanceof JetProperty) {
|
else if (resolveElement instanceof JetClassInitializer) {
|
||||||
propertyAdditionalResolve(resolveSession, (JetProperty) resolveElement, trace, file);
|
initializerAdditionalResolve(resolveSession, (JetClassInitializer) resolveElement, trace, file);
|
||||||
}
|
}
|
||||||
else if (resolveElement instanceof JetDelegationSpecifierList) {
|
else if (resolveElement instanceof JetProperty) {
|
||||||
delegationSpecifierAdditionalResolve(resolveSession, (JetDelegationSpecifierList) resolveElement,
|
propertyAdditionalResolve(resolveSession, (JetProperty) resolveElement, trace, file);
|
||||||
trace, file);
|
}
|
||||||
}
|
else if (resolveElement instanceof JetDelegationSpecifierList) {
|
||||||
else if (resolveElement instanceof JetImportDirective) {
|
delegationSpecifierAdditionalResolve(resolveSession, (JetDelegationSpecifierList) resolveElement, trace, file);
|
||||||
JetImportDirective importDirective = (JetImportDirective) resolveElement;
|
}
|
||||||
JetScope scope = resolveSession.getInjector().getScopeProvider().getFileScope((JetFile) importDirective.getContainingFile());
|
else if (resolveElement instanceof JetImportDirective) {
|
||||||
|
JetImportDirective importDirective = (JetImportDirective) resolveElement;
|
||||||
|
JetScope scope = resolveSession.getInjector().getScopeProvider().getFileScope((JetFile) importDirective.getContainingFile());
|
||||||
|
|
||||||
// Get all descriptors to force resolving all imports
|
// Get all descriptors to force resolving all imports
|
||||||
scope.getAllDescriptors();
|
scope.getAllDescriptors();
|
||||||
}
|
}
|
||||||
else if (resolveElement instanceof JetAnnotationEntry) {
|
else if (resolveElement instanceof JetAnnotationEntry) {
|
||||||
annotationAdditionalResolve(resolveSession, (JetAnnotationEntry) resolveElement);
|
annotationAdditionalResolve(resolveSession, (JetAnnotationEntry) resolveElement);
|
||||||
}
|
}
|
||||||
else if (resolveElement instanceof JetTypeParameter) {
|
else if (resolveElement instanceof JetTypeParameter) {
|
||||||
typeParameterAdditionalResolve(resolveSession, (JetTypeParameter) resolveElement);
|
typeParameterAdditionalResolve(resolveSession, (JetTypeParameter) resolveElement);
|
||||||
}
|
}
|
||||||
else if (resolveElement instanceof JetTypeConstraint) {
|
else if (resolveElement instanceof JetTypeConstraint) {
|
||||||
typeConstraintAdditionalResolve(resolveSession, jetElement);
|
typeConstraintAdditionalResolve(resolveSession, jetElement);
|
||||||
}
|
}
|
||||||
else if (resolveElement instanceof JetNamespaceHeader) {
|
else if (resolveElement instanceof JetNamespaceHeader) {
|
||||||
namespaceRefAdditionalResolve(resolveSession, (JetNamespaceHeader) resolveElement, trace, jetElement);
|
namespaceRefAdditionalResolve(resolveSession, (JetNamespaceHeader) resolveElement, trace, jetElement);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert false : "Invalid type of the topmost parent";
|
assert false : "Invalid type of the topmost parent";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return trace.getBindingContext();
|
return trace.getBindingContext();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user