Accessing of default parameter value in compiled code via source (if found)

This commit is contained in:
Valentin Kipyatkov
2015-05-21 22:17:12 +03:00
parent 281acb860e
commit a7580d95e5
3 changed files with 36 additions and 6 deletions
@@ -20,18 +20,29 @@ import com.intellij.openapi.util.TextRange
import com.intellij.psi.FileViewProvider
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText
import org.jetbrains.kotlin.psi.JetDeclaration
import org.jetbrains.kotlin.idea.decompiler.textBuilder.descriptorToKey
import org.jetbrains.kotlin.utils.concurrent.block.LockedClearableLazyValue
import org.jetbrains.kotlin.psi.JetCallableDeclaration
import org.jetbrains.kotlin.psi.JetDeclaration
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.utils.concurrent.block.LockedClearableLazyValue
public abstract class KotlinClsFileBase(provider: FileViewProvider) : JetFile(provider, true) {
protected abstract val decompiledText: LockedClearableLazyValue<DecompiledText>
public fun getDeclarationForDescriptor(descriptor: DeclarationDescriptor): JetDeclaration? {
val key = descriptorToKey(descriptor.getOriginal())
val original = descriptor.getOriginal()
if (original is ValueParameterDescriptor) {
val callable = original.getContainingDeclaration() as? CallableDescriptor ?: return null
val callableDeclaration = getDeclarationForDescriptor(callable) as? JetCallableDeclaration ?: return null
return callableDeclaration.getValueParameters()[original.getIndex()]
}
val key = descriptorToKey(original)
val range = decompiledText.get().renderedDescriptorsToRange[key]
return if (range != null) {
@@ -439,6 +439,20 @@ public class JetSourceNavigationHelper {
public JetDeclaration visitClass(@NotNull JetClass klass, Void data) {
return getSourceClassOrObject(klass);
}
@Override
public JetDeclaration visitParameter(@NotNull JetParameter parameter, Void data) {
PsiElement pparent = parameter.getParent().getParent();
JetCallableDeclaration callableDeclaration = (JetCallableDeclaration) pparent;
List<JetParameter> parameters = callableDeclaration.getValueParameters();
int index = parameters.indexOf(parameter);
JetCallableDeclaration sourceCallable = (JetCallableDeclaration) callableDeclaration.accept(this, null);
if (sourceCallable == null) return null;
List<JetParameter> sourceParameters = sourceCallable.getValueParameters();
if (sourceParameters.size() != parameters.size()) return null;
return sourceParameters.get(index);
}
}
private static class LibrarySourcesScope extends GlobalSearchScope {