Convert DescriptorToSourceUtils to Kotlin. Auto-convert.
This commit is contained in:
@@ -14,93 +14,84 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.resolve;
|
package org.jetbrains.kotlin.resolve
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor;
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
|
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource;
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor;
|
import org.jetbrains.kotlin.resolve.source.*
|
||||||
import org.jetbrains.kotlin.psi.JetFile;
|
|
||||||
import org.jetbrains.kotlin.resolve.source.SourcePackage;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION;
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION
|
||||||
import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED;
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED
|
||||||
|
|
||||||
public final class DescriptorToSourceUtils {
|
public class DescriptorToSourceUtils private() {
|
||||||
private static void collectEffectiveReferencedDescriptors(@NotNull List<DeclarationDescriptor> result, @NotNull DeclarationDescriptor descriptor) {
|
class object {
|
||||||
if (descriptor instanceof CallableMemberDescriptor) {
|
private fun collectEffectiveReferencedDescriptors(result: MutableList<DeclarationDescriptor>, descriptor: DeclarationDescriptor) {
|
||||||
CallableMemberDescriptor.Kind kind = ((CallableMemberDescriptor) descriptor).getKind();
|
if (descriptor is CallableMemberDescriptor) {
|
||||||
if (kind != DECLARATION && kind != SYNTHESIZED) {
|
val kind = (descriptor as CallableMemberDescriptor).getKind()
|
||||||
for (DeclarationDescriptor overridden: ((CallableMemberDescriptor) descriptor).getOverriddenDescriptors()) {
|
if (kind != DECLARATION && kind != SYNTHESIZED) {
|
||||||
collectEffectiveReferencedDescriptors(result, overridden.getOriginal());
|
for (overridden in (descriptor as CallableMemberDescriptor).getOverriddenDescriptors()) {
|
||||||
|
collectEffectiveReferencedDescriptors(result, overridden.getOriginal())
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
result.add(descriptor)
|
||||||
}
|
}
|
||||||
result.add(descriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
public fun getEffectiveReferencedDescriptors(descriptor: DeclarationDescriptor): Collection<DeclarationDescriptor> {
|
||||||
public static Collection<DeclarationDescriptor> getEffectiveReferencedDescriptors(@NotNull DeclarationDescriptor descriptor) {
|
val result = ArrayList<DeclarationDescriptor>()
|
||||||
List<DeclarationDescriptor> result = new ArrayList<DeclarationDescriptor>();
|
collectEffectiveReferencedDescriptors(result, descriptor.getOriginal())
|
||||||
collectEffectiveReferencedDescriptors(result, descriptor.getOriginal());
|
return result
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static PsiElement getSourceFromDescriptor(@NotNull DeclarationDescriptor descriptor) {
|
|
||||||
if (!(descriptor instanceof DeclarationDescriptorWithSource)) {
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
return SourcePackage.getPsi(((DeclarationDescriptorWithSource) descriptor).getSource());
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE this is also used by KDoc
|
public fun getSourceFromDescriptor(descriptor: DeclarationDescriptor): PsiElement? {
|
||||||
@Nullable
|
if (!(descriptor is DeclarationDescriptorWithSource)) {
|
||||||
public static PsiElement descriptorToDeclaration(@NotNull DeclarationDescriptor descriptor) {
|
return null
|
||||||
for (DeclarationDescriptor declarationDescriptor : getEffectiveReferencedDescriptors(descriptor.getOriginal())) {
|
|
||||||
PsiElement source = getSourceFromDescriptor(declarationDescriptor);
|
|
||||||
if (source != null) {
|
|
||||||
return source;
|
|
||||||
}
|
}
|
||||||
|
return (descriptor as DeclarationDescriptorWithSource).getSource().getPsi()
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
// NOTE this is also used by KDoc
|
||||||
public static JetFile getContainingFile(@NotNull DeclarationDescriptor declarationDescriptor) {
|
public fun descriptorToDeclaration(descriptor: DeclarationDescriptor): PsiElement? {
|
||||||
// declarationDescriptor may describe a synthesized element which doesn't have PSI
|
for (declarationDescriptor in getEffectiveReferencedDescriptors(descriptor.getOriginal())) {
|
||||||
// To workaround that, we find a top-level parent (which is inside a PackageFragmentDescriptor), which is guaranteed to have PSI
|
val source = getSourceFromDescriptor(declarationDescriptor)
|
||||||
DeclarationDescriptor descriptor = findTopLevelParent(declarationDescriptor);
|
if (source != null) {
|
||||||
if (descriptor == null) return null;
|
return source
|
||||||
|
}
|
||||||
PsiElement declaration = descriptorToDeclaration(descriptor);
|
}
|
||||||
if (declaration == null) return null;
|
return null
|
||||||
|
|
||||||
PsiFile containingFile = declaration.getContainingFile();
|
|
||||||
if (!(containingFile instanceof JetFile)) return null;
|
|
||||||
return (JetFile) containingFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static DeclarationDescriptor findTopLevelParent(@NotNull DeclarationDescriptor declarationDescriptor) {
|
|
||||||
DeclarationDescriptor descriptor = declarationDescriptor;
|
|
||||||
if (declarationDescriptor instanceof PropertyAccessorDescriptor) {
|
|
||||||
descriptor = ((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty();
|
|
||||||
}
|
}
|
||||||
while (!(descriptor == null || DescriptorUtils.isTopLevelDeclaration(descriptor))) {
|
|
||||||
descriptor = descriptor.getContainingDeclaration();
|
|
||||||
}
|
|
||||||
return descriptor;
|
|
||||||
}
|
|
||||||
|
|
||||||
private DescriptorToSourceUtils() {}
|
public fun getContainingFile(declarationDescriptor: DeclarationDescriptor): JetFile? {
|
||||||
|
// declarationDescriptor may describe a synthesized element which doesn't have PSI
|
||||||
|
// To workaround that, we find a top-level parent (which is inside a PackageFragmentDescriptor), which is guaranteed to have PSI
|
||||||
|
val descriptor = findTopLevelParent(declarationDescriptor)
|
||||||
|
if (descriptor == null) return null
|
||||||
|
|
||||||
|
val declaration = descriptorToDeclaration(descriptor)
|
||||||
|
if (declaration == null) return null
|
||||||
|
|
||||||
|
val containingFile = declaration.getContainingFile()
|
||||||
|
if (!(containingFile is JetFile)) return null
|
||||||
|
return containingFile as JetFile
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun findTopLevelParent(declarationDescriptor: DeclarationDescriptor): DeclarationDescriptor? {
|
||||||
|
var descriptor: DeclarationDescriptor? = declarationDescriptor
|
||||||
|
if (declarationDescriptor is PropertyAccessorDescriptor) {
|
||||||
|
descriptor = (descriptor as PropertyAccessorDescriptor).getCorrespondingProperty()
|
||||||
|
}
|
||||||
|
while (!(descriptor == null || DescriptorUtils.isTopLevelDeclaration(descriptor))) {
|
||||||
|
descriptor = descriptor!!.getContainingDeclaration()
|
||||||
|
}
|
||||||
|
return descriptor
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user