Introduce light-weight user data parts into FunctionDescriptor

This commit is contained in:
Denis Zharkov
2016-06-01 12:50:59 +03:00
parent dd3de8372f
commit 1067531224
4 changed files with 67 additions and 0 deletions
@@ -82,6 +82,12 @@ public interface FunctionDescriptor extends CallableMemberDescriptor {
boolean isSuspend();
interface UserDataKey<V> {}
// TODO: pull up userdata related members to DeclarationDescriptor and use more efficient implementation (e.g. THashMap)
@Nullable
<V> V getUserData(UserDataKey<V> key);
@NotNull
CopyBuilder<? extends FunctionDescriptor> newCopyBuilder();
@@ -146,6 +152,9 @@ public interface FunctionDescriptor extends CallableMemberDescriptor {
@NotNull
CopyBuilder<D> setSubstitution(@NotNull TypeSubstitution substitution);
@NotNull
<V> CopyBuilder<D> putUserData(@NotNull UserDataKey<V> userDataKey, V value);
@Nullable
D build();
}
@@ -58,6 +58,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
@Nullable
private FunctionDescriptor initialSignatureDescriptor = null;
private Map<UserDataKey<?>, Object> userDataMap = null;
protected FunctionDescriptorImpl(
@NotNull DeclarationDescriptor containingDeclaration,
@Nullable FunctionDescriptor original,
@@ -245,6 +247,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
return isSuspend;
}
@Override
public <V> V getUserData(UserDataKey<V> key) {
if (userDataMap == null) return null;
//noinspection unchecked
return (V) userDataMap.get(key);
}
@Override
public boolean isHiddenToOvercomeSignatureClash() {
return isHiddenToOvercomeSignatureClash;
@@ -341,6 +350,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
private Annotations additionalAnnotations = null;
private boolean isHiddenForResolutionEverywhereBesideSupercalls = isHiddenForResolutionEverywhereBesideSupercalls();
private SourceElement sourceElement;
private Map<UserDataKey<?>, Object> userDataMap = new LinkedHashMap<UserDataKey<?>, Object>();
public CopyConfiguration(
@NotNull TypeSubstitution substitution,
@@ -504,6 +514,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
return this;
}
@NotNull
@Override
public <V> CopyBuilder<FunctionDescriptor> putUserData(@NotNull UserDataKey<V> userDataKey, V value) {
userDataMap.put(userDataKey, value);
return this;
}
@Override
@Nullable
public FunctionDescriptor build() {
@@ -620,6 +637,27 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
substitutedDescriptor.setHiddenToOvercomeSignatureClash(configuration.isHiddenToOvercomeSignatureClash);
substitutedDescriptor.setHiddenForResolutionEverywhereBesideSupercalls(configuration.isHiddenForResolutionEverywhereBesideSupercalls);
if (!configuration.userDataMap.isEmpty() || userDataMap != null) {
Map<UserDataKey<?>, Object> newMap = configuration.userDataMap;
if (userDataMap != null) {
for (Map.Entry<UserDataKey<?>, Object> entry : userDataMap.entrySet()) {
if (!newMap.containsKey(entry.getKey())) {
newMap.put(entry.getKey(), entry.getValue());
}
}
}
if (newMap.size() == 1) {
substitutedDescriptor.userDataMap =
Collections.<UserDataKey<?>, Object>singletonMap(
newMap.keySet().iterator().next(), newMap.values().iterator().next());
}
else {
substitutedDescriptor.userDataMap = newMap;
}
}
if (configuration.signatureChange || getInitialSignatureDescriptor() != null) {
FunctionDescriptor initialSignature = (getInitialSignatureDescriptor() != null ? getInitialSignatureDescriptor() : this);
FunctionDescriptor initialSignatureSubstituted = initialSignature.substitute(substitutor);
@@ -219,4 +219,10 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript
public boolean isHiddenForResolutionEverywhereBesideSupercalls() {
return false;
}
@Nullable
@Override
public <V> V getUserData(UserDataKey<V> key) {
return null;
}
}
@@ -111,6 +111,15 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI
return this;
}
@NotNull
@Override
public <V> CopyBuilder<SimpleFunctionDescriptor> putUserData(
@NotNull UserDataKey<V> userDataKey,
V value
) {
return this;
}
@NotNull
@Override
public CopyBuilder<SimpleFunctionDescriptor> setTypeParameters(@NotNull List<TypeParameterDescriptor> parameters) {
@@ -196,6 +205,11 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI
return false;
}
@Override
public <V> V getUserData(UserDataKey<V> key) {
return null;
}
@Override
public void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors) {
// nop