From 34e8ce6a486129fdb6d9300b304c50d11f1e0455 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 1 Nov 2018 11:03:07 +0300 Subject: [PATCH] Fix data race in LightReferenceListBuilder Effectively this is a cherry-pick of https://github.com/JetBrains/intellij-community/commit/75032008695977f171540b5f0e055b77aa682c0c --- .../KotlinLightReferenceListBuilder.java | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightReferenceListBuilder.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightReferenceListBuilder.java index 35a0e656478..c9da0f0fffd 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightReferenceListBuilder.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightReferenceListBuilder.java @@ -19,8 +19,8 @@ import java.util.List; */ public class KotlinLightReferenceListBuilder extends LightReferenceListBuilder implements PsiReferenceList { private final List myRefs = new ArrayList<>(); - private PsiJavaCodeReferenceElement[] myCachedRefs; - private PsiClassType[] myCachedTypes; + private volatile PsiJavaCodeReferenceElement[] myCachedRefs; + private volatile PsiClassType[] myCachedTypes; private final Role myRole; private final PsiElementFactory myFactory; @@ -57,34 +57,27 @@ public class KotlinLightReferenceListBuilder extends LightReferenceListBuilder i @NotNull @Override public PsiJavaCodeReferenceElement[] getReferenceElements() { - if (myCachedRefs == null) { - if (myRefs.isEmpty()) { - myCachedRefs = PsiJavaCodeReferenceElement.EMPTY_ARRAY; - } - else { - myCachedRefs = myRefs.toArray(PsiJavaCodeReferenceElement.EMPTY_ARRAY); - } + PsiJavaCodeReferenceElement[] refs = myCachedRefs; + if (refs == null) { + myCachedRefs = refs = myRefs.toArray(PsiJavaCodeReferenceElement.EMPTY_ARRAY); } - return myCachedRefs; + return refs; } @NotNull @Override public PsiClassType[] getReferencedTypes() { - if (myCachedTypes == null) { - if (myRefs.isEmpty()) { - myCachedTypes = PsiClassType.EMPTY_ARRAY; - } - else { - final int size = myRefs.size(); - myCachedTypes = new PsiClassType[size]; - for (int i = 0; i < size; i++) { - myCachedTypes[i] = myFactory.createType(myRefs.get(i)); - } + PsiClassType[] types = myCachedTypes; + if (types == null) { + int size = myRefs.size(); + types = size == 0 ? PsiClassType.EMPTY_ARRAY : new PsiClassType[size]; + for (int i = 0; i < size; i++) { + types[i] = myFactory.createType(myRefs.get(i)); } + myCachedTypes = types; } - return myCachedTypes; + return types; } @Override