diff --git a/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java b/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java index 5d444fc5b9c..83ffe283560 100644 --- a/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java +++ b/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java @@ -16,6 +16,8 @@ package org.jetbrains.kotlin.idea.internal; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; @@ -47,6 +49,7 @@ import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.Progress; import org.jetbrains.kotlin.descriptors.CallableDescriptor; import org.jetbrains.kotlin.descriptors.ModuleDescriptor; +import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor; import org.jetbrains.kotlin.diagnostics.DiagnosticSink; import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade; import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage; @@ -201,12 +204,20 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { GenerationState state; try { ResolutionFacade resolutionFacade = ResolvePackage.getResolutionFacade(jetFile); - BindingContext bindingContext = resolutionFacade.analyzeFullyAndGetResult(Collections.singletonList(jetFile)).getBindingContext(); - Ref> ref = Ref.create(); - if (enableInline) { - bindingContext = processInlinedDeclarations(jetFile.getProject(), resolutionFacade, bindingContext, Collections.singleton(jetFile), 1, ref); - } + Ref> ref = Ref.create(); + BindingContext bindingContext = processInlinedDeclarations( + jetFile.getProject(), + resolutionFacade, + Collections.singleton(jetFile), + 1, + ref, + !enableInline + ); + + + //We processing another files just to annotate anonymous classes within their inline functions + //Bytecode not produced for them cause of filtering via generateClassFilter Set toProcess = new LinkedHashSet(); toProcess.add(jetFile); if (ref.get() != null) { @@ -271,15 +282,13 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { private static BindingContext processInlinedDeclarations( @NotNull Project project, @NotNull ResolutionFacade resolutionFacade, - @NotNull BindingContext bindingContext, @NotNull Set originalElements, int deep, - @NotNull Ref> resultElements + @NotNull Ref> resultElements, + boolean processOnlyReifiedInline ) { - if (deep >= 10) { - resultElements.set(originalElements); - return bindingContext; - } + AnalysisResult newResult = resolutionFacade.analyzeFullyAndGetResult(originalElements); + BindingContext bindingContext = newResult.getBindingContext(); Set collectedElements = new HashSet(); collectedElements.addAll(originalElements); @@ -287,27 +296,37 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { for (ResolvedCall call : contents.values()) { CallableDescriptor descriptor = call.getResultingDescriptor(); if (!(descriptor instanceof DeserializedSimpleFunctionDescriptor) && InlineUtil.isInline(descriptor)) { - PsiElement declaration = DescriptorToSourceUtilsIde.INSTANCE$.getAnyDeclaration(project, descriptor); - if (declaration != null && declaration instanceof JetElement) { - collectedElements.add((JetElement) declaration); + if (!processOnlyReifiedInline || hasReifiedTypeParameters(descriptor)) { + PsiElement declaration = DescriptorToSourceUtilsIde.INSTANCE$.getAnyDeclaration(project, descriptor); + if (declaration != null && declaration instanceof JetElement) { + collectedElements.add((JetElement) declaration); + } } } } if (collectedElements.size() != originalElements.size()) { - AnalysisResult newResult = resolutionFacade.analyzeFullyAndGetResult(collectedElements); - if (newResult.isError()) { + if (newResult.isError() || deep >= 10) { resultElements.set(collectedElements); - return newResult.getBindingContext(); + return bindingContext; } - return processInlinedDeclarations(project, resolutionFacade, newResult.getBindingContext(), collectedElements, deep + 1, resultElements); + return processInlinedDeclarations(project, resolutionFacade, collectedElements, deep + 1, resultElements, processOnlyReifiedInline); } resultElements.set(collectedElements); return bindingContext; } + private static boolean hasReifiedTypeParameters(CallableDescriptor descriptor) { + return Iterables.any(descriptor.getTypeParameters(), new Predicate() { + @Override + public boolean apply(TypeParameterDescriptor input) { + return input.isReified(); + } + }); + } + private static Pair mapLines(String text, int startLine, int endLine) { int byteCodeLine = 0; int byteCodeStartLine = -1;