Convert DescriptorToSourceUtils to Kotlin. Auto-convert.

This commit is contained in:
Evgeny Gerashchenko
2015-03-03 13:03:58 +03:00
parent 648336e759
commit 44d86da1cd
@@ -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
}
}
} }