package org.jetbrains.android.augment; import com.intellij.openapi.util.Pair; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.psi.xml.XmlElement; import org.jetbrains.android.dom.manifest.Manifest; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.annotations.NotNull; import java.util.List; /** * @author Eugene.Kudelevsky */ abstract class ManifestInnerClass extends AndroidLightClass { private CachedValue<PsiField[]> myFieldsCache; private final AndroidFacet myFacet; ManifestInnerClass(@NotNull AndroidFacet facet, @NotNull String name, @NotNull PsiClass context) { super(context, name); myFacet = facet; } @NotNull @Override public PsiField[] getFields() { if (myFieldsCache == null) { myFieldsCache = CachedValuesManager.getManager(getProject()).createCachedValue(new CachedValueProvider<PsiField[]>() { @Override public Result<PsiField[]> compute() { final Manifest manifest = myFacet.getManifest(); if (manifest == null) { return Result.create(PsiField.EMPTY_ARRAY, PsiModificationTracker.MODIFICATION_COUNT); } final List<Pair<String, String>> pairs = doGetFields(manifest); final PsiField[] result = new PsiField[pairs.size()]; final PsiClassType stringType = PsiType.getJavaLangString(myManager, GlobalSearchScope.allScope(getProject())); final PsiElementFactory factory = JavaPsiFacade.getElementFactory(getProject()); int i = 0; for (Pair<String, String> pair : pairs) { final AndroidLightField field = new AndroidLightField(pair.getFirst(), ManifestInnerClass.this, stringType, true, pair.getSecond()); field.setInitializer(factory.createExpressionFromText("\"" + pair.getSecond() + "\"", field)); result[i++] = field; } final XmlElement xmlElement = manifest.getXmlElement(); final PsiFile psiManifestFile = xmlElement != null ? xmlElement.getContainingFile() : null; return Result.create(result, psiManifestFile != null ? psiManifestFile : PsiModificationTracker.MODIFICATION_COUNT); } }); } return myFieldsCache.getValue(); } @NotNull protected abstract List<Pair<String, String>> doGetFields(@NotNull Manifest manifest); }