Simplify slices: remove SliceWithOpposite, defaultValue, etc.

This commit is contained in:
Alexander Udalov
2015-07-28 18:34:55 +03:00
parent 9a0e322c51
commit 96ded4d5d2
4 changed files with 34 additions and 95 deletions
@@ -61,11 +61,10 @@ public class CodegenBinding {
public static final WritableSlice<JetCallElement, JetExpression> SAM_CONSTRUCTOR_TO_ARGUMENT = Slices.createSimpleSlice(); public static final WritableSlice<JetCallElement, JetExpression> SAM_CONSTRUCTOR_TO_ARGUMENT = Slices.createSimpleSlice();
public static final WritableSlice<JetWhenExpression, WhenByEnumsMapping> MAPPING_FOR_WHEN_BY_ENUM = public static final WritableSlice<JetWhenExpression, WhenByEnumsMapping> MAPPING_FOR_WHEN_BY_ENUM = Slices.createSimpleSlice();
Slices.<JetWhenExpression, WhenByEnumsMapping>sliceBuilder().build();
public static final WritableSlice<String, List<WhenByEnumsMapping>> MAPPINGS_FOR_WHENS_BY_ENUM_IN_CLASS_FILE = public static final WritableSlice<String, List<WhenByEnumsMapping>> MAPPINGS_FOR_WHENS_BY_ENUM_IN_CLASS_FILE =
Slices.<String, List<WhenByEnumsMapping>>sliceBuilder().build(); Slices.createSimpleSlice();
static { static {
BasicWritableSlice.initSliceDebugNames(CodegenBinding.class); BasicWritableSlice.initSliceDebugNames(CodegenBinding.class);
@@ -151,8 +151,8 @@ public interface BindingContext {
* Has type of current expression has been already resolved * Has type of current expression has been already resolved
*/ */
WritableSlice<JetExpression, Boolean> PROCESSED = Slices.createSimpleSetSlice(); WritableSlice<JetExpression, Boolean> PROCESSED = Slices.createSimpleSetSlice();
WritableSlice<JetElement, Boolean> USED_AS_EXPRESSION = Slices.createRemovableSetSlice(); WritableSlice<JetElement, Boolean> USED_AS_EXPRESSION = Slices.createSimpleSetSlice();
WritableSlice<JetElement, Boolean> UNREACHABLE_CODE = Slices.createRemovableSetSlice(); WritableSlice<JetElement, Boolean> UNREACHABLE_CODE = Slices.createSimpleSetSlice();
WritableSlice<VariableDescriptor, CaptureKind> CAPTURED_IN_CLOSURE = new BasicWritableSlice<VariableDescriptor, CaptureKind>(DO_NOTHING); WritableSlice<VariableDescriptor, CaptureKind> CAPTURED_IN_CLOSURE = new BasicWritableSlice<VariableDescriptor, CaptureKind>(DO_NOTHING);
@@ -196,50 +196,45 @@ public interface BindingContext {
@Override @Override
public Boolean computeValue(SlicedMap map, JetFunctionLiteralExpression expression, Boolean isBlock, boolean valueNotFound) { public Boolean computeValue(SlicedMap map, JetFunctionLiteralExpression expression, Boolean isBlock, boolean valueNotFound) {
isBlock = valueNotFound ? false : isBlock; isBlock = valueNotFound ? false : isBlock;
assert isBlock != null;
return isBlock && !expression.getFunctionLiteral().hasParameterSpecification(); return isBlock && !expression.getFunctionLiteral().hasParameterSpecification();
} }
}; };
WritableSlice<PsiElement, ClassDescriptor> CLASS = Slices.<PsiElement, ClassDescriptor>sliceBuilder().build(); WritableSlice<PsiElement, ClassDescriptor> CLASS = Slices.createSimpleSlice();
WritableSlice<PsiElement, ScriptDescriptor> SCRIPT = Slices.<PsiElement, ScriptDescriptor>sliceBuilder().build(); WritableSlice<PsiElement, ScriptDescriptor> SCRIPT = Slices.createSimpleSlice();
WritableSlice<JetTypeParameter, TypeParameterDescriptor> TYPE_PARAMETER = WritableSlice<JetTypeParameter, TypeParameterDescriptor> TYPE_PARAMETER = Slices.createSimpleSlice();
Slices.<JetTypeParameter, TypeParameterDescriptor>sliceBuilder().build();
/** /**
* @see BindingContextUtils#recordFunctionDeclarationToDescriptor(BindingTrace, PsiElement, SimpleFunctionDescriptor)} * @see BindingContextUtils#recordFunctionDeclarationToDescriptor(BindingTrace, PsiElement, SimpleFunctionDescriptor)}
*/ */
WritableSlice<PsiElement, SimpleFunctionDescriptor> FUNCTION = Slices.<PsiElement, SimpleFunctionDescriptor>sliceBuilder().build(); WritableSlice<PsiElement, SimpleFunctionDescriptor> FUNCTION = Slices.createSimpleSlice();
WritableSlice<PsiElement, ConstructorDescriptor> CONSTRUCTOR = Slices.<PsiElement, ConstructorDescriptor>sliceBuilder().build(); WritableSlice<PsiElement, ConstructorDescriptor> CONSTRUCTOR = Slices.createSimpleSlice();
WritableSlice<ConstructorDescriptor, ResolvedCall<ConstructorDescriptor>> CONSTRUCTOR_RESOLVED_DELEGATION_CALL = WritableSlice<ConstructorDescriptor, ResolvedCall<ConstructorDescriptor>> CONSTRUCTOR_RESOLVED_DELEGATION_CALL =
Slices.<ConstructorDescriptor, ResolvedCall<ConstructorDescriptor>>sliceBuilder().build(); Slices.createSimpleSlice();
WritableSlice<PsiElement, VariableDescriptor> VARIABLE = Slices.<PsiElement, VariableDescriptor>sliceBuilder().build(); WritableSlice<PsiElement, VariableDescriptor> VARIABLE = Slices.createSimpleSlice();
WritableSlice<JetParameter, VariableDescriptor> VALUE_PARAMETER = Slices.<JetParameter, VariableDescriptor>sliceBuilder().build(); WritableSlice<JetParameter, VariableDescriptor> VALUE_PARAMETER = Slices.createSimpleSlice();
WritableSlice<JetPropertyAccessor, PropertyAccessorDescriptor> PROPERTY_ACCESSOR = WritableSlice<JetPropertyAccessor, PropertyAccessorDescriptor> PROPERTY_ACCESSOR = Slices.createSimpleSlice();
Slices.<JetPropertyAccessor, PropertyAccessorDescriptor>sliceBuilder().build(); WritableSlice<PsiElement, PropertyDescriptor> PRIMARY_CONSTRUCTOR_PARAMETER = Slices.createSimpleSlice();
WritableSlice<PsiElement, PropertyDescriptor> PRIMARY_CONSTRUCTOR_PARAMETER =
Slices.<PsiElement, PropertyDescriptor>sliceBuilder().build();
WritableSlice[] DECLARATIONS_TO_DESCRIPTORS = new WritableSlice[] { WritableSlice[] DECLARATIONS_TO_DESCRIPTORS = new WritableSlice[] {
CLASS, TYPE_PARAMETER, FUNCTION, CONSTRUCTOR, VARIABLE, VALUE_PARAMETER, PROPERTY_ACCESSOR, CLASS, TYPE_PARAMETER, FUNCTION, CONSTRUCTOR, VARIABLE, VALUE_PARAMETER, PROPERTY_ACCESSOR,
PRIMARY_CONSTRUCTOR_PARAMETER PRIMARY_CONSTRUCTOR_PARAMETER
}; };
ReadOnlySlice<PsiElement, DeclarationDescriptor> DECLARATION_TO_DESCRIPTOR = Slices.<PsiElement, DeclarationDescriptor>sliceBuilder() @SuppressWarnings("unchecked")
.setFurtherLookupSlices(DECLARATIONS_TO_DESCRIPTORS).build(); ReadOnlySlice<PsiElement, DeclarationDescriptor> DECLARATION_TO_DESCRIPTOR =
Slices.<PsiElement, DeclarationDescriptor>sliceBuilder()
.setFurtherLookupSlices(DECLARATIONS_TO_DESCRIPTORS)
.build();
WritableSlice<JetReferenceExpression, PsiElement> LABEL_TARGET = Slices.<JetReferenceExpression, PsiElement>sliceBuilder().build(); WritableSlice<JetReferenceExpression, PsiElement> LABEL_TARGET = Slices.createSimpleSlice();
@KotlinSignature("val AMBIGUOUS_LABEL_TARGET: WritableSlice<JetReferenceExpression, Collection<PsiElement>>") WritableSlice<JetReferenceExpression, Collection<? extends PsiElement>> AMBIGUOUS_LABEL_TARGET = Slices.createSimpleSlice();
WritableSlice<JetReferenceExpression, Collection<? extends PsiElement>> AMBIGUOUS_LABEL_TARGET = WritableSlice<ValueParameterDescriptor, PropertyDescriptor> VALUE_PARAMETER_AS_PROPERTY = Slices.createSimpleSlice();
Slices.<JetReferenceExpression, Collection<? extends PsiElement>>sliceBuilder().build();
WritableSlice<ValueParameterDescriptor, PropertyDescriptor> VALUE_PARAMETER_AS_PROPERTY =
Slices.<ValueParameterDescriptor, PropertyDescriptor>sliceBuilder().build();
WritableSlice<ValueParameterDescriptor, FunctionDescriptor> DATA_CLASS_COMPONENT_FUNCTION = WritableSlice<ValueParameterDescriptor, FunctionDescriptor> DATA_CLASS_COMPONENT_FUNCTION = Slices.createSimpleSlice();
Slices.<ValueParameterDescriptor, FunctionDescriptor>sliceBuilder().build(); WritableSlice<ClassDescriptor, FunctionDescriptor> DATA_CLASS_COPY_FUNCTION = Slices.createSimpleSlice();
WritableSlice<ClassDescriptor, FunctionDescriptor> DATA_CLASS_COPY_FUNCTION =
Slices.<ClassDescriptor, FunctionDescriptor>sliceBuilder().build();
WritableSlice<FqNameUnsafe, ClassDescriptor> FQNAME_TO_CLASS_DESCRIPTOR = new BasicWritableSlice<FqNameUnsafe, ClassDescriptor>(DO_NOTHING, true); WritableSlice<FqNameUnsafe, ClassDescriptor> FQNAME_TO_CLASS_DESCRIPTOR =
new BasicWritableSlice<FqNameUnsafe, ClassDescriptor>(DO_NOTHING, true);
WritableSlice<JetFile, PackageFragmentDescriptor> FILE_TO_PACKAGE_FRAGMENT = Slices.createSimpleSlice(); WritableSlice<JetFile, PackageFragmentDescriptor> FILE_TO_PACKAGE_FRAGMENT = Slices.createSimpleSlice();
WritableSlice<FqName, Collection<JetFile>> PACKAGE_TO_FILES = Slices.createSimpleSlice(); WritableSlice<FqName, Collection<JetFile>> PACKAGE_TO_FILES = Slices.createSimpleSlice();
@@ -60,70 +60,43 @@ public class Slices {
} }
public static <K> WritableSlice<K, Boolean> createSimpleSetSlice() { public static <K> WritableSlice<K, Boolean> createSimpleSetSlice() {
return createRemovableSetSlice(); return new SetSlice<K>(RewritePolicy.DO_NOTHING);
} }
public static <K> WritableSlice<K, Boolean> createCollectiveSetSlice() { public static <K> WritableSlice<K, Boolean> createCollectiveSetSlice() {
return new SetSlice<K>(RewritePolicy.DO_NOTHING, true); return new SetSlice<K>(RewritePolicy.DO_NOTHING, true);
} }
public static <K> RemovableSlice<K, Boolean> createRemovableSetSlice() {
return new SetSlice<K>(RewritePolicy.DO_NOTHING, false);
}
public static class SliceBuilder<K, V> { public static class SliceBuilder<K, V> {
private V defaultValue = null; private List<ReadOnlySlice<K, V>> furtherLookupSlices;
private List<ReadOnlySlice<K, V>> furtherLookupSlices = null;
private WritableSlice<? super V, ? super K> opposite = null;
private final RewritePolicy rewritePolicy; private final RewritePolicy rewritePolicy;
private String debugName; private String debugName;
private SliceBuilder(RewritePolicy rewritePolicy) { private SliceBuilder(RewritePolicy rewritePolicy) {
this.rewritePolicy = rewritePolicy; this.rewritePolicy = rewritePolicy;
} }
public SliceBuilder<K, V> setDefaultValue(V defaultValue) {
this.defaultValue = defaultValue;
return this;
}
public SliceBuilder<K, V> setFurtherLookupSlices(ReadOnlySlice<K, V>... furtherLookupSlices) { public SliceBuilder<K, V> setFurtherLookupSlices(ReadOnlySlice<K, V>... furtherLookupSlices) {
this.furtherLookupSlices = Arrays.asList(furtherLookupSlices); this.furtherLookupSlices = Arrays.asList(furtherLookupSlices);
return this; return this;
} }
public SliceBuilder<K, V> setOpposite(WritableSlice<? super V, ? super K> opposite) {
this.opposite = opposite;
return this;
}
public SliceBuilder<K, V> setDebugName(@NotNull String debugName) { public SliceBuilder<K, V> setDebugName(@NotNull String debugName) {
this.debugName = debugName; this.debugName = debugName;
return this; return this;
} }
public RemovableSlice<K, V> build() { public RemovableSlice<K, V> build() {
SliceWithOpposite<K, V> result = doBuild(); BasicRemovableSlice<K, V> result = doBuild();
if (debugName != null) { if (debugName != null) {
result.setDebugName(debugName); result.setDebugName(debugName);
} }
return result; return result;
} }
private SliceWithOpposite<K, V> doBuild() { private BasicRemovableSlice<K, V> doBuild() {
if (defaultValue != null) {
return new SliceWithOpposite<K, V>(rewritePolicy, opposite) {
@Override
public V computeValue(SlicedMap map, K key, V value, boolean valueNotFound) {
if (valueNotFound) return defaultValue;
return super.computeValue(map, key, value, false);
}
};
}
if (furtherLookupSlices != null) { if (furtherLookupSlices != null) {
return new SliceWithOpposite<K, V>(rewritePolicy, opposite) { return new BasicRemovableSlice<K, V>(rewritePolicy) {
@Override @Override
public V computeValue(SlicedMap map, K key, V value, boolean valueNotFound) { public V computeValue(SlicedMap map, K key, V value, boolean valueNotFound) {
if (valueNotFound) { if (valueNotFound) {
@@ -133,13 +106,13 @@ public class Slices {
return v; return v;
} }
} }
return defaultValue; return null;
} }
return super.computeValue(map, key, value, false); return super.computeValue(map, key, value, false);
} }
}; };
} }
return new SliceWithOpposite<K, V>(rewritePolicy, opposite); return new BasicRemovableSlice<K, V>(rewritePolicy);
} }
} }
@@ -153,22 +126,6 @@ public class Slices {
} }
} }
public static class SliceWithOpposite<K, V> extends BasicRemovableSlice<K, V> {
private final WritableSlice<? super V, ? super K> opposite;
public SliceWithOpposite(RewritePolicy rewritePolicy, WritableSlice<? super V, ? super K> opposite) {
super(rewritePolicy);
this.opposite = opposite;
}
@Override
public void afterPut(MutableSlicedMap map, K key, V value) {
if (opposite != null) {
map.put(opposite, value, key);
}
}
}
public static class SetSlice<K> extends BasicRemovableSlice<K, Boolean> { public static class SetSlice<K> extends BasicRemovableSlice<K, Boolean> {
protected SetSlice(RewritePolicy rewritePolicy) { protected SetSlice(RewritePolicy rewritePolicy) {
@@ -31,18 +31,6 @@ public class TrackingSliceMapTest extends TestCase {
assertEquals(42, (int) answer); assertEquals(42, (int) answer);
} }
public void testOppositeSlice() {
WritableSlice<Integer, String> COLOR_NAME = Slices.<Integer, String>sliceBuilder().setDebugName("COLOR_NAME").build();
WritableSlice<String, Integer> NAME_COLOR = Slices.<String, Integer>sliceBuilder().setOpposite(COLOR_NAME).setDebugName("NAME_COLOR").build();
BindingTraceContext traceContext = BindingTraceContext.createTraceableBindingTrace();
traceContext.record(NAME_COLOR, "RED", 0xff0000);
String redName = traceContext.get(COLOR_NAME, 0xff0000);
assertEquals("RED", redName);
}
public void testFurtherSlices() { public void testFurtherSlices() {
WritableSlice<String, Integer> NAME_COLOR = Slices.<String, Integer>sliceBuilder().setDebugName("NAME_COLOR").build(); WritableSlice<String, Integer> NAME_COLOR = Slices.<String, Integer>sliceBuilder().setDebugName("NAME_COLOR").build();