Supporting (predefined) classifier aliases in Lazy Resolve
This commit is contained in:
@@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve.lazy;
|
|||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
|
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
|
||||||
@@ -64,6 +65,13 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<NamespaceDes
|
|||||||
return namespaceDescriptor;
|
return namespaceDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassifierDescriptor getClassifier(@NotNull Name name) {
|
||||||
|
// TODO: creating an FqName every time may be a performance problem
|
||||||
|
Name actualName = resolveSession.resolveClassifierAlias(DescriptorUtils.getFQName(thisDescriptor).toSafe(), name);
|
||||||
|
return super.getClassifier(actualName);
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
protected JetScope getScopeForMemberDeclarationResolution(JetDeclaration declaration) {
|
protected JetScope getScopeForMemberDeclarationResolution(JetDeclaration declaration) {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import com.google.common.collect.Maps;
|
|||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.util.PsiTreeUtil;
|
import com.intellij.psi.util.PsiTreeUtil;
|
||||||
|
import com.intellij.util.Function;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.di.InjectorForLazyResolve;
|
import org.jetbrains.jet.di.InjectorForLazyResolve;
|
||||||
@@ -45,6 +46,14 @@ import java.util.Map;
|
|||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class ResolveSession {
|
public class ResolveSession {
|
||||||
|
private static final Function<FqName, Name> NO_ALIASES = new Function<FqName, Name>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Name fun(FqName name) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private final ModuleDescriptor module;
|
private final ModuleDescriptor module;
|
||||||
private final LazyPackageDescriptor rootPackage;
|
private final LazyPackageDescriptor rootPackage;
|
||||||
|
|
||||||
@@ -58,6 +67,7 @@ public class ResolveSession {
|
|||||||
private final ModuleConfiguration moduleConfiguration;
|
private final ModuleConfiguration moduleConfiguration;
|
||||||
|
|
||||||
private final Map<JetEnumEntry, ClassDescriptor> enumEntryClassDescriptorCache = Maps.newHashMap();
|
private final Map<JetEnumEntry, ClassDescriptor> enumEntryClassDescriptorCache = Maps.newHashMap();
|
||||||
|
private final Function<FqName, Name> classifierAliases;
|
||||||
|
|
||||||
public ResolveSession(
|
public ResolveSession(
|
||||||
@NotNull Project project,
|
@NotNull Project project,
|
||||||
@@ -65,7 +75,7 @@ public class ResolveSession {
|
|||||||
@NotNull ModuleConfiguration moduleConfiguration,
|
@NotNull ModuleConfiguration moduleConfiguration,
|
||||||
@NotNull DeclarationProviderFactory declarationProviderFactory
|
@NotNull DeclarationProviderFactory declarationProviderFactory
|
||||||
) {
|
) {
|
||||||
this(project, rootDescriptor, moduleConfiguration, declarationProviderFactory, Predicates.<FqNameUnsafe>alwaysFalse());
|
this(project, rootDescriptor, moduleConfiguration, declarationProviderFactory, NO_ALIASES, Predicates.<FqNameUnsafe>alwaysFalse());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated // Internal use only
|
@Deprecated // Internal use only
|
||||||
@@ -74,8 +84,10 @@ public class ResolveSession {
|
|||||||
@NotNull ModuleDescriptor rootDescriptor,
|
@NotNull ModuleDescriptor rootDescriptor,
|
||||||
@NotNull ModuleConfiguration moduleConfiguration,
|
@NotNull ModuleConfiguration moduleConfiguration,
|
||||||
@NotNull DeclarationProviderFactory declarationProviderFactory,
|
@NotNull DeclarationProviderFactory declarationProviderFactory,
|
||||||
|
@NotNull Function<FqName, Name> classifierAliases,
|
||||||
@NotNull Predicate<FqNameUnsafe> specialClasses
|
@NotNull Predicate<FqNameUnsafe> specialClasses
|
||||||
) {
|
) {
|
||||||
|
this.classifierAliases = classifierAliases;
|
||||||
this.specialClasses = specialClasses;
|
this.specialClasses = specialClasses;
|
||||||
this.injector = new InjectorForLazyResolve(project, this, trace);
|
this.injector = new InjectorForLazyResolve(project, this, trace);
|
||||||
this.module = rootDescriptor;
|
this.module = rootDescriptor;
|
||||||
@@ -303,4 +315,14 @@ public class ResolveSession {
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
/*package*/ Name resolveClassifierAlias(@NotNull FqName packageName, @NotNull Name alias) {
|
||||||
|
// TODO: creating a new FqName object every time...
|
||||||
|
Name actualName = classifierAliases.fun(packageName.child(alias));
|
||||||
|
if (actualName == null) {
|
||||||
|
return alias;
|
||||||
|
}
|
||||||
|
return actualName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+111
@@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 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.resolve.lazy;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicates;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import com.intellij.openapi.util.io.FileUtil;
|
||||||
|
import com.intellij.util.Function;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.jvm.compiler.NamespaceComparator;
|
||||||
|
import org.jetbrains.jet.lang.DefaultModuleConfiguration;
|
||||||
|
import org.jetbrains.jet.lang.ModuleConfiguration;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
||||||
|
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.BindingTrace;
|
||||||
|
import org.jetbrains.jet.lang.resolve.ImportPath;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
||||||
|
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author abreslav
|
||||||
|
*/
|
||||||
|
public class LazyResolveBuiltinClassesTest extends AbstractLazyResolveTest {
|
||||||
|
@Test
|
||||||
|
public void testJetStandardLibrary() throws Exception {
|
||||||
|
List<JetFile> files = Lists.newArrayList();
|
||||||
|
addJetFilesFromDir(files, new File("compiler/frontend/src/jet"));
|
||||||
|
addJetFilesFromDir(files, new File("compiler/frontend/src/jet.src"));
|
||||||
|
|
||||||
|
final Map<FqName, Name> aliases = ImmutableMap.<FqName, Name>builder()
|
||||||
|
.put(new FqName("jet.Unit"), Name.identifier("Tuple0"))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("<lazy module>"));
|
||||||
|
ResolveSession session = new ResolveSession(
|
||||||
|
project,
|
||||||
|
lazyModule,
|
||||||
|
new SpecialModuleConfiguration(),
|
||||||
|
new FileBasedDeclarationProviderFactory(files),
|
||||||
|
new Function<FqName, Name>() {
|
||||||
|
@Override
|
||||||
|
public Name fun(FqName name) {
|
||||||
|
return aliases.get(name);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Predicates.in(Sets.newHashSet(new FqNameUnsafe("jet.Any"), new FqNameUnsafe("jet.Nothing"))));
|
||||||
|
|
||||||
|
NamespaceDescriptor jetNamespaceFromJSL =
|
||||||
|
(NamespaceDescriptor) JetStandardLibrary.getInstance().getInt().getContainingDeclaration();
|
||||||
|
NamespaceDescriptor jetNamespaceFromLazy = lazyModule.getRootNamespace().getMemberScope().getNamespace(
|
||||||
|
jetNamespaceFromJSL.getName());
|
||||||
|
|
||||||
|
NamespaceComparator.compareNamespaces(jetNamespaceFromJSL, jetNamespaceFromLazy,
|
||||||
|
true, Predicates.<NamespaceDescriptor>alwaysTrue(),
|
||||||
|
new File("compiler/testData/builtin-classes.txt"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addJetFilesFromDir(List<JetFile> files, File jetDir) throws IOException {
|
||||||
|
for (File file : jetDir.listFiles()) {
|
||||||
|
if (FileUtil.getExtension(file.getName()).equals("jet")) {
|
||||||
|
files.add(JetPsiFactory.createFile(project, file.getName(), FileUtil.loadFile(file, true)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SpecialModuleConfiguration implements ModuleConfiguration {
|
||||||
|
@Override
|
||||||
|
public void addDefaultImports(@NotNull Collection<JetImportDirective> directives) {
|
||||||
|
for (ImportPath defaultJetImport : DefaultModuleConfiguration.DEFAULT_JET_IMPORTS) {
|
||||||
|
directives.add(JetPsiFactory.createImportDirective(project, defaultJetImport));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void extendNamespaceScope(@NotNull BindingTrace trace,
|
||||||
|
@NotNull NamespaceDescriptor namespaceDescriptor,
|
||||||
|
@NotNull WritableScope namespaceMemberScope) {
|
||||||
|
// DO nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user