Search in sources :

Example 11 with Name

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

the class KtImportDirective method getImportPath.

@Nullable
@IfNotParsed
public ImportPath getImportPath() {
    FqName importFqn = getImportedFqName();
    if (importFqn == null) {
        return null;
    }
    Name alias = null;
    String aliasName = getAliasName();
    if (aliasName != null) {
        alias = Name.identifier(aliasName);
    }
    return new ImportPath(importFqn, isAllUnder(), alias);
}
Also used : FqName(org.jetbrains.kotlin.name.FqName) ImportPath(org.jetbrains.kotlin.resolve.ImportPath) FqName(org.jetbrains.kotlin.name.FqName) Name(org.jetbrains.kotlin.name.Name) Nullable(org.jetbrains.annotations.Nullable)

Example 12 with Name

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

the class SourceNavigationHelper method convertPropertyOrFunction.

@Nullable
private static KtNamedDeclaration convertPropertyOrFunction(@NotNull KtNamedDeclaration declaration, @NotNull NavigationKind navigationKind) {
    if (declaration instanceof KtPrimaryConstructor) {
        KtClassOrObject sourceClassOrObject = findClassOrObject(((KtPrimaryConstructor) declaration).getContainingClassOrObject(), navigationKind);
        KtPrimaryConstructor primaryConstructor = sourceClassOrObject != null ? sourceClassOrObject.getPrimaryConstructor() : null;
        return primaryConstructor != null ? primaryConstructor : sourceClassOrObject;
    }
    String memberNameAsString = declaration.getName();
    if (memberNameAsString == null) {
        LOG.debug("JetSourceNavigationHelper.convertPropertyOrFunction(): null name for declaration " + declaration);
        return null;
    }
    Name memberName = Name.identifier(memberNameAsString);
    PsiElement decompiledContainer = declaration.getParent();
    Collection<KtNamedDeclaration> candidates;
    if (decompiledContainer instanceof KtFile) {
        candidates = getInitialTopLevelCandidates(declaration, navigationKind);
    } else if (decompiledContainer instanceof KtClassBody) {
        KtClassOrObject decompiledClassOrObject = (KtClassOrObject) decompiledContainer.getParent();
        KtClassOrObject sourceClassOrObject = findClassOrObject(decompiledClassOrObject, navigationKind);
        //noinspection unchecked
        candidates = sourceClassOrObject == null ? Collections.<KtNamedDeclaration>emptyList() : getInitialMemberCandidates(sourceClassOrObject, memberName, (Class<KtNamedDeclaration>) declaration.getClass());
        if (candidates.isEmpty()) {
            if (declaration instanceof KtProperty && sourceClassOrObject instanceof KtClass) {
                return findSpecialProperty(memberName, (KtClass) sourceClassOrObject);
            }
        }
    } else {
        throw new IllegalStateException("Unexpected container of " + (navigationKind == NavigationKind.CLASS_FILES_TO_SOURCES ? "decompiled" : "source") + " declaration: " + decompiledContainer.getClass().getSimpleName());
    }
    if (candidates.isEmpty()) {
        return null;
    }
    candidates = filterByOrderEntries(declaration, candidates);
    if (!forceResolve) {
        candidates = filterByReceiverPresenceAndParametersCount(declaration, candidates);
        if (candidates.size() <= 1) {
            return candidates.isEmpty() ? null : candidates.iterator().next();
        }
        if (!haveRenamesInImports(getContainingFiles(candidates))) {
            candidates = filterByReceiverAndParameterTypes(declaration, candidates);
            if (candidates.size() <= 1) {
                return candidates.isEmpty() ? null : candidates.iterator().next();
            }
        }
    }
    KotlinCodeAnalyzer analyzer = createAnalyzer(candidates, declaration.getProject());
    for (KtNamedDeclaration candidate : candidates) {
        //noinspection unchecked
        CallableDescriptor candidateDescriptor = (CallableDescriptor) analyzer.resolveToDescriptor(candidate);
        if (receiversMatch(declaration, candidateDescriptor) && valueParametersTypesMatch(declaration, candidateDescriptor) && typeParametersMatch((KtTypeParameterListOwner) declaration, candidateDescriptor.getTypeParameters())) {
            return candidate;
        }
    }
    return null;
}
Also used : KotlinCodeAnalyzer(org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer) FqName(org.jetbrains.kotlin.name.FqName) Name(org.jetbrains.kotlin.name.Name) PsiClass(com.intellij.psi.PsiClass) LightClassUtilsKt.toLightClass(org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass) CallableDescriptor(org.jetbrains.kotlin.descriptors.CallableDescriptor) PsiElement(com.intellij.psi.PsiElement) Nullable(org.jetbrains.annotations.Nullable)

Example 13 with Name

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

the class DescriptorUtils method getFqNameFromTopLevelClass.

@NotNull
public static FqName getFqNameFromTopLevelClass(@NotNull DeclarationDescriptor descriptor) {
    DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
    Name name = descriptor.getName();
    if (!(containingDeclaration instanceof ClassDescriptor)) {
        return FqName.topLevel(name);
    }
    return getFqNameFromTopLevelClass(containingDeclaration).child(name);
}
Also used : FqName(org.jetbrains.kotlin.name.FqName) Name(org.jetbrains.kotlin.name.Name) NotNull(org.jetbrains.annotations.NotNull)

Example 14 with Name

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

the class MemberComparator method compare.

@Override
public int compare(DeclarationDescriptor o1, DeclarationDescriptor o2) {
    int prioritiesCompareTo = getDeclarationPriority(o2) - getDeclarationPriority(o1);
    if (prioritiesCompareTo != 0) {
        return prioritiesCompareTo;
    }
    if (isEnumEntry(o1) && isEnumEntry(o2)) {
        //never reorder enum entries
        return 0;
    }
    int namesCompareTo = o1.getName().compareTo(o2.getName());
    if (namesCompareTo != 0) {
        return namesCompareTo;
    }
    if (o1 instanceof TypeAliasDescriptor && o2 instanceof TypeAliasDescriptor) {
        TypeAliasDescriptor ta1 = (TypeAliasDescriptor) o1;
        TypeAliasDescriptor ta2 = (TypeAliasDescriptor) o2;
        String r1 = RENDERER.renderType(ta1.getUnderlyingType());
        String r2 = RENDERER.renderType(ta2.getUnderlyingType());
        int underlyingTypesCompareTo = r1.compareTo(r2);
        if (underlyingTypesCompareTo != 0) {
            return underlyingTypesCompareTo;
        }
    } else if (o1 instanceof CallableDescriptor && o2 instanceof CallableDescriptor) {
        CallableDescriptor c1 = (CallableDescriptor) o1;
        CallableDescriptor c2 = (CallableDescriptor) o2;
        ReceiverParameterDescriptor c1ReceiverParameter = c1.getExtensionReceiverParameter();
        ReceiverParameterDescriptor c2ReceiverParameter = c2.getExtensionReceiverParameter();
        assert (c1ReceiverParameter != null) == (c2ReceiverParameter != null);
        if (c1ReceiverParameter != null) {
            String r1 = RENDERER.renderType(c1ReceiverParameter.getType());
            String r2 = RENDERER.renderType(c2ReceiverParameter.getType());
            int receiversCompareTo = r1.compareTo(r2);
            if (receiversCompareTo != 0) {
                return receiversCompareTo;
            }
        }
        List<ValueParameterDescriptor> c1ValueParameters = c1.getValueParameters();
        List<ValueParameterDescriptor> c2ValueParameters = c2.getValueParameters();
        for (int i = 0; i < Math.min(c1ValueParameters.size(), c2ValueParameters.size()); i++) {
            String p1 = RENDERER.renderType(c1ValueParameters.get(i).getType());
            String p2 = RENDERER.renderType(c2ValueParameters.get(i).getType());
            int parametersCompareTo = p1.compareTo(p2);
            if (parametersCompareTo != 0) {
                return parametersCompareTo;
            }
        }
        int valueParametersNumberCompareTo = c1ValueParameters.size() - c2ValueParameters.size();
        if (valueParametersNumberCompareTo != 0) {
            return valueParametersNumberCompareTo;
        }
        List<TypeParameterDescriptor> c1TypeParameters = c1.getTypeParameters();
        List<TypeParameterDescriptor> c2TypeParameters = c2.getTypeParameters();
        for (int i = 0; i < Math.min(c1TypeParameters.size(), c2TypeParameters.size()); i++) {
            List<KotlinType> c1Bounds = c1TypeParameters.get(i).getUpperBounds();
            List<KotlinType> c2Bounds = c2TypeParameters.get(i).getUpperBounds();
            int boundsCountCompareTo = c1Bounds.size() - c2Bounds.size();
            if (boundsCountCompareTo != 0) {
                return boundsCountCompareTo;
            }
            for (int j = 0; j < c1Bounds.size(); j++) {
                String b1 = RENDERER.renderType(c1Bounds.get(j));
                String b2 = RENDERER.renderType(c2Bounds.get(j));
                int boundCompareTo = b1.compareTo(b2);
                if (boundCompareTo != 0) {
                    return boundCompareTo;
                }
            }
        }
        int typeParametersCompareTo = c1TypeParameters.size() - c2TypeParameters.size();
        if (typeParametersCompareTo != 0) {
            return typeParametersCompareTo;
        }
        if (c1 instanceof CallableMemberDescriptor && c2 instanceof CallableMemberDescriptor) {
            CallableMemberDescriptor.Kind c1Kind = ((CallableMemberDescriptor) c1).getKind();
            CallableMemberDescriptor.Kind c2Kind = ((CallableMemberDescriptor) c2).getKind();
            int kindsCompareTo = c1Kind.ordinal() - c2Kind.ordinal();
            if (kindsCompareTo != 0) {
                return kindsCompareTo;
            }
        }
    } else if (o1 instanceof ClassDescriptor && o2 instanceof ClassDescriptor) {
        ClassDescriptor class1 = (ClassDescriptor) o1;
        ClassDescriptor class2 = (ClassDescriptor) o2;
        if (class1.getKind().ordinal() != class2.getKind().ordinal()) {
            return class1.getKind().ordinal() - class2.getKind().ordinal();
        }
        if (class1.isCompanionObject() != class2.isCompanionObject()) {
            return class1.isCompanionObject() ? 1 : -1;
        }
    } else {
        throw new AssertionError(String.format("Unsupported pair of descriptors:\n'" + "%s' Class: %s\n" + "%s' Class: %s", o1, o1.getClass(), o2, o2.getClass()));
    }
    int renderDiff = RENDERER.render(o1).compareTo(RENDERER.render(o2));
    if (renderDiff != 0)
        return renderDiff;
    Name firstModuleName = DescriptorUtils.getContainingModule(o1).getName();
    Name secondModuleName = DescriptorUtils.getContainingModule(o2).getName();
    return firstModuleName.compareTo(secondModuleName);
}
Also used : List(java.util.List) Name(org.jetbrains.kotlin.name.Name)

Example 15 with Name

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

the class KtImportDirective method fqNameFromExpression.

@Nullable
private static FqName fqNameFromExpression(@Nullable KtExpression expression) {
    if (expression == null) {
        return null;
    }
    if (expression instanceof KtDotQualifiedExpression) {
        KtDotQualifiedExpression dotQualifiedExpression = (KtDotQualifiedExpression) expression;
        FqName parentFqn = fqNameFromExpression(dotQualifiedExpression.getReceiverExpression());
        Name child = nameFromExpression(dotQualifiedExpression.getSelectorExpression());
        if (child == null) {
            return parentFqn;
        }
        if (parentFqn != null) {
            return parentFqn.child(child);
        }
        return null;
    } else if (expression instanceof KtSimpleNameExpression) {
        KtSimpleNameExpression simpleNameExpression = (KtSimpleNameExpression) expression;
        return FqName.topLevel(simpleNameExpression.getReferencedNameAsName());
    } else {
        throw new IllegalArgumentException("Can't construct fqn for: " + expression.getClass().toString());
    }
}
Also used : FqName(org.jetbrains.kotlin.name.FqName) FqName(org.jetbrains.kotlin.name.FqName) Name(org.jetbrains.kotlin.name.Name) Nullable(org.jetbrains.annotations.Nullable)

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