Interface of 'addDefaultImports' in StandardConfiguration simplified

This commit is contained in:
Svetlana Isakova
2012-03-06 16:02:24 +04:00
parent d03d695979
commit d5da6e8c23
7 changed files with 50 additions and 56 deletions
@@ -22,12 +22,13 @@ import org.jetbrains.jet.lang.Configuration;
import org.jetbrains.jet.lang.JetSemanticServices;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.psi.JetImportDirective;
import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.Importer;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.util.QualifiedNamesUtil;
import java.util.Collection;
import java.util.Collections;
/**
@@ -35,30 +36,29 @@ import java.util.Collections;
*/
public class JavaBridgeConfiguration implements Configuration {
public static final String[] DEFAULT_JAVA_IMPORTS = new String[] { "java.lang" };
public static final String[] DEFAULT_JAVA_IMPORTS = new String[] { "java.lang.*" };
public static Configuration createJavaBridgeConfiguration(@NotNull Project project, @NotNull BindingTrace trace, Configuration delegateConfiguration) {
return new JavaBridgeConfiguration(project, trace, delegateConfiguration);
}
private final Project project;
private final JavaSemanticServices javaSemanticServices;
private final Configuration delegateConfiguration;
private JavaBridgeConfiguration(Project project, BindingTrace trace, Configuration delegateConfiguration) {
this.project = project;
this.javaSemanticServices = new JavaSemanticServices(project, JetSemanticServices.createSemanticServices(project), trace);
this.delegateConfiguration = delegateConfiguration;
}
@Override
public void addDefaultImports(@NotNull BindingTrace trace, @NotNull WritableScope rootScope, @NotNull Importer importer) {
public void addDefaultImports(@NotNull WritableScope rootScope, @NotNull Collection<JetImportDirective> directives) {
rootScope.importScope(new JavaPackageScope("", createNamespaceDescriptor(JavaDescriptorResolver.JAVA_ROOT, ""), javaSemanticServices));
for (String importFQN : DEFAULT_JAVA_IMPORTS) {
NamespaceDescriptor namespaceDescriptor = javaSemanticServices.getDescriptorResolver().resolveNamespace(importFQN);
if (namespaceDescriptor != null) {
importer.addScopeImport(namespaceDescriptor.getMemberScope());
}
directives.add(JetPsiFactory.createImportDirective(project, importFQN));
}
delegateConfiguration.addDefaultImports(trace, rootScope, importer);
delegateConfiguration.addDefaultImports(rootScope, directives);
}
public static JavaNamespaceDescriptor createNamespaceDescriptor(String name, String qualifiedName) {
@@ -18,17 +18,19 @@ package org.jetbrains.jet.lang;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetImportDirective;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.Importer;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import java.util.Collection;
/**
* @author abreslav
*/
public interface Configuration {
Configuration EMPTY = new Configuration() {
@Override
public void addDefaultImports(@NotNull BindingTrace trace, @NotNull WritableScope rootScope, @NotNull Importer importer) {
public void addDefaultImports(@NotNull WritableScope rootScope, @NotNull Collection<JetImportDirective> directives) {
}
@Override
@@ -36,7 +38,7 @@ public interface Configuration {
}
};
void addDefaultImports(@NotNull BindingTrace trace, @NotNull WritableScope rootScope, @NotNull Importer importer);
void addDefaultImports(@NotNull WritableScope rootScope, @NotNull Collection<JetImportDirective> directives);
/**
*
@@ -19,12 +19,13 @@ package org.jetbrains.jet.lang;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetImportDirective;
import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.Importer;
import org.jetbrains.jet.lang.resolve.ImportsResolver;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import java.util.Collection;
/**
* @author svtk
*/
@@ -42,10 +43,9 @@ public class StandardConfiguration implements Configuration {
}
@Override
public void addDefaultImports(@NotNull BindingTrace trace, @NotNull WritableScope rootScope, @NotNull Importer importer) {
ImportsResolver.ImportResolver importResolver = new ImportsResolver.ImportResolver(trace, true);
public void addDefaultImports(@NotNull WritableScope rootScope, @NotNull Collection<JetImportDirective> directives) {
for (String defaultJetImport : DEFAULT_JET_IMPORTS) {
importResolver.processImportReference(JetPsiFactory.createImportDirective(project, defaultJetImport), rootScope, importer);
directives.add(JetPsiFactory.createImportDirective(project, defaultJetImport));
}
}
@@ -20,7 +20,6 @@ import com.google.common.collect.Lists;
import com.intellij.openapi.util.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.types.JetType;
@@ -30,13 +29,21 @@ import java.util.List;
/**
* @author svtk
*/
public interface Importer {
/*package*/ interface Importer {
void addAllUnderImport(@NotNull DeclarationDescriptor descriptor);
void addAliasImport(@NotNull DeclarationDescriptor descriptor, @NotNull String aliasName);
void addScopeImport(@NotNull JetScope scope);
Importer DO_NOTHING = new Importer() {
@Override
public void addAllUnderImport(@NotNull DeclarationDescriptor descriptor) {
}
@Override
public void addAliasImport(@NotNull DeclarationDescriptor descriptor, @NotNull String aliasName) {
}
};
class StandardImporter implements Importer {
private final WritableScope namespaceScope;
@@ -57,15 +64,6 @@ public interface Importer {
importDeclarationAlias(descriptor, aliasName);
}
@Override
public void addScopeImport(@NotNull JetScope scope) {
importScope(scope);
}
protected void importScope(@NotNull JetScope scope) {
namespaceScope.importScope(scope);
}
protected void importAllUnderDeclaration(@NotNull DeclarationDescriptor descriptor) {
if (descriptor instanceof NamespaceDescriptor) {
namespaceScope.importScope(((NamespaceDescriptor) descriptor).getMemberScope());
@@ -112,7 +110,6 @@ public interface Importer {
}
class DelayedImporter extends StandardImporter {
private final List<JetScope> scopesToImport = Lists.newArrayList();
private final List<Pair<DeclarationDescriptor, String>> imports = Lists.newArrayList();
public DelayedImporter(@NotNull WritableScope namespaceScope, boolean firstPhase) {
@@ -129,15 +126,7 @@ public interface Importer {
imports.add(Pair.create(descriptor, aliasName));
}
@Override
public void addScopeImport(@NotNull JetScope scope) {
scopesToImport.add(scope);
}
public void processImports() {
for (JetScope scope : scopesToImport) {
importScope(scope);
}
for (Pair<DeclarationDescriptor, String> anImport : imports) {
DeclarationDescriptor descriptor = anImport.getFirst();
String aliasName = anImport.getSecond();
@@ -151,5 +140,4 @@ public interface Importer {
}
}
}
}
@@ -24,8 +24,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.resolve.scopes.*;
import org.jetbrains.jet.lang.types.JetType;
import java.util.Collection;
@@ -55,15 +54,20 @@ public class ImportsResolver {
}
private void processImports(boolean firstPhase) {
ImportResolver importResolver = new ImportResolver(context.getTrace(), firstPhase);
SingleImportResolver importResolver = new SingleImportResolver(context.getTrace(), firstPhase);
SingleImportResolver defaultImportResolver = new SingleImportResolver(TemporaryBindingTrace.create(context.getTrace()), firstPhase);//not to trace errors of default imports
for (JetFile file : context.getNamespaceDescriptors().keySet()) {
WritableScope namespaceScope = context.getNamespaceScopes().get(file);
Importer.DelayedImporter delayedImporter = new Importer.DelayedImporter(namespaceScope, firstPhase);
if (!firstPhase) {
namespaceScope.clearImports();
}
context.getConfiguration().addDefaultImports(context.getTrace(), namespaceScope, delayedImporter);
Map<JetImportDirective, DeclarationDescriptor> resolvedDirectives = Maps.newHashMap();
Collection<JetImportDirective> defaultImportDirectives = Lists.newArrayList();
context.getConfiguration().addDefaultImports(namespaceScope, defaultImportDirectives);
for (JetImportDirective defaultImportDirective : defaultImportDirectives) {
defaultImportResolver.processImportReference(defaultImportDirective, namespaceScope, delayedImporter);
}
List<JetImportDirective> importDirectives = file.getImportDirectives();
for (JetImportDirective importDirective : importDirectives) {
@@ -133,13 +137,18 @@ public class ImportsResolver {
}
}
public static class ImportResolver {
public static Collection<? extends DeclarationDescriptor> analyseImportReference(@NotNull JetImportDirective importDirective, @NotNull JetScope scope, @NotNull BindingTrace trace) {
ImportsResolver.SingleImportResolver importResolver = new ImportsResolver.SingleImportResolver(trace, false);
return importResolver.processImportReference(importDirective, scope, Importer.DO_NOTHING);
}
private static class SingleImportResolver {
private final BindingTrace trace;
/* On first phase all classes and objects are imported,
on second phase previous imports are thrown and everything (including functions and properties at namespace level) is imported */
private final boolean firstPhase;
public ImportResolver(BindingTrace trace, boolean firstPhase) {
public SingleImportResolver(BindingTrace trace, boolean firstPhase) {
this.trace = trace;
this.firstPhase = firstPhase;
}
@@ -182,15 +182,9 @@ public class ExpressionTypingUtils {
@NotNull JetType receiverType,
@NotNull JetScope scope) {
WritableScopeWithImports writableScopeWithImports = new WritableScopeImpl(
scope, scope.getContainingDeclaration(), RedeclarationHandler.DO_NOTHING);
JetImportDirective importDirective = JetPsiFactory.createImportDirective(project, callableFQN);
ImportsResolver.ImportResolver importResolver = new ImportsResolver.ImportResolver(new BindingTraceContext(), false);
Collection<? extends DeclarationDescriptor> declarationDescriptors = importResolver.processImportReference(
importDirective, scope,
new Importer.StandardImporter(writableScopeWithImports, false));
Collection<? extends DeclarationDescriptor> declarationDescriptors = ImportsResolver.analyseImportReference(importDirective, scope, new BindingTraceContext());
List<CallableDescriptor> callableExtensionDescriptors = new ArrayList<CallableDescriptor>();
ReceiverDescriptor receiverDescriptor = new ExpressionReceiver(receiverExpression, receiverType);
@@ -27,12 +27,14 @@ import org.jetbrains.jet.lang.JetSemanticServices;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetImportDirective;
import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.k2js.config.Config;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -118,10 +120,9 @@ public final class AnalyzerFacadeForJS {
}
@Override
public void addDefaultImports(@NotNull BindingTrace trace, @NotNull WritableScope rootScope,
@NotNull Importer importer) {
ImportsResolver.ImportResolver importResolver = new ImportsResolver.ImportResolver(trace, true);
importResolver.processImportReference(JetPsiFactory.createImportDirective(project, "js.*"), rootScope, importer);
public void addDefaultImports(@NotNull WritableScope rootScope,
@NotNull Collection<JetImportDirective> directives) {
directives.add(JetPsiFactory.createImportDirective(project, "js.*"));
}
@Override