Search in sources :

Example 36 with Name

use of org.jetbrains.kotlin.name.Name in project kotlin by JetBrains.

the class MemberMatching method typeParametersMatch.

static boolean typeParametersMatch(@NotNull KtTypeParameterListOwner typeParameterListOwner, @NotNull List<TypeParameterDescriptor> typeParameterDescriptors) {
    List<KtTypeParameter> decompiledParameters = typeParameterListOwner.getTypeParameters();
    if (decompiledParameters.size() != typeParameterDescriptors.size()) {
        return false;
    }
    Multimap<Name, String> decompiledParameterToBounds = HashMultimap.create();
    for (KtTypeParameter parameter : decompiledParameters) {
        KtTypeReference extendsBound = parameter.getExtendsBound();
        if (extendsBound != null) {
            decompiledParameterToBounds.put(parameter.getNameAsName(), extendsBound.getText());
        }
    }
    for (KtTypeConstraint typeConstraint : typeParameterListOwner.getTypeConstraints()) {
        KtSimpleNameExpression typeParameterName = typeConstraint.getSubjectTypeParameterName();
        assert typeParameterName != null;
        KtTypeReference bound = typeConstraint.getBoundTypeReference();
        assert bound != null;
        decompiledParameterToBounds.put(typeParameterName.getReferencedNameAsName(), bound.getText());
    }
    for (int i = 0; i < decompiledParameters.size(); i++) {
        KtTypeParameter decompiledParameter = decompiledParameters.get(i);
        TypeParameterDescriptor descriptor = typeParameterDescriptors.get(i);
        Name name = decompiledParameter.getNameAsName();
        assert name != null;
        if (!name.equals(descriptor.getName())) {
            return false;
        }
        Set<String> descriptorUpperBounds = Sets.newHashSet(ContainerUtil.map(descriptor.getUpperBounds(), new Function<KotlinType, String>() {

            @Override
            public String fun(KotlinType type) {
                return DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(type);
            }
        }));
        KotlinBuiltIns builtIns = DescriptorUtilsKt.getBuiltIns(descriptor);
        Set<String> decompiledUpperBounds = decompiledParameterToBounds.get(descriptor.getName()).isEmpty() ? Sets.newHashSet(DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(builtIns.getDefaultBound())) : Sets.newHashSet(decompiledParameterToBounds.get(descriptor.getName()));
        if (!descriptorUpperBounds.equals(decompiledUpperBounds)) {
            return false;
        }
    }
    return true;
}
Also used : TypeParameterDescriptor(org.jetbrains.kotlin.descriptors.TypeParameterDescriptor) KotlinType(org.jetbrains.kotlin.types.KotlinType) Name(org.jetbrains.kotlin.name.Name) Function(com.intellij.util.Function) KotlinBuiltIns(org.jetbrains.kotlin.builtins.KotlinBuiltIns)

Example 37 with Name

use of org.jetbrains.kotlin.name.Name in project kotlin by JetBrains.

the class PatternBuilder method pattern.

@NotNull
private static DescriptorPredicate pattern(@NotNull List<NamePredicate> checkers, @Nullable List<NamePredicate> arguments) {
    assert !checkers.isEmpty();
    final List<NamePredicate> checkersWithPrefixChecker = Lists.newArrayList();
    if (!checkers.get(0).apply(KOTLIN_NAME)) {
        checkersWithPrefixChecker.add(KOTLIN_NAME_PREDICATE);
    }
    checkersWithPrefixChecker.addAll(checkers);
    assert checkersWithPrefixChecker.size() > 1;
    final List<NamePredicate> argumentCheckers = arguments != null ? Lists.newArrayList(arguments) : null;
    return new DescriptorPredicate() {

        @Override
        public boolean apply(@Nullable FunctionDescriptor descriptor) {
            assert descriptor != null : "argument for DescriptorPredicate.apply should not be null, checkers=" + checkersWithPrefixChecker;
            //TODO: no need to wrap if we check beforehand
            try {
                return doApply(descriptor);
            } catch (IllegalArgumentException e) {
                return false;
            }
        }

        private boolean doApply(@NotNull FunctionDescriptor descriptor) {
            List<Name> nameParts = DescriptorUtils.getFqName(descriptor).pathSegments();
            if (nameParts.size() != checkersWithPrefixChecker.size())
                return false;
            return allNamePartsValid(nameParts) && checkAllArgumentsValidIfNeeded(descriptor);
        }

        private boolean checkAllArgumentsValidIfNeeded(@NotNull FunctionDescriptor descriptor) {
            if (argumentCheckers != null) {
                List<ValueParameterDescriptor> valueParameterDescriptors = descriptor.getValueParameters();
                if (valueParameterDescriptors.size() != argumentCheckers.size()) {
                    return false;
                }
                for (int i = 0; i < valueParameterDescriptors.size(); i++) {
                    ValueParameterDescriptor valueParameterDescriptor = valueParameterDescriptors.get(i);
                    Name name = DescriptorUtilsKt.getNameIfStandardType(valueParameterDescriptor.getType());
                    NamePredicate namePredicate = argumentCheckers.get(i);
                    if (!namePredicate.apply(name))
                        return false;
                }
            }
            return true;
        }

        private boolean allNamePartsValid(@NotNull List<Name> nameParts) {
            for (int i = 0; i < nameParts.size(); ++i) {
                Name namePart = nameParts.get(i);
                NamePredicate correspondingPredicate = checkersWithPrefixChecker.get(i);
                if (!correspondingPredicate.apply(namePart)) {
                    return false;
                }
            }
            return true;
        }
    };
}
Also used : NotNull(org.jetbrains.annotations.NotNull) Name(org.jetbrains.kotlin.name.Name) List(java.util.List) Nullable(org.jetbrains.annotations.Nullable) NotNull(org.jetbrains.annotations.NotNull)

Aggregations

Name (org.jetbrains.kotlin.name.Name)37 FqName (org.jetbrains.kotlin.name.FqName)18 NotNull (org.jetbrains.annotations.NotNull)16 Nullable (org.jetbrains.annotations.Nullable)10 KotlinType (org.jetbrains.kotlin.types.KotlinType)6 MemberScope (org.jetbrains.kotlin.resolve.scopes.MemberScope)5 PsiElement (com.intellij.psi.PsiElement)4 IElementType (com.intellij.psi.tree.IElementType)3 Annotations (org.jetbrains.kotlin.descriptors.annotations.Annotations)3 CompositeAnnotations (org.jetbrains.kotlin.descriptors.annotations.CompositeAnnotations)3 ExpressionReceiver (org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver)3 List (java.util.List)2 AnnotationSplitter (org.jetbrains.kotlin.descriptors.annotations.AnnotationSplitter)2 DescriptorUtils.getFqName (org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName)2 TemporaryBindingTrace (org.jetbrains.kotlin.resolve.TemporaryBindingTrace)2 ASTNode (com.intellij.lang.ASTNode)1 PsiClass (com.intellij.psi.PsiClass)1 Function (com.intellij.util.Function)1 ArrayList (java.util.ArrayList)1 Pair (kotlin.Pair)1