/*
 * Copyright 2000-2012 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 com.intellij.openapi.compiler;

import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.UserDataHolderBase;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.*;

public class ExportableUserDataHolderBase extends UserDataHolderBase implements ExportableUserDataHolder{
  private final Set<Key> myKeys = Collections.synchronizedSet(new HashSet<Key>());

  @NotNull
  public final Map<Key, Object> exportUserData() {
    final Map<Key, Object> result = new HashMap<Key, Object>();
    synchronized (myKeys) {
      for (Key<?> k : myKeys) {
        final Object data = getUserData(k);
        if (data != null) {
          result.put(k, data);
        }
      }
    }
    return result;
  }

  @Override
  public final <T> void putUserData(@NotNull Key<T> key, @Nullable T value) {
    if (value != null) {
      myKeys.add(key);
    }
    else {
      myKeys.remove(key);
    }
    super.putUserData(key, value);
  }

}

@@ -736,41 +736,41 @@
 ort 
-org.jetbrains.annotations.NotNull
+com.intellij.util.keyFMap.KeyFMap
 ;%0Aim
@@ -805,17 +805,42 @@
 ns.N
-ullable;%0A
+otNull;%0A%0Aimport java.util.HashMap;
 %0Aimp
@@ -853,17 +853,19 @@
 va.util.
-*
+Map
 ;%0A%0Apubli
@@ -969,92 +969,8 @@
 er%7B%0A
-  private final Set%3CKey%3E myKeys = Collections.synchronizedSet(new HashSet%3CKey%3E());%0A%0A
   @N
@@ -1095,38 +1095,74 @@
 ();%0A
+%0A
     
-synchronized (myKeys) %7B%0A  
+KeyFMap map = getUserMap();%0A    Key%5B%5D keys = map.getKeys();%0A%0A
     
@@ -1181,20 +1181,16 @@
 k : 
-myK
+k
 eys) %7B%0A
-  
     
@@ -1215,26 +1215,20 @@
 a = 
-getUserData
+map.get
 (k);%0A
-  
     
@@ -1245,26 +1245,24 @@
  != null) %7B%0A
-  
         resu
@@ -1288,25 +1288,16 @@
     
-  
 %7D%0A    
- 
- 
 %7D%0A
-    %7D
 %0A   
@@ -1320,234 +1320,6 @@
   %7D%0A
-%0A  @Override%0A  public final %3CT%3E void putUserData(@NotNull Key%3CT%3E key, @Nullable T value) %7B%0A    if (value != null) %7B%0A      myKeys.add(key);%0A    %7D%0A    else %7B%0A      myKeys.remove(key);%0A    %7D%0A    super.putUserData(key, value);%0A  %7D%0A%0A
 %7D%0A

Use KeyFMap#getKeys in ExportableUserDataHolderBase to simplify and improve performance