Refactor: split MembersByNameCache#Builder into two nested classes

This commit is contained in:
Pavel V. Talanov
2012-10-17 21:26:55 +04:00
parent fa1921c66f
commit 56a452139f
@@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve.java;
import com.intellij.psi.*; import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.java.data.ResolverScopeData;
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation; import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
import org.jetbrains.jet.lang.resolve.java.prop.PropertyNameUtils; import org.jetbrains.jet.lang.resolve.java.prop.PropertyNameUtils;
import org.jetbrains.jet.lang.resolve.java.prop.PropertyParseResult; import org.jetbrains.jet.lang.resolve.java.prop.PropertyParseResult;
@@ -62,34 +61,61 @@ public final class MembersByNameCache {
boolean staticMembers, boolean staticMembers,
boolean isKotlin boolean isKotlin
) { ) {
PsiClassWrapper classWrapper = psiClass == null ? null : new PsiClassWrapper(psiClass); MembersByNameCache cache = new MembersByNameCache();
Builder builder = new Builder(classWrapper, psiPackage, staticMembers, isKotlin); if (psiClass != null) {
builder.build(); cache.new ClassProcessor(new PsiClassWrapper(psiClass), staticMembers, isKotlin).process();
return builder.cache; }
PsiClass[] classes = psiPackage != null ? psiPackage.getClasses() : psiClass.getInnerClasses();
cache.new ObjectClassProcessor(classes).process();
return cache;
} }
private static class Builder { private class ObjectClassProcessor {
@NotNull
private final PsiClass[] psiClasses;
private ObjectClassProcessor(@NotNull PsiClass[] classes) {
psiClasses = classes;
}
private void process() {
for (PsiClass psiClass : psiClasses) {
if (!psiClass.isPhysical()) { // to filter out JetLightClasses
continue;
}
if (JetClassAnnotation.get(psiClass).kind() != JvmStdlibNames.FLAG_CLASS_KIND_OBJECT) {
continue;
}
processObjectClass(psiClass);
}
}
private void processObjectClass(@NotNull PsiClass psiClass) {
PsiField instanceField = psiClass.findFieldByName(JvmAbi.INSTANCE_FIELD, false);
if (instanceField != null) {
NamedMembers namedMembers = getOrCreateEmpty(Name.identifier(psiClass.getName()));
TypeSource type = new TypeSource("", instanceField.getType(), instanceField);
namedMembers.addPropertyAccessor(new PropertyAccessorData(new PsiFieldWrapper(instanceField), type, null));
}
}
}
private class ClassProcessor {
@NotNull
private final PsiClassWrapper psiClass; private final PsiClassWrapper psiClass;
private final PsiPackage psiPackage;
private final boolean staticMembers; private final boolean staticMembers;
private final boolean kotlin; private final boolean kotlin;
private final MembersByNameCache cache = new MembersByNameCache(); private ClassProcessor(@NotNull PsiClassWrapper psiClass, boolean staticMembers, boolean kotlin) {
private Builder(@Nullable PsiClassWrapper psiClass, @Nullable PsiPackage psiPackage, boolean staticMembers, boolean kotlin) {
this.psiClass = psiClass; this.psiClass = psiClass;
this.psiPackage = psiPackage;
this.staticMembers = staticMembers; this.staticMembers = staticMembers;
this.kotlin = kotlin; this.kotlin = kotlin;
} }
@NotNull public void process() {
public MembersByNameCache build() { processFields();
if (psiClass != null) { processMethods();
processFields();
processMethods();
}
processObjectClasses();
} }
private boolean includeMember(PsiMemberWrapper member) { private boolean includeMember(PsiMemberWrapper member) {
@@ -121,7 +147,7 @@ public final class MembersByNameCache {
PsiFieldWrapper fieldWrapper = new PsiFieldWrapper(field); PsiFieldWrapper fieldWrapper = new PsiFieldWrapper(field);
// group must be created even for excluded field // group must be created even for excluded field
NamedMembers namedMembers = cache.getOrCreateEmpty(Name.identifier(fieldWrapper.getName())); NamedMembers namedMembers = getOrCreateEmpty(Name.identifier(fieldWrapper.getName()));
if (!includeMember(fieldWrapper)) { if (!includeMember(fieldWrapper)) {
continue; continue;
@@ -156,7 +182,7 @@ public final class MembersByNameCache {
} }
if (!method.getJetMethod().hasPropertyFlag()) { if (!method.getJetMethod().hasPropertyFlag()) {
NamedMembers namedMembers = cache.getOrCreateEmpty(Name.identifier(method.getName())); NamedMembers namedMembers = getOrCreateEmpty(Name.identifier(method.getName()));
namedMembers.addMethod(method); namedMembers.addMethod(method);
} }
} }
@@ -164,7 +190,7 @@ public final class MembersByNameCache {
private void processSetter(PsiMethodWrapper method, PropertyParseResult propertyParseResult) { private void processSetter(PsiMethodWrapper method, PropertyParseResult propertyParseResult) {
String propertyName = propertyParseResult.getPropertyName(); String propertyName = propertyParseResult.getPropertyName();
NamedMembers members = cache.getOrCreateEmpty(Name.identifier(propertyName)); NamedMembers members = getOrCreateEmpty(Name.identifier(propertyName));
if (method.getJetMethod().hasPropertyFlag()) { if (method.getJetMethod().hasPropertyFlag()) {
if (method.getParameters().size() == 0) { if (method.getParameters().size() == 0) {
@@ -190,7 +216,9 @@ public final class MembersByNameCache {
} }
PsiParameterWrapper propertyTypeParameter = method.getParameter(i); PsiParameterWrapper propertyTypeParameter = method.getParameter(i);
TypeSource propertyType = new TypeSource(method.getJetMethod().propertyType(), propertyTypeParameter.getPsiParameter().getType(), propertyTypeParameter.getPsiParameter()); TypeSource propertyType =
new TypeSource(method.getJetMethod().propertyType(), propertyTypeParameter.getPsiParameter().getType(),
propertyTypeParameter.getPsiParameter());
members.addPropertyAccessor(new PropertyAccessorData(method, false, propertyType, receiverType)); members.addPropertyAccessor(new PropertyAccessorData(method, false, propertyType, receiverType));
} }
@@ -198,7 +226,7 @@ public final class MembersByNameCache {
private void processGetter(PsiMethod ownMethod, PsiMethodWrapper method, PropertyParseResult propertyParseResult) { private void processGetter(PsiMethod ownMethod, PsiMethodWrapper method, PropertyParseResult propertyParseResult) {
String propertyName = propertyParseResult.getPropertyName(); String propertyName = propertyParseResult.getPropertyName();
NamedMembers members = cache.getOrCreateEmpty(Name.identifier(propertyName)); NamedMembers members = getOrCreateEmpty(Name.identifier(propertyName));
// TODO: some java properties too // TODO: some java properties too
if (method.getJetMethod().hasPropertyFlag()) { if (method.getJetMethod().hasPropertyFlag()) {
@@ -208,7 +236,9 @@ public final class MembersByNameCache {
TypeSource receiverType; TypeSource receiverType;
if (i < method.getParameters().size() && method.getParameter(i).getJetValueParameter().receiver()) { if (i < method.getParameters().size() && method.getParameter(i).getJetValueParameter().receiver()) {
PsiParameterWrapper receiverParameter = method.getParameter(i); PsiParameterWrapper receiverParameter = method.getParameter(i);
receiverType = new TypeSource(receiverParameter.getJetValueParameter().type(), receiverParameter.getPsiParameter().getType(), receiverParameter.getPsiParameter()); receiverType =
new TypeSource(receiverParameter.getJetValueParameter().type(), receiverParameter.getPsiParameter().getType(),
receiverParameter.getPsiParameter());
++i; ++i;
} }
else { else {
@@ -240,32 +270,13 @@ public final class MembersByNameCache {
PropertyParseResult propertyParseResult = PropertyNameUtils.parseMethodToProperty(method.getName()); PropertyParseResult propertyParseResult = PropertyNameUtils.parseMethodToProperty(method.getName());
if (propertyParseResult != null) { if (propertyParseResult != null) {
cache.getOrCreateEmpty(Name.identifier(propertyParseResult.getPropertyName())); createEmptyEntry(Name.identifier(propertyParseResult.getPropertyName()));
} }
} }
} }
private void createEmptyEntry(@NotNull Name identifier) { private void createEmptyEntry(@NotNull Name identifier) {
cache.getOrCreateEmpty(identifier); getOrCreateEmpty(identifier);
}
private void processObjectClasses() {
PsiClass[] classes = psiPackage != null ? psiPackage.getClasses() : psiClass.getPsiClass().getInnerClasses();
for (PsiClass psiClass : classes) {
if (!psiClass.isPhysical()) { // to filter out JetLightClasses
continue;
}
if (JetClassAnnotation.get(psiClass).kind() != JvmStdlibNames.FLAG_CLASS_KIND_OBJECT) {
continue;
}
PsiField instanceField = psiClass.findFieldByName(JvmAbi.INSTANCE_FIELD, false);
if (instanceField != null) {
NamedMembers namedMembers = cache.getOrCreateEmpty(Name.identifier(psiClass.getName()));
TypeSource type = new TypeSource("", instanceField.getType(), instanceField);
namedMembers.addPropertyAccessor(new PropertyAccessorData(new PsiFieldWrapper(instanceField), type, null));
}
}
} }
} }
} }