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.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor; 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.JetExpression;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetVisitorVoid; import org.jetbrains.jet.lang.psi.JetVisitorVoid;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.plugin.codeInsight.TipsManager; import org.jetbrains.jet.plugin.codeInsight.TipsManager;
@@ -33,12 +33,17 @@ import java.util.Collection;
public class JetNameValidatorImpl extends JetNameValidator { public class JetNameValidatorImpl extends JetNameValidator {
private final PsiElement myContainer; private final PsiElement myContainer;
private final PsiElement myAnchor; 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()); super(container.getProject());
myContainer = container; myContainer = container;
myAnchor = anchor; myAnchor = anchor;
myOnlyVariables = onlyVariables;
}
public JetNameValidatorImpl(PsiElement container, PsiElement anchor) {
this(container, anchor, true);
} }
@Override @Override
@@ -63,9 +68,10 @@ public class JetNameValidatorImpl extends JetNameValidator {
} }
private boolean checkElement(final String name, PsiElement sibling) { private boolean checkElement(final String name, PsiElement sibling) {
if (myBindingContext == null) { if (!(sibling instanceof JetElement)) return true;
myBindingContext = AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) myContainer.getContainingFile()).getBindingContext();
} final BindingContext bindingContext = AnalyzerFacadeWithCache.getContextForElement((JetElement) sibling);
final Ref<Boolean> result = new Ref<Boolean>(true); final Ref<Boolean> result = new Ref<Boolean>(true);
JetVisitorVoid visitor = new JetVisitorVoid() { JetVisitorVoid visitor = new JetVisitorVoid() {
@Override @Override
@@ -77,10 +83,9 @@ public class JetNameValidatorImpl extends JetNameValidator {
@Override @Override
public void visitExpression(@NotNull JetExpression expression) { public void visitExpression(@NotNull JetExpression expression) {
Collection<DeclarationDescriptor> variants = Collection<DeclarationDescriptor> variants = TipsManager.getVariantsNoReceiver(expression, bindingContext);
TipsManager.getVariantsNoReceiver(expression, myBindingContext);
for (DeclarationDescriptor variant : variants) { 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); result.set(false);
return; return;
} }