Introduce light-weight user data parts into FunctionDescriptor
This commit is contained in:
@@ -82,6 +82,12 @@ public interface FunctionDescriptor extends CallableMemberDescriptor {
|
|||||||
|
|
||||||
boolean isSuspend();
|
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
|
@NotNull
|
||||||
CopyBuilder<? extends FunctionDescriptor> newCopyBuilder();
|
CopyBuilder<? extends FunctionDescriptor> newCopyBuilder();
|
||||||
|
|
||||||
@@ -146,6 +152,9 @@ public interface FunctionDescriptor extends CallableMemberDescriptor {
|
|||||||
@NotNull
|
@NotNull
|
||||||
CopyBuilder<D> setSubstitution(@NotNull TypeSubstitution substitution);
|
CopyBuilder<D> setSubstitution(@NotNull TypeSubstitution substitution);
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
<V> CopyBuilder<D> putUserData(@NotNull UserDataKey<V> userDataKey, V value);
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
D build();
|
D build();
|
||||||
}
|
}
|
||||||
|
|||||||
+38
@@ -58,6 +58,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
|||||||
@Nullable
|
@Nullable
|
||||||
private FunctionDescriptor initialSignatureDescriptor = null;
|
private FunctionDescriptor initialSignatureDescriptor = null;
|
||||||
|
|
||||||
|
private Map<UserDataKey<?>, Object> userDataMap = null;
|
||||||
|
|
||||||
protected FunctionDescriptorImpl(
|
protected FunctionDescriptorImpl(
|
||||||
@NotNull DeclarationDescriptor containingDeclaration,
|
@NotNull DeclarationDescriptor containingDeclaration,
|
||||||
@Nullable FunctionDescriptor original,
|
@Nullable FunctionDescriptor original,
|
||||||
@@ -245,6 +247,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
|||||||
return isSuspend;
|
return isSuspend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <V> V getUserData(UserDataKey<V> key) {
|
||||||
|
if (userDataMap == null) return null;
|
||||||
|
//noinspection unchecked
|
||||||
|
return (V) userDataMap.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isHiddenToOvercomeSignatureClash() {
|
public boolean isHiddenToOvercomeSignatureClash() {
|
||||||
return isHiddenToOvercomeSignatureClash;
|
return isHiddenToOvercomeSignatureClash;
|
||||||
@@ -341,6 +350,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
|||||||
private Annotations additionalAnnotations = null;
|
private Annotations additionalAnnotations = null;
|
||||||
private boolean isHiddenForResolutionEverywhereBesideSupercalls = isHiddenForResolutionEverywhereBesideSupercalls();
|
private boolean isHiddenForResolutionEverywhereBesideSupercalls = isHiddenForResolutionEverywhereBesideSupercalls();
|
||||||
private SourceElement sourceElement;
|
private SourceElement sourceElement;
|
||||||
|
private Map<UserDataKey<?>, Object> userDataMap = new LinkedHashMap<UserDataKey<?>, Object>();
|
||||||
|
|
||||||
public CopyConfiguration(
|
public CopyConfiguration(
|
||||||
@NotNull TypeSubstitution substitution,
|
@NotNull TypeSubstitution substitution,
|
||||||
@@ -504,6 +514,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public <V> CopyBuilder<FunctionDescriptor> putUserData(@NotNull UserDataKey<V> userDataKey, V value) {
|
||||||
|
userDataMap.put(userDataKey, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public FunctionDescriptor build() {
|
public FunctionDescriptor build() {
|
||||||
@@ -620,6 +637,27 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
|||||||
substitutedDescriptor.setHiddenToOvercomeSignatureClash(configuration.isHiddenToOvercomeSignatureClash);
|
substitutedDescriptor.setHiddenToOvercomeSignatureClash(configuration.isHiddenToOvercomeSignatureClash);
|
||||||
substitutedDescriptor.setHiddenForResolutionEverywhereBesideSupercalls(configuration.isHiddenForResolutionEverywhereBesideSupercalls);
|
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) {
|
if (configuration.signatureChange || getInitialSignatureDescriptor() != null) {
|
||||||
FunctionDescriptor initialSignature = (getInitialSignatureDescriptor() != null ? getInitialSignatureDescriptor() : this);
|
FunctionDescriptor initialSignature = (getInitialSignatureDescriptor() != null ? getInitialSignatureDescriptor() : this);
|
||||||
FunctionDescriptor initialSignatureSubstituted = initialSignature.substitute(substitutor);
|
FunctionDescriptor initialSignatureSubstituted = initialSignature.substitute(substitutor);
|
||||||
|
|||||||
+6
@@ -219,4 +219,10 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript
|
|||||||
public boolean isHiddenForResolutionEverywhereBesideSupercalls() {
|
public boolean isHiddenForResolutionEverywhereBesideSupercalls() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public <V> V getUserData(UserDataKey<V> key) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
@@ -111,6 +111,15 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public <V> CopyBuilder<SimpleFunctionDescriptor> putUserData(
|
||||||
|
@NotNull UserDataKey<V> userDataKey,
|
||||||
|
V value
|
||||||
|
) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public CopyBuilder<SimpleFunctionDescriptor> setTypeParameters(@NotNull List<TypeParameterDescriptor> parameters) {
|
public CopyBuilder<SimpleFunctionDescriptor> setTypeParameters(@NotNull List<TypeParameterDescriptor> parameters) {
|
||||||
@@ -196,6 +205,11 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <V> V getUserData(UserDataKey<V> key) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors) {
|
public void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors) {
|
||||||
// nop
|
// nop
|
||||||
|
|||||||
Reference in New Issue
Block a user