AnalyzingUtils refactored

This commit is contained in:
Andrey Breslav
2011-05-06 19:56:58 +04:00
parent a912bef5c5
commit 792bc0f5d2
7 changed files with 24 additions and 39 deletions
@@ -2,6 +2,7 @@ package org.jetbrains.jet.codegen;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.ErrorHandler; import org.jetbrains.jet.lang.ErrorHandler;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -38,7 +39,9 @@ public class NamespaceCodegen {
} }
public void generate(JetNamespace namespace) { public void generate(JetNamespace namespace) {
BindingContext bindingContext = AnalyzingUtils.analyzeNamespace(namespace, ErrorHandler.THROW_EXCEPTION); BindingContext bindingContext1 = AnalyzingUtils.analyzeNamespace(namespace, JetControlFlowDataTraceFactory.EMPTY);
AnalyzingUtils.applyHandler(ErrorHandler.THROW_EXCEPTION, bindingContext1);
BindingContext bindingContext = bindingContext1;
final JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project); final JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project);
final FunctionCodegen functionCodegen = new FunctionCodegen(namespace, v, standardLibrary, bindingContext); final FunctionCodegen functionCodegen = new FunctionCodegen(namespace, v, standardLibrary, bindingContext);
@@ -43,7 +43,7 @@ public class JetLineMarkerProvider implements LineMarkerProvider {
JetFile file = PsiTreeUtil.getParentOfType(element, JetFile.class); JetFile file = PsiTreeUtil.getParentOfType(element, JetFile.class);
assert file != null; assert file != null;
final BindingContext bindingContext = AnalyzingUtils.analyzeFile(file); final BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
FunctionDescriptor functionDescriptor = bindingContext.getFunctionDescriptor(jetFunction); FunctionDescriptor functionDescriptor = bindingContext.getFunctionDescriptor(jetFunction);
final Set<? extends FunctionDescriptor> overriddenFunctions = functionDescriptor.getOverriddenFunctions(); final Set<? extends FunctionDescriptor> overriddenFunctions = functionDescriptor.getOverriddenFunctions();
if (!overriddenFunctions.isEmpty()) { if (!overriddenFunctions.isEmpty()) {
@@ -37,7 +37,7 @@ public class JetPsiChecker implements Annotator {
JetFile file = (JetFile) element; JetFile file = (JetFile) element;
try { try {
final BindingContext bindingContext = AnalyzingUtils.analyzeFile(file); final BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
ErrorHandler errorHandler = new ErrorHandler() { ErrorHandler errorHandler = new ErrorHandler() {
private final Set<DeclarationDescriptor> redeclarations = new HashSet<DeclarationDescriptor>(); private final Set<DeclarationDescriptor> redeclarations = new HashSet<DeclarationDescriptor>();
@@ -5,7 +5,6 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference; import com.intellij.psi.PsiReference;
import com.intellij.util.IncorrectOperationException; import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.ErrorHandler;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -19,7 +18,7 @@ public abstract class JetReferenceExpression extends JetExpression {
protected PsiElement doResolve() { protected PsiElement doResolve() {
JetFile file = (JetFile) getContainingFile(); JetFile file = (JetFile) getContainingFile();
BindingContext bindingContext = AnalyzingUtils.analyzeFile(file, ErrorHandler.DO_NOTHING); BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
PsiElement psiElement = bindingContext.resolveToDeclarationPsiElement(this); PsiElement psiElement = bindingContext.resolveToDeclarationPsiElement(this);
return psiElement == null return psiElement == null
? file ? file
@@ -26,9 +26,8 @@ import org.jetbrains.jet.lang.types.ModuleDescriptor;
public class AnalyzingUtils { public class AnalyzingUtils {
private final static Key<CachedValue<BindingContext>> BINDING_CONTEXT = Key.create("BINDING_CONTEXT"); private final static Key<CachedValue<BindingContext>> BINDING_CONTEXT = Key.create("BINDING_CONTEXT");
public static BindingContext analyzeFile(@NotNull final JetFile file) { public static BindingContext analyzeFileWithCache(@NotNull final JetFile file) {
// TODO : Synchronization? // TODO : Synchronization?
// TODO : Error handler may be ignored
CachedValue<BindingContext> bindingContextCachedValue = file.getUserData(BINDING_CONTEXT); CachedValue<BindingContext> bindingContextCachedValue = file.getUserData(BINDING_CONTEXT);
if (bindingContextCachedValue == null) { if (bindingContextCachedValue == null) {
bindingContextCachedValue = CachedValuesManager.getManager(file.getProject()).createCachedValue(new CachedValueProvider<BindingContext>() { bindingContextCachedValue = CachedValuesManager.getManager(file.getProject()).createCachedValue(new CachedValueProvider<BindingContext>() {
@@ -44,10 +43,6 @@ public class AnalyzingUtils {
return bindingContextCachedValue.getValue(); return bindingContextCachedValue.getValue();
} }
public static BindingContext analyzeNamespace(@NotNull JetNamespace namespace) {
return analyzeNamespace(namespace, JetControlFlowDataTraceFactory.EMPTY);
}
public static BindingContext analyzeNamespace(@NotNull JetNamespace namespace, @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory) { public static BindingContext analyzeNamespace(@NotNull JetNamespace namespace, @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory) {
Project project = namespace.getProject(); Project project = namespace.getProject();
@@ -66,6 +61,12 @@ public class AnalyzingUtils {
return bindingTraceContext; return bindingTraceContext;
} }
public static void applyHandler(@NotNull ErrorHandler errorHandler, @NotNull BindingContext bindingContext) {
for (JetDiagnostic jetDiagnostic : bindingContext.getDiagnostics()) {
jetDiagnostic.acceptHandler(errorHandler);
}
}
public static void checkForSyntacticErrors(@NotNull PsiElement root) { public static void checkForSyntacticErrors(@NotNull PsiElement root) {
root.acceptChildren(new PsiElementVisitor() { root.acceptChildren(new PsiElementVisitor() {
@Override @Override
@@ -79,22 +80,4 @@ public class AnalyzingUtils {
} }
}); });
} }
public static BindingContext analyzeNamespace(@NotNull JetNamespace namespace, @NotNull ErrorHandler errorHandler) {
BindingContext bindingContext = analyzeNamespace(namespace);
applyHandler(errorHandler, bindingContext);
return bindingContext;
}
private static void applyHandler(@NotNull ErrorHandler errorHandler, @NotNull BindingContext bindingContext) {
for (JetDiagnostic jetDiagnostic : bindingContext.getDiagnostics()) {
jetDiagnostic.acceptHandler(errorHandler);
}
}
public static BindingContext analyzeFile(@NotNull JetFile file, @NotNull ErrorHandler errorHandler) {
BindingContext bindingContext = analyzeFile(file);
applyHandler(errorHandler, bindingContext);
return bindingContext;
}
} }
@@ -4,7 +4,6 @@ import com.intellij.lang.documentation.DocumentationProvider;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiManager; import com.intellij.psi.PsiManager;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.jet.lang.ErrorHandler;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetReferenceExpression; import org.jetbrains.jet.lang.psi.JetReferenceExpression;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
@@ -30,7 +29,7 @@ public class JetQuickDocumentationProvider implements DocumentationProvider {
ref = PsiTreeUtil.getParentOfType(originalElement, JetReferenceExpression.class); ref = PsiTreeUtil.getParentOfType(originalElement, JetReferenceExpression.class);
} }
if (ref != null) { if (ref != null) {
BindingContext bindingContext = AnalyzingUtils.analyzeFile((JetFile) element.getContainingFile(), ErrorHandler.DO_NOTHING); BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache((JetFile) element.getContainingFile());
DeclarationDescriptor declarationDescriptor = bindingContext.resolveReferenceExpression(ref); DeclarationDescriptor declarationDescriptor = bindingContext.resolveReferenceExpression(ref);
if (declarationDescriptor != null) { if (declarationDescriptor != null) {
return render(declarationDescriptor); return render(declarationDescriptor);
@@ -40,7 +39,7 @@ public class JetQuickDocumentationProvider implements DocumentationProvider {
// if (originalElement.getNode().getElementType() == JetTokens.IDENTIFIER) { // if (originalElement.getNode().getElementType() == JetTokens.IDENTIFIER) {
// JetDeclaration declaration = PsiTreeUtil.getParentOfType(originalElement, JetDeclaration.class); // JetDeclaration declaration = PsiTreeUtil.getParentOfType(originalElement, JetDeclaration.class);
// BindingContext bindingContext = AnalyzingUtils.analyzeFile((JetFile) element.getContainingFile(), ErrorHandler.DO_NOTHING); // BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache((JetFile) element.getContainingFile(), ErrorHandler.DO_NOTHING);
// DeclarationDescriptor declarationDescriptor = bindingContext.getDeclarationDescriptor(declaration); // DeclarationDescriptor declarationDescriptor = bindingContext.getDeclarationDescriptor(declaration);
// if (declarationDescriptor != null) { // if (declarationDescriptor != null) {
// return render(declarationDescriptor); // return render(declarationDescriptor);
@@ -7,6 +7,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.ErrorHandler; import org.jetbrains.jet.lang.ErrorHandler;
import org.jetbrains.jet.lang.JetSemanticServices; import org.jetbrains.jet.lang.JetSemanticServices;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -81,16 +82,16 @@ public class ExpectedResolveData {
public void checkResult(JetFile file) { public void checkResult(JetFile file) {
final Set<PsiElement> unresolvedReferences = new HashSet<PsiElement>(); final Set<PsiElement> unresolvedReferences = new HashSet<PsiElement>();
ErrorHandler errorHandler = new ErrorHandler() {
@Override
public void unresolvedReference(@NotNull JetReferenceExpression referenceExpression) {
unresolvedReferences.add(referenceExpression);
}
};
JetSemanticServices semanticServices = JetSemanticServices.createSemanticServices(file.getProject()); JetSemanticServices semanticServices = JetSemanticServices.createSemanticServices(file.getProject());
JetStandardLibrary lib = semanticServices.getStandardLibrary(); JetStandardLibrary lib = semanticServices.getStandardLibrary();
BindingContext bindingContext = AnalyzingUtils.analyzeFile(file, errorHandler); BindingContext bindingContext = AnalyzingUtils.analyzeNamespace(file.getRootNamespace(), JetControlFlowDataTraceFactory.EMPTY);
AnalyzingUtils.applyHandler(new ErrorHandler() {
@Override
public void unresolvedReference(@NotNull JetReferenceExpression referenceExpression) {
unresolvedReferences.add(referenceExpression);
}
}, bindingContext);
Map<String, JetDeclaration> nameToDeclaration = new HashMap<String, JetDeclaration>(); Map<String, JetDeclaration> nameToDeclaration = new HashMap<String, JetDeclaration>();