blob: 3aaa8ae48311c2084b226e748928c0d1b60206e0 [file] [log] [blame]
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);
}