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);
}
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;
}
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);
}
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);
}
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());
}
}
Aggregations