AnalyzingUtils refactored
This commit is contained in:
@@ -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>();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user