More efficient code completion + fixed a few bugs
This commit is contained in:
@@ -58,7 +58,6 @@ import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
|
|||||||
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
||||||
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
|
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor;
|
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor;
|
|
||||||
import org.jetbrains.jet.lang.resolve.java.jvmSignature.JvmMethodSignature;
|
import org.jetbrains.jet.lang.resolve.java.jvmSignature.JvmMethodSignature;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.*;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.*;
|
||||||
|
|||||||
+1
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor
|
|||||||
import org.jetbrains.jet.lang.types.TypeUtils
|
import org.jetbrains.jet.lang.types.TypeUtils
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker
|
||||||
|
import org.jetbrains.jet.lang.descriptors.SamConstructorDescriptor
|
||||||
|
|
||||||
public object SamConversionResolverImpl : SamConversionResolver {
|
public object SamConversionResolverImpl : SamConversionResolver {
|
||||||
override fun resolveSamConstructor(name: Name, scope: JetScope): SamConstructorDescriptor? {
|
override fun resolveSamConstructor(name: Name, scope: JetScope): SamConstructorDescriptor? {
|
||||||
|
|||||||
+1
-1
@@ -147,7 +147,7 @@ public class SingleAbstractMethodUtils {
|
|||||||
) {
|
) {
|
||||||
assert isSamInterface(samInterface) : samInterface;
|
assert isSamInterface(samInterface) : samInterface;
|
||||||
|
|
||||||
SamConstructorDescriptor result = new SamConstructorDescriptor(owner, samInterface);
|
SamConstructorDescriptorImpl result = new SamConstructorDescriptorImpl(owner, samInterface);
|
||||||
|
|
||||||
TypeParameters typeParameters = recreateAndInitializeTypeParameters(samInterface.getTypeConstructor().getParameters(), result);
|
TypeParameters typeParameters = recreateAndInitializeTypeParameters(samInterface.getTypeConstructor().getParameters(), result);
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -18,10 +18,11 @@ package org.jetbrains.jet.lang.resolve.java.descriptor;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.SamConstructorDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl;
|
import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl;
|
||||||
|
|
||||||
public class SamConstructorDescriptor extends SimpleFunctionDescriptorImpl {
|
public class SamConstructorDescriptorImpl extends SimpleFunctionDescriptorImpl implements SamConstructorDescriptor {
|
||||||
public SamConstructorDescriptor(@NotNull DeclarationDescriptor containingDeclaration, @NotNull JavaClassDescriptor samInterface) {
|
public SamConstructorDescriptorImpl(@NotNull DeclarationDescriptor containingDeclaration, @NotNull JavaClassDescriptor samInterface) {
|
||||||
super(containingDeclaration, null, samInterface.getAnnotations(), samInterface.getName(),
|
super(containingDeclaration, null, samInterface.getAnnotations(), samInterface.getName(),
|
||||||
Kind.SYNTHESIZED, samInterface.getSource());
|
Kind.SYNTHESIZED, samInterface.getSource());
|
||||||
}
|
}
|
||||||
+1
@@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContext
|
|||||||
import org.jetbrains.jet.lang.resolve.java.lazy.withTypes
|
import org.jetbrains.jet.lang.resolve.java.lazy.withTypes
|
||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod
|
||||||
import org.jetbrains.jet.lang.types.JetType
|
import org.jetbrains.jet.lang.types.JetType
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptorImpl
|
||||||
|
|
||||||
public abstract class LazyJavaStaticScope(
|
public abstract class LazyJavaStaticScope(
|
||||||
c: LazyJavaResolverContext,
|
c: LazyJavaResolverContext,
|
||||||
|
|||||||
+1
-1
@@ -18,11 +18,11 @@ package org.jetbrains.jet.lang.resolve.java.resolver
|
|||||||
|
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name
|
import org.jetbrains.jet.lang.resolve.name.Name
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor
|
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.jet.lang.types.JetType
|
import org.jetbrains.jet.lang.types.JetType
|
||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor
|
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor
|
||||||
|
import org.jetbrains.jet.lang.descriptors.SamConstructorDescriptor
|
||||||
|
|
||||||
public trait SamConversionResolver {
|
public trait SamConversionResolver {
|
||||||
public fun resolveSamConstructor(name: Name, scope: JetScope): SamConstructorDescriptor?
|
public fun resolveSamConstructor(name: Name, scope: JetScope): SamConstructorDescriptor?
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.lang.descriptors;
|
||||||
|
|
||||||
|
public interface SamConstructorDescriptor extends SimpleFunctionDescriptor {
|
||||||
|
}
|
||||||
@@ -51,7 +51,7 @@ public trait JetScope {
|
|||||||
* (that means that the implementation is not obliged to use the filters but may do so when it gives any performance advantage).
|
* (that means that the implementation is not obliged to use the filters but may do so when it gives any performance advantage).
|
||||||
*/
|
*/
|
||||||
public fun getDescriptors(kindFilterMask: Int = ALL_KINDS_MASK,
|
public fun getDescriptors(kindFilterMask: Int = ALL_KINDS_MASK,
|
||||||
nameFilter: (Name) -> Boolean = { true }): Collection<DeclarationDescriptor>
|
nameFilter: (Name) -> Boolean = ALL_NAME_FILTER): Collection<DeclarationDescriptor>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds receivers to the list in order of locality, so that the closest (the most local) receiver goes first
|
* Adds receivers to the list in order of locality, so that the closest (the most local) receiver goes first
|
||||||
@@ -100,6 +100,40 @@ public trait JetScope {
|
|||||||
public val VARIABLES_AND_PROPERTIES_MASK: Int = LOCAL_VARIABLE or NON_EXTENSION_PROPERTY or EXTENSION_PROPERTY
|
public val VARIABLES_AND_PROPERTIES_MASK: Int = LOCAL_VARIABLE or NON_EXTENSION_PROPERTY or EXTENSION_PROPERTY
|
||||||
|
|
||||||
public val ALL_NAME_FILTER: (Name) -> Boolean = { true }
|
public val ALL_NAME_FILTER: (Name) -> Boolean = { true }
|
||||||
|
|
||||||
|
public fun descriptorKind(descriptor: DeclarationDescriptor): Int {
|
||||||
|
return when (descriptor) {
|
||||||
|
is ClassDescriptor -> when (descriptor.getKind()) {
|
||||||
|
ClassKind.OBJECT, ClassKind.CLASS_OBJECT -> OBJECT
|
||||||
|
ClassKind.ENUM_ENTRY -> ENUM_ENTRY
|
||||||
|
else -> TYPE
|
||||||
|
}
|
||||||
|
|
||||||
|
is PackageFragmentDescriptor, is PackageViewDescriptor -> PACKAGE
|
||||||
|
|
||||||
|
is SamConstructorDescriptor -> SAM_CONSTRUCTOR
|
||||||
|
|
||||||
|
is FunctionDescriptor -> if (descriptor.getExtensionReceiverParameter() != null) EXTENSION_FUNCTION else ORDINARY_FUNCTION
|
||||||
|
|
||||||
|
is PropertyDescriptor -> if (descriptor.getExtensionReceiverParameter() != null) EXTENSION_PROPERTY else NON_EXTENSION_PROPERTY
|
||||||
|
|
||||||
|
is VariableDescriptor -> LOCAL_VARIABLE
|
||||||
|
|
||||||
|
else -> 0 /* unknown */
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The same as getDescriptors(kindFilterMask, nameFilter) but the result is guaranteed to be filtered by kind and name.
|
||||||
|
*/
|
||||||
|
public fun JetScope.getDescriptorsFiltered(kindFilterMask: Int,
|
||||||
|
nameFilter: (Name) -> Boolean): Collection<DeclarationDescriptor> {
|
||||||
|
return getDescriptors(kindFilterMask, nameFilter).filter {
|
||||||
|
(JetScope.descriptorKind(it) and kindFilterMask) != 0 && nameFilter(it.getName())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils
|
|||||||
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo
|
import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo
|
||||||
import org.jetbrains.jet.lang.resolve.descriptorUtil.isExtension
|
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name
|
import org.jetbrains.jet.lang.resolve.name.Name
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.getDescriptorsFiltered
|
||||||
|
|
||||||
public object TipsManager{
|
public object TipsManager{
|
||||||
|
|
||||||
@@ -64,9 +64,8 @@ public object TipsManager{
|
|||||||
|
|
||||||
val qualifier = context[BindingContext.QUALIFIER, receiverExpression]
|
val qualifier = context[BindingContext.QUALIFIER, receiverExpression]
|
||||||
if (qualifier != null) {
|
if (qualifier != null) {
|
||||||
//TODO: filter out extensions!
|
|
||||||
// It's impossible to add extension function for package or class (if it's class object, expression type is not null)
|
// It's impossible to add extension function for package or class (if it's class object, expression type is not null)
|
||||||
qualifier.scope.getDescriptors(kindFilterMask and JetScope.NON_EXTENSIONS_MASK, nameFilter).filterTo(descriptors, ::filterIfInfix)
|
qualifier.scope.getDescriptorsFiltered(kindFilterMask and JetScope.NON_EXTENSIONS_MASK, nameFilter).filterTo(descriptors, ::filterIfInfix)
|
||||||
}
|
}
|
||||||
|
|
||||||
val expressionType = context[BindingContext.EXPRESSION_TYPE, receiverExpression]
|
val expressionType = context[BindingContext.EXPRESSION_TYPE, receiverExpression]
|
||||||
@@ -74,12 +73,12 @@ public object TipsManager{
|
|||||||
val receiverValue = ExpressionReceiver(receiverExpression, expressionType)
|
val receiverValue = ExpressionReceiver(receiverExpression, expressionType)
|
||||||
val dataFlowInfo = context.getDataFlowInfo(expression)
|
val dataFlowInfo = context.getDataFlowInfo(expression)
|
||||||
|
|
||||||
|
val mask = kindFilterMask and JetScope.NON_EXTENSIONS_MASK and JetScope.TYPE.inv()
|
||||||
for (variant in SmartCastUtils.getSmartCastVariants(receiverValue, context, dataFlowInfo)) {
|
for (variant in SmartCastUtils.getSmartCastVariants(receiverValue, context, dataFlowInfo)) {
|
||||||
//TODO: filter out nested classes!
|
variant.getMemberScope().getDescriptorsFiltered(mask, nameFilter).filterTo(descriptors, ::filterIfInfix)
|
||||||
variant.getMemberScope().getDescriptors(kindFilterMask, nameFilter).filterTo(descriptors) { filterIfInfix(it) && !it.isExtension }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
descriptors.addAll(getCallableExtensions(resolutionScope, listOf(receiverValue), context, dataFlowInfo, isInfixCall, kindFilterMask, nameFilter))
|
descriptors.addCallableExtensions(resolutionScope, receiverValue, context, dataFlowInfo, isInfixCall, kindFilterMask, nameFilter)
|
||||||
}
|
}
|
||||||
|
|
||||||
return descriptors
|
return descriptors
|
||||||
@@ -87,21 +86,21 @@ public object TipsManager{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (parent is JetImportDirective || parent is JetPackageDirective) {
|
if (parent is JetImportDirective || parent is JetPackageDirective) {
|
||||||
return excludeNonPackageDescriptors(resolutionScope.getDescriptors(kindFilterMask and JetScope.PACKAGE, nameFilter))
|
if (kindFilterMask and JetScope.PACKAGE == 0) return listOf()
|
||||||
|
return resolutionScope.getDescriptorsFiltered(JetScope.PACKAGE, nameFilter)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
val descriptorsSet = HashSet<DeclarationDescriptor>()
|
val descriptorsSet = HashSet<DeclarationDescriptor>()
|
||||||
|
|
||||||
val receivers = resolutionScope.getImplicitReceiversHierarchy()
|
val receivers = resolutionScope.getImplicitReceiversHierarchy()
|
||||||
for (receiver in receivers) {
|
receivers.flatMapTo(descriptorsSet) {
|
||||||
receiver.getType().getMemberScope().getDescriptors(kindFilterMask and JetScope.NON_EXTENSIONS_MASK, nameFilter)
|
it.getType().getMemberScope().getDescriptorsFiltered(kindFilterMask and JetScope.NON_EXTENSIONS_MASK, nameFilter)
|
||||||
.filterTo(descriptorsSet) { !it.isExtension }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val dataFlowInfo = context.getDataFlowInfo(expression)
|
val dataFlowInfo = context.getDataFlowInfo(expression)
|
||||||
val receiverValues = receivers.map { it.getValue() }
|
val receiverValues = receivers.map { it.getValue() }
|
||||||
|
|
||||||
resolutionScope.getDescriptors(kindFilterMask, nameFilter).filterTo(descriptorsSet) {
|
resolutionScope.getDescriptorsFiltered(kindFilterMask, nameFilter).filterTo(descriptorsSet) {
|
||||||
if (it is CallableDescriptor && it.getExtensionReceiverParameter() != null) {
|
if (it is CallableDescriptor && it.getExtensionReceiverParameter() != null) {
|
||||||
it.isExtensionCallable(receiverValues, context, dataFlowInfo, false)
|
it.isExtensionCallable(receiverValues, context, dataFlowInfo, false)
|
||||||
}
|
}
|
||||||
@@ -113,23 +112,21 @@ public object TipsManager{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun getCallableExtensions(
|
private fun MutableCollection<DeclarationDescriptor>.addCallableExtensions(
|
||||||
resolutionScope: JetScope,
|
resolutionScope: JetScope,
|
||||||
receivers: Collection<ReceiverValue>,
|
receiver: ReceiverValue,
|
||||||
context: BindingContext,
|
context: BindingContext,
|
||||||
dataFlowInfo: DataFlowInfo,
|
dataFlowInfo: DataFlowInfo,
|
||||||
isInfixCall: Boolean,
|
isInfixCall: Boolean,
|
||||||
kindFilterMask: Int,
|
kindFilterMask: Int,
|
||||||
nameFilter: (Name) -> Boolean): Collection<CallableDescriptor> {
|
nameFilter: (Name) -> Boolean) {
|
||||||
val mask = kindFilterMask and JetScope.EXTENSIONS_MASK
|
val mask = kindFilterMask and JetScope.EXTENSIONS_MASK
|
||||||
if (mask == 0) return listOf()
|
if (mask != 0) {
|
||||||
return resolutionScope.getDescriptors(mask, nameFilter)
|
resolutionScope.getDescriptorsFiltered(mask, nameFilter)
|
||||||
.stream()
|
.stream()
|
||||||
.filterIsInstance(javaClass<CallableDescriptor>())
|
.filterIsInstance(javaClass<CallableDescriptor>())
|
||||||
.filter {
|
.filterTo(this) { ExpressionTypingUtils.checkIsExtensionCallable(receiver, it, isInfixCall, context, dataFlowInfo) }
|
||||||
it.getExtensionReceiverParameter() != null && it.isExtensionCallable(receivers, context, dataFlowInfo, isInfixCall)
|
}
|
||||||
}
|
|
||||||
.toList()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun CallableDescriptor.isExtensionCallable(receivers: Collection<ReceiverValue>,
|
public fun CallableDescriptor.isExtensionCallable(receivers: Collection<ReceiverValue>,
|
||||||
@@ -145,20 +142,6 @@ public object TipsManager{
|
|||||||
context: BindingContext,
|
context: BindingContext,
|
||||||
nameFilter: (Name) -> Boolean): Collection<DeclarationDescriptor> {
|
nameFilter: (Name) -> Boolean): Collection<DeclarationDescriptor> {
|
||||||
val resolutionScope = context[BindingContext.RESOLUTION_SCOPE, expression] ?: return listOf()
|
val resolutionScope = context[BindingContext.RESOLUTION_SCOPE, expression] ?: return listOf()
|
||||||
return excludeNonPackageDescriptors(resolutionScope.getDescriptors(JetScope.PACKAGE, nameFilter))
|
return resolutionScope.getDescriptorsFiltered(JetScope.PACKAGE, nameFilter)
|
||||||
}
|
|
||||||
|
|
||||||
private fun excludeNonPackageDescriptors(descriptors: Collection<DeclarationDescriptor>): Collection<DeclarationDescriptor> {
|
|
||||||
return descriptors.filter{
|
|
||||||
if (it is PackageViewDescriptor) {
|
|
||||||
// Heuristic: we don't want to complete "System" in "package java.lang.Sys",
|
|
||||||
// so we find class of the same name as package, we exclude this package
|
|
||||||
val parent = it.getContainingDeclaration()
|
|
||||||
parent == null || parent.getMemberScope().getClassifier(it.getName()) == null
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,7 +141,8 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration,
|
|||||||
addAllTypes()
|
addAllTypes()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
addReferenceVariants(JetScope.TYPE or JetScope.PACKAGE) { isPartOfTypeDeclaration(it) }
|
addReferenceVariants(JetScope.TYPE or JetScope.PACKAGE)
|
||||||
|
collector.addDescriptorElements(listOf(KotlinBuiltIns.getInstance().getUnit()), false)
|
||||||
JavaCompletionContributor.advertiseSecondCompletion(project, resultSet)
|
JavaCompletionContributor.advertiseSecondCompletion(project, resultSet)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -175,20 +176,6 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration,
|
|||||||
private fun isOnlyKeywordCompletion()
|
private fun isOnlyKeywordCompletion()
|
||||||
= PsiTreeUtil.getParentOfType(position, javaClass<JetModifierList>()) != null
|
= PsiTreeUtil.getParentOfType(position, javaClass<JetModifierList>()) != null
|
||||||
|
|
||||||
private fun isPartOfTypeDeclaration(descriptor: DeclarationDescriptor): Boolean {
|
|
||||||
return when (descriptor) {
|
|
||||||
is PackageViewDescriptor, is TypeParameterDescriptor -> true
|
|
||||||
|
|
||||||
is ClassDescriptor -> {
|
|
||||||
val kind = descriptor.getKind()
|
|
||||||
KotlinBuiltIns.getInstance().isUnit(descriptor.getDefaultType()) ||
|
|
||||||
kind != ClassKind.OBJECT && kind != ClassKind.CLASS_OBJECT
|
|
||||||
}
|
|
||||||
|
|
||||||
else -> false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun shouldRunOnlyTypeCompletion(): Boolean {
|
private fun shouldRunOnlyTypeCompletion(): Boolean {
|
||||||
// Check that completion in the type annotation context and if there's a qualified
|
// Check that completion in the type annotation context and if there's a qualified
|
||||||
// expression we are at first of it
|
// expression we are at first of it
|
||||||
@@ -201,8 +188,8 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration,
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addReferenceVariants(kindFilterMask: Int, filterCondition: (DeclarationDescriptor) -> Boolean = { true }) {
|
private fun addReferenceVariants(kindFilterMask: Int) {
|
||||||
collector.addDescriptorElements(getReferenceVariants(kindFilterMask).filter { filterCondition(it) }, suppressAutoInsertion = false)
|
collector.addDescriptorElements(getReferenceVariants(kindFilterMask), suppressAutoInsertion = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
|
|||||||
import org.jetbrains.jet.renderer.DescriptorRenderer
|
import org.jetbrains.jet.renderer.DescriptorRenderer
|
||||||
import org.jetbrains.jet.lang.psi.psiUtil.getReceiverExpression
|
import org.jetbrains.jet.lang.psi.psiUtil.getReceiverExpression
|
||||||
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
|
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor
|
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptorImpl
|
||||||
|
|
||||||
class SmartCompletion(val expression: JetSimpleNameExpression,
|
class SmartCompletion(val expression: JetSimpleNameExpression,
|
||||||
val resolveSession: ResolveSessionForBodies,
|
val resolveSession: ResolveSessionForBodies,
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ import org.jetbrains.jet.plugin.util.makeNotNullable
|
|||||||
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
|
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext
|
import org.jetbrains.jet.lang.resolve.BindingContext
|
||||||
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
|
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor
|
import org.jetbrains.jet.lang.descriptors.SamConstructorDescriptor
|
||||||
|
|
||||||
class TypeInstantiationItems(val resolveSession: ResolveSessionForBodies, val bindingContext: BindingContext, val visibilityFilter: (DeclarationDescriptor) -> Boolean) {
|
class TypeInstantiationItems(val resolveSession: ResolveSessionForBodies, val bindingContext: BindingContext, val visibilityFilter: (DeclarationDescriptor) -> Boolean) {
|
||||||
public fun addToCollection(collection: MutableCollection<LookupElement>, expectedInfos: Collection<ExpectedInfo>) {
|
public fun addToCollection(collection: MutableCollection<LookupElement>, expectedInfos: Collection<ExpectedInfo>) {
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
enum class E {
|
||||||
|
AAA
|
||||||
|
BBB
|
||||||
|
|
||||||
|
fun foo(): <caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// ABSENT: AAA
|
||||||
|
// ABSENT: BBB
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package pack
|
||||||
|
|
||||||
|
fun String.extFoo(){}
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
pack.<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// ABSENT: extFoo
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
class C {
|
||||||
|
class Nested
|
||||||
|
inner class Inner
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(c: C) {
|
||||||
|
c.<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// ABSENT: Nested
|
||||||
|
// ABSENT: Inner
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package java.lang.<caret>
|
||||||
|
|
||||||
|
// EXIST: annotation
|
||||||
|
// EXIST: reflect
|
||||||
|
// ABSENT: System
|
||||||
|
// ABSENT: Thread
|
||||||
@@ -598,6 +598,24 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NoEnumEntryType.kt")
|
||||||
|
public void testNoEnumEntryType() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoEnumEntryType.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NoExtensionsAfterQualifier.kt")
|
||||||
|
public void testNoExtensionsAfterQualifier() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoExtensionsAfterQualifier.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NoNestedClassAfterReceiver.kt")
|
||||||
|
public void testNoNestedClassAfterReceiver() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoNestedClassAfterReceiver.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("NoObjectInTypePosition.kt")
|
@TestMetadata("NoObjectInTypePosition.kt")
|
||||||
public void testNoObjectInTypePosition() throws Exception {
|
public void testNoObjectInTypePosition() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoObjectInTypePosition.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoObjectInTypePosition.kt");
|
||||||
|
|||||||
@@ -598,6 +598,24 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NoEnumEntryType.kt")
|
||||||
|
public void testNoEnumEntryType() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoEnumEntryType.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NoExtensionsAfterQualifier.kt")
|
||||||
|
public void testNoExtensionsAfterQualifier() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoExtensionsAfterQualifier.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NoNestedClassAfterReceiver.kt")
|
||||||
|
public void testNoNestedClassAfterReceiver() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoNestedClassAfterReceiver.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("NoObjectInTypePosition.kt")
|
@TestMetadata("NoObjectInTypePosition.kt")
|
||||||
public void testNoObjectInTypePosition() throws Exception {
|
public void testNoObjectInTypePosition() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoObjectInTypePosition.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoObjectInTypePosition.kt");
|
||||||
@@ -937,6 +955,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("PackageDirective.kt")
|
||||||
|
public void testPackageDirective() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/java/PackageDirective.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("PropertyMetadata.kt")
|
@TestMetadata("PropertyMetadata.kt")
|
||||||
public void testPropertyMetadata() throws Exception {
|
public void testPropertyMetadata() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/java/PropertyMetadata.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/java/PropertyMetadata.kt");
|
||||||
|
|||||||
@@ -204,12 +204,6 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("FunctionReference11.kt")
|
|
||||||
public void testFunctionReference11() throws Exception {
|
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference11.kt");
|
|
||||||
doTest(fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("FunctionReference12.kt")
|
@TestMetadata("FunctionReference12.kt")
|
||||||
public void testFunctionReference12() throws Exception {
|
public void testFunctionReference12() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference12.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference12.kt");
|
||||||
@@ -228,12 +222,6 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("FunctionReference5.kt")
|
|
||||||
public void testFunctionReference5() throws Exception {
|
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference5.kt");
|
|
||||||
doTest(fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("FunctionReference7.kt")
|
@TestMetadata("FunctionReference7.kt")
|
||||||
public void testFunctionReference7() throws Exception {
|
public void testFunctionReference7() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference7.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference7.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user