void cacheVisitedState(
     APTPreprocHandler.State inputState,
     APTPreprocHandler outputHandler,
     FilePreprocessorConditionState pcState) {
   if (cacheStates && inputState.isCompileContext()) {
     stateCacheLock.writeLock().lock();
     try {
       if ((stateCache.isEmpty() || APTHandlersSupport.getIncludeStackDepth(inputState) == 1)
           && isCacheableState(inputState)) {
         if (stateCache.size() == CACHE_SIZE) {
           int min = Integer.MAX_VALUE;
           APTPreprocHandler.StateKey key = null;
           for (Map.Entry<APTPreprocHandler.StateKey, Value> entry : stateCache.entrySet()) {
             if (entry.getValue().value.get() == null) {
               key = entry.getKey();
               break;
             }
             if (entry.getValue().count < min) {
               key = entry.getKey();
               min = entry.getValue().count;
             }
           }
           stateCache.remove(key);
         }
         stateCache.put(
             createKey(inputState),
             new Value(new PreprocessorStatePair(outputHandler.getState(), pcState)));
       }
     } finally {
       stateCacheLock.writeLock().unlock();
     }
   }
 }
 /*package-local*/ PreprocessorStatePair getCachedVisitedState(
     APTPreprocHandler.State inputState) {
   PreprocessorStatePair res = null;
   if (cacheStates && inputState.isCompileContext()) {
     if (TRACE) {
       stateCacheAttempt++;
     }
     stateCacheLock.readLock().lock();
     APTPreprocHandler.StateKey key = null;
     try {
       if (isCacheableState(inputState)) {
         key = createKey(inputState);
         Value value = stateCache.get(key);
         if (value != null) {
           res = value.value.get();
           value.count++;
         }
       }
     } finally {
       stateCacheLock.readLock().unlock();
     }
     if (TRACE && res != null) {
       stateCacheSuccessAttempt++;
       System.err.println(
           "State Cache Attempt="
               + stateCacheAttempt
               + " successful="
               + stateCacheSuccessAttempt
               + " cache size="
               + stateCache.size()
               + " in file "
               + file.getName());
       System.err.println("    Key=" + key);
       System.err.println("    Res=" + createKey(res.state));
     }
   }
   return res;
 }