Use lazy analysis in JetNameValidatorImpl

This commit is contained in:
Alexey Sedunov
2014-04-10 16:34:41 +04:00
parent 1fe6df268a
commit a72d785d62
@@ -21,8 +21,8 @@ import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetVisitorVoid;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.plugin.codeInsight.TipsManager;
@@ -33,12 +33,17 @@ import java.util.Collection;
public class JetNameValidatorImpl extends JetNameValidator {
private final PsiElement myContainer;
private final PsiElement myAnchor;
private BindingContext myBindingContext;
private final boolean myOnlyVariables;
public JetNameValidatorImpl(PsiElement container, PsiElement anchor) {
public JetNameValidatorImpl(PsiElement container, PsiElement anchor, boolean onlyVariables) {
super(container.getProject());
myContainer = container;
myAnchor = anchor;
myOnlyVariables = onlyVariables;
}
public JetNameValidatorImpl(PsiElement container, PsiElement anchor) {
this(container, anchor, true);
}
@Override
@@ -63,9 +68,10 @@ public class JetNameValidatorImpl extends JetNameValidator {
}
private boolean checkElement(final String name, PsiElement sibling) {
if (myBindingContext == null) {
myBindingContext = AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) myContainer.getContainingFile()).getBindingContext();
}
if (!(sibling instanceof JetElement)) return true;
final BindingContext bindingContext = AnalyzerFacadeWithCache.getContextForElement((JetElement) sibling);
final Ref<Boolean> result = new Ref<Boolean>(true);
JetVisitorVoid visitor = new JetVisitorVoid() {
@Override
@@ -77,10 +83,9 @@ public class JetNameValidatorImpl extends JetNameValidator {
@Override
public void visitExpression(@NotNull JetExpression expression) {
Collection<DeclarationDescriptor> variants =
TipsManager.getVariantsNoReceiver(expression, myBindingContext);
Collection<DeclarationDescriptor> variants = TipsManager.getVariantsNoReceiver(expression, bindingContext);
for (DeclarationDescriptor variant : variants) {
if (variant.getName().asString().equals(name) && variant instanceof VariableDescriptor) {
if (variant.getName().asString().equals(name) && (!myOnlyVariables || variant instanceof VariableDescriptor)) {
result.set(false);
return;
}