Big refactoring continued. Migrating to package views and fragments.

This commit is contained in:
Evgeny Gerashchenko
2013-10-30 11:20:09 +04:00
parent 577fb25777
commit 19d8f1394b
24 changed files with 59 additions and 130 deletions
@@ -101,14 +101,6 @@ public class BindingContextUtils {
return (JetFile) containingFile; return (JetFile) containingFile;
} }
// TODO these helper methods are added as a workaround to some compiler bugs in Kotlin...
// NOTE this is used by KDoc
@Nullable
public static NamespaceDescriptor namespaceDescriptor(@NotNull BindingContext context, @NotNull JetFile source) {
return context.get(BindingContext.FILE_TO_NAMESPACE, source);
}
@Nullable @Nullable
private static PsiElement doGetDescriptorToDeclaration(@NotNull BindingContext context, @NotNull DeclarationDescriptor descriptor) { private static PsiElement doGetDescriptorToDeclaration(@NotNull BindingContext context, @NotNull DeclarationDescriptor descriptor) {
return context.get(DESCRIPTOR_TO_DECLARATION, descriptor); return context.get(DESCRIPTOR_TO_DECLARATION, descriptor);
@@ -22,7 +22,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@@ -51,7 +51,7 @@ public class LibrarySourceHacks {
if (!(original instanceof CallableMemberDescriptor)) { if (!(original instanceof CallableMemberDescriptor)) {
return false; return false;
} }
if (!(original.getContainingDeclaration() instanceof NamespaceDescriptor)) { if (!(original.getContainingDeclaration() instanceof PackageFragmentDescriptor)) {
return false; return false;
} }
@@ -111,7 +111,7 @@ public class DataFlowValueFactory {
} }
@NotNull @NotNull
private static IdentifierInfo createNamespaceInfo(Object id) { private static IdentifierInfo createPackageInfo(Object id) {
return new IdentifierInfo(id, true, true); return new IdentifierInfo(id, true, true);
} }
@@ -156,7 +156,7 @@ public class DataFlowValueFactory {
return getIdForThisReceiver(declarationDescriptor); return getIdForThisReceiver(declarationDescriptor);
} }
else if (expression instanceof JetRootNamespaceExpression) { else if (expression instanceof JetRootNamespaceExpression) {
return createNamespaceInfo(JetModuleUtil.getRootNamespaceType(expression)); return createPackageInfo(JetModuleUtil.getRootNamespaceType(expression));
} }
return NO_IDENTIFIER_INFO; return NO_IDENTIFIER_INFO;
} }
@@ -179,8 +179,8 @@ public class DataFlowValueFactory {
VariableDescriptor variableDescriptor = (VariableDescriptor) declarationDescriptor; VariableDescriptor variableDescriptor = (VariableDescriptor) declarationDescriptor;
return combineInfo(receiverInfo, createInfo(variableDescriptor, isStableVariable(variableDescriptor))); return combineInfo(receiverInfo, createInfo(variableDescriptor, isStableVariable(variableDescriptor)));
} }
if (declarationDescriptor instanceof NamespaceDescriptor) { if (declarationDescriptor instanceof PackageViewDescriptor) {
return createNamespaceInfo(declarationDescriptor); return createPackageInfo(declarationDescriptor);
} }
return NO_IDENTIFIER_INFO; return NO_IDENTIFIER_INFO;
} }
@@ -186,21 +186,6 @@ public class WriteThroughScope extends WritableScopeWithImports {
writableWorker.addFunctionAlias(name, functionDescriptor); writableWorker.addFunctionAlias(name, functionDescriptor);
} }
@Override
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
checkMayWrite();
writableWorker.addNamespace(namespaceDescriptor);
}
@Override
@Nullable
public NamespaceDescriptor getDeclaredNamespace(@NotNull Name name) {
checkMayRead();
return writableWorker.getDeclaredNamespace(name);
}
@NotNull @NotNull
@Override @Override
public Multimap<Name, DeclarationDescriptor> getDeclaredDescriptorsAccessibleBySimpleName() { public Multimap<Name, DeclarationDescriptor> getDeclaredDescriptorsAccessibleBySimpleName() {
@@ -105,15 +105,15 @@ public class JdkAnnotationsValidityTest extends UsefulTestCase {
int chunkStart = chunkIndex * CLASSES_IN_CHUNK; int chunkStart = chunkIndex * CLASSES_IN_CHUNK;
for (FqName javaClass : affectedClasses.subList(chunkStart, Math.min(chunkStart + CLASSES_IN_CHUNK, affectedClasses.size()))) { for (FqName javaClass : affectedClasses.subList(chunkStart, Math.min(chunkStart + CLASSES_IN_CHUNK, affectedClasses.size()))) {
ClassDescriptor topLevelClass = javaDescriptorResolver.resolveClass(javaClass, IGNORE_KOTLIN_SOURCES); ClassDescriptor topLevelClass = javaDescriptorResolver.resolveClass(javaClass, IGNORE_KOTLIN_SOURCES);
NamespaceDescriptor topLevelNamespace = javaDescriptorResolver.resolveNamespace(javaClass, IGNORE_KOTLIN_SOURCES); PackageViewDescriptor topLevelPackage = javaDescriptorResolver.getPackageFragmentProvider().getModule().getPackage(javaClass);
if (topLevelClass == null) { if (topLevelClass == null) {
continue; continue;
} }
topLevelClass.acceptVoid(visitor); topLevelClass.acceptVoid(visitor);
if (topLevelNamespace != null) { if (topLevelPackage != null) {
topLevelNamespace.acceptVoid(visitor); topLevelPackage.acceptVoid(visitor);
} }
} }
} }
@@ -21,7 +21,6 @@ import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.checkers.AbstractJetDiagnosticsTest; import org.jetbrains.jet.checkers.AbstractJetDiagnosticsTest;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor; import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -22,7 +22,6 @@ import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor; import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.psi.JetPsiFactory;
@@ -22,7 +22,6 @@ import org.jetbrains.jet.KotlinTestWithEnvironmentManagement;
import org.jetbrains.jet.TestJdkKind; import org.jetbrains.jet.TestJdkKind;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor; import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider; import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -56,13 +55,6 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
return classResolver.resolveClass(qualifiedName, IGNORE_KOTLIN_SOURCES); return classResolver.resolveClass(qualifiedName, IGNORE_KOTLIN_SOURCES);
} }
@Deprecated
@Nullable
public NamespaceDescriptor resolveNamespace(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
// TODO 1 remove this method
return null;
}
@NotNull @NotNull
public JavaPackageFragmentProvider getPackageFragmentProvider() { public JavaPackageFragmentProvider getPackageFragmentProvider() {
return packageFragmentProvider; return packageFragmentProvider;
@@ -291,6 +291,16 @@ public final class JavaFunctionResolver {
return findClassInPackage(parentPackage, fragment.getFqName().shortName()); return findClassInPackage(parentPackage, fragment.getFqName().shortName());
} }
@Nullable
public static JavaPackageFragmentDescriptor getPackageForCorrespondingJavaClass(@NotNull JavaClassDescriptor javaClass) {
PackageFragmentDescriptor packageFragment = DescriptorUtils.getParentOfType(javaClass, PackageFragmentDescriptor.class);
assert packageFragment instanceof JavaPackageFragmentDescriptor :
"java class " + javaClass + " is under non-java fragment: " + packageFragment;
JavaPackageFragmentProvider provider = ((JavaPackageFragmentDescriptor) packageFragment).getProvider();
return provider.getOrCreatePackage(getFQName(javaClass).toSafe());
}
@Nullable @Nullable
public static SamConstructorDescriptor resolveSamConstructor(@NotNull JavaPackageFragmentDescriptor owner, @NotNull NamedMembers namedMembers) { public static SamConstructorDescriptor resolveSamConstructor(@NotNull JavaPackageFragmentDescriptor owner, @NotNull NamedMembers namedMembers) {
if (namedMembers.getSamInterface() != null) { if (namedMembers.getSamInterface() != null) {
@@ -19,10 +19,8 @@ package org.jetbrains.jet.lang;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import java.util.List; import java.util.List;
@@ -39,8 +37,5 @@ public class DefaultModuleConfiguration implements ModuleConfiguration {
@Override @Override
public void extendNamespaceScope(@NotNull NamespaceDescriptor namespaceDescriptor, @NotNull WritableScope namespaceMemberScope) { public void extendNamespaceScope(@NotNull NamespaceDescriptor namespaceDescriptor, @NotNull WritableScope namespaceMemberScope) {
if (DescriptorUtils.getFQName(namespaceDescriptor).equalsTo(KotlinBuiltIns.getInstance().getBuiltInsPackageFqName())) {
namespaceMemberScope.importScope(KotlinBuiltIns.getInstance().getBuiltInsScope());
}
} }
} }
@@ -51,12 +51,6 @@ public interface WritableScope extends JetScope {
void addVariableAlias(@NotNull Name name, @NotNull VariableDescriptor variableDescriptor); void addVariableAlias(@NotNull Name name, @NotNull VariableDescriptor variableDescriptor);
void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor);
@Deprecated
@Nullable
NamespaceDescriptor getDeclaredNamespace(@NotNull Name name);
@NotNull Multimap<Name, DeclarationDescriptor> getDeclaredDescriptorsAccessibleBySimpleName(); @NotNull Multimap<Name, DeclarationDescriptor> getDeclaredDescriptorsAccessibleBySimpleName();
void importScope(@NotNull JetScope imported); void importScope(@NotNull JetScope imported);
@@ -49,7 +49,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
private SetMultimap<Name, FunctionDescriptor> functionGroups; private SetMultimap<Name, FunctionDescriptor> functionGroups;
@Nullable @Nullable
private Map<Name, DeclarationDescriptor> variableClassOrNamespaceDescriptors; private Map<Name, DeclarationDescriptor> variableOrClassDescriptors;
@Nullable @Nullable
private SetMultimap<Name, VariableDescriptor> propertyGroups; private SetMultimap<Name, VariableDescriptor> propertyGroups;
@@ -180,11 +180,11 @@ public class WritableScopeImpl extends WritableScopeWithImports {
} }
@NotNull @NotNull
private Map<Name, DeclarationDescriptor> getVariableClassOrNamespaceDescriptors() { private Map<Name, DeclarationDescriptor> getVariableOrClassDescriptors() {
if (variableClassOrNamespaceDescriptors == null) { if (variableOrClassDescriptors == null) {
variableClassOrNamespaceDescriptors = Maps.newHashMap(); variableOrClassDescriptors = Maps.newHashMap();
} }
return variableClassOrNamespaceDescriptors; return variableOrClassDescriptors;
} }
@NotNull @NotNull
@@ -216,7 +216,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
if (variableDescriptor.getReceiverParameter() == null) { if (variableDescriptor.getReceiverParameter() == null) {
checkForRedeclaration(name, variableDescriptor); checkForRedeclaration(name, variableDescriptor);
// TODO : Should this always happen? // TODO : Should this always happen?
getVariableClassOrNamespaceDescriptors().put(name, variableDescriptor); getVariableOrClassDescriptors().put(name, variableDescriptor);
} }
allDescriptors.add(variableDescriptor); allDescriptors.add(variableDescriptor);
addToDeclared(variableDescriptor); addToDeclared(variableDescriptor);
@@ -240,7 +240,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
public VariableDescriptor getLocalVariable(@NotNull Name name) { public VariableDescriptor getLocalVariable(@NotNull Name name) {
checkMayRead(); checkMayRead();
Map<Name, DeclarationDescriptor> variableClassOrNamespaceDescriptors = getVariableClassOrNamespaceDescriptors(); Map<Name, DeclarationDescriptor> variableClassOrNamespaceDescriptors = getVariableOrClassDescriptors();
DeclarationDescriptor descriptor = variableClassOrNamespaceDescriptors.get(name); DeclarationDescriptor descriptor = variableClassOrNamespaceDescriptors.get(name);
if (descriptor instanceof VariableDescriptor && !getPropertyGroups().get(name).contains(descriptor)) { if (descriptor instanceof VariableDescriptor && !getPropertyGroups().get(name).contains(descriptor)) {
return (VariableDescriptor) descriptor; return (VariableDescriptor) descriptor;
@@ -311,7 +311,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
checkMayWrite(); checkMayWrite();
checkForRedeclaration(name, classifierDescriptor); checkForRedeclaration(name, classifierDescriptor);
getVariableClassOrNamespaceDescriptors().put(name, classifierDescriptor); getVariableOrClassDescriptors().put(name, classifierDescriptor);
allDescriptors.add(classifierDescriptor); allDescriptors.add(classifierDescriptor);
addToDeclared(classifierDescriptor); addToDeclared(classifierDescriptor);
} }
@@ -340,7 +340,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
checkMayWrite(); checkMayWrite();
checkForRedeclaration(name, variableDescriptor); checkForRedeclaration(name, variableDescriptor);
getVariableClassOrNamespaceDescriptors().put(name, variableDescriptor); getVariableOrClassDescriptors().put(name, variableDescriptor);
allDescriptors.add(variableDescriptor); allDescriptors.add(variableDescriptor);
addToDeclared(variableDescriptor); addToDeclared(variableDescriptor);
} }
@@ -358,7 +358,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
} }
private void checkForRedeclaration(@NotNull Name name, DeclarationDescriptor classifierDescriptor) { private void checkForRedeclaration(@NotNull Name name, DeclarationDescriptor classifierDescriptor) {
DeclarationDescriptor originalDescriptor = getVariableClassOrNamespaceDescriptors().get(name); DeclarationDescriptor originalDescriptor = getVariableOrClassDescriptors().get(name);
if (originalDescriptor != null) { if (originalDescriptor != null) {
redeclarationHandler.handleRedeclaration(originalDescriptor, classifierDescriptor); redeclarationHandler.handleRedeclaration(originalDescriptor, classifierDescriptor);
} }
@@ -368,7 +368,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
public ClassifierDescriptor getClassifier(@NotNull Name name) { public ClassifierDescriptor getClassifier(@NotNull Name name) {
checkMayRead(); checkMayRead();
Map<Name, DeclarationDescriptor> variableClassOrNamespaceDescriptors = getVariableClassOrNamespaceDescriptors(); Map<Name, DeclarationDescriptor> variableClassOrNamespaceDescriptors = getVariableOrClassDescriptors();
DeclarationDescriptor descriptor = variableClassOrNamespaceDescriptors.get(name); DeclarationDescriptor descriptor = variableClassOrNamespaceDescriptors.get(name);
if (descriptor instanceof ClassifierDescriptor) return (ClassifierDescriptor) descriptor; if (descriptor instanceof ClassifierDescriptor) return (ClassifierDescriptor) descriptor;
@@ -378,37 +378,10 @@ public class WritableScopeImpl extends WritableScopeWithImports {
return super.getClassifier(name); return super.getClassifier(name);
} }
@Override
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
checkMayWrite();
Map<Name, DeclarationDescriptor> variableClassOrNamespaceDescriptors = getVariableClassOrNamespaceDescriptors();
DeclarationDescriptor oldValue = variableClassOrNamespaceDescriptors.put(namespaceDescriptor.getName(), namespaceDescriptor);
if (oldValue != null) {
redeclarationHandler.handleRedeclaration(oldValue, namespaceDescriptor);
}
allDescriptors.add(namespaceDescriptor);
addToDeclared(namespaceDescriptor);
}
@Override
public NamespaceDescriptor getDeclaredNamespace(@NotNull Name name) {
checkMayRead();
Map<Name, DeclarationDescriptor> variableClassOrNamespaceDescriptors = getVariableClassOrNamespaceDescriptors();
DeclarationDescriptor namespaceDescriptor = variableClassOrNamespaceDescriptors.get(name);
if (namespaceDescriptor instanceof NamespaceDescriptor) return (NamespaceDescriptor) namespaceDescriptor;
return null;
}
@Override @Override
public PackageViewDescriptor getPackage(@NotNull Name name) { public PackageViewDescriptor getPackage(@NotNull Name name) {
checkMayRead(); checkMayRead();
// TODO 1
//NamespaceDescriptor declaredNamespace = getDeclaredNamespace(name);
//if (declaredNamespace != null) return declaredNamespace;
PackageViewDescriptor aliased = getPackageAliases().get(name); PackageViewDescriptor aliased = getPackageAliases().get(name);
if (aliased != null) return aliased; if (aliased != null) return aliased;
@@ -682,11 +682,6 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
renderName(moduleOrScript, builder); renderName(moduleOrScript, builder);
} }
private void renderNamespace(@NotNull NamespaceDescriptor namespace, @NotNull StringBuilder builder) {
builder.append(renderKeyword("package")).append(" ");
renderName(namespace, builder);
}
private void renderPackageView(@NotNull PackageViewDescriptor packageView, @NotNull StringBuilder builder) { private void renderPackageView(@NotNull PackageViewDescriptor packageView, @NotNull StringBuilder builder) {
builder.append(renderKeyword("package")).append(" "); builder.append(renderKeyword("package")).append(" ");
renderName(packageView, builder); renderName(packageView, builder);
@@ -751,7 +746,6 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
@Override @Override
public Void visitNamespaceDescriptor(NamespaceDescriptor namespaceDescriptor, StringBuilder builder) { public Void visitNamespaceDescriptor(NamespaceDescriptor namespaceDescriptor, StringBuilder builder) {
renderNamespace(namespaceDescriptor, builder);
return null; return null;
} }
@@ -70,7 +70,7 @@ public final class JetDescriptorIconProvider {
} }
public static Icon getBaseIcon(@NotNull DeclarationDescriptor descriptor) { public static Icon getBaseIcon(@NotNull DeclarationDescriptor descriptor) {
if (descriptor instanceof NamespaceDescriptor) { if (descriptor instanceof PackageFragmentDescriptor || descriptor instanceof PackageViewDescriptor) {
return PlatformIcons.PACKAGE_ICON; return PlatformIcons.PACKAGE_ICON;
} }
if (descriptor instanceof FunctionDescriptor) { if (descriptor instanceof FunctionDescriptor) {
@@ -24,7 +24,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetImportDirective; import org.jetbrains.jet.lang.psi.JetImportDirective;
@@ -175,12 +175,12 @@ public final class TipsManager {
return Collections2.filter(descriptors, new Predicate<DeclarationDescriptor>() { return Collections2.filter(descriptors, new Predicate<DeclarationDescriptor>() {
@Override @Override
public boolean apply(DeclarationDescriptor declarationDescriptor) { public boolean apply(DeclarationDescriptor declarationDescriptor) {
if (declarationDescriptor instanceof NamespaceDescriptor) { if (declarationDescriptor instanceof PackageViewDescriptor) {
// Heuristic: we don't want to complete "System" in "package java.lang.Sys", // Heuristic: we don't want to complete "System" in "package java.lang.Sys",
// so we find class of the same name as namespace, we exclude this namespace // so we find class of the same name as namespace, we exclude this namespace
DeclarationDescriptor parent = declarationDescriptor.getContainingDeclaration(); PackageViewDescriptor parent = ((PackageViewDescriptor) declarationDescriptor).getContainingDeclaration();
if (parent instanceof NamespaceDescriptor) { if (parent != null) {
JetScope parentScope = ((NamespaceDescriptor) parent).getMemberScope(); JetScope parentScope = parent.getMemberScope();
return parentScope.getClassifier(declarationDescriptor.getName()) == null; return parentScope.getClassifier(declarationDescriptor.getName()) == null;
} }
return true; return true;
@@ -163,8 +163,8 @@ class CompletionSession {
jetResult.addAllElements(jetCallableExtensions); jetResult.addAllElements(jetCallableExtensions);
} }
public static boolean isPartOfTypeDeclaration(@NotNull DeclarationDescriptor descriptor) { private static boolean isPartOfTypeDeclaration(@NotNull DeclarationDescriptor descriptor) {
if (descriptor instanceof NamespaceDescriptor || descriptor instanceof TypeParameterDescriptor) { if (descriptor instanceof PackageViewDescriptor || descriptor instanceof TypeParameterDescriptor) {
return true; return true;
} }
@@ -4,8 +4,7 @@ import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValue
import org.jetbrains.jet.lang.resolve.scopes.receivers.ThisReceiver import org.jetbrains.jet.lang.resolve.scopes.receivers.ThisReceiver
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
import org.jetbrains.jet.lang.descriptors.VariableDescriptor import org.jetbrains.jet.lang.descriptors.VariableDescriptor
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor
import org.jetbrains.jet.lang.resolve.DescriptorUtils
fun renderDataFlowValue(value: DataFlowValue): String? { fun renderDataFlowValue(value: DataFlowValue): String? {
// If it is not a stable identifier, there's no point in rendering it // If it is not a stable identifier, there's no point in rendering it
@@ -16,7 +15,7 @@ fun renderDataFlowValue(value: DataFlowValue): String? {
is JetExpression -> id.getText() is JetExpression -> id.getText()
is ThisReceiver -> "this@${id.getDeclarationDescriptor().getName()}" is ThisReceiver -> "this@${id.getDeclarationDescriptor().getName()}"
is VariableDescriptor -> id.getName().asString() is VariableDescriptor -> id.getName().asString()
is NamespaceDescriptor -> DescriptorUtils.getFQName(id).asString() is PackageViewDescriptor -> id.getFqName().asString()
is com.intellij.openapi.util.Pair<*, *> -> renderId(id.first) + "." + renderId(id.second) is com.intellij.openapi.util.Pair<*, *> -> renderId(id.first) + "." + renderId(id.second)
else -> null else -> null
} }
@@ -25,6 +25,7 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiClass import com.intellij.psi.PsiClass
import com.intellij.psi.PsiModifier import com.intellij.psi.PsiModifier
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver
trait SmartCompletionData{ trait SmartCompletionData{
fun accepts(descriptor: DeclarationDescriptor): Boolean fun accepts(descriptor: DeclarationDescriptor): Boolean
@@ -256,12 +257,9 @@ private fun staticMembers(context: JetExpression, expectedType: JetType, resolve
} }
if (classDescriptor is JavaClassDescriptor) { if (classDescriptor is JavaClassDescriptor) {
val container = classDescriptor.getContainingDeclaration() //TODO: nested classes! val pseudoPackage = JavaFunctionResolver.getPackageForCorrespondingJavaClass(classDescriptor)
if (container is NamespaceDescriptor) { if (pseudoPackage != null) {
val pseudoPackage: NamespaceDescriptor? = container.getMemberScope().getNamespace(classDescriptor.getName()) pseudoPackage.getMemberScope().getAllDescriptors().filterTo(descriptors, isSuitableCallable)
if (pseudoPackage != null) {
pseudoPackage.getMemberScope().getAllDescriptors().filterTo(descriptors, isSuitableCallable)
}
} }
} }
@@ -20,7 +20,7 @@ import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementWeigher; import com.intellij.codeInsight.lookup.LookupElementWeigher;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.LocalVariableDescriptor; import org.jetbrains.jet.lang.descriptors.impl.LocalVariableDescriptor;
@@ -53,7 +53,7 @@ class JetKindWeigher extends LookupElementWeigher {
else if (descriptor instanceof PropertyDescriptor) { else if (descriptor instanceof PropertyDescriptor) {
return MyResult.property; return MyResult.property;
} }
else if (descriptor instanceof NamespaceDescriptor) { else if (descriptor instanceof PackageViewDescriptor) {
return MyResult.packages; return MyResult.packages;
} }
} }
@@ -186,9 +186,9 @@ public class KotlinSignatureAnnotationIntention extends BaseIntentionAction impl
@NotNull @NotNull
private static JetScope getMemberScope(PsiModifierListOwner psiModifierListOwner, FqName classFqName, JavaDescriptorResolver javaDescriptorResolver) { private static JetScope getMemberScope(PsiModifierListOwner psiModifierListOwner, FqName classFqName, JavaDescriptorResolver javaDescriptorResolver) {
if (psiModifierListOwner.hasModifierProperty(PsiModifier.STATIC)) { if (psiModifierListOwner.hasModifierProperty(PsiModifier.STATIC)) {
NamespaceDescriptor namespaceDescriptor = javaDescriptorResolver.resolveNamespace(classFqName, IGNORE_KOTLIN_SOURCES); PackageFragmentDescriptor packageFragment = javaDescriptorResolver.getPackageFragmentProvider().getOrCreatePackage(classFqName);
assert namespaceDescriptor != null: "Couldn't resolve namespace descriptor for " + classFqName; assert packageFragment != null: "Couldn't resolve package fragment for " + classFqName;
return namespaceDescriptor.getMemberScope(); return packageFragment.getMemberScope();
} }
ClassDescriptor classDescriptor = javaDescriptorResolver.resolveClass(classFqName, IGNORE_KOTLIN_SOURCES); ClassDescriptor classDescriptor = javaDescriptorResolver.resolveClass(classFqName, IGNORE_KOTLIN_SOURCES);
@@ -38,7 +38,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver; import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace; import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace;
@@ -166,12 +166,12 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
@NotNull PsiMember member @NotNull PsiMember member
) { ) {
if (member.hasModifierProperty(PsiModifier.STATIC)) { if (member.hasModifierProperty(PsiModifier.STATIC)) {
NamespaceDescriptor packageDescriptor = javaDescriptorResolver.resolveNamespace(classFqName, IGNORE_KOTLIN_SOURCES); PackageFragmentDescriptor packageFragment = javaDescriptorResolver.getPackageFragmentProvider().getOrCreatePackage(classFqName);
if (packageDescriptor == null) { if (packageFragment == null) {
return null; return null;
} }
return packageDescriptor.getMemberScope(); return packageFragment.getMemberScope();
} }
else { else {
ClassDescriptor klass = javaDescriptorResolver.resolveClass(classFqName, IGNORE_KOTLIN_SOURCES); ClassDescriptor klass = javaDescriptorResolver.resolveClass(classFqName, IGNORE_KOTLIN_SOURCES);
@@ -84,10 +84,10 @@ public final class DecompiledDataFactory {
appendDecompiledTextAndPackageName(packageFqName); appendDecompiledTextAndPackageName(packageFqName);
SerializedDataHeader.Kind kind = classFileHeader.getKind(); SerializedDataHeader.Kind kind = classFileHeader.getKind();
if (kind == SerializedDataHeader.Kind.PACKAGE) { if (kind == SerializedDataHeader.Kind.PACKAGE) {
NamespaceDescriptor nd = javaDescriptorResolver.resolveNamespace(packageFqName, INCLUDE_KOTLIN_SOURCES); PackageFragmentDescriptor pf = javaDescriptorResolver.getPackageFragmentProvider().getOrCreatePackage(packageFqName);
if (nd != null) { if (pf != null) {
for (DeclarationDescriptor member : sortDeclarations(nd.getMemberScope().getAllDescriptors())) { for (DeclarationDescriptor member : sortDeclarations(pf.getMemberScope().getAllDescriptors())) {
if (!(member instanceof ClassOrNamespaceDescriptor)) { if (!(member instanceof ClassDescriptor)) {
appendDescriptor(member, ""); appendDescriptor(member, "");
builder.append("\n"); builder.append("\n");
} }
@@ -195,8 +195,8 @@ public class JetChangeSignatureUsageProcessor implements ChangeSignatureUsagePro
if (container instanceof JetFunction) if (container instanceof JetFunction)
return getFunctionBodyScope((JetFunction) container, bindingContext); return getFunctionBodyScope((JetFunction) container, bindingContext);
} }
else if (containingDeclaration instanceof NamespaceDescriptor) else if (containingDeclaration instanceof PackageFragmentDescriptor)
return ((NamespaceDescriptor) containingDeclaration).getMemberScope(); return ((PackageFragmentDescriptor) containingDeclaration).getMemberScope();
return null; return null;
} }