diff --git a/jps/model-api/src/org/jetbrains/jps/model/ex/JpsElementChildRoleBase.java b/jps/model-api/src/org/jetbrains/jps/model/ex/JpsElementChildRoleBase.java index 7150cb7708da..17036f1e9f80 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/ex/JpsElementChildRoleBase.java +++ b/jps/model-api/src/org/jetbrains/jps/model/ex/JpsElementChildRoleBase.java @@ -25,7 +25,7 @@ public class JpsElementChildRoleBase extends JpsElementChi private String myDebugName; protected JpsElementChildRoleBase(String debugName) { - myDebugName = debugName.intern(); + myDebugName = debugName; } @Override diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java index e2a4c5031004..cdbb379c43c9 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java @@ -28,12 +28,17 @@ import org.jetbrains.jps.model.library.*; import org.jetbrains.jps.util.JpsPathUtil; import java.io.File; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentMap; /** * @author nik */ public class JpsLibraryImpl

extends JpsNamedCompositeElementBase> implements JpsTypedLibrary

{ + private static final ConcurrentMap> ourRootRoles = ContainerUtil.newConcurrentMap(); private final JpsLibraryType

myLibraryType; public JpsLibraryImpl(@NotNull String name, @NotNull JpsLibraryType

type, @NotNull P properties) { @@ -103,7 +108,10 @@ public class JpsLibraryImpl

extends JpsNamedCompositeEleme } private static JpsElementCollectionRole getRole(JpsOrderRootType type) { - return JpsElementCollectionRole.create(new JpsLibraryRootRole(type)); + JpsElementCollectionRole role = ourRootRoles.get(type); + if (role != null) return role; + ourRootRoles.putIfAbsent(type, JpsElementCollectionRole.create(new JpsLibraryRootRole(type))); + return ourRootRoles.get(type); } @Override diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsSdkReferencesTableImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsSdkReferencesTableImpl.java index adf4bfb7314a..ad2a33ebdc07 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsSdkReferencesTableImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsSdkReferencesTableImpl.java @@ -15,6 +15,7 @@ */ package org.jetbrains.jps.model.module.impl; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElement; @@ -25,11 +26,14 @@ import org.jetbrains.jps.model.library.sdk.JpsSdkReference; import org.jetbrains.jps.model.library.sdk.JpsSdkType; import org.jetbrains.jps.model.module.JpsSdkReferencesTable; +import java.util.concurrent.ConcurrentMap; + /** * @author nik */ public class JpsSdkReferencesTableImpl extends JpsCompositeElementBase implements JpsSdkReferencesTable { public static final JpsSdkReferencesTableRole ROLE = new JpsSdkReferencesTableRole(); + private static final ConcurrentMap ourReferenceRoles = ContainerUtil.newConcurrentMap(); public JpsSdkReferencesTableImpl() { super(); @@ -47,7 +51,7 @@ public class JpsSdkReferencesTableImpl extends JpsCompositeElementBase void setSdkReference(@NotNull JpsSdkType

type, @Nullable JpsSdkReference

sdkReference) { - JpsSdkReferenceRole

role = new JpsSdkReferenceRole

(type); + JpsSdkReferenceRole

role = getSdkReferenceRole(type); if (sdkReference != null) { myContainer.setChild(role, sdkReference); } @@ -58,7 +62,16 @@ public class JpsSdkReferencesTableImpl extends JpsCompositeElementBase JpsSdkReference

getSdkReference(@NotNull JpsSdkType

type) { - return myContainer.getChild(new JpsSdkReferenceRole

(type)); + return myContainer.getChild(getSdkReferenceRole(type)); + } + + @SuppressWarnings("unchecked") + @NotNull + private static

JpsSdkReferenceRole

getSdkReferenceRole(@NotNull JpsSdkType

type) { + JpsSdkReferenceRole

role = ourReferenceRoles.get(type); + if (role != null) return role; + ourReferenceRoles.putIfAbsent(type, new JpsSdkReferenceRole

(type)); + return ourReferenceRoles.get(type); } private static class JpsSdkReferencesTableRole extends JpsElementChildRoleBase implements JpsElementCreator {