Classify Location.NO_LOCATION usages

This commit is contained in:
Zalim Bashorov
2015-08-14 22:42:20 +03:00
parent 0ca9c6fd40
commit 69e0f23db9
37 changed files with 167 additions and 122 deletions
@@ -60,7 +60,7 @@ public class CodegenUtil {
@NotNull ClassifierDescriptor returnedClassifier, @NotNull ClassifierDescriptor returnedClassifier,
@NotNull ClassifierDescriptor... valueParameterClassifiers @NotNull ClassifierDescriptor... valueParameterClassifiers
) { ) {
Collection<FunctionDescriptor> functions = owner.getDefaultType().getMemberScope().getFunctions(name, LookupLocation.NO_LOCATION); Collection<FunctionDescriptor> functions = owner.getDefaultType().getMemberScope().getFunctions(name, LookupLocation.NO_LOCATION_FROM_BACKEND);
for (FunctionDescriptor function : functions) { for (FunctionDescriptor function : functions) {
if (!CallResolverUtilPackage.isOrOverridesSynthesized(function) if (!CallResolverUtilPackage.isOrOverridesSynthesized(function)
&& function.getTypeParameters().isEmpty() && function.getTypeParameters().isEmpty()
@@ -16,16 +16,17 @@
package org.jetbrains.kotlin.backend.common package org.jetbrains.kotlin.backend.common
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.incremental.components.LookupLocation
import kotlin.platform.platformStatic
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.utils.keysToMapExceptNulls
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.MemberComparator import org.jetbrains.kotlin.resolve.MemberComparator
import java.util.Comparator import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.types.isDynamic import org.jetbrains.kotlin.types.isDynamic
import org.jetbrains.kotlin.utils.keysToMapExceptNulls
import java.util.Comparator
import kotlin.platform.platformStatic
public object CodegenUtilKt { public object CodegenUtilKt {
@@ -57,7 +58,7 @@ public object CodegenUtilKt {
val name = overriddenDescriptor.getName() val name = overriddenDescriptor.getName()
// this is the actual member of delegateExpressionType that we are delegating to // this is the actual member of delegateExpressionType that we are delegating to
(scope.getFunctions(name) + scope.getProperties(name)) (scope.getFunctions(name, LookupLocation.NO_LOCATION_FROM_BACKEND) + scope.getProperties(name, LookupLocation.NO_LOCATION_FROM_BACKEND))
.first { .first {
(listOf(it) + DescriptorUtils.getAllOverriddenDescriptors(it)).map { it.getOriginal() }.contains(overriddenDescriptor.getOriginal()) (listOf(it) + DescriptorUtils.getAllOverriddenDescriptors(it)).map { it.getOriginal() }.contains(overriddenDescriptor.getOriginal())
} }
@@ -37,6 +37,7 @@ import org.jetbrains.kotlin.psi.JetElement;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.incremental.components.LookupLocation; import org.jetbrains.kotlin.incremental.components.LookupLocation;
import org.jetbrains.kotlin.resolve.scopes.JetScope;
import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.expressions.OperatorConventions; import org.jetbrains.kotlin.types.expressions.OperatorConventions;
import org.jetbrains.kotlin.utils.UtilsPackage; import org.jetbrains.kotlin.utils.UtilsPackage;
@@ -453,6 +454,7 @@ public class ClosureCodegen extends MemberCodegen<JetElement> {
ClassDescriptor elementClass = elementDescriptor.getExtensionReceiverParameter() == null ClassDescriptor elementClass = elementDescriptor.getExtensionReceiverParameter() == null
? getBuiltIns(elementDescriptor).getFunction(arity) ? getBuiltIns(elementDescriptor).getFunction(arity)
: getBuiltIns(elementDescriptor).getExtensionFunction(arity); : getBuiltIns(elementDescriptor).getExtensionFunction(arity);
return elementClass.getDefaultType().getMemberScope().getFunctions(OperatorConventions.INVOKE, LookupLocation.NO_LOCATION).iterator().next(); JetScope scope = elementClass.getDefaultType().getMemberScope();
return scope.getFunctions(OperatorConventions.INVOKE, LookupLocation.NO_LOCATION_FROM_BACKEND).iterator().next();
} }
} }
@@ -1075,7 +1075,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Type asmLoopRangeType = asmType(loopRangeType); Type asmLoopRangeType = asmType(loopRangeType);
Collection<VariableDescriptor> incrementProp = Collection<VariableDescriptor> incrementProp =
loopRangeType.getMemberScope().getProperties(Name.identifier("increment"), LookupLocation.NO_LOCATION); loopRangeType.getMemberScope().getProperties(Name.identifier("increment"), LookupLocation.NO_LOCATION_FROM_BACKEND);
assert incrementProp.size() == 1 : loopRangeType + " " + incrementProp.size(); assert incrementProp.size() == 1 : loopRangeType + " " + incrementProp.size();
incrementType = asmType(incrementProp.iterator().next().getType()); incrementType = asmType(incrementProp.iterator().next().getType());
@@ -403,7 +403,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
private boolean isGenericToArrayPresent() { private boolean isGenericToArrayPresent() {
Collection<FunctionDescriptor> functions = Collection<FunctionDescriptor> functions =
descriptor.getDefaultType().getMemberScope().getFunctions(Name.identifier("toArray"), LookupLocation.NO_LOCATION); descriptor.getDefaultType().getMemberScope().getFunctions(Name.identifier("toArray"), LookupLocation.NO_LOCATION_FROM_BACKEND);
for (FunctionDescriptor function : functions) { for (FunctionDescriptor function : functions) {
if (CallResolverUtilPackage.isOrOverridesSynthesized(function)) { if (CallResolverUtilPackage.isOrOverridesSynthesized(function)) {
continue; continue;
@@ -817,7 +817,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
Type type = typeMapper.mapType(getBuiltIns(descriptor).getArrayType(INVARIANT, descriptor.getDefaultType())); Type type = typeMapper.mapType(getBuiltIns(descriptor).getArrayType(INVARIANT, descriptor.getDefaultType()));
FunctionDescriptor valuesFunction = FunctionDescriptor valuesFunction =
KotlinPackage.single(descriptor.getStaticScope().getFunctions(ENUM_VALUES, LookupLocation.NO_LOCATION), new Function1<FunctionDescriptor, Boolean>() { KotlinPackage.single(descriptor.getStaticScope().getFunctions(ENUM_VALUES, LookupLocation.NO_LOCATION_FROM_BACKEND), new Function1<FunctionDescriptor, Boolean>() {
@Override @Override
public Boolean invoke(FunctionDescriptor descriptor) { public Boolean invoke(FunctionDescriptor descriptor) {
return CodegenUtil.isEnumValuesMethod(descriptor); return CodegenUtil.isEnumValuesMethod(descriptor);
@@ -837,7 +837,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
private void generateEnumValueOfMethod() { private void generateEnumValueOfMethod() {
FunctionDescriptor valueOfFunction = FunctionDescriptor valueOfFunction =
KotlinPackage.single(descriptor.getStaticScope().getFunctions(ENUM_VALUE_OF, LookupLocation.NO_LOCATION), new Function1<FunctionDescriptor, Boolean>() { KotlinPackage.single(descriptor.getStaticScope().getFunctions(ENUM_VALUE_OF, LookupLocation.NO_LOCATION_FROM_BACKEND), new Function1<FunctionDescriptor, Boolean>() {
@Override @Override
public Boolean invoke(FunctionDescriptor descriptor) { public Boolean invoke(FunctionDescriptor descriptor) {
return CodegenUtil.isEnumValueOfMethod(descriptor); return CodegenUtil.isEnumValueOfMethod(descriptor);
@@ -149,7 +149,7 @@ public class SamWrapperCodegen {
(ClassDescriptor) erasedInterfaceFunction.getContainingDeclaration(), OwnerKind.IMPLEMENTATION, state), cv, state, parentCodegen); (ClassDescriptor) erasedInterfaceFunction.getContainingDeclaration(), OwnerKind.IMPLEMENTATION, state), cv, state, parentCodegen);
FunctionDescriptor invokeFunction = FunctionDescriptor invokeFunction =
functionJetType.getMemberScope().getFunctions(OperatorConventions.INVOKE, LookupLocation.NO_LOCATION).iterator().next().getOriginal(); functionJetType.getMemberScope().getFunctions(OperatorConventions.INVOKE, LookupLocation.NO_LOCATION_FROM_BACKEND).iterator().next().getOriginal();
StackValue functionField = StackValue.field(functionType, ownerType, FUNCTION_FIELD_NAME, false, StackValue.none()); StackValue functionField = StackValue.field(functionType, ownerType, FUNCTION_FIELD_NAME, false, StackValue.none());
codegen.genDelegate(erasedInterfaceFunction, invokeFunction, functionField); codegen.genDelegate(erasedInterfaceFunction, invokeFunction, functionField);
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoots
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
@@ -113,7 +114,7 @@ public class MultiModuleJavaAnalysisCustomTest : UsefulTestCase() {
private fun checkClassInPackage(moduleDescriptor: ModuleDescriptor, packageName: String, className: String) { private fun checkClassInPackage(moduleDescriptor: ModuleDescriptor, packageName: String, className: String) {
val kotlinPackage = moduleDescriptor.getPackage(FqName(packageName)) val kotlinPackage = moduleDescriptor.getPackage(FqName(packageName))
val kotlinClassName = Name.identifier(className) val kotlinClassName = Name.identifier(className)
val kotlinClass = kotlinPackage.memberScope.getClassifier(kotlinClassName) as ClassDescriptor val kotlinClass = kotlinPackage.memberScope.getClassifier(kotlinClassName, LookupLocation.NO_LOCATION_FROM_TEST) as ClassDescriptor
checkClass(kotlinClass) checkClass(kotlinClass)
} }
@@ -155,7 +155,7 @@ public abstract class AbstractAnnotationDescriptorResolveTest extends JetLiteFix
protected static FunctionDescriptor getFunctionDescriptor(@NotNull PackageFragmentDescriptor packageView, @NotNull String name) { protected static FunctionDescriptor getFunctionDescriptor(@NotNull PackageFragmentDescriptor packageView, @NotNull String name) {
Name functionName = Name.identifier(name); Name functionName = Name.identifier(name);
JetScope memberScope = packageView.getMemberScope(); JetScope memberScope = packageView.getMemberScope();
Collection<FunctionDescriptor> functions = memberScope.getFunctions(functionName, LookupLocation.NO_LOCATION); Collection<FunctionDescriptor> functions = memberScope.getFunctions(functionName, LookupLocation.NO_LOCATION_FROM_TEST);
assert functions.size() == 1 : "Failed to find function " + functionName + " in class" + "." + packageView.getName(); assert functions.size() == 1 : "Failed to find function " + functionName + " in class" + "." + packageView.getName();
return functions.iterator().next(); return functions.iterator().next();
} }
@@ -164,7 +164,7 @@ public abstract class AbstractAnnotationDescriptorResolveTest extends JetLiteFix
private static FunctionDescriptor getFunctionDescriptor(@NotNull ClassDescriptor classDescriptor, @NotNull String name) { private static FunctionDescriptor getFunctionDescriptor(@NotNull ClassDescriptor classDescriptor, @NotNull String name) {
Name functionName = Name.identifier(name); Name functionName = Name.identifier(name);
JetScope memberScope = classDescriptor.getMemberScope(Collections.<TypeProjection>emptyList()); JetScope memberScope = classDescriptor.getMemberScope(Collections.<TypeProjection>emptyList());
Collection<FunctionDescriptor> functions = memberScope.getFunctions(functionName, LookupLocation.NO_LOCATION); Collection<FunctionDescriptor> functions = memberScope.getFunctions(functionName, LookupLocation.NO_LOCATION_FROM_TEST);
assert functions.size() == 1 : "Failed to find function " + functionName + " in class" + "." + classDescriptor.getName(); assert functions.size() == 1 : "Failed to find function " + functionName + " in class" + "." + classDescriptor.getName();
return functions.iterator().next(); return functions.iterator().next();
} }
@@ -173,13 +173,13 @@ public abstract class AbstractAnnotationDescriptorResolveTest extends JetLiteFix
protected static PropertyDescriptor getPropertyDescriptor(@NotNull PackageFragmentDescriptor packageView, @NotNull String name, boolean failOnMissing) { protected static PropertyDescriptor getPropertyDescriptor(@NotNull PackageFragmentDescriptor packageView, @NotNull String name, boolean failOnMissing) {
Name propertyName = Name.identifier(name); Name propertyName = Name.identifier(name);
JetScope memberScope = packageView.getMemberScope(); JetScope memberScope = packageView.getMemberScope();
Collection<VariableDescriptor> properties = memberScope.getProperties(propertyName, LookupLocation.NO_LOCATION); Collection<VariableDescriptor> properties = memberScope.getProperties(propertyName, LookupLocation.NO_LOCATION_FROM_TEST);
if (properties.isEmpty()) { if (properties.isEmpty()) {
for (DeclarationDescriptor descriptor : memberScope.getAllDescriptors()) { for (DeclarationDescriptor descriptor : memberScope.getAllDescriptors()) {
if (descriptor instanceof ClassDescriptor) { if (descriptor instanceof ClassDescriptor) {
Collection<VariableDescriptor> classProperties = Collection<VariableDescriptor> classProperties =
((ClassDescriptor) descriptor).getMemberScope(Collections.<TypeProjection>emptyList()) ((ClassDescriptor) descriptor).getMemberScope(Collections.<TypeProjection>emptyList())
.getProperties(propertyName, LookupLocation.NO_LOCATION); .getProperties(propertyName, LookupLocation.NO_LOCATION_FROM_TEST);
if (!classProperties.isEmpty()) { if (!classProperties.isEmpty()) {
properties = classProperties; properties = classProperties;
break; break;
@@ -200,7 +200,7 @@ public abstract class AbstractAnnotationDescriptorResolveTest extends JetLiteFix
private static PropertyDescriptor getPropertyDescriptor(@NotNull ClassDescriptor classDescriptor, @NotNull String name) { private static PropertyDescriptor getPropertyDescriptor(@NotNull ClassDescriptor classDescriptor, @NotNull String name) {
Name propertyName = Name.identifier(name); Name propertyName = Name.identifier(name);
JetScope memberScope = classDescriptor.getMemberScope(Collections.<TypeProjection>emptyList()); JetScope memberScope = classDescriptor.getMemberScope(Collections.<TypeProjection>emptyList());
Collection<VariableDescriptor> properties = memberScope.getProperties(propertyName, LookupLocation.NO_LOCATION); Collection<VariableDescriptor> properties = memberScope.getProperties(propertyName, LookupLocation.NO_LOCATION_FROM_TEST);
assert properties.size() == 1 : "Failed to find property " + propertyName + " in class " + classDescriptor.getName(); assert properties.size() == 1 : "Failed to find property " + propertyName + " in class " + classDescriptor.getName();
return (PropertyDescriptor) properties.iterator().next(); return (PropertyDescriptor) properties.iterator().next();
} }
@@ -208,7 +208,7 @@ public abstract class AbstractAnnotationDescriptorResolveTest extends JetLiteFix
@NotNull @NotNull
protected static ClassDescriptor getClassDescriptor(@NotNull PackageFragmentDescriptor packageView, @NotNull String name) { protected static ClassDescriptor getClassDescriptor(@NotNull PackageFragmentDescriptor packageView, @NotNull String name) {
Name className = Name.identifier(name); Name className = Name.identifier(name);
ClassifierDescriptor aClass = packageView.getMemberScope().getClassifier(className, LookupLocation.NO_LOCATION); ClassifierDescriptor aClass = packageView.getMemberScope().getClassifier(className, LookupLocation.NO_LOCATION_FROM_TEST);
assertNotNull("Failed to find class: " + packageView.getName() + "." + className, aClass); assertNotNull("Failed to find class: " + packageView.getName() + "." + className, aClass);
assert aClass instanceof ClassDescriptor : "Not a class: " + aClass; assert aClass instanceof ClassDescriptor : "Not a class: " + aClass;
return (ClassDescriptor) aClass; return (ClassDescriptor) aClass;
@@ -218,7 +218,7 @@ public abstract class AbstractAnnotationDescriptorResolveTest extends JetLiteFix
private static ClassDescriptor getInnerClassDescriptor(@NotNull ClassDescriptor classDescriptor, @NotNull String name) { private static ClassDescriptor getInnerClassDescriptor(@NotNull ClassDescriptor classDescriptor, @NotNull String name) {
Name propertyName = Name.identifier(name); Name propertyName = Name.identifier(name);
JetScope memberScope = classDescriptor.getMemberScope(Collections.<TypeProjection>emptyList()); JetScope memberScope = classDescriptor.getMemberScope(Collections.<TypeProjection>emptyList());
ClassifierDescriptor innerClass = memberScope.getClassifier(propertyName, LookupLocation.NO_LOCATION); ClassifierDescriptor innerClass = memberScope.getClassifier(propertyName, LookupLocation.NO_LOCATION_FROM_TEST);
assert innerClass instanceof ClassDescriptor : "Failed to find inner class " + assert innerClass instanceof ClassDescriptor : "Failed to find inner class " +
propertyName + propertyName +
" in class " + " in class " +
@@ -411,7 +411,7 @@ public class DescriptorValidator {
public Void visitVariableDescriptor( public Void visitVariableDescriptor(
VariableDescriptor descriptor, JetScope scope VariableDescriptor descriptor, JetScope scope
) { ) {
assertFound(scope, descriptor, scope.getProperties(descriptor.getName(), LookupLocation.NO_LOCATION)); assertFound(scope, descriptor, scope.getProperties(descriptor.getName(), LookupLocation.NO_LOCATION_FROM_TEST));
return null; return null;
} }
@@ -419,7 +419,7 @@ public class DescriptorValidator {
public Void visitFunctionDescriptor( public Void visitFunctionDescriptor(
FunctionDescriptor descriptor, JetScope scope FunctionDescriptor descriptor, JetScope scope
) { ) {
assertFound(scope, descriptor, scope.getFunctions(descriptor.getName(), LookupLocation.NO_LOCATION)); assertFound(scope, descriptor, scope.getFunctions(descriptor.getName(), LookupLocation.NO_LOCATION_FROM_TEST));
return null; return null;
} }
@@ -427,7 +427,7 @@ public class DescriptorValidator {
public Void visitTypeParameterDescriptor( public Void visitTypeParameterDescriptor(
TypeParameterDescriptor descriptor, JetScope scope TypeParameterDescriptor descriptor, JetScope scope
) { ) {
assertFound(scope, descriptor, scope.getClassifier(descriptor.getName(), LookupLocation.NO_LOCATION), true); assertFound(scope, descriptor, scope.getClassifier(descriptor.getName(), LookupLocation.NO_LOCATION_FROM_TEST), true);
return null; return null;
} }
@@ -435,7 +435,7 @@ public class DescriptorValidator {
public Void visitClassDescriptor( public Void visitClassDescriptor(
ClassDescriptor descriptor, JetScope scope ClassDescriptor descriptor, JetScope scope
) { ) {
assertFound(scope, descriptor, scope.getClassifier(descriptor.getName(), LookupLocation.NO_LOCATION), true); assertFound(scope, descriptor, scope.getClassifier(descriptor.getName(), LookupLocation.NO_LOCATION_FROM_TEST), true);
return null; return null;
} }
@@ -74,7 +74,7 @@ public class BoundsSubstitutorTest extends KotlinTestWithEnvironment {
JetFile jetFile = JetPsiFactory(getProject()).createFile("fun.kt", text); JetFile jetFile = JetPsiFactory(getProject()).createFile("fun.kt", text);
ModuleDescriptor module = LazyResolveTestUtil.resolveLazily(Collections.singletonList(jetFile), getEnvironment()); ModuleDescriptor module = LazyResolveTestUtil.resolveLazily(Collections.singletonList(jetFile), getEnvironment());
Collection<FunctionDescriptor> functions = Collection<FunctionDescriptor> functions =
module.getPackage(FqName.ROOT).getMemberScope().getFunctions(Name.identifier("f"), LookupLocation.NO_LOCATION); module.getPackage(FqName.ROOT).getMemberScope().getFunctions(Name.identifier("f"), LookupLocation.NO_LOCATION_FROM_TEST);
assert functions.size() == 1 : "Many functions defined"; assert functions.size() == 1 : "Many functions defined";
FunctionDescriptor function = ContainerUtil.getFirstItem(functions); FunctionDescriptor function = ContainerUtil.getFirstItem(functions);
@@ -624,7 +624,7 @@ public class JetTypeCheckerTest extends JetLiteFixture {
else { else {
Name shortName = fqName.shortName(); Name shortName = fqName.shortName();
assert shortName.equals(defaultImport.getImportedName()); assert shortName.equals(defaultImport.getImportedName());
writableScope.addClassifierDescriptor(module.getPackage(fqName.parent()).getMemberScope().getClassifier(shortName, LookupLocation.NO_LOCATION)); writableScope.addClassifierDescriptor(module.getPackage(fqName.parent()).getMemberScope().getClassifier(shortName, LookupLocation.NO_LOCATION_FROM_TEST));
} }
} }
scopeChain.add(module.getPackage(FqName.ROOT).getMemberScope()); scopeChain.add(module.getPackage(FqName.ROOT).getMemberScope());
@@ -86,7 +86,7 @@ public class TypeSubstitutorTest extends KotlinTestWithEnvironment {
JetFile jetFile = JetPsiFactory(getProject()).createFile(text); JetFile jetFile = JetPsiFactory(getProject()).createFile(text);
ModuleDescriptor module = LazyResolveTestUtil.resolveLazily(Collections.singletonList(jetFile), getEnvironment()); ModuleDescriptor module = LazyResolveTestUtil.resolveLazily(Collections.singletonList(jetFile), getEnvironment());
JetScope topLevelDeclarations = module.getPackage(FqName.ROOT).getMemberScope(); JetScope topLevelDeclarations = module.getPackage(FqName.ROOT).getMemberScope();
ClassifierDescriptor contextClass = topLevelDeclarations.getClassifier(Name.identifier("___Context"), LookupLocation.NO_LOCATION); ClassifierDescriptor contextClass = topLevelDeclarations.getClassifier(Name.identifier("___Context"), LookupLocation.NO_LOCATION_FROM_TEST);
assert contextClass instanceof ClassDescriptor; assert contextClass instanceof ClassDescriptor;
WritableScopeImpl typeParameters = new WritableScopeImpl(JetScope.Empty.INSTANCE$, module, RedeclarationHandler.THROW_EXCEPTION, WritableScopeImpl typeParameters = new WritableScopeImpl(JetScope.Empty.INSTANCE$, module, RedeclarationHandler.THROW_EXCEPTION,
"Type parameter scope"); "Type parameter scope");
@@ -125,7 +125,7 @@ public class TypeSubstitutorTest extends KotlinTestWithEnvironment {
String typeParameterName = pair.first; String typeParameterName = pair.first;
String replacementProjectionString = pair.second; String replacementProjectionString = pair.second;
ClassifierDescriptor classifier = scope.getClassifier(Name.identifier(typeParameterName), LookupLocation.NO_LOCATION); ClassifierDescriptor classifier = scope.getClassifier(Name.identifier(typeParameterName), LookupLocation.NO_LOCATION_FROM_TEST);
assertNotNull("No type parameter named " + typeParameterName, classifier); assertNotNull("No type parameter named " + typeParameterName, classifier);
assertTrue(typeParameterName + " is not a type parameter: " + classifier, classifier instanceof TypeParameterDescriptor); assertTrue(typeParameterName + " is not a type parameter: " + classifier, classifier instanceof TypeParameterDescriptor);
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION import org.jetbrains.kotlin.load.java.JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.JETBRAINS_NULLABLE_ANNOTATION import org.jetbrains.kotlin.load.java.JvmAnnotationNames.JETBRAINS_NULLABLE_ANNOTATION
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.JETBRAINS_READONLY_ANNOTATION import org.jetbrains.kotlin.load.java.JvmAnnotationNames.JETBRAINS_READONLY_ANNOTATION
@@ -81,7 +82,7 @@ fun JetType.isResolvableInScope(scope: JetScope?, checkTypeParameters: Boolean):
if (descriptor == null || descriptor.getName().isSpecial()) return false if (descriptor == null || descriptor.getName().isSpecial()) return false
if (!checkTypeParameters && descriptor is TypeParameterDescriptor) return true if (!checkTypeParameters && descriptor is TypeParameterDescriptor) return true
return scope != null && scope.getClassifier(descriptor.getName()) == descriptor return scope != null && scope.getClassifier(descriptor.name, LookupLocation.NO_LOCATION_FROM_IDE) == descriptor
} }
public fun JetType.approximateWithResolvableType(scope: JetScope?, checkTypeParameters: Boolean): JetType { public fun JetType.approximateWithResolvableType(scope: JetScope?, checkTypeParameters: Boolean): JetType {
@@ -140,7 +140,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
if (declaration instanceof JetFunction) { if (declaration instanceof JetFunction) {
JetFunction jetFunction = (JetFunction) declaration; JetFunction jetFunction = (JetFunction) declaration;
Name name = jetFunction.getNameAsSafeName(); Name name = jetFunction.getNameAsSafeName();
Collection<FunctionDescriptor> functions = packageDescriptor.getMemberScope().getFunctions(name, LookupLocation.NO_LOCATION); Collection<FunctionDescriptor> functions = packageDescriptor.getMemberScope().getFunctions(name, LookupLocation.NO_LOCATION_FROM_IDE);
for (FunctionDescriptor descriptor : functions) { for (FunctionDescriptor descriptor : functions) {
ForceResolveUtil.forceResolveAllContents(descriptor); ForceResolveUtil.forceResolveAllContents(descriptor);
} }
@@ -148,7 +148,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
else if (declaration instanceof JetProperty) { else if (declaration instanceof JetProperty) {
JetProperty jetProperty = (JetProperty) declaration; JetProperty jetProperty = (JetProperty) declaration;
Name name = jetProperty.getNameAsSafeName(); Name name = jetProperty.getNameAsSafeName();
Collection<VariableDescriptor> properties = packageDescriptor.getMemberScope().getProperties(name, LookupLocation.NO_LOCATION); Collection<VariableDescriptor> properties = packageDescriptor.getMemberScope().getProperties(name, LookupLocation.NO_LOCATION_FROM_IDE);
for (VariableDescriptor descriptor : properties) { for (VariableDescriptor descriptor : properties) {
ForceResolveUtil.forceResolveAllContents(descriptor); ForceResolveUtil.forceResolveAllContents(descriptor);
} }
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.caches.resolve
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.* import com.intellij.psi.*
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.load.java.structure.impl.* import org.jetbrains.kotlin.load.java.structure.impl.*
@@ -73,7 +74,7 @@ fun PsiMember.getJavaMemberDescriptor(): DeclarationDescriptor? {
} }
public fun JavaDescriptorResolver.resolveMethod(method: JavaMethod): FunctionDescriptor? { public fun JavaDescriptorResolver.resolveMethod(method: JavaMethod): FunctionDescriptor? {
return getContainingScope(method)?.getFunctions(method.getName())?.findByJavaElement(method) return getContainingScope(method)?.getFunctions(method.name, LookupLocation.NO_LOCATION_FROM_IDE)?.findByJavaElement(method)
} }
public fun JavaDescriptorResolver.resolveConstructor(constructor: JavaConstructor): ConstructorDescriptor? { public fun JavaDescriptorResolver.resolveConstructor(constructor: JavaConstructor): ConstructorDescriptor? {
@@ -81,7 +82,7 @@ public fun JavaDescriptorResolver.resolveConstructor(constructor: JavaConstructo
} }
public fun JavaDescriptorResolver.resolveField(field: JavaField): PropertyDescriptor? { public fun JavaDescriptorResolver.resolveField(field: JavaField): PropertyDescriptor? {
return getContainingScope(field)?.getProperties(field.getName())?.findByJavaElement(field) as? PropertyDescriptor return getContainingScope(field)?.getProperties(field.name, LookupLocation.NO_LOCATION_FROM_IDE)?.findByJavaElement(field) as? PropertyDescriptor
} }
private fun JavaDescriptorResolver.getContainingScope(member: JavaMember): JetScope? { private fun JavaDescriptorResolver.getContainingScope(member: JavaMember): JetScope? {
@@ -16,11 +16,9 @@
package org.jetbrains.kotlin.idea.util package org.jetbrains.kotlin.idea.util
import com.intellij.openapi.util.Key
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiRecursiveElementVisitor
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.analyzer.analyzeInContext import org.jetbrains.kotlin.analyzer.analyzeInContext
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
@@ -32,10 +30,10 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport
import org.jetbrains.kotlin.idea.imports.getImportableTargets import org.jetbrains.kotlin.idea.imports.getImportableTargets
import org.jetbrains.kotlin.idea.util.ShortenReferences.Options import org.jetbrains.kotlin.idea.util.ShortenReferences.Options
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.psi.psiUtil.parents
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
@@ -275,7 +273,7 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options.
val typeReference = type.getStrictParentOfType<JetTypeReference>()!! val typeReference = type.getStrictParentOfType<JetTypeReference>()!!
val scope = bindingContext[BindingContext.TYPE_RESOLUTION_SCOPE, typeReference]!! val scope = bindingContext[BindingContext.TYPE_RESOLUTION_SCOPE, typeReference]!!
val name = target.getName() val name = target.getName()
val targetByName = if (target is ClassifierDescriptor) scope.getClassifier(name) else scope.getPackage(name) val targetByName = if (target is ClassifierDescriptor) scope.getClassifier(name, LookupLocation.NO_LOCATION_FROM_IDE) else scope.getPackage(name)
val canShortenNow = targetByName?.asString() == target.asString() val canShortenNow = targetByName?.asString() == target.asString()
processQualifiedElement(type, target, canShortenNow) processQualifiedElement(type, target, canShortenNow)
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.idea.JetDescriptorIconProvider import org.jetbrains.kotlin.idea.JetDescriptorIconProvider
import org.jetbrains.kotlin.idea.completion.* import org.jetbrains.kotlin.idea.completion.*
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.renderer.render
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
@@ -89,7 +90,7 @@ class MultipleArgumentsItemProvider(val bindingContext: BindingContext,
private fun variableInScope(parameter: ValueParameterDescriptor, scope: JetScope): VariableDescriptor? { private fun variableInScope(parameter: ValueParameterDescriptor, scope: JetScope): VariableDescriptor? {
val name = parameter.getName() val name = parameter.getName()
//TODO: there can be more than one property with such name in scope and we should be able to select one (but we need API for this) //TODO: there can be more than one property with such name in scope and we should be able to select one (but we need API for this)
val variable = scope.getLocalVariable(name) ?: scope.getProperties(name).singleOrNull() ?: return null val variable = scope.getLocalVariable(name) ?: scope.getProperties(name, LookupLocation.NO_LOCATION_FROM_IDE).singleOrNull() ?: return null
return if (smartCastCalculator.types(variable).any { JetTypeChecker.DEFAULT.isSubtypeOf(it, parameter.getType()) }) return if (smartCastCalculator.types(variable).any { JetTypeChecker.DEFAULT.isSubtypeOf(it, parameter.getType()) })
variable variable
else else
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.idea.completion.handlers.KotlinFunctionInsertHandler
import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMethodsHandler import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMethodsHandler
import org.jetbrains.kotlin.idea.core.psiClassToDescriptor import org.jetbrains.kotlin.idea.core.psiClassToDescriptor
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptor import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptor
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.psi.JetClassOrObject import org.jetbrains.kotlin.psi.JetClassOrObject
@@ -253,7 +254,7 @@ class TypeInstantiationItems(
is ClassDescriptor -> container.getStaticScope() is ClassDescriptor -> container.getStaticScope()
else -> return else -> return
} }
val samConstructor = scope.getFunctions(`class`.getName()) val samConstructor = scope.getFunctions(`class`.name, LookupLocation.NO_LOCATION_FROM_IDE)
.filterIsInstance<SamConstructorDescriptor>() .filterIsInstance<SamConstructorDescriptor>()
.singleOrNull() ?: return .singleOrNull() ?: return
val lookupElement = lookupElementFactory.createLookupElement(samConstructor, bindingContext, false) val lookupElement = lookupElementFactory.createLookupElement(samConstructor, bindingContext, false)
@@ -16,21 +16,21 @@
package org.jetbrains.kotlin.idea.completion.smart package org.jetbrains.kotlin.idea.completion.smart
import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.resolve.scopes.JetScope
import java.util.HashMap
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.typeUtil.nullability
import org.jetbrains.kotlin.types.typeUtil.TypeNullability
import org.jetbrains.kotlin.idea.util.FuzzyType
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.idea.completion.HeuristicSignatures import org.jetbrains.kotlin.idea.completion.HeuristicSignatures
import org.jetbrains.kotlin.idea.util.FuzzyType
import org.jetbrains.kotlin.idea.util.nullability import org.jetbrains.kotlin.idea.util.nullability
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.JetScope
import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.typeUtil.TypeNullability
import java.util.HashMap
class TypesWithContainsDetector( class TypesWithContainsDetector(
private val scope: JetScope, private val scope: JetScope,
@@ -43,7 +43,7 @@ class TypesWithContainsDetector(
private val containsName = Name.identifier("contains") private val containsName = Name.identifier("contains")
private val booleanType = KotlinBuiltIns.getInstance().getBooleanType() private val booleanType = KotlinBuiltIns.getInstance().getBooleanType()
private val typesWithExtensionContains: Collection<JetType> = scope.getFunctions(containsName) private val typesWithExtensionContains: Collection<JetType> = scope.getFunctions(containsName, LookupLocation.NO_LOCATION_FROM_IDE)
.filter { it.getExtensionReceiverParameter() != null && isGoodContainsFunction(it, listOf()) } .filter { it.getExtensionReceiverParameter() != null && isGoodContainsFunction(it, listOf()) }
.map { it.getExtensionReceiverParameter()!!.getType() } .map { it.getExtensionReceiverParameter()!!.getType() }
@@ -52,7 +52,8 @@ class TypesWithContainsDetector(
} }
private fun hasContainsNoCache(type: FuzzyType): Boolean { private fun hasContainsNoCache(type: FuzzyType): Boolean {
return type.nullability() != TypeNullability.NULLABLE && type.type.getMemberScope().getFunctions(containsName).any { isGoodContainsFunction(it, type.freeParameters) } return type.nullability() != TypeNullability.NULLABLE &&
type.type.memberScope.getFunctions(containsName, LookupLocation.NO_LOCATION_FROM_IDE).any { isGoodContainsFunction(it, type.freeParameters) }
|| typesWithExtensionContains.any { type.checkIsSubtypeOf(it) != null } || typesWithExtensionContains.any { type.checkIsSubtypeOf(it) != null }
} }
@@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.frontend.di.createContainerForMacros import org.jetbrains.kotlin.frontend.di.createContainerForMacros
import org.jetbrains.kotlin.idea.util.FuzzyType import org.jetbrains.kotlin.idea.util.FuzzyType
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.JetPsiFactory import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.resolve.BindingTraceContext import org.jetbrains.kotlin.resolve.BindingTraceContext
@@ -41,7 +42,7 @@ public class IterableTypesDetector(
private val cache = HashMap<FuzzyType, FuzzyType?>() private val cache = HashMap<FuzzyType, FuzzyType?>()
private val iteratorName = Name.identifier("iterator") private val iteratorName = Name.identifier("iterator")
private val typesWithExtensionIterator: Collection<JetType> = scope.getFunctions(iteratorName) private val typesWithExtensionIterator: Collection<JetType> = scope.getFunctions(iteratorName, LookupLocation.NO_LOCATION_FROM_IDE)
.map { it.getExtensionReceiverParameter() } .map { it.getExtensionReceiverParameter() }
.filterNotNull() .filterNotNull()
.map { it.getType() } .map { it.getType() }
@@ -74,6 +75,7 @@ public class IterableTypesDetector(
} }
private fun canBeIterable(type: FuzzyType): Boolean { private fun canBeIterable(type: FuzzyType): Boolean {
return type.type.getMemberScope().getFunctions(iteratorName).isNotEmpty() || typesWithExtensionIterator.any { type.checkIsSubtypeOf(it) != null } return type.type.memberScope.getFunctions(iteratorName, LookupLocation.NO_LOCATION_FROM_IDE).isNotEmpty() ||
typesWithExtensionIterator.any { type.checkIsSubtypeOf(it) != null }
} }
} }
@@ -21,13 +21,13 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.allChildren import org.jetbrains.kotlin.psi.psiUtil.allChildren
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.psi.psiUtil.siblings import org.jetbrains.kotlin.psi.psiUtil.siblings
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.scopes.JetScope import org.jetbrains.kotlin.resolve.scopes.JetScope
@@ -96,8 +96,12 @@ public class NewDeclarationNameValidator(
} }
return when(target) { return when(target) {
Target.VARIABLES -> getProperties(name).any { !it.isExtension && it.isVisible() } || getLocalVariable(name) != null Target.VARIABLES ->
Target.FUNCTIONS_AND_CLASSES -> getFunctions(name).any { !it.isExtension && it.isVisible() } || getClassifier(name)?.let { it.isVisible() } ?: false getProperties(name, LookupLocation.NO_LOCATION_FROM_IDE).any { !it.isExtension && it.isVisible() } ||
getLocalVariable(name) != null
Target.FUNCTIONS_AND_CLASSES ->
getFunctions(name, LookupLocation.NO_LOCATION_FROM_IDE).any { !it.isExtension && it.isVisible() } ||
getClassifier(name, LookupLocation.NO_LOCATION_FROM_IDE)?.let { it.isVisible() } ?: false
} }
} }
@@ -42,9 +42,13 @@ import org.jetbrains.kotlin.idea.conversion.copy.range
import org.jetbrains.kotlin.idea.conversion.copy.start import org.jetbrains.kotlin.idea.conversion.copy.start
import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport
import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.imports.importableFqName
import org.jetbrains.kotlin.idea.references.* import org.jetbrains.kotlin.idea.references.JetMultiReference
import org.jetbrains.kotlin.idea.references.JetReference
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.util.ImportInsertHelper import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.elementsInRange import org.jetbrains.kotlin.psi.psiUtil.elementsInRange
@@ -234,10 +238,12 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<Kotlin
val originalFqName = FqName(refData.fqName) val originalFqName = FqName(refData.fqName)
if (refData.kind == KotlinReferenceData.Kind.EXTENSION_FUNCTION) { if (refData.kind == KotlinReferenceData.Kind.EXTENSION_FUNCTION) {
if (fileResolutionScope.getFunctions(originalFqName.shortName()).any { it.importableFqName == originalFqName }) return null // already imported val functions = fileResolutionScope.getFunctions(originalFqName.shortName(), LookupLocation.NO_LOCATION_FROM_IDE)
if (functions.any { it.importableFqName == originalFqName }) return null // already imported
} }
else if (refData.kind == KotlinReferenceData.Kind.EXTENSION_PROPERTY) { else if (refData.kind == KotlinReferenceData.Kind.EXTENSION_PROPERTY) {
if (fileResolutionScope.getProperties(originalFqName.shortName()).any { it.importableFqName == originalFqName }) return null // already imported val properties = fileResolutionScope.getProperties(originalFqName.shortName(), LookupLocation.NO_LOCATION_FROM_IDE)
if (properties.any { it.importableFqName == originalFqName }) return null // already imported
} }
val referencedDescriptors = try { val referencedDescriptors = try {
@@ -16,30 +16,28 @@
package org.jetbrains.kotlin.idea.debugger package org.jetbrains.kotlin.idea.debugger
import com.intellij.psi.search.FilenameIndex
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.psi.JetElement
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import com.intellij.openapi.roots.libraries.LibraryUtil
import com.intellij.openapi.module.impl.scopes.LibraryScope
import com.intellij.openapi.roots.LibraryOrderEntry
import org.jetbrains.kotlin.psi.JetDeclaration
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.openapi.module.impl.scopes.JdkScope import com.intellij.openapi.module.impl.scopes.JdkScope
import com.intellij.openapi.module.impl.scopes.LibraryScope
import com.intellij.openapi.roots.JdkOrderEntry import com.intellij.openapi.roots.JdkOrderEntry
import org.jetbrains.kotlin.psi.JetPsiUtil import com.intellij.openapi.roots.LibraryOrderEntry
import org.jetbrains.kotlin.resolve.jvm.JvmClassName import com.intellij.openapi.roots.libraries.LibraryUtil
import org.jetbrains.kotlin.resolve.descriptorUtil.module import com.intellij.psi.search.FilenameIndex
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import com.intellij.util.indexing.FileBasedIndex import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.psi.JetDeclaration
import org.jetbrains.kotlin.psi.JetElement
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
private val LOG = Logger.getInstance("org.jetbrains.kotlin.idea.debugger") private val LOG = Logger.getInstance("org.jetbrains.kotlin.idea.debugger")
@@ -64,8 +62,8 @@ fun findPackagePartInternalNameForLibraryFile(topLevelDeclaration: JetDeclaratio
val descFromSourceText = render(descriptor) val descFromSourceText = render(descriptor)
val descriptors: Collection<CallableDescriptor> = when (descriptor) { val descriptors: Collection<CallableDescriptor> = when (descriptor) {
is FunctionDescriptor -> packageDescriptor.memberScope.getFunctions(descriptor.getName()) is FunctionDescriptor -> packageDescriptor.memberScope.getFunctions(descriptor.name, LookupLocation.NO_LOCATION_FROM_IDE)
is PropertyDescriptor -> packageDescriptor.memberScope.getProperties(descriptor.getName()) is PropertyDescriptor -> packageDescriptor.memberScope.getProperties(descriptor.name, LookupLocation.NO_LOCATION_FROM_IDE)
else -> { else -> {
reportError(topLevelDeclaration, descriptor) reportError(topLevelDeclaration, descriptor)
listOf() listOf()
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.idea.core.formatter.JetCodeStyleSettings
import org.jetbrains.kotlin.idea.references.JetReference import org.jetbrains.kotlin.idea.references.JetReference
import org.jetbrains.kotlin.idea.util.ImportInsertHelper import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -198,7 +199,7 @@ public class KotlinImportOptimizer() : ImportOptimizer {
val scope = fileWithImports.getResolutionFacade().getFileTopLevelScope(fileWithImports) val scope = fileWithImports.getResolutionFacade().getFileTopLevelScope(fileWithImports)
for (fqName in classNamesToCheck) { for (fqName in classNamesToCheck) {
if (scope.getClassifier(fqName.shortName())?.importableFqNameSafe != fqName) { if (scope.getClassifier(fqName.shortName(), LookupLocation.NO_LOCATION_FROM_IDE)?.importableFqNameSafe != fqName) {
// add explicit import if failed to import with * (or from current package) // add explicit import if failed to import with * (or from current package)
importsToGenerate.add(ImportPath(fqName, false)) importsToGenerate.add(ImportPath(fqName, false))
@@ -42,14 +42,15 @@ import org.jetbrains.kotlin.idea.search.usagesSearch.search
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.util.ShortenReferences import org.jetbrains.kotlin.idea.util.ShortenReferences
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.types.typeUtil.supertypes
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch
import org.jetbrains.kotlin.psi.psiUtil.siblings import org.jetbrains.kotlin.psi.psiUtil.siblings
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.types.typeUtil.supertypes
import java.util.ArrayList import java.util.ArrayList
public class ConvertFunctionToPropertyIntention : JetSelfTargetingIntention<JetNamedFunction>(javaClass(), "Convert function to property"), LowPriorityAction { public class ConvertFunctionToPropertyIntention : JetSelfTargetingIntention<JetNamedFunction>(javaClass(), "Convert function to property"), LowPriorityAction {
@@ -114,7 +115,7 @@ public class ConvertFunctionToPropertyIntention : JetSelfTargetingIntention<JetN
} }
callableDescriptor.getContainingScope(bindingContext) callableDescriptor.getContainingScope(bindingContext)
?.getProperties(callableDescriptor.getName()) ?.getProperties(callableDescriptor.name, LookupLocation.NO_LOCATION_FROM_IDE)
?.firstOrNull() ?.firstOrNull()
?.let { DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) } ?.let { DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) }
?.let { reportDeclarationConflict(conflicts, it) { "$it already exists" } } ?.let { reportDeclarationConflict(conflicts, it) { "$it already exists" } }
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.idea.search.usagesSearch.DefaultSearchHelper
import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchTarget import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchTarget
import org.jetbrains.kotlin.idea.search.usagesSearch.search import org.jetbrains.kotlin.idea.search.usagesSearch.search
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
@@ -96,7 +97,7 @@ public class ConvertPropertyToFunctionIntention : JetSelfTargetingIntention<JetP
if (callable is JetProperty) { if (callable is JetProperty) {
callableDescriptor.getContainingScope(bindingContext) callableDescriptor.getContainingScope(bindingContext)
?.getFunctions(callableDescriptor.getName()) ?.getFunctions(callableDescriptor.name, LookupLocation.NO_LOCATION_FROM_IDE)
?.firstOrNull { it.getValueParameters().isEmpty() } ?.firstOrNull { it.getValueParameters().isEmpty() }
?.let { DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) } ?.let { DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) }
?.let { reportDeclarationConflict(conflicts, it) { "$it already exists" } } ?.let { reportDeclarationConflict(conflicts, it) { "$it already exists" } }
@@ -268,7 +268,7 @@ public class ChangeMemberFunctionSignatureFix extends JetHintAction<JetNamedFunc
Name name = functionDescriptor.getName(); Name name = functionDescriptor.getName();
for (JetType type : TypeUtils.getAllSupertypes(classDescriptor.getDefaultType())) { for (JetType type : TypeUtils.getAllSupertypes(classDescriptor.getDefaultType())) {
JetScope scope = type.getMemberScope(); JetScope scope = type.getMemberScope();
for (FunctionDescriptor function : scope.getFunctions(name, LookupLocation.NO_LOCATION)) { for (FunctionDescriptor function : scope.getFunctions(name, LookupLocation.NO_LOCATION_FROM_IDE)) {
if (!function.getKind().isReal()) continue; if (!function.getKind().isReal()) continue;
if (function.getModality().isOverridable()) if (function.getModality().isOverridable())
superFunctions.add(function); superFunctions.add(function);
@@ -54,6 +54,7 @@ import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.util.ShortenReferences import org.jetbrains.kotlin.idea.util.ShortenReferences
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -399,7 +400,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
SourceElement.NO_SOURCE SourceElement.NO_SOURCE
) )
val validator = CollectingNameValidator { scope.getClassifier(Name.identifier(it)) == null } val validator = CollectingNameValidator { scope.getClassifier(Name.identifier(it), LookupLocation.NO_LOCATION_FROM_IDE) == null }
val parameterNames = KotlinNameSuggester.suggestNamesForTypeParameters(typeParameterCount, validator) val parameterNames = KotlinNameSuggester.suggestNamesForTypeParameters(typeParameterCount, validator)
val typeParameters = (0..typeParameterCount - 1).map { val typeParameters = (0..typeParameterCount - 1).map {
TypeParameterDescriptorImpl.createWithDefaultBound( TypeParameterDescriptorImpl.createWithDefaultBound(
@@ -619,7 +620,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
} }
} }
val validator = CollectingNameValidator { scope.getClassifier(Name.identifier(it)) == null } val validator = CollectingNameValidator { scope.getClassifier(Name.identifier(it), LookupLocation.NO_LOCATION_FROM_IDE) == null }
val typeParameterNames = allTypeParametersNotInScope.map { KotlinNameSuggester.suggestNameByName(it.getName().asString(), validator) } val typeParameterNames = allTypeParametersNotInScope.map { KotlinNameSuggester.suggestNameByName(it.getName().asString(), validator) }
return allTypeParametersNotInScope.zip(typeParameterNames).toMap() return allTypeParametersNotInScope.zip(typeParameterNames).toMap()
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference import org.jetbrains.kotlin.idea.references.JetSimpleNameReference
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -65,7 +66,7 @@ private fun JetType.renderLong(typeParameterNameMap: Map<TypeParameterDescriptor
private fun getTypeParameterNamesNotInScope(typeParameters: Collection<TypeParameterDescriptor>, scope: JetScope): List<TypeParameterDescriptor> { private fun getTypeParameterNamesNotInScope(typeParameters: Collection<TypeParameterDescriptor>, scope: JetScope): List<TypeParameterDescriptor> {
return typeParameters.filter { typeParameter -> return typeParameters.filter { typeParameter ->
val classifier = scope.getClassifier(typeParameter.getName()) val classifier = scope.getClassifier(typeParameter.name, LookupLocation.NO_LOCATION_FROM_IDE)
classifier == null || classifier != typeParameter classifier == null || classifier != typeParameter
} }
} }
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.getTyp
import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.guessTypes import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.guessTypes
import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetParameterInfo import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetParameterInfo
import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetValVar import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetValVar
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElement import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElement
@@ -136,5 +137,5 @@ fun JetType.hasTypeParametersToAdd(functionDescriptor: FunctionDescriptor, conte
else -> null else -> null
} ?: return true } ?: return true
return typeParametersToAdd.any { scope.getClassifier(it.name) != it } return typeParametersToAdd.any { scope.getClassifier(it.name, LookupLocation.NO_LOCATION_FROM_IDE) != it }
} }
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
import org.jetbrains.kotlin.idea.core.CollectingNameValidator import org.jetbrains.kotlin.idea.core.CollectingNameValidator
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.JetCallableDefinitionUsage import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.JetCallableDefinitionUsage
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.JetCallableDeclaration import org.jetbrains.kotlin.psi.JetCallableDeclaration
import org.jetbrains.kotlin.psi.JetClass import org.jetbrains.kotlin.psi.JetClass
@@ -80,7 +81,7 @@ public class JetChangeSignatureData(
val validator = bodyScope?.let { bodyScope -> val validator = bodyScope?.let { bodyScope ->
CollectingNameValidator(paramNames) { CollectingNameValidator(paramNames) {
val name = Name.identifier(it) val name = Name.identifier(it)
bodyScope.getLocalVariable(name) == null && bodyScope.getProperties(name).isEmpty() bodyScope.getLocalVariable(name) == null && bodyScope.getProperties(name, LookupLocation.NO_LOCATION_FROM_IDE).isEmpty()
} }
} ?: CollectingNameValidator(paramNames) } ?: CollectingNameValidator(paramNames)
val receiverType = baseDescriptor.getExtensionReceiverParameter()?.getType() ?: return null val receiverType = baseDescriptor.getExtensionReceiverParameter()?.getType() ?: return null
@@ -623,8 +623,8 @@ public class JetChangeSignatureUsageProcessor implements ChangeSignatureUsagePro
if (!kind.getIsConstructor() && callableScope != null && !info.getNewName().isEmpty()) { if (!kind.getIsConstructor() && callableScope != null && !info.getNewName().isEmpty()) {
Name newName = Name.identifier(info.getNewName()); Name newName = Name.identifier(info.getNewName());
Collection<? extends CallableDescriptor> conflicts = oldDescriptor instanceof FunctionDescriptor Collection<? extends CallableDescriptor> conflicts = oldDescriptor instanceof FunctionDescriptor
? callableScope.getFunctions(newName, LookupLocation.NO_LOCATION) ? callableScope.getFunctions(newName, LookupLocation.NO_LOCATION_FROM_IDE)
: callableScope.getProperties(newName, LookupLocation.NO_LOCATION); : callableScope.getProperties(newName, LookupLocation.NO_LOCATION_FROM_IDE);
for (CallableDescriptor conflict : conflicts) { for (CallableDescriptor conflict : conflicts) {
if (conflict == oldDescriptor) continue; if (conflict == oldDescriptor) continue;
@@ -647,7 +647,7 @@ public class JetChangeSignatureUsageProcessor implements ChangeSignatureUsagePro
} }
if (parametersScope != null) { if (parametersScope != null) {
if (kind == JetMethodDescriptor.Kind.PRIMARY_CONSTRUCTOR && valOrVar != JetValVar.None) { if (kind == JetMethodDescriptor.Kind.PRIMARY_CONSTRUCTOR && valOrVar != JetValVar.None) {
for (VariableDescriptor property : parametersScope.getProperties(Name.identifier(parameterName), LookupLocation.NO_LOCATION)) { for (VariableDescriptor property : parametersScope.getProperties(Name.identifier(parameterName), LookupLocation.NO_LOCATION_FROM_IDE)) {
PsiElement propertyDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(property); PsiElement propertyDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(property);
if (propertyDeclaration != null && !(propertyDeclaration.getParent() instanceof JetParameterList)) { if (propertyDeclaration != null && !(propertyDeclaration.getParent() instanceof JetParameterList)) {
@@ -60,6 +60,7 @@ import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.util.approximateWithResolvableType import org.jetbrains.kotlin.idea.util.approximateWithResolvableType
import org.jetbrains.kotlin.idea.util.isResolvableInScope import org.jetbrains.kotlin.idea.util.isResolvableInScope
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
@@ -649,7 +650,7 @@ private fun ExtractionData.inferParametersInfo(
options.captureLocalFunctions options.captureLocalFunctions
&& originalRef.getReferencedName() == originalDescriptor.getName().asString() // to forbid calls by convention && originalRef.getReferencedName() == originalDescriptor.getName().asString() // to forbid calls by convention
&& originalDeclaration is JetNamedFunction && originalDeclaration.isLocal() && originalDeclaration is JetNamedFunction && originalDeclaration.isLocal()
&& (targetScope == null || originalDescriptor !in targetScope.getFunctions(originalDescriptor.getName())) && (targetScope == null || originalDescriptor !in targetScope.getFunctions(originalDescriptor.name, LookupLocation.NO_LOCATION_FROM_IDE))
val descriptorToExtract = (if (extractThis) thisDescriptor else null) ?: originalDescriptor val descriptorToExtract = (if (extractThis) thisDescriptor else null) ?: originalDescriptor
@@ -1024,4 +1025,4 @@ fun ExtractableCodeDescriptor.validate(): ExtractableCodeDescriptorWithConflicts
return ExtractableCodeDescriptorWithConflicts(this, conflicts) return ExtractableCodeDescriptorWithConflicts(this, conflicts)
} }
private val LOG = Logger.getInstance(javaClass<ExtractionEngine>()) private val LOG = Logger.getInstance(javaClass<ExtractionEngine>())
@@ -16,8 +16,6 @@
package org.jetbrains.kotlin.util package org.jetbrains.kotlin.util
import com.intellij.codeInsight.CodeInsightSettings
import com.intellij.codeInsight.actions.OptimizeImportsProcessor
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.impl.PsiModificationTrackerImpl import com.intellij.psi.impl.PsiModificationTrackerImpl
@@ -33,6 +31,7 @@ import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
import org.jetbrains.kotlin.idea.refactoring.fqName.isImported import org.jetbrains.kotlin.idea.refactoring.fqName.isImported
import org.jetbrains.kotlin.idea.util.ImportInsertHelper import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.ImportInsertHelper.ImportDescriptorResult import org.jetbrains.kotlin.idea.util.ImportInsertHelper.ImportDescriptorResult
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -121,11 +120,24 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
// check if import is not needed // check if import is not needed
when (target) { when (target) {
is ClassDescriptor -> { if (topLevelScope.getClassifier(name)?.importableFqName == targetFqName) return ImportDescriptorResult.ALREADY_IMPORTED } is ClassDescriptor -> {
is PackageViewDescriptor -> { if (topLevelScope.getPackage(name)?.importableFqName == targetFqName) return ImportDescriptorResult.ALREADY_IMPORTED } val classifier = topLevelScope.getClassifier(name, LookupLocation.NO_LOCATION_FROM_IDE)
is FunctionDescriptor -> { if (topLevelScope.getFunctions(name).map { it.importableFqName }.contains(targetFqName)) return ImportDescriptorResult.ALREADY_IMPORTED } if (classifier?.importableFqName == targetFqName) return ImportDescriptorResult.ALREADY_IMPORTED
is PropertyDescriptor -> { if (topLevelScope.getProperties(name).map { it.importableFqName }.contains(targetFqName)) return ImportDescriptorResult.ALREADY_IMPORTED } }
else -> return ImportDescriptorResult.FAIL is PackageViewDescriptor -> {
if (topLevelScope.getPackage(name)?.importableFqName == targetFqName) return ImportDescriptorResult.ALREADY_IMPORTED
}
is FunctionDescriptor -> {
val functions = topLevelScope.getFunctions(name, LookupLocation.NO_LOCATION_FROM_IDE)
if (functions.map { it.importableFqName }.contains(targetFqName)) return ImportDescriptorResult.ALREADY_IMPORTED
}
is PropertyDescriptor -> {
val properties = topLevelScope.getProperties(name, LookupLocation.NO_LOCATION_FROM_IDE)
if (properties.map { it.importableFqName }.contains(targetFqName)) return ImportDescriptorResult.ALREADY_IMPORTED
}
else -> {
return ImportDescriptorResult.FAIL
}
} }
if (!mayImportByCodeStyle(descriptor)) { if (!mayImportByCodeStyle(descriptor)) {
@@ -139,7 +151,7 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
// check there is an explicit import of a class/package with the same name already // check there is an explicit import of a class/package with the same name already
val conflict = when (target) { val conflict = when (target) {
is ClassDescriptor -> topLevelScope.getClassifier(name) is ClassDescriptor -> topLevelScope.getClassifier(name, LookupLocation.NO_LOCATION_FROM_IDE)
is PackageViewDescriptor -> topLevelScope.getPackage(name) is PackageViewDescriptor -> topLevelScope.getPackage(name)
else -> null else -> null
} }
@@ -156,7 +168,9 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
val tryStarImport = shouldTryStarImport(packageFqName, imports) val tryStarImport = shouldTryStarImport(packageFqName, imports)
&& when (target) { && when (target) {
is ClassDescriptor -> topLevelScope.getClassifier(name) == null // this check does not give a guarantee that import with * will import the class - for example, there can be classes with conflicting name in more than one import with * // this check does not give a guarantee that import with * will import the class - for example,
// there can be classes with conflicting name in more than one import with *
is ClassDescriptor -> topLevelScope.getClassifier(name, LookupLocation.NO_LOCATION_FROM_IDE) == null
is PackageViewDescriptor -> false is PackageViewDescriptor -> false
is FunctionDescriptor, is PropertyDescriptor -> true is FunctionDescriptor, is PropertyDescriptor -> true
else -> throw Exception() else -> throw Exception()
@@ -222,12 +236,14 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
val topLevelScope = resolutionFacade.getFileTopLevelScope(file) val topLevelScope = resolutionFacade.getFileTopLevelScope(file)
val conflictCandidates: List<ClassifierDescriptor> = classNamesToImport val conflictCandidates: List<ClassifierDescriptor> = classNamesToImport
.flatMap { .flatMap {
importedScopes.map { scope -> scope.getClassifier(it) }.filterNotNull() importedScopes.map { scope -> scope.getClassifier(it, LookupLocation.NO_LOCATION_FROM_IDE) }.filterNotNull()
} }
.filter { importedClass -> .filter { importedClass ->
isVisible(importedClass) isVisible(importedClass)
&& topLevelScope.getClassifier(importedClass.getName()) == importedClass /* check that class is really imported */ // check that class is really imported
&& imports.all { it.getImportPath() != ImportPath(importedClass.importableFqNameSafe, false) } /* and not yet imported explicitly */ && topLevelScope.getClassifier(importedClass.name, LookupLocation.NO_LOCATION_FROM_IDE) == importedClass
// and not yet imported explicitly
&& imports.all { it.importPath != ImportPath(importedClass.importableFqNameSafe, false) }
} }
val conflicts = detectNeededImports(conflictCandidates) val conflicts = detectNeededImports(conflictCandidates)
@@ -235,7 +251,7 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
if (target is ClassDescriptor) { if (target is ClassDescriptor) {
val newTopLevelScope = resolutionFacade.getFileTopLevelScope(file) val newTopLevelScope = resolutionFacade.getFileTopLevelScope(file)
val resolvedTo = newTopLevelScope.getClassifier(target.getName()) val resolvedTo = newTopLevelScope.getClassifier(target.name, LookupLocation.NO_LOCATION_FROM_IDE)
if (resolvedTo?.importableFqNameSafe != targetFqName) { if (resolvedTo?.importableFqNameSafe != targetFqName) {
addedImport.delete() addedImport.delete()
return ImportDescriptorResult.FAIL return ImportDescriptorResult.FAIL
@@ -258,7 +274,8 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
} }
val parentScope = getMemberScope(fqName.parent(), moduleDescriptor) ?: return null val parentScope = getMemberScope(fqName.parent(), moduleDescriptor) ?: return null
val classDescriptor = parentScope.getClassifier(fqName.shortName()) as? ClassDescriptor ?: return null val classifier = parentScope.getClassifier(fqName.shortName(), LookupLocation.NO_LOCATION_FROM_IDE)
val classDescriptor = classifier as? ClassDescriptor ?: return null
return classDescriptor.getDefaultType().getMemberScope() return classDescriptor.getDefaultType().getMemberScope()
} }
@@ -269,7 +286,7 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
// check if there is a conflicting class imported with * import // check if there is a conflicting class imported with * import
// (not with explicit import - explicit imports are checked before this method invocation) // (not with explicit import - explicit imports are checked before this method invocation)
val classifier = topLevelScope.getClassifier(name) val classifier = topLevelScope.getClassifier(name, LookupLocation.NO_LOCATION_FROM_IDE)
if (classifier != null && detectNeededImports(listOf(classifier)).isNotEmpty()) { if (classifier != null && detectNeededImports(listOf(classifier)).isNotEmpty()) {
return ImportDescriptorResult.FAIL return ImportDescriptorResult.FAIL
} }
@@ -298,7 +315,8 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
if (importsToCheck.isNotEmpty()) { if (importsToCheck.isNotEmpty()) {
val topLevelScope = resolutionFacade.getFileTopLevelScope(file) val topLevelScope = resolutionFacade.getFileTopLevelScope(file)
for (classFqName in importsToCheck) { for (classFqName in importsToCheck) {
if (topLevelScope.getClassifier(classFqName.shortName())?.importableFqNameSafe != classFqName) { val classifier = topLevelScope.getClassifier(classFqName.shortName(), LookupLocation.NO_LOCATION_FROM_IDE)
if (classifier?.importableFqNameSafe != classFqName) {
addImport(classFqName, false) // restore explicit import addImport(classFqName, false) // restore explicit import
} }
} }
@@ -18,8 +18,9 @@ package org.jetbrains.kotlin.idea.kdoc
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
import org.junit.Assert import org.junit.Assert
@@ -42,7 +43,7 @@ public class KDocFinderTest() : LightPlatformCodeInsightFixtureTestCase() {
myFixture.configureByFile(getTestName(false) + ".kt") myFixture.configureByFile(getTestName(false) + ".kt")
val declaration = (myFixture.getFile() as JetFile).getDeclarations().single { it.getName() == "Bar" } val declaration = (myFixture.getFile() as JetFile).getDeclarations().single { it.getName() == "Bar" }
val descriptor = declaration.resolveToDescriptor() as ClassDescriptor val descriptor = declaration.resolveToDescriptor() as ClassDescriptor
val overriddenFunctionDescriptor = descriptor.getDefaultType().getMemberScope().getFunctions(Name.identifier("xyzzy")).single() val overriddenFunctionDescriptor = descriptor.defaultType.memberScope.getFunctions(Name.identifier("xyzzy"), LookupLocation.NO_LOCATION_FROM_TEST).single()
val doc = KDocFinder.findKDoc(overriddenFunctionDescriptor) val doc = KDocFinder.findKDoc(overriddenFunctionDescriptor)
Assert.assertEquals("Doc for method xyzzy", doc!!.getContent()) Assert.assertEquals("Doc for method xyzzy", doc!!.getContent())
} }
@@ -51,7 +52,7 @@ public class KDocFinderTest() : LightPlatformCodeInsightFixtureTestCase() {
myFixture.configureByFile(getTestName(false) + ".kt") myFixture.configureByFile(getTestName(false) + ".kt")
val declaration = (myFixture.getFile() as JetFile).getDeclarations().single { it.getName() == "Bar" } val declaration = (myFixture.getFile() as JetFile).getDeclarations().single { it.getName() == "Bar" }
val descriptor = declaration.resolveToDescriptor() as ClassDescriptor val descriptor = declaration.resolveToDescriptor() as ClassDescriptor
val overriddenFunctionDescriptor = descriptor.getDefaultType().getMemberScope().getFunctions(Name.identifier("xyzzy")).single() val overriddenFunctionDescriptor = descriptor.defaultType.memberScope.getFunctions(Name.identifier("xyzzy"), LookupLocation.NO_LOCATION_FROM_TEST).single()
val doc = KDocFinder.findKDoc(overriddenFunctionDescriptor) val doc = KDocFinder.findKDoc(overriddenFunctionDescriptor)
Assert.assertEquals("Doc for method xyzzy", doc!!.getContent()) Assert.assertEquals("Doc for method xyzzy", doc!!.getContent())
} }
@@ -60,7 +61,7 @@ public class KDocFinderTest() : LightPlatformCodeInsightFixtureTestCase() {
myFixture.configureByFile(getTestName(false) + ".kt") myFixture.configureByFile(getTestName(false) + ".kt")
val declaration = (myFixture.getFile() as JetFile).getDeclarations().single { it.getName() == "Foo" } val declaration = (myFixture.getFile() as JetFile).getDeclarations().single { it.getName() == "Foo" }
val descriptor = declaration.resolveToDescriptor() as ClassDescriptor val descriptor = declaration.resolveToDescriptor() as ClassDescriptor
val propertyDescriptor = descriptor.getDefaultType().getMemberScope().getProperties(Name.identifier("xyzzy")).single() val propertyDescriptor = descriptor.defaultType.memberScope.getProperties(Name.identifier("xyzzy"), LookupLocation.NO_LOCATION_FROM_TEST).single()
val doc = KDocFinder.findKDoc(propertyDescriptor) val doc = KDocFinder.findKDoc(propertyDescriptor)
Assert.assertEquals("Doc for property xyzzy", doc!!.getContent()) Assert.assertEquals("Doc for property xyzzy", doc!!.getContent())
} }
@@ -47,6 +47,7 @@ import org.jetbrains.kotlin.idea.search.allScope
import org.jetbrains.kotlin.idea.test.DirectiveBasedActionUtils import org.jetbrains.kotlin.idea.test.DirectiveBasedActionUtils
import org.jetbrains.kotlin.idea.test.KotlinMultiFileTestCase import org.jetbrains.kotlin.idea.test.KotlinMultiFileTestCase
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
@@ -185,13 +186,13 @@ public abstract class AbstractRenameTest : KotlinMultiFileTestCase() {
private fun renameKotlinFunctionTest(renameParamsObject: JsonObject, context: TestContext) { private fun renameKotlinFunctionTest(renameParamsObject: JsonObject, context: TestContext) {
val oldMethodName = Name.identifier(renameParamsObject.getString("oldName")) val oldMethodName = Name.identifier(renameParamsObject.getString("oldName"))
doRenameInKotlinClassOrPackage(renameParamsObject, context) { it.getFunctions(oldMethodName).first() } doRenameInKotlinClassOrPackage(renameParamsObject, context) { it.getFunctions(oldMethodName, LookupLocation.NO_LOCATION_FROM_TEST).first() }
} }
private fun renameKotlinPropertyTest(renameParamsObject: JsonObject, context: TestContext) { private fun renameKotlinPropertyTest(renameParamsObject: JsonObject, context: TestContext) {
val oldPropertyName = Name.identifier(renameParamsObject.getString("oldName")) val oldPropertyName = Name.identifier(renameParamsObject.getString("oldName"))
doRenameInKotlinClassOrPackage(renameParamsObject, context) { it.getProperties(oldPropertyName).first() } doRenameInKotlinClassOrPackage(renameParamsObject, context) { it.getProperties(oldPropertyName, LookupLocation.NO_LOCATION_FROM_TEST).first() }
} }
private fun renameKotlinClassTest(renameParamsObject: JsonObject, context: TestContext) { private fun renameKotlinClassTest(renameParamsObject: JsonObject, context: TestContext) {
@@ -249,7 +249,7 @@ public class ManglingUtils {
@NotNull @NotNull
public static String getStableMangledNameForDescriptor(@NotNull ClassDescriptor descriptor, @NotNull String functionName) { public static String getStableMangledNameForDescriptor(@NotNull ClassDescriptor descriptor, @NotNull String functionName) {
Collection<FunctionDescriptor> functions = Collection<FunctionDescriptor> functions =
descriptor.getDefaultType().getMemberScope().getFunctions(Name.identifier(functionName), LookupLocation.NO_LOCATION); descriptor.getDefaultType().getMemberScope().getFunctions(Name.identifier(functionName), LookupLocation.NO_LOCATION_FROM_BACKEND);
assert functions.size() == 1 : "Can't select a single function: " + functionName + " in " + descriptor; assert functions.size() == 1 : "Can't select a single function: " + functionName + " in " + descriptor;
return getSuggestedName((DeclarationDescriptor) functions.iterator().next()); return getSuggestedName((DeclarationDescriptor) functions.iterator().next());
} }