introduced interface PlatformToKotlinClassMap

changed method in ModuleConfiguration (now it returns PlatformToKotlinClassMap)
JavaToKotlinTypesMap implements PlatformToKotlinClassMap
'importAllUnderDeclaration' in Importer uses PlatformToKotlinClassMap
This commit is contained in:
Svetlana Isakova
2012-09-07 18:19:04 +04:00
parent c0dc1e6742
commit 3bd79fa701
16 changed files with 156 additions and 97 deletions
@@ -18,18 +18,16 @@ package org.jetbrains.jet.analyzer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.ModuleConfiguration;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetImportDirective;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.BodiesResolveContext;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import java.util.Collection;
import java.util.Collections;
/**
* @author Stepan Koltsov
@@ -46,8 +44,8 @@ public class AnalyzeExhaust {
@NotNull
@Override
public Collection<ClassDescriptor> getKotlinAnalogs(@NotNull FqNameUnsafe classOrPackageName) {
return Collections.emptyList();
public PlatformToKotlinClassMap getPlatformToKotlinClassMap() {
return PlatformToKotlinClassMap.EMPTY;
}
@Override
@@ -18,20 +18,17 @@ package org.jetbrains.jet.lang;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
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.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import java.util.Collection;
import java.util.Collections;
/**
* @author svtk
@@ -76,7 +73,7 @@ public class DefaultModuleConfiguration implements ModuleConfiguration {
@NotNull
@Override
public Collection<ClassDescriptor> getKotlinAnalogs(@NotNull FqNameUnsafe classOrPackageName) {
return Collections.emptyList();
public PlatformToKotlinClassMap getPlatformToKotlinClassMap() {
return PlatformToKotlinClassMap.EMPTY;
}
}
@@ -17,15 +17,12 @@
package org.jetbrains.jet.lang;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
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.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import java.util.Collection;
import java.util.Collections;
/**
* @author abreslav
@@ -42,8 +39,8 @@ public interface ModuleConfiguration {
@NotNull
@Override
public Collection<ClassDescriptor> getKotlinAnalogs(@NotNull FqNameUnsafe classOrPackageName) {
return Collections.emptyList();
public PlatformToKotlinClassMap getPlatformToKotlinClassMap() {
return PlatformToKotlinClassMap.EMPTY;
}
@Override
@@ -61,5 +58,5 @@ public interface ModuleConfiguration {
void extendNamespaceScope(@NotNull BindingTrace trace, @NotNull NamespaceDescriptor namespaceDescriptor, @NotNull WritableScope namespaceMemberScope);
@NotNull
Collection<ClassDescriptor> getKotlinAnalogs(@NotNull FqNameUnsafe classOrPackageName);
PlatformToKotlinClassMap getPlatformToKotlinClassMap();
}
@@ -0,0 +1,49 @@
/*
* 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;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import java.util.Collection;
import java.util.Collections;
/**
* @author svtk
*/
public interface PlatformToKotlinClassMap {
PlatformToKotlinClassMap EMPTY = new PlatformToKotlinClassMap() {
@NotNull
@Override
public Collection<ClassDescriptor> mapPlatformClass(@NotNull ClassDescriptor classDescriptor) {
return Collections.emptyList();
}
@NotNull
@Override
public Collection<ClassDescriptor> mapPlatformClassesInside(@NotNull DeclarationDescriptor containingDeclaration) {
return Collections.emptyList();
}
};
@NotNull
Collection<ClassDescriptor> mapPlatformClass(@NotNull ClassDescriptor classDescriptor);
@NotNull
Collection<ClassDescriptor> mapPlatformClassesInside(@NotNull DeclarationDescriptor containingDeclaration);
}
@@ -21,12 +21,14 @@ import com.google.common.collect.Lists;
import com.intellij.openapi.util.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.FilteringScope;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import java.util.Collection;
import java.util.List;
/**
@@ -34,13 +36,13 @@ import java.util.List;
*/
/*package*/ interface Importer {
void addAllUnderImport(@NotNull DeclarationDescriptor descriptor, @Nullable Predicate<DeclarationDescriptor> isNotHiddenByKotlinAnalog);
void addAllUnderImport(@NotNull DeclarationDescriptor descriptor, @NotNull PlatformToKotlinClassMap platformToKotlinClassMap);
void addAliasImport(@NotNull DeclarationDescriptor descriptor, @NotNull Name aliasName);
Importer DO_NOTHING = new Importer() {
@Override
public void addAllUnderImport(@NotNull DeclarationDescriptor descriptor, Predicate<DeclarationDescriptor> isNotHiddenByKotlinAnalog) {
public void addAllUnderImport(@NotNull DeclarationDescriptor descriptor, @NotNull PlatformToKotlinClassMap platformToKotlinClassMap) {
}
@Override
@@ -56,8 +58,8 @@ import java.util.List;
}
@Override
public void addAllUnderImport(@NotNull DeclarationDescriptor descriptor, @Nullable Predicate<DeclarationDescriptor> isNotHiddenByKotlinAnalog) {
importAllUnderDeclaration(descriptor, isNotHiddenByKotlinAnalog);
public void addAllUnderImport(@NotNull DeclarationDescriptor descriptor, @NotNull PlatformToKotlinClassMap platformToKotlinClassMap) {
importAllUnderDeclaration(descriptor, platformToKotlinClassMap);
}
@Override
@@ -65,7 +67,29 @@ import java.util.List;
importDeclarationAlias(descriptor, aliasName);
}
protected void importAllUnderDeclaration(@NotNull DeclarationDescriptor descriptor, @Nullable Predicate<DeclarationDescriptor> isNotHiddenByKotlinAnalog) {
@NotNull
private static JetScope createFilteringScope(
@NotNull JetScope scope,
@NotNull DeclarationDescriptor descriptor,
@NotNull PlatformToKotlinClassMap platformToKotlinClassMap
) {
final Collection<ClassDescriptor> kotlinAnalogsForClassesInside = platformToKotlinClassMap.mapPlatformClassesInside(
descriptor);
if (kotlinAnalogsForClassesInside.isEmpty()) return scope;
return new FilteringScope(scope, new Predicate<DeclarationDescriptor>() {
@Override
public boolean apply(DeclarationDescriptor descriptor) {
for (ClassDescriptor kotlinAnalog : kotlinAnalogsForClassesInside) {
if (kotlinAnalog.getName().equals(descriptor.getName())) {
return false;
}
}
return true;
}
});
}
protected void importAllUnderDeclaration(@NotNull DeclarationDescriptor descriptor, @NotNull PlatformToKotlinClassMap platformToKotlinClassMap) {
JetScope scopeToImport = null;
if (descriptor instanceof NamespaceDescriptor) {
scopeToImport = ((NamespaceDescriptor) descriptor).getMemberScope();
@@ -79,10 +103,7 @@ import java.util.List;
}
}
if (scopeToImport != null) {
if (isNotHiddenByKotlinAnalog != null) {
scopeToImport = new FilteringScope(scopeToImport, isNotHiddenByKotlinAnalog);
}
namespaceScope.importScope(scopeToImport);
namespaceScope.importScope(createFilteringScope(scopeToImport, descriptor, platformToKotlinClassMap));
}
}
@@ -105,8 +126,8 @@ import java.util.List;
class DelayedImporter extends StandardImporter {
private interface DelayedImportEntry {}
private static class AllUnderImportEntry extends Pair<DeclarationDescriptor, Predicate<DeclarationDescriptor>> implements DelayedImportEntry {
public AllUnderImportEntry(@NotNull DeclarationDescriptor first, @Nullable Predicate<DeclarationDescriptor> second) {
private static class AllUnderImportEntry extends Pair<DeclarationDescriptor, PlatformToKotlinClassMap> implements DelayedImportEntry {
public AllUnderImportEntry(@NotNull DeclarationDescriptor first, @Nullable PlatformToKotlinClassMap second) {
super(first, second);
}
}
@@ -123,8 +144,8 @@ import java.util.List;
}
@Override
public void addAllUnderImport(@NotNull DeclarationDescriptor descriptor, @Nullable Predicate<DeclarationDescriptor> isNotHiddenByKotlinAnalog) {
imports.add(new AllUnderImportEntry(descriptor, isNotHiddenByKotlinAnalog));
public void addAllUnderImport(@NotNull DeclarationDescriptor descriptor, @NotNull PlatformToKotlinClassMap platformToKotlinClassMap) {
imports.add(new AllUnderImportEntry(descriptor, platformToKotlinClassMap));
}
@Override
@@ -19,10 +19,10 @@ package org.jetbrains.jet.lang.resolve;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.ModuleConfiguration;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
@@ -124,7 +124,9 @@ public class ImportsResolver {
resolvedDirectives.put(importDirective, descriptors.iterator().next());
}
for (DeclarationDescriptor descriptor : descriptors) {
reportHasKotlinAnalog(onlyClasses, configuration, trace, importDirective, descriptor);
JetExpression importedReference = importDirective.getImportedReference();
if (onlyClasses || importedReference == null) continue;
reportPlatformClassMappedToKotlin(configuration, trace, importedReference, descriptor);
}
}
delayedImporter.processImports();
@@ -136,19 +138,18 @@ public class ImportsResolver {
}
}
private static void reportHasKotlinAnalog(
boolean onlyClasses,
public static void reportPlatformClassMappedToKotlin(
@NotNull ModuleConfiguration configuration,
@NotNull BindingTrace trace,
@NotNull JetImportDirective importDirective,
@NotNull JetElement element,
@NotNull DeclarationDescriptor descriptor
) {
if (!(descriptor instanceof ClassDescriptor) || onlyClasses) return;
FqNameUnsafe fqName = DescriptorUtils.getFQName(descriptor);
Collection<ClassDescriptor> kotlinAnalogs = configuration.getKotlinAnalogs(fqName);
JetExpression importedReference = importDirective.getImportedReference();
if (importedReference != null && !kotlinAnalogs.isEmpty()) {
trace.report(CLASS_HAS_KOTLIN_ANALOG.on(importedReference, kotlinAnalogs));
if (!(descriptor instanceof ClassDescriptor)) return;
PlatformToKotlinClassMap platformToKotlinMap = configuration.getPlatformToKotlinClassMap();
Collection<ClassDescriptor> kotlinAnalogsForClass = platformToKotlinMap.mapPlatformClass((ClassDescriptor) descriptor);
if (!kotlinAnalogsForClass.isEmpty()) {
trace.report(CLASS_HAS_KOTLIN_ANALOG.on(element, kotlinAnalogsForClass));
}
}
@@ -85,7 +85,7 @@ public class QualifiedExpressionResolver {
}
for (DeclarationDescriptor descriptor : descriptors) {
importer.addAllUnderImport(descriptor, DescriptorUtils.createIsNotHiddenByKotlinAnalogPredicate(descriptor, moduleConfiguration));
importer.addAllUnderImport(descriptor, moduleConfiguration.getPlatformToKotlinClassMap());
}
return Collections.emptyList();
}
@@ -37,7 +37,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static org.jetbrains.jet.lang.diagnostics.Errors.CLASS_HAS_KOTLIN_ANALOG;
import static org.jetbrains.jet.lang.diagnostics.Errors.UNSUPPORTED;
import static org.jetbrains.jet.lang.diagnostics.Errors.WRONG_NUMBER_OF_TYPE_ARGUMENTS;
@@ -289,10 +288,7 @@ public class TypeResolver {
Collection<? extends DeclarationDescriptor> descriptors = qualifiedExpressionResolver.lookupDescriptorsForUserType(userType, scope, trace);
for (DeclarationDescriptor descriptor : descriptors) {
if (descriptor instanceof ClassifierDescriptor) {
Collection<ClassDescriptor> kotlinAnalogs = moduleConfiguration.getKotlinAnalogs(DescriptorUtils.getFQName(descriptor));
if (!kotlinAnalogs.isEmpty()) {
trace.report(CLASS_HAS_KOTLIN_ANALOG.on(userType, kotlinAnalogs));
}
ImportsResolver.reportPlatformClassMappedToKotlin(moduleConfiguration, trace, userType, descriptor);
return (ClassifierDescriptor) descriptor;
}
}