[code style] IDEA-327617 migrate production code that uses doWithTemporarySettings to runWithLocalSettings

`doWithTemporarySettings` uses a global variable under the hood and its concurrent usages lead to race conditions.

`runWithLocalSettings` provides the same functionality in a thread-safe manner using a thread-local variable.

GitOrigin-RevId: 0d32cb8ac2e3347f4b5fabda8092d399827b2d6a
This commit is contained in:
Vojtech Balik
2023-11-01 21:01:23 +01:00
committed by intellij-monorepo-bot
parent 2d160c85d3
commit bf688b75fb
8 changed files with 14 additions and 19 deletions

View File

@@ -58,7 +58,7 @@ public class TextBlockBackwardMigrationInspection extends AbstractBaseJavaLocalI
CodeStyleSettings tempSettings = CodeStyle.getSettings(file);
tempSettings.getCommonSettings(JavaLanguage.INSTANCE).ALIGN_MULTILINE_BINARY_OPERATION = true;
CodeStyleManager manager = CodeStyleManager.getInstance(literalExpression.getProject());
CodeStyle.doWithTemporarySettings(project, tempSettings, () -> {
CodeStyle.runWithLocalSettings(project, tempSettings, () -> {
PsiElement result = new CommentTracker().replaceAndRestoreComments(literalExpression, replacement);
manager.reformat(result);
});

View File

@@ -225,7 +225,7 @@ public abstract class CodeStyleAbstractPanel implements Disposable, ComponentHig
applySettingsToModel();
final Ref<PsiFile> formatted = Ref.create();
CodeStyle.doWithTemporarySettings(
CodeStyle.runWithLocalSettings(
project,
mySettings,
settings -> {
@@ -270,7 +270,7 @@ public abstract class CodeStyleAbstractPanel implements Disposable, ComponentHig
private Document collectChangesBeforeCurrentSettingsAppliance(@NotNull Project project) {
PsiFile psiFile = createFileFromText(project, myTextToReformat);
prepareForReformat(psiFile);
CodeStyle.doWithTemporarySettings(
CodeStyle.runWithLocalSettings(
project,
mySettings,
settings -> {

View File

@@ -155,7 +155,7 @@ public class ReformatCodeProcessor extends AbstractLayoutCodeProcessor {
boolean doNotKeepLineBreaks = confirmSecondReformat(file);
return new FutureTask<>(() -> {
Ref<Boolean> result = new Ref<>();
CodeStyle.doWithTemporarySettings(myProject, CodeStyle.getSettings(fileToProcess), (settings) -> {
CodeStyle.runWithLocalSettings(myProject, CodeStyle.getSettings(fileToProcess), (settings) -> {
if (doNotKeepLineBreaks) {
settings.getCommonSettings(fileToProcess.getLanguage()).KEEP_LINE_BREAKS = false;
}

View File

@@ -229,7 +229,7 @@ public final class FixDocCommentAction extends EditorAction {
}
private static void reformatCommentKeepingEmptyTags(@NotNull PsiFile file, @NotNull Project project, int start, int end) {
CodeStyle.doWithTemporarySettings(
CodeStyle.runWithLocalSettings(
project,
CodeStyle.getSettings(file),
tempSettings -> {

View File

@@ -53,7 +53,7 @@ public final class SelectedTextFormatter {
void reformatSelectedText(@NotNull CodeStyleSettings reformatSettings) {
final SelectionModel model = myEditor.getSelectionModel();
if (model.hasSelection()) {
CodeStyle.doWithTemporarySettings(myProject, reformatSettings, () -> reformatRange(myFile, getSelectedRange()));
CodeStyle.runWithLocalSettings(myProject, reformatSettings, () -> reformatRange(myFile, getSelectedRange()));
}
}

View File

@@ -50,9 +50,9 @@ public final class CodeStyleSettingsCodeFragmentFilter {
public @NotNull CodeStyleSettingsToShow getFieldNamesAffectingCodeFragment(LanguageCodeStyleSettingsProvider.SettingsType... types) {
Ref<CodeStyleSettingsToShow> settingsToShow = new Ref<>();
CodeStyle.doWithTemporarySettings(myProject,
CodeStyle.getSettings(myFile),
tempSettings -> settingsToShow.set(computeFieldsWithTempSettings(tempSettings, types)));
CodeStyle.runWithLocalSettings(myProject,
CodeStyle.getSettings(myFile),
tempSettings -> settingsToShow.set(computeFieldsWithTempSettings(tempSettings, types)));
return settingsToShow.get();
}

View File

@@ -75,7 +75,7 @@ final class EditorConfigPreviewFile extends LightVirtualFile implements CodeStyl
CodeStyleSettings settings = CodeStyle.getSettings(originalPsiFile);
PsiFile psiFile = createPsi(originalPsiFile.getFileType());
psiFile.putUserData(PsiFileFactory.ORIGINAL_FILE, originalPsiFile);
CodeStyle.doWithTemporarySettings(
CodeStyle.runWithLocalSettings(
myProject, settings, () -> CodeStyleManager.getInstance(myProject).reformatText(psiFile, 0, psiFile.getTextLength()));
myDocument.replaceString(0, myDocument.getTextLength(), psiFile.getText());
}

View File

@@ -4,9 +4,7 @@ package org.jetbrains.kotlin.idea.codeInsight.inspections.shared
import com.intellij.application.options.CodeStyle
import com.intellij.codeInsight.intention.FileModifier
import com.intellij.codeInspection.*
import com.intellij.codeInspection.options.OptPane
import com.intellij.codeInspection.options.OptPane.*
import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel
import com.intellij.codeInspection.util.InspectionMessage
import com.intellij.codeInspection.util.IntentionFamilyName
import com.intellij.openapi.project.Project
@@ -15,7 +13,6 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.PsiFile
import com.intellij.psi.codeStyle.CodeStyleManager
import com.intellij.psi.codeStyle.CodeStyleSettingsManager
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.idea.base.resources.KotlinBundle
import org.jetbrains.kotlin.idea.codeinsight.api.classic.inspections.AbstractKotlinInspection
@@ -33,7 +30,6 @@ import org.jetbrains.kotlin.idea.util.leafIgnoringWhitespaceAndComments
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments
import javax.swing.JComponent
import kotlin.properties.Delegates
internal class TrailingCommaInspection(
@@ -198,12 +194,11 @@ internal class TrailingCommaInspection(
override fun applyFix(project: Project, problemDescriptor: ProblemDescriptor) {
val element = commaOwnerPointer.element ?: return
val range = createFormatterTextRange(element)
val settings = CodeStyleSettingsManager.getInstance(project).cloneSettings(CodeStyle.getSettings(element.containingKtFile))
settings.kotlinCustomSettings.ALLOW_TRAILING_COMMA = true
settings.kotlinCustomSettings.ALLOW_TRAILING_COMMA_ON_CALL_SITE = true
CodeStyle.doWithTemporarySettings(project, settings, Runnable {
CodeStyle.runWithLocalSettings(project, CodeStyle.getSettings(element.containingKtFile)) { tempSettings ->
tempSettings.kotlinCustomSettings.ALLOW_TRAILING_COMMA = true
tempSettings.kotlinCustomSettings.ALLOW_TRAILING_COMMA_ON_CALL_SITE = true
CodeStyleManager.getInstance(project).reformatRange(element, range.startOffset, range.endOffset)
})
}
}
private fun createFormatterTextRange(commaOwner: KtElement): TextRange {