@NotNull private Collection<SmartPsiElementPointer<PsiField>> getFieldsToFix() { Map<SmartPsiElementPointer<PsiField>, Boolean> fields = myClass.getUserData(FIELDS); if (fields == null) myClass.putUserData( FIELDS, fields = new ConcurrentWeakHashMap<SmartPsiElementPointer<PsiField>, Boolean>(1)); final Map<SmartPsiElementPointer<PsiField>, Boolean> finalFields = fields; return new AbstractCollection<SmartPsiElementPointer<PsiField>>() { @Override public boolean add(SmartPsiElementPointer<PsiField> psiVariable) { PsiField field = psiVariable.getElement(); if (field == null || !isAvailable(field)) return false; return finalFields.put(psiVariable, Boolean.TRUE) == null; } @NotNull @Override public Iterator<SmartPsiElementPointer<PsiField>> iterator() { return finalFields.keySet().iterator(); } @Override public int size() { return finalFields.size(); } @Override public void clear() { finalFields.clear(); } }; }
@NotNull private static ParameterizedCachedValue<MembersMap, PsiClass> getValues( @NotNull PsiClass aClass) { ParameterizedCachedValue<MembersMap, PsiClass> value = aClass.getUserData(MAP_IN_CLASS_KEY); if (value == null) { value = CachedValuesManager.getManager(aClass.getProject()) .createParameterizedCachedValue(ByNameCachedValueProvider.INSTANCE, false); // Do not cache for nonphysical elements if (aClass.isPhysical()) { value = ((UserDataHolderEx) aClass).putUserDataIfAbsent(MAP_IN_CLASS_KEY, value); } } return value; }
@NotNull private Collection<PsiVariable> getVariablesToFix() { Map<PsiVariable, Boolean> vars = myClass.getUserData(VARS[myFixType]); if (vars == null) myClass.putUserData( VARS[myFixType], vars = new ConcurrentWeakHashMap<PsiVariable, Boolean>(1)); final Map<PsiVariable, Boolean> finalVars = vars; return new AbstractCollection<PsiVariable>() { @Override public boolean add(PsiVariable psiVariable) { return finalVars.put(psiVariable, Boolean.TRUE) == null; } @Override public Iterator<PsiVariable> iterator() { return finalVars.keySet().iterator(); } @Override public int size() { return finalVars.size(); } }; }