From 8533fd64ffccc3532eb577f61a5c11103eab741f Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Fri, 22 Nov 2013 17:12:17 +0400 Subject: [PATCH] Compiler inline on/off flag --- .../jet/codegen/state/GenerationState.java | 14 +++++++--- .../arguments/K2JVMCompilerArguments.java | 3 +++ .../jetbrains/jet/cli/common/CLICompiler.java | 5 ++++ .../jet/cli/jvm/JVMConfigurationKeys.java | 3 +++ .../jetbrains/jet/cli/jvm/K2JVMCompiler.java | 13 ++++++++++ .../compiler/KotlinToJVMBytecodeCompiler.java | 4 ++- .../jet/cli/jvm/repl/ReplInterpreter.java | 3 ++- .../asJava/KotlinJavaFileStubProvider.java | 4 ++- compiler/testData/cli/jvm/help.out | 3 ++- compiler/testData/cli/jvm/inline/off.args | 3 +++ compiler/testData/cli/jvm/inline/off.out | 23 ++++++++++++++++ compiler/testData/cli/jvm/inline/on.args | 3 +++ compiler/testData/cli/jvm/inline/on.out | 23 ++++++++++++++++ compiler/testData/cli/jvm/inline/wrong.args | 2 ++ compiler/testData/cli/jvm/inline/wrong.out | 24 +++++++++++++++++ compiler/testData/cli/jvm/wrongArgument.out | 3 ++- .../cli/KotlincExecutableTestGenerated.java | 26 ++++++++++++++++++- .../jet/codegen/CodegenTestUtil.java | 4 ++- .../jet/codegen/GenerationUtils.java | 4 ++- .../jet/lang/types/lang/InlineUtil.java | 8 ++++++ .../codewindow/BytecodeToolwindow.java | 4 ++- 21 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/cli/jvm/inline/off.args create mode 100644 compiler/testData/cli/jvm/inline/off.out create mode 100644 compiler/testData/cli/jvm/inline/on.args create mode 100644 compiler/testData/cli/jvm/inline/on.out create mode 100644 compiler/testData/cli/jvm/inline/wrong.args create mode 100644 compiler/testData/cli/jvm/inline/wrong.out diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java index d7a1276e762..4ba4170f64e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java @@ -70,11 +70,13 @@ public class GenerationState { private final boolean generateDeclaredClasses; + private final boolean inlineEnabled; + @Nullable private List earlierScriptsForReplInterpreter; - public GenerationState(Project project, ClassBuilderFactory builderFactory, BindingContext bindingContext, List files) { - this(project, builderFactory, Progress.DEAF, bindingContext, files, true, false, true); + public GenerationState(Project project, ClassBuilderFactory builderFactory, BindingContext bindingContext, List files, boolean inlineEnabled) { + this(project, builderFactory, Progress.DEAF, bindingContext, files, true, false, true, inlineEnabled); } public GenerationState( @@ -85,12 +87,14 @@ public class GenerationState { @NotNull List files, boolean generateNotNullAssertions, boolean generateNotNullParamAssertions, - boolean generateDeclaredClasses + boolean generateDeclaredClasses, + boolean inlineEnabled ) { this.project = project; this.progress = progress; this.files = files; this.classBuilderMode = builderFactory.getClassBuilderMode(); + this.inlineEnabled = inlineEnabled; bindingTrace = new DelegatingBindingTrace(bindingContext, "trace in GenerationState"); this.bindingContext = bindingTrace.getBindingContext(); @@ -169,6 +173,10 @@ public class GenerationState { return generateDeclaredClasses; } + public boolean isInlineEnabled() { + return inlineEnabled; + } + public void beforeCompile() { markUsed(); diff --git a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/arguments/K2JVMCompilerArguments.java b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/arguments/K2JVMCompilerArguments.java index cb3a88e0f83..90b3903b649 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/arguments/K2JVMCompilerArguments.java +++ b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/arguments/K2JVMCompilerArguments.java @@ -65,4 +65,7 @@ public class K2JVMCompilerArguments extends CommonCompilerArguments { @Argument(value = "kotlinHome", description = "Path to Kotlin compiler home directory, used for annotations and runtime libraries discovery") public String kotlinHome; + + @Argument(value = "inline", description = "Inlining mode: on/off (default is off)") + public String enableInline; } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/common/CLICompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/common/CLICompiler.java index 59892dc1846..c1ed663dc05 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/common/CLICompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/common/CLICompiler.java @@ -63,6 +63,7 @@ public abstract class CLICompiler { protected boolean parseArguments(@NotNull PrintStream errStream, @NotNull A arguments, @NotNull String[] args) { try { arguments.freeArgs = Args.parse(arguments, args); + checkArguments(arguments); return true; } catch (IllegalArgumentException e) { @@ -76,6 +77,10 @@ public abstract class CLICompiler { return false; } + protected void checkArguments(@NotNull A argument) { + + } + /** * Allow derived classes to add additional command line arguments */ diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/JVMConfigurationKeys.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/JVMConfigurationKeys.java index cccbfd8ffb5..1d4baf90846 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/JVMConfigurationKeys.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/JVMConfigurationKeys.java @@ -35,4 +35,7 @@ public class JVMConfigurationKeys { CompilerConfigurationKey.create("generate not-null assertions"); public static final CompilerConfigurationKey GENERATE_NOT_NULL_PARAMETER_ASSERTIONS = CompilerConfigurationKey.create("generate not-null parameter assertions"); + + public static final CompilerConfigurationKey ENABLE_INLINE = + CompilerConfigurationKey.create("enable inline"); } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java index 5999c5db000..66f97a79723 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java @@ -107,6 +107,7 @@ public class K2JVMCompiler extends CLICompiler { configuration.put(JVMConfigurationKeys.GENERATE_NOT_NULL_ASSERTIONS, arguments.notNullAssertions); configuration.put(JVMConfigurationKeys.GENERATE_NOT_NULL_PARAMETER_ASSERTIONS, arguments.notNullParamAssertions); + configuration.put(JVMConfigurationKeys.ENABLE_INLINE, "on".equalsIgnoreCase(arguments.enableInline)); configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector); @@ -190,4 +191,16 @@ public class K2JVMCompiler extends CLICompiler { } return annotationsPath; } + + @Override + protected void checkArguments(@NotNull K2JVMCompilerArguments argument) { + super.checkArguments(argument); + + String inline = argument.enableInline; + if (inline != null) { + if (!"on".equalsIgnoreCase(inline) && !"off".equalsIgnoreCase(inline)) { + throw new IllegalArgumentException("Wrong value for inline option: '" + inline + "'. Should be 'on' or 'off'"); + } + } + } } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java index d81a9d867d6..0057be4f0dd 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java @@ -47,6 +47,7 @@ import org.jetbrains.jet.lang.resolve.ScriptNameUtil; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.types.lang.InlineUtil; import org.jetbrains.jet.plugin.JetMainDetector; import org.jetbrains.jet.utils.KotlinPaths; @@ -293,7 +294,8 @@ public class KotlinToJVMBytecodeCompiler { project, ClassBuilderFactories.BINARIES, Progress.DEAF, exhaust.getBindingContext(), environment.getSourceFiles(), configuration.get(JVMConfigurationKeys.GENERATE_NOT_NULL_ASSERTIONS, false), configuration.get(JVMConfigurationKeys.GENERATE_NOT_NULL_PARAMETER_ASSERTIONS, false), - /*generateDeclaredClasses = */true + /*generateDeclaredClasses = */true, + configuration.get(JVMConfigurationKeys.ENABLE_INLINE, InlineUtil.DEFAULT_INLINE_FLAG) ); KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION); diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java index 0014ac86daa..cfb421b42f4 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java @@ -57,6 +57,7 @@ import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; +import org.jetbrains.jet.lang.types.lang.InlineUtil; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.plugin.JetLanguage; import org.jetbrains.jet.utils.ExceptionUtils; @@ -236,7 +237,7 @@ public class ReplInterpreter { BindingContext bindingContext = AnalyzeExhaust.success(trace.getBindingContext(), module).getBindingContext(); GenerationState generationState = new GenerationState(psiFile.getProject(), ClassBuilderFactories.BINARIES, - bindingContext, Collections.singletonList(psiFile)); + bindingContext, Collections.singletonList(psiFile), InlineUtil.DEFAULT_INLINE_FLAG); compileScript(psiFile.getScript(), scriptClassType, earlierScripts, generationState, CompilationErrorHandler.THROW_EXCEPTION); diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java index c302815bd0b..7f08d9ba171 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java @@ -45,6 +45,7 @@ import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.types.lang.InlineUtil; import java.util.Collection; import java.util.Collections; @@ -152,7 +153,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider files) { analyzeExhaust.throwIfError(); - GenerationState state = new GenerationState(project, ClassBuilderFactories.TEST, analyzeExhaust.getBindingContext(), files); + GenerationState state = new GenerationState(project, ClassBuilderFactories.TEST, analyzeExhaust.getBindingContext(), files, + InlineUtil.DEFAULT_INLINE_FLAG_FOR_TEST); KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION); return state; } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/InlineUtil.java b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/InlineUtil.java index 7e3659b7347..49c23e0209d 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/InlineUtil.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/InlineUtil.java @@ -31,6 +31,14 @@ import java.util.List; public class InlineUtil { + public static boolean DEFAULT_INLINE_FLAG = false; + + public static boolean DEFAULT_INLINE_FLAG_FOR_TEST = true; + + public static boolean DEFAULT_INLINE_FLAG_FOR_TOOLWINDOW = false; + + public static boolean DEFAULT_INLINE_FLAG_FOR_STUB = false; /*always false*/ + @NotNull public static InlineStrategy getInlineType(@NotNull Annotated annotated) { return getInlineType(annotated.getAnnotations()); diff --git a/idea/src/org/jetbrains/jet/plugin/internal/codewindow/BytecodeToolwindow.java b/idea/src/org/jetbrains/jet/plugin/internal/codewindow/BytecodeToolwindow.java index cf26fd678df..504157397fa 100644 --- a/idea/src/org/jetbrains/jet/plugin/internal/codewindow/BytecodeToolwindow.java +++ b/idea/src/org/jetbrains/jet/plugin/internal/codewindow/BytecodeToolwindow.java @@ -40,6 +40,7 @@ import org.jetbrains.jet.codegen.KotlinCodegenFacade; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.Progress; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.types.lang.InlineUtil; import org.jetbrains.jet.plugin.internal.Location; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.util.LongRunningReadTask; @@ -97,7 +98,8 @@ public class BytecodeToolwindow extends JPanel implements Disposable { return printStackTraceToString(exhaust.getError()); } state = new GenerationState(jetFile.getProject(), ClassBuilderFactories.TEXT, Progress.DEAF, exhaust.getBindingContext(), - Collections.singletonList(jetFile), true, true, true); + Collections.singletonList(jetFile), true, true, true, + InlineUtil.DEFAULT_INLINE_FLAG_FOR_TOOLWINDOW /*TODO add checkbox or extract it from option*/); KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION); } catch (ProcessCanceledException e) {