Introducing dependency kinds to prioritize package fragments

This commit is contained in:
Andrey Breslav
2014-01-10 17:25:11 +04:00
parent 935fae70ea
commit df88e3e625
15 changed files with 76 additions and 30 deletions
@@ -43,6 +43,7 @@ import org.jetbrains.jet.codegen.KotlinCodegenFacade;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
import org.jetbrains.jet.lang.descriptors.DependencyKind;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.PackageLikeBuilderDummy;
@@ -73,6 +74,9 @@ import java.util.List;
import static org.jetbrains.jet.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClasses;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.registerClassNameForScript;
import static org.jetbrains.jet.lang.descriptors.DependencyKind.BINARIES;
import static org.jetbrains.jet.lang.descriptors.DependencyKind.BUILT_INS;
import static org.jetbrains.jet.lang.descriptors.DependencyKind.SOURCES;
public class ReplInterpreter {
@@ -103,9 +107,9 @@ public class ReplInterpreter {
true,
Collections.<AnalyzerScriptParameter>emptyList());
injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module);
module.addFragmentProvider(injector.getTopDownAnalyzer().getPackageFragmentProvider());
module.addFragmentProvider(KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
module.addFragmentProvider(injector.getJavaDescriptorResolver().getPackageFragmentProvider());
module.addFragmentProvider(SOURCES, injector.getTopDownAnalyzer().getPackageFragmentProvider());
module.addFragmentProvider(BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
module.addFragmentProvider(BINARIES, injector.getJavaDescriptorResolver().getPackageFragmentProvider());
List<URL> classpath = Lists.newArrayList();
@@ -18,13 +18,14 @@ package org.jetbrains.jet.di;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.DependencyKind;
import org.jetbrains.jet.lang.resolve.BindingTrace;
public class InjectorForJavaDescriptorResolverUtil {
@NotNull
public static InjectorForJavaDescriptorResolver create(@NotNull Project project, @NotNull BindingTrace bindingTrace) {
InjectorForJavaDescriptorResolver injector = new InjectorForJavaDescriptorResolver(project, bindingTrace);
injector.getModule().addFragmentProvider(injector.getJavaDescriptorResolver().getPackageFragmentProvider());
injector.getModule().addFragmentProvider(DependencyKind.BINARIES, injector.getJavaDescriptorResolver().getPackageFragmentProvider());
return injector;
}
}
@@ -28,6 +28,7 @@ import org.jetbrains.jet.analyzer.AnalyzerFacadeForEverything;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
import org.jetbrains.jet.lang.descriptors.DependencyKind;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetFile;
@@ -110,7 +111,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
ModuleDescriptorImpl module = injector.getModule();
if (addBuiltIns) {
module.addFragmentProvider(KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
module.addFragmentProvider(DependencyKind.BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
}
return new ResolveSession(project, storageManager, module, declarationProviderFactory, trace);
@@ -196,7 +197,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module);
try {
module.addFragmentProvider(injector.getJavaDescriptorResolver().getPackageFragmentProvider());
module.addFragmentProvider(DependencyKind.BINARIES, injector.getJavaDescriptorResolver().getPackageFragmentProvider());
injector.getTopDownAnalyzer().analyzeFiles(files, scriptParameters);
BodiesResolveContext bodiesResolveContext = storeContextForBodiesResolve ?
new CachedBodiesResolveContext(injector.getTopDownAnalysisContext()) :
@@ -212,10 +212,10 @@ public class TopDownAnalyzer {
public void analyzeFiles(
@NotNull Collection<JetFile> files,
@NotNull List<AnalyzerScriptParameter> scriptParameters) {
((ModuleDescriptorImpl) moduleDescriptor).addFragmentProvider(packageFragmentProvider);
((ModuleDescriptorImpl) moduleDescriptor).addFragmentProvider(DependencyKind.SOURCES, packageFragmentProvider);
// "depend on" builtins module
((ModuleDescriptorImpl) moduleDescriptor).addFragmentProvider(KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
((ModuleDescriptorImpl) moduleDescriptor).addFragmentProvider(DependencyKind.BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
// Import a scope that contains all top-level packages that come from dependencies
// This makes the package visible at all, does not import themselves
@@ -148,7 +148,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
return packageDescriptor.getDeclarationProvider().getAllDeclaredPackages();
}
};
rootDescriptor.addFragmentProvider(packageFragmentProvider);
rootDescriptor.addFragmentProvider(DependencyKind.SOURCES, packageFragmentProvider);
}
@NotNull
@@ -48,6 +48,7 @@ import org.jetbrains.jet.codegen.forTestCompile.ForTestPackJdkAnnotations;
import org.jetbrains.jet.config.CommonConfigurationKeys;
import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.descriptors.DependencyKind;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor;
import org.jetbrains.jet.lang.diagnostics.Diagnostic;
@@ -716,7 +717,7 @@ public class JetTestUtils {
public static MutablePackageFragmentDescriptor createTestPackageFragment(@NotNull Name testPackageName, @NotNull String moduleName) {
ModuleDescriptorImpl module = AnalyzerFacadeForJVM.createJavaModule(moduleName);
MutablePackageFragmentProvider provider = new MutablePackageFragmentProvider(module);
module.addFragmentProvider(provider);
module.addFragmentProvider(DependencyKind.SOURCES, provider);
return provider.getOrCreateFragment(FqName.topLevel(testPackageName));
}
@@ -33,10 +33,7 @@ import org.jetbrains.jet.config.CommonConfigurationKeys;
import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.test.TestCaseWithTmpdir;
import org.jetbrains.jet.test.util.RecursiveDescriptorComparator;
@@ -148,7 +145,7 @@ public abstract class AbstractLoadJavaTest extends TestCaseWithTmpdir {
trace,
module);
module.addFragmentProvider(injectorForAnalyzer.getJavaDescriptorResolver().getPackageFragmentProvider());
module.addFragmentProvider(DependencyKind.BINARIES, injectorForAnalyzer.getJavaDescriptorResolver().getPackageFragmentProvider());
injectorForAnalyzer.getTopDownAnalyzer().analyzeFiles(environment.getSourceFiles(), Collections.<AnalyzerScriptParameter>emptyList());
@@ -52,7 +52,7 @@ public abstract class AbstractLazyResolveDescriptorRendererTest extends KotlinTe
Collection<JetFile> files = Lists.newArrayList(psiFile);
final ModuleDescriptorImpl lazyModule = AnalyzerFacadeForJVM.createJavaModule("<lazy module>");
lazyModule.addFragmentProvider(KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
lazyModule.addFragmentProvider(DependencyKind.BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
LockBasedLazyResolveStorageManager storageManager = new LockBasedLazyResolveStorageManager();
final ResolveSession resolveSession = new ResolveSession(getProject(), storageManager, lazyModule,
new FileBasedDeclarationProviderFactory(storageManager, files));
@@ -28,6 +28,7 @@ import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzer;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
import org.jetbrains.jet.lang.descriptors.DependencyKind;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetFile;
@@ -59,7 +60,7 @@ public class LazyResolveTestUtil {
InjectorForTopDownAnalyzerForJvm injector =
new InjectorForTopDownAnalyzerForJvm(environment.getProject(), params, sharedTrace, sharedModule);
sharedModule.addFragmentProvider(injector.getJavaDescriptorResolver().getPackageFragmentProvider());
sharedModule.addFragmentProvider(DependencyKind.BINARIES, injector.getJavaDescriptorResolver().getPackageFragmentProvider());
return injector;
}
@@ -28,10 +28,7 @@ import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil;
import org.jetbrains.jet.di.InjectorForTests;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.ReceiverParameterDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetPsiFactory;
@@ -591,7 +588,7 @@ public class JetTypeCheckerTest extends JetLiteFixture {
InjectorForJavaDescriptorResolver injector = InjectorForJavaDescriptorResolverUtil.create(getProject(), new BindingTraceContext());
JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver();
ModuleDescriptorImpl module = (ModuleDescriptorImpl) javaDescriptorResolver.getModule();
module.addFragmentProvider(KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
module.addFragmentProvider(DependencyKind.BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
for (ImportPath defaultImport : module.getDefaultImports()) {
writableScope.importScope(module.getPackage(defaultImport.fqnPart()).getMemberScope());
}
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.descriptors;
public enum DependencyKind {
// Using this class is supposed to be a temporary measure before we switch to full-blown support for module dependency ordering
SOURCES,
BUILT_INS,
BINARIES
}
@@ -17,6 +17,7 @@
package org.jetbrains.jet.lang.descriptors;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.intellij.openapi.diagnostic.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -30,12 +31,13 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.TypeSubstitutor;
import java.util.Collections;
import java.util.List;
import java.util.*;
public class ModuleDescriptorImpl extends DeclarationDescriptorImpl implements ModuleDescriptor {
private static final Logger LOG = Logger.getInstance(ModuleDescriptorImpl.class);
private final Map<DependencyKind, List<PackageFragmentProvider>> prioritizedFragmentProviders = Maps.newHashMap();
private final List<PackageFragmentProvider> fragmentProviders = Lists.newArrayList();
private final CompositePackageFragmentProvider packageFragmentProvider = new CompositePackageFragmentProvider(fragmentProviders);
private final List<ImportPath> defaultImports;
@@ -54,11 +56,27 @@ public class ModuleDescriptorImpl extends DeclarationDescriptorImpl implements M
this.platformToKotlinClassMap = platformToKotlinClassMap;
}
public void addFragmentProvider(@NotNull PackageFragmentProvider provider) {
public void addFragmentProvider(@NotNull DependencyKind dependencyKind, @NotNull PackageFragmentProvider provider) {
if (fragmentProviders.contains(provider)) {
LOG.error("Trying to add already present fragment provider: " + provider);
}
fragmentProviders.add(provider);
List<PackageFragmentProvider> providers = prioritizedFragmentProviders.get(dependencyKind);
if (providers == null) {
providers = new ArrayList<PackageFragmentProvider>(1);
prioritizedFragmentProviders.put(dependencyKind, providers);
}
providers.add(provider);
buildProvidersList();
}
private void buildProvidersList() {
fragmentProviders.clear();
for (DependencyKind dependencyKind : DependencyKind.values()) {
List<PackageFragmentProvider> providers = prioritizedFragmentProviders.get(dependencyKind);
if (providers != null) {
fragmentProviders.addAll(providers);
}
}
}
@Override
@@ -128,7 +128,7 @@ public class KotlinBuiltIns {
Collections.<ImportPath>emptyList(),
PlatformToKotlinClassMap.EMPTY);
builtinsPackageFragment = new BuiltinsPackageFragment(new LockBasedStorageManager(), builtInsModule);
builtInsModule.addFragmentProvider(builtinsPackageFragment.getProvider());
builtInsModule.addFragmentProvider(DependencyKind.SOURCES, builtinsPackageFragment.getProvider());
this.functionClassesSet = computeIndexedClasses("Function", FUNCTION_TRAIT_COUNT);
this.extensionFunctionClassesSet = computeIndexedClasses("ExtensionFunction", FUNCTION_TRAIT_COUNT);
@@ -45,6 +45,7 @@ import org.jetbrains.jet.codegen.binding.PsiCodegenPredictor;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DependencyKind;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
@@ -225,7 +226,7 @@ public class JetSourceNavigationHelper {
AnalyzerFacadeForJVM.DEFAULT_IMPORTS,
PlatformToKotlinClassMap.EMPTY);
moduleDescriptor.addFragmentProvider(KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
moduleDescriptor.addFragmentProvider(DependencyKind.BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
KotlinCodeAnalyzer analyzer = new ResolveSession(
project,
@@ -27,6 +27,7 @@ import org.jetbrains.jet.analyzer.AnalyzeExhaust;
import org.jetbrains.jet.analyzer.AnalyzerFacadeForEverything;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJs;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.descriptors.DependencyKind;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetFile;
@@ -93,7 +94,7 @@ public final class AnalyzerFacadeForJS {
ModuleDescriptor libraryModule = config.getLibraryModule();
if (libraryModule != null) {
owner.addFragmentProvider(libraryModule.getPackageFragmentProvider()); // "import" analyzed library module
owner.addFragmentProvider(DependencyKind.BINARIES, libraryModule.getPackageFragmentProvider()); // "import" analyzed library module
}
BindingContext libraryContext = config.getLibraryContext();
@@ -155,7 +156,7 @@ public final class AnalyzerFacadeForJS {
FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(
storageManager, Config.withJsLibAdded(files, config), Predicates.<FqName>alwaysFalse());
ModuleDescriptorImpl module = createJsModule("<lazy module>");
module.addFragmentProvider(KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
module.addFragmentProvider(DependencyKind.BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
return new ResolveSession(config.getProject(), storageManager, module, declarationProviderFactory);
}