diff --git a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/arguments/CommonCompilerArguments.java b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/arguments/CommonCompilerArguments.java index 2235ff0cd95..1335aea036e 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/arguments/CommonCompilerArguments.java +++ b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/arguments/CommonCompilerArguments.java @@ -38,6 +38,9 @@ public abstract class CommonCompilerArguments { @Argument(value = "X", description = "Print a synopsis of advanced options") public boolean extraHelp; + @Argument(value = "Xno-inline", description = "Disable method inlining") + public boolean noInline; + public List freeArgs = new SmartList(); @NotNull 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 20c1af26a72..3a0f99bc843 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 @@ -63,9 +63,6 @@ public class K2JVMCompilerArguments extends CommonCompilerArguments { @Argument(value = "Xno-param-assertions", description = "Don't generate not-null assertions on parameters of methods accessible from Java") public boolean noParamAssertions; - @Argument(value = "Xno-inline", description = "Disable method inlining") - public boolean noInline; - @Argument(value = "Xno-optimize", description = "Disable optimizations") public boolean noOptimize; diff --git a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java index e13414a7dce..60057f6e527 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java @@ -198,12 +198,14 @@ public class K2JSCompiler extends CLICompiler { } EcmaVersion ecmaVersion = EcmaVersion.defaultVersion(); String moduleId = FileUtil.getNameWithoutExtension(new File(arguments.outputFile)); + boolean inlineEnabled = !arguments.noInline; + if (arguments.libraryFiles != null) { - return new LibrarySourcesConfig(project, moduleId, Arrays.asList(arguments.libraryFiles), ecmaVersion, arguments.sourceMap); + return new LibrarySourcesConfig(project, moduleId, Arrays.asList(arguments.libraryFiles), ecmaVersion, arguments.sourceMap, inlineEnabled); } else { // lets discover the JS library definitions on the classpath - return new ClassPathLibraryDefintionsConfig(project, moduleId, ecmaVersion, arguments.sourceMap); + return new ClassPathLibraryDefintionsConfig(project, moduleId, ecmaVersion, arguments.sourceMap, inlineEnabled); } } diff --git a/js/js.frontend/src/org/jetbrains/k2js/config/Config.java b/js/js.frontend/src/org/jetbrains/k2js/config/Config.java index a3fc8df4948..a7429c6cf85 100644 --- a/js/js.frontend/src/org/jetbrains/k2js/config/Config.java +++ b/js/js.frontend/src/org/jetbrains/k2js/config/Config.java @@ -36,10 +36,11 @@ public abstract class Config { //NOTE: a hacky solution to be able to rerun code samples with lib loaded only once: used by tests and web demo @NotNull public static final String REWRITABLE_MODULE_NAME = "JS_TESTS"; + private boolean inlineEnabled; @NotNull public static Config getEmptyConfig(@NotNull Project project, @NotNull EcmaVersion ecmaVersion) { - return new Config(project, "main", ecmaVersion) { + return new Config(project, "main", ecmaVersion, false, true) { @NotNull @Override protected List generateLibFiles() { @@ -161,21 +162,28 @@ public abstract class Config { private final boolean sourcemap; - public Config(@NotNull Project project, @NotNull String moduleId, @NotNull EcmaVersion ecmaVersion) { - this(project, moduleId, ecmaVersion, false); - } - - public Config(@NotNull Project project, @NotNull String moduleId, @NotNull EcmaVersion ecmaVersion, boolean sourcemap) { + public Config( + @NotNull Project project, + @NotNull String moduleId, + @NotNull EcmaVersion ecmaVersion, + boolean sourcemap, + boolean inlineEnabled + ) { this.project = project; this.target = ecmaVersion; this.moduleId = moduleId; this.sourcemap = sourcemap; + this.inlineEnabled = inlineEnabled; } public boolean isSourcemap() { return sourcemap; } + public boolean isInlineEnabled() { + return inlineEnabled; + } + @NotNull public Project getProject() { return project; diff --git a/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java b/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java index fbae2b8a091..872b21d78fb 100644 --- a/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java +++ b/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java @@ -56,9 +56,10 @@ public class LibrarySourcesConfig extends Config { @NotNull String moduleId, @NotNull List files, @NotNull EcmaVersion ecmaVersion, - boolean sourcemap + boolean sourcemap, + boolean inlineEnabled ) { - super(project, moduleId, ecmaVersion, sourcemap); + super(project, moduleId, ecmaVersion, sourcemap, inlineEnabled); this.files = files; } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java b/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java index 8fcf042423f..c080fc6e76a 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java @@ -36,7 +36,7 @@ public class TestConfig extends Config { @NotNull List files, @NotNull BindingContext libraryContext, @NotNull ModuleDescriptor module) { - return new TestConfig(project, version, files, libraryContext, module, false); + return new TestConfig(project, version, files, libraryContext, module, false, true); } }; @@ -47,7 +47,7 @@ public class TestConfig extends Config { @NotNull List files, @NotNull BindingContext libraryContext, @NotNull ModuleDescriptor module) { - return new TestConfig(project, version, files, libraryContext, module, true); + return new TestConfig(project, version, files, libraryContext, module, true, true); } }; @@ -58,9 +58,16 @@ public class TestConfig extends Config { @NotNull private final ModuleDescriptor libraryModule; - public TestConfig(@NotNull Project project, @NotNull EcmaVersion version, - @NotNull List files, @NotNull BindingContext libraryContext, @NotNull ModuleDescriptor module, boolean sourcemap) { - super(project, REWRITABLE_MODULE_NAME, version, sourcemap); + public TestConfig( + @NotNull Project project, + @NotNull EcmaVersion version, + @NotNull List files, + @NotNull BindingContext libraryContext, + @NotNull ModuleDescriptor module, + boolean sourcemap, + boolean inlineEnabled + ) { + super(project, REWRITABLE_MODULE_NAME, version, sourcemap, inlineEnabled); jsLibFiles = files; this.libraryContext = libraryContext; libraryModule = module; diff --git a/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfigWithUnitTests.java b/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfigWithUnitTests.java index 498c6a1c399..bbde991331b 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfigWithUnitTests.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfigWithUnitTests.java @@ -45,7 +45,7 @@ public class TestConfigWithUnitTests extends TestConfig { @NotNull List files, @NotNull BindingContext libraryContext, @NotNull ModuleDescriptor module) { - super(project, version, files, libraryContext, module, false); + super(project, version, files, libraryContext, module, false, true); } @Override diff --git a/js/js.translator/src/org/jetbrains/k2js/config/ClassPathLibraryDefintionsConfig.java b/js/js.translator/src/org/jetbrains/k2js/config/ClassPathLibraryDefintionsConfig.java index 594db64e05f..02b40bdcb90 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/ClassPathLibraryDefintionsConfig.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/ClassPathLibraryDefintionsConfig.java @@ -30,8 +30,14 @@ public class ClassPathLibraryDefintionsConfig extends Config { @NotNull public static final String META_INF_SERVICES_FILE = "META-INF/services/org.jetbrains.kotlin.js.libraryDefinitions"; - public ClassPathLibraryDefintionsConfig(@NotNull Project project, @NotNull String moduleId, @NotNull EcmaVersion version, boolean sourcemap) { - super(project, moduleId, version, sourcemap); + public ClassPathLibraryDefintionsConfig( + @NotNull Project project, + @NotNull String moduleId, + @NotNull EcmaVersion version, + boolean sourcemap, + boolean inlineEnabled + ) { + super(project, moduleId, version, sourcemap, inlineEnabled); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index eae2751acfe..3364ac89cec 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.reflect.ReflectionTypes; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.k2js.config.Config; import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.config.LibrarySourcesConfig; import org.jetbrains.k2js.translate.context.generator.Generator; @@ -48,12 +49,12 @@ import static org.jetbrains.k2js.translate.utils.TranslationUtils.getSuggestedNa */ public final class StaticContext { - public static StaticContext generateStaticContext(@NotNull BindingContext bindingContext, @NotNull EcmaVersion ecmaVersion, @NotNull ModuleDescriptor moduleDescriptor) { + public static StaticContext generateStaticContext(@NotNull BindingContext bindingContext, @NotNull Config config, @NotNull ModuleDescriptor moduleDescriptor) { JsProgram program = new JsProgram("main"); Namer namer = Namer.newInstance(program.getRootScope()); Intrinsics intrinsics = new Intrinsics(); StandardClasses standardClasses = StandardClasses.bindImplementations(namer.getKotlinScope()); - return new StaticContext(program, bindingContext, namer, intrinsics, standardClasses, program.getRootScope(), ecmaVersion, moduleDescriptor); + return new StaticContext(program, bindingContext, namer, intrinsics, standardClasses, program.getRootScope(), config, moduleDescriptor); } @NotNull @@ -90,20 +91,24 @@ public final class StaticContext { @NotNull private final Map scopeToFunction = Maps.newHashMap(); + @NotNull + private final Config config; + @NotNull private final EcmaVersion ecmaVersion; //TODO: too many parameters in constructor private StaticContext(@NotNull JsProgram program, @NotNull BindingContext bindingContext, @NotNull Namer namer, @NotNull Intrinsics intrinsics, - @NotNull StandardClasses standardClasses, @NotNull JsScope rootScope, @NotNull EcmaVersion ecmaVersion, @NotNull ModuleDescriptor moduleDescriptor) { + @NotNull StandardClasses standardClasses, @NotNull JsScope rootScope, @NotNull Config config, @NotNull ModuleDescriptor moduleDescriptor) { this.program = program; this.bindingContext = bindingContext; this.namer = namer; this.intrinsics = intrinsics; this.rootScope = rootScope; this.standardClasses = standardClasses; - this.ecmaVersion = ecmaVersion; + this.config = config; + this.ecmaVersion = config.getTarget(); this.reflectionTypes = new ReflectionTypes(moduleDescriptor); } @@ -214,6 +219,10 @@ public final class StaticContext { return result; } + public Config getConfig() { + return config; + } + private final class NameGenerator extends Generator { public NameGenerator() { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index 1e69c04247e..d3df151326f 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -20,11 +20,15 @@ import com.google.dart.compiler.backend.js.ast.*; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.MemberDescriptor; +import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.reflect.ReflectionTypes; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.k2js.config.Config; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; import org.jetbrains.k2js.translate.utils.TranslationUtils; @@ -246,6 +250,11 @@ public class TranslationContext { return staticContext.getProgram(); } + @NotNull + public Config getConfig() { + return staticContext.getConfig(); + } + @NotNull public JsScope scope() { return dynamicContext.getScope(); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java index 468482a8b75..14017c18822 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java @@ -169,7 +169,7 @@ public final class Translation { throws TranslationException { try { JsProgram program = doGenerateAst(bindingContext, files, mainCallParameters, moduleDescriptor, config); - return JsInliner.process(program); + return config.isInlineEnabled() ? JsInliner.process(program) : program; } catch (UnsupportedOperationException e) { throw new UnsupportedFeatureException("Unsupported feature used.", e); @@ -184,7 +184,7 @@ public final class Translation { @NotNull MainCallParameters mainCallParameters, @NotNull ModuleDescriptor moduleDescriptor, @NotNull Config config) throws MainFunctionNotFoundException { - StaticContext staticContext = StaticContext.generateStaticContext(bindingContext, config.getTarget(), moduleDescriptor); + StaticContext staticContext = StaticContext.generateStaticContext(bindingContext, config, moduleDescriptor); JsProgram program = staticContext.getProgram(); JsBlock block = program.getGlobalBlock(); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallExpressionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallExpressionTranslator.java index d158269c28a..4a3cd9c3a1c 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallExpressionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallExpressionTranslator.java @@ -53,6 +53,8 @@ public final class CallExpressionTranslator extends AbstractCallExpressionTransl } public static boolean shouldBeInlined(@NotNull JetCallExpression expression, @NotNull TranslationContext context) { + if (!context.getConfig().isInlineEnabled()) return false; + ResolvedCall resolvedCall = CallUtilPackage.getResolvedCall(expression, context.bindingContext()); assert resolvedCall != null;