diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 7bff2c1b584..ad03e6940aa 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -159,6 +159,8 @@ + + @@ -189,6 +191,7 @@ + diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompilerManager.java b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompilerManager.java index ecd7883aabe..3f1f54f5e2f 100644 --- a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompilerManager.java +++ b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompilerManager.java @@ -16,11 +16,13 @@ package org.jetbrains.jet.plugin.compiler; +import com.intellij.compiler.CompilerWorkspaceConfiguration; import com.intellij.diagnostic.PluginException; import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.compiler.*; import com.intellij.openapi.components.ProjectComponent; +import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtilRt; @@ -29,6 +31,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.plugin.JetFileType; +import org.jetbrains.jet.plugin.compiler.configuration.KotlinCompilerWorkspaceSettings; import java.io.PrintStream; import java.io.PrintWriter; @@ -44,7 +47,10 @@ public class JetCompilerManager implements ProjectComponent { private static final String PREFIX_WITH_COMPILER_NAME = KOTLIN_COMPILER_NAME + ": " + INTERNAL_ERROR_PREFIX; private static final Set FILE_EXTS_WHICH_NEEDS_REFRESH = ContainerUtil.immutableSet(".js", ".map"); + private final Project project; + public JetCompilerManager(Project project, CompilerManager manager) { + this.project = project; manager.addCompilableFileType(JetFileType.INSTANCE); manager.addCompilationStatusListener(new CompilationStatusListener() { @Override @@ -83,6 +89,18 @@ public class JetCompilerManager implements ProjectComponent { @Override public void initComponent() { + // TODO remove it after Kotlin M9 + // Migrate incremental compilation option for early adopters only + + String INCREMENTAL_VM_OPTION = "-Dkotlin.incremental.compilation=true"; + + CompilerWorkspaceConfiguration commonCompilerConfig = ServiceManager.getService(project, CompilerWorkspaceConfiguration.class); + String additionalVmOptions = commonCompilerConfig.COMPILER_PROCESS_ADDITIONAL_VM_OPTIONS; + if (additionalVmOptions.contains(INCREMENTAL_VM_OPTION)) { + String updatedVmOptions = additionalVmOptions.replace(INCREMENTAL_VM_OPTION, " ").trim(); + commonCompilerConfig.COMPILER_PROCESS_ADDITIONAL_VM_OPTIONS = updatedVmOptions; + ServiceManager.getService(project, KotlinCompilerWorkspaceSettings.class).setIncrementalCompilationEnabled(true); + } } @Override diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinBuildProcessParametersProvider.kt b/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinBuildProcessParametersProvider.kt new file mode 100644 index 00000000000..98da95c8d09 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinBuildProcessParametersProvider.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.compiler.configuration + +import com.intellij.compiler.server.BuildProcessParametersProvider +import com.intellij.openapi.components.ServiceManager + +public class KotlinBuildProcessParametersProvider(private val compilerWorkspaceSettings: KotlinCompilerWorkspaceSettings): BuildProcessParametersProvider() { + override fun getVMArguments(): MutableList { + return if (compilerWorkspaceSettings.incrementalCompilationEnabled) + arrayListOf("-Dkotlin.incremental.compilation=true") + else + arrayListOf() + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerConfigurableTab.form b/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerConfigurableTab.form index 27459467b29..45092739810 100644 --- a/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerConfigurableTab.form +++ b/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerConfigurableTab.form @@ -3,7 +3,7 @@ - + @@ -56,13 +56,22 @@ - + - + + + + + + + + + + diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerConfigurableTab.java b/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerConfigurableTab.java index 726f55f321a..7604a1c53f5 100644 --- a/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerConfigurableTab.java +++ b/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerConfigurableTab.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.plugin.compiler.configuration; import com.intellij.compiler.options.ComparingUtils; +import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurableEP; @@ -40,6 +41,7 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co private final CommonCompilerArguments commonCompilerArguments; private final K2JSCompilerArguments k2jsCompilerArguments; private final CompilerSettings compilerSettings; + private final KotlinCompilerWorkspaceSettings compilerWorkspaceSettings; private final ConfigurableEP extPoint; private JPanel contentPane; private JCheckBox generateNoWarningsCheckBox; @@ -50,12 +52,14 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co private TextFieldWithBrowseButton outputPostfixFile; private JLabel labelForOutputPrefixFile; private JLabel labelForOutputPostfixFile; + private JCheckBox incrementalCompilationCheckBox; public KotlinCompilerConfigurableTab(ConfigurableEP ep) { this.extPoint = ep; this.commonCompilerArguments = KotlinCommonCompilerArgumentsHolder.getInstance(ep.getProject()).getSettings(); this.k2jsCompilerArguments = Kotlin2JsCompilerArgumentsHolder.getInstance(ep.getProject()).getSettings(); this.compilerSettings = KotlinCompilerSettings.getInstance(ep.getProject()).getSettings(); + this.compilerWorkspaceSettings = ServiceManager.getService(ep.getProject(), KotlinCompilerWorkspaceSettings.class); additionalArgsOptionsField.attachLabel(additionalArgsLabel); @@ -87,6 +91,9 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co public boolean isModified() { return ComparingUtils.isModified(generateNoWarningsCheckBox, commonCompilerArguments.suppressWarnings) || ComparingUtils.isModified(additionalArgsOptionsField, compilerSettings.getAdditionalArguments()) || + + ComparingUtils.isModified(incrementalCompilationCheckBox, compilerWorkspaceSettings.getIncrementalCompilationEnabled()) || + ComparingUtils.isModified(generateSourceMapsCheckBox, k2jsCompilerArguments.sourceMap) || isModified(outputPrefixFile, k2jsCompilerArguments.outputPrefix) || isModified(outputPostfixFile, k2jsCompilerArguments.outputPostfix); @@ -96,6 +103,9 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co public void apply() throws ConfigurationException { commonCompilerArguments.suppressWarnings = generateNoWarningsCheckBox.isSelected(); compilerSettings.setAdditionalArguments(additionalArgsOptionsField.getText()); + + compilerWorkspaceSettings.setIncrementalCompilationEnabled(incrementalCompilationCheckBox.isSelected()); + k2jsCompilerArguments.sourceMap = generateSourceMapsCheckBox.isSelected(); k2jsCompilerArguments.outputPrefix = StringUtil.nullize(outputPrefixFile.getText(), true); k2jsCompilerArguments.outputPostfix = StringUtil.nullize(outputPostfixFile.getText(), true); @@ -105,6 +115,9 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co public void reset() { generateNoWarningsCheckBox.setSelected(commonCompilerArguments.suppressWarnings); additionalArgsOptionsField.setText(compilerSettings.getAdditionalArguments()); + + incrementalCompilationCheckBox.setSelected(compilerWorkspaceSettings.getIncrementalCompilationEnabled()); + generateSourceMapsCheckBox.setSelected(k2jsCompilerArguments.sourceMap); outputPrefixFile.setText(k2jsCompilerArguments.outputPrefix); outputPostfixFile.setText(k2jsCompilerArguments.outputPostfix); diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerWorkspaceSettings.kt b/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerWorkspaceSettings.kt new file mode 100644 index 00000000000..a08d80ce29b --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/compiler/configuration/KotlinCompilerWorkspaceSettings.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.compiler.configuration + +import com.intellij.openapi.components.PersistentStateComponent +import com.intellij.util.xmlb.XmlSerializerUtil +import com.intellij.compiler.CompilerWorkspaceConfiguration +import com.intellij.openapi.components.StoragePathMacros +import com.intellij.openapi.components.State +import com.intellij.openapi.components.Storage + +State( + name = "KotlinCompilerWorkspaceSettings", + storages = array( + Storage(file = StoragePathMacros.WORKSPACE_FILE) + ) +) +public class KotlinCompilerWorkspaceSettings() : PersistentStateComponent { + public var incrementalCompilationEnabled: Boolean = false + + override fun getState(): KotlinCompilerWorkspaceSettings { + return this + } + + override fun loadState(state: KotlinCompilerWorkspaceSettings?) { + XmlSerializerUtil.copyBean(state!!, this) + } +} \ No newline at end of file