Add IR->JVM output to bytecode tool window
This commit is contained in:
committed by
Dmitry Petrov
parent
0838b28e10
commit
709bc08fbd
Generated
+4
@@ -53,6 +53,10 @@
|
|||||||
<element id="module-output" name="formatter" />
|
<element id="module-output" name="formatter" />
|
||||||
<element id="module-output" name="idea-maven" />
|
<element id="module-output" name="idea-maven" />
|
||||||
<element id="extracted-dir" path="$PROJECT_DIR$/dependencies/protobuf-2.6.1.jar" path-in-jar="/" />
|
<element id="extracted-dir" path="$PROJECT_DIR$/dependencies/protobuf-2.6.1.jar" path-in-jar="/" />
|
||||||
|
<element id="module-output" name="backend.common" />
|
||||||
|
<element id="module-output" name="ir.tree" />
|
||||||
|
<element id="module-output" name="backend.jvm" />
|
||||||
|
<element id="module-output" name="ir.psi2ir" />
|
||||||
</element>
|
</element>
|
||||||
<element id="library" level="project" name="javax.inject" />
|
<element id="library" level="project" name="javax.inject" />
|
||||||
<element id="directory" name="jps">
|
<element id="directory" name="jps">
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.java.decompiler.IdeaLogger;
|
import org.jetbrains.java.decompiler.IdeaLogger;
|
||||||
import org.jetbrains.kotlin.backend.common.output.OutputFile;
|
import org.jetbrains.kotlin.backend.common.output.OutputFile;
|
||||||
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection;
|
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection;
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendFacade;
|
||||||
import org.jetbrains.kotlin.codegen.ClassBuilderFactories;
|
import org.jetbrains.kotlin.codegen.ClassBuilderFactories;
|
||||||
import org.jetbrains.kotlin.codegen.CompilationErrorHandler;
|
import org.jetbrains.kotlin.codegen.CompilationErrorHandler;
|
||||||
import org.jetbrains.kotlin.codegen.KotlinCodegenFacade;
|
import org.jetbrains.kotlin.codegen.KotlinCodegenFacade;
|
||||||
@@ -132,7 +133,7 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
|||||||
configuration.put(JVMConfigurationKeys.JVM_TARGET, JvmTarget.JVM_1_8);
|
configuration.put(JVMConfigurationKeys.JVM_TARGET, JvmTarget.JVM_1_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
return getBytecodeForFile(ktFile, configuration);
|
return getBytecodeForFile(ktFile, configuration, ir.isSelected());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -181,6 +182,7 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
|||||||
private final JCheckBox enableAssertions;
|
private final JCheckBox enableAssertions;
|
||||||
private final JButton decompile;
|
private final JButton decompile;
|
||||||
private final JCheckBox jvm8Target;
|
private final JCheckBox jvm8Target;
|
||||||
|
private final JCheckBox ir;
|
||||||
|
|
||||||
public KotlinBytecodeToolWindow(Project project, ToolWindow toolWindow) {
|
public KotlinBytecodeToolWindow(Project project, ToolWindow toolWindow) {
|
||||||
super(new BorderLayout());
|
super(new BorderLayout());
|
||||||
@@ -220,9 +222,11 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
|||||||
enableOptimization = new JCheckBox("Optimization", true);
|
enableOptimization = new JCheckBox("Optimization", true);
|
||||||
enableAssertions = new JCheckBox("Assertions", true);
|
enableAssertions = new JCheckBox("Assertions", true);
|
||||||
jvm8Target = new JCheckBox("JVM 8 target", false);
|
jvm8Target = new JCheckBox("JVM 8 target", false);
|
||||||
|
ir = new JCheckBox("IR", true);
|
||||||
optionPanel.add(enableInline);
|
optionPanel.add(enableInline);
|
||||||
optionPanel.add(enableOptimization);
|
optionPanel.add(enableOptimization);
|
||||||
optionPanel.add(enableAssertions);
|
optionPanel.add(enableAssertions);
|
||||||
|
optionPanel.add(ir);
|
||||||
optionPanel.add(jvm8Target);
|
optionPanel.add(jvm8Target);
|
||||||
|
|
||||||
new InfinitePeriodicalTask(UPDATE_DELAY, Alarm.ThreadToUse.SWING_THREAD, this, new Computable<LongRunningReadTask>() {
|
new InfinitePeriodicalTask(UPDATE_DELAY, Alarm.ThreadToUse.SWING_THREAD, this, new Computable<LongRunningReadTask>() {
|
||||||
@@ -237,10 +241,10 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
|||||||
|
|
||||||
// public for tests
|
// public for tests
|
||||||
@NotNull
|
@NotNull
|
||||||
public static String getBytecodeForFile(@NotNull KtFile ktFile, @NotNull CompilerConfiguration configuration) {
|
public static String getBytecodeForFile(@NotNull KtFile ktFile, @NotNull CompilerConfiguration configuration, boolean newIRGenerator) {
|
||||||
GenerationState state;
|
GenerationState state;
|
||||||
try {
|
try {
|
||||||
state = compileSingleFile(ktFile, configuration);
|
state = compileSingleFile(ktFile, configuration, newIRGenerator);
|
||||||
}
|
}
|
||||||
catch (ProcessCanceledException e) {
|
catch (ProcessCanceledException e) {
|
||||||
throw e;
|
throw e;
|
||||||
@@ -278,7 +282,11 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static GenerationState compileSingleFile(@NotNull final KtFile ktFile, @NotNull CompilerConfiguration configuration) {
|
public static GenerationState compileSingleFile(
|
||||||
|
@NotNull final KtFile ktFile,
|
||||||
|
@NotNull CompilerConfiguration configuration,
|
||||||
|
boolean newIRGenerator
|
||||||
|
) {
|
||||||
ResolutionFacade resolutionFacade = ResolutionUtils.getResolutionFacade(ktFile);
|
ResolutionFacade resolutionFacade = ResolutionUtils.getResolutionFacade(ktFile);
|
||||||
|
|
||||||
BindingContext bindingContextForFile = resolutionFacade.analyzeFullyAndGetResult(Collections.singletonList(ktFile)).getBindingContext();
|
BindingContext bindingContextForFile = resolutionFacade.analyzeFullyAndGetResult(Collections.singletonList(ktFile)).getBindingContext();
|
||||||
@@ -316,7 +324,11 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
|||||||
ktFile.getProject(), ClassBuilderFactories.TEST, resolutionFacade.getModuleDescriptor(), bindingContext, toProcess,
|
ktFile.getProject(), ClassBuilderFactories.TEST, resolutionFacade.getModuleDescriptor(), bindingContext, toProcess,
|
||||||
configuration, generateClassFilter
|
configuration, generateClassFilter
|
||||||
);
|
);
|
||||||
KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION);
|
if (newIRGenerator) {
|
||||||
|
JvmBackendFacade.INSTANCE.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION);
|
||||||
|
} else {
|
||||||
|
KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION);
|
||||||
|
}
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class KotlinDecompilerServiceImpl : KotlinDecompilerService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun bytecodeMapForSourceFile(file: KtFile): Map<File, () -> ByteArray> {
|
fun bytecodeMapForSourceFile(file: KtFile): Map<File, () -> ByteArray> {
|
||||||
val generationState = KotlinBytecodeToolWindow.compileSingleFile(file, CompilerConfiguration.EMPTY)
|
val generationState = KotlinBytecodeToolWindow.compileSingleFile(file, CompilerConfiguration.EMPTY, false)
|
||||||
|
|
||||||
val bytecodeMap = hashMapOf<File, () -> ByteArray>()
|
val bytecodeMap = hashMapOf<File, () -> ByteArray>()
|
||||||
generationState.factory.asList().filter { FileUtilRt.extensionEquals(it.relativePath, "class") }.forEach {
|
generationState.factory.asList().filter { FileUtilRt.extensionEquals(it.relativePath, "class") }.forEach {
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ abstract class AbstractBytecodeToolWindowTest: KotlinLightCodeInsightFixtureTest
|
|||||||
if (InTextDirectivesUtils.getPrefixedBoolean(mainFileText, "// INLINE:") == false) {
|
if (InTextDirectivesUtils.getPrefixedBoolean(mainFileText, "// INLINE:") == false) {
|
||||||
configuration.put(CommonConfigurationKeys.DISABLE_INLINE, true)
|
configuration.put(CommonConfigurationKeys.DISABLE_INLINE, true)
|
||||||
}
|
}
|
||||||
val bytecodes = KotlinBytecodeToolWindow.getBytecodeForFile(file, configuration)
|
val bytecodes = KotlinBytecodeToolWindow.getBytecodeForFile(file, configuration, false)
|
||||||
assert(bytecodes.contains("// ================")) {
|
assert(bytecodes.contains("// ================")) {
|
||||||
"The header \"// ================\" is missing.\n This means that there is an exception failed during compilation:\n$bytecodes"
|
"The header \"// ================\" is missing.\n This means that there is an exception failed during compilation:\n$bytecodes"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user