Pseudocode: Have builder return instructions rather than output values

This commit is contained in:
Alexey Sedunov
2014-06-06 16:06:40 +04:00
parent e6ff115772
commit e94f96d457
4 changed files with 46 additions and 49 deletions
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue; import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue;
import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode; import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode;
import org.jetbrains.jet.lang.cfg.pseudocode.TypePredicate; import org.jetbrains.jet.lang.cfg.pseudocode.TypePredicate;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.AccessTarget; import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.*;
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
@@ -103,16 +103,16 @@ public interface JetControlFlowBuilder {
void loadUnit(@NotNull JetExpression expression); void loadUnit(@NotNull JetExpression expression);
@NotNull @NotNull
PseudoValue loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant); ValuedInstruction loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant);
@NotNull @NotNull
PseudoValue createAnonymousObject(@NotNull JetObjectLiteralExpression expression); ValuedInstruction createAnonymousObject(@NotNull JetObjectLiteralExpression expression);
@NotNull @NotNull
PseudoValue createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression); ValuedInstruction createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression);
@NotNull @NotNull
PseudoValue loadStringTemplate(@NotNull JetStringTemplateExpression expression, @NotNull List<PseudoValue> inputValues); ValuedInstruction loadStringTemplate(@NotNull JetStringTemplateExpression expression, @NotNull List<PseudoValue> inputValues);
@NotNull @NotNull
PseudoValue magic( MagicInstruction magic(
@NotNull JetElement instructionElement, @NotNull JetElement instructionElement,
@Nullable JetElement valueElement, @Nullable JetElement valueElement,
@NotNull List<PseudoValue> inputValues, @NotNull List<PseudoValue> inputValues,
@@ -121,23 +121,22 @@ public interface JetControlFlowBuilder {
); );
@NotNull @NotNull
PseudoValue merge( MergeInstruction merge(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@NotNull List<PseudoValue> inputValues @NotNull List<PseudoValue> inputValues
); );
@NotNull @NotNull
PseudoValue readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor); ReadValueInstruction readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor);
@NotNull @NotNull
PseudoValue readVariable( ReadValueInstruction readVariable(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues @NotNull Map<PseudoValue, ReceiverValue> receiverValues
); );
@Nullable @NotNull
PseudoValue call( CallInstruction call(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues, @NotNull Map<PseudoValue, ReceiverValue> receiverValues,
@@ -150,7 +149,7 @@ public interface JetControlFlowBuilder {
NOT_NULL_ASSERTION NOT_NULL_ASSERTION
} }
@NotNull @NotNull
PseudoValue predefinedOperation( OperationInstruction predefinedOperation(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@NotNull PredefinedOperation operation, @NotNull PredefinedOperation operation,
@NotNull List<PseudoValue> inputValues @NotNull List<PseudoValue> inputValues
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue; import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue;
import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode; import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode;
import org.jetbrains.jet.lang.cfg.pseudocode.TypePredicate; import org.jetbrains.jet.lang.cfg.pseudocode.TypePredicate;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.AccessTarget; import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.*;
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
@@ -44,31 +44,31 @@ public abstract class JetControlFlowBuilderAdapter implements JetControlFlowBuil
@NotNull @NotNull
@Override @Override
public PseudoValue loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) { public ValuedInstruction loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) {
return getDelegateBuilder().loadConstant(expression, constant); return getDelegateBuilder().loadConstant(expression, constant);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue createAnonymousObject(@NotNull JetObjectLiteralExpression expression) { public ValuedInstruction createAnonymousObject(@NotNull JetObjectLiteralExpression expression) {
return getDelegateBuilder().createAnonymousObject(expression); return getDelegateBuilder().createAnonymousObject(expression);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) { public ValuedInstruction createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) {
return getDelegateBuilder().createFunctionLiteral(expression); return getDelegateBuilder().createFunctionLiteral(expression);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue loadStringTemplate(@NotNull JetStringTemplateExpression expression, @NotNull List<PseudoValue> inputValues) { public ValuedInstruction loadStringTemplate(@NotNull JetStringTemplateExpression expression, @NotNull List<PseudoValue> inputValues) {
return getDelegateBuilder().loadStringTemplate(expression, inputValues); return getDelegateBuilder().loadStringTemplate(expression, inputValues);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue magic( public MagicInstruction magic(
@NotNull JetElement instructionElement, @NotNull JetElement instructionElement,
@Nullable JetElement valueElement, @Nullable JetElement valueElement,
@NotNull List<PseudoValue> inputValues, @NotNull List<PseudoValue> inputValues,
@@ -80,30 +80,28 @@ public abstract class JetControlFlowBuilderAdapter implements JetControlFlowBuil
@NotNull @NotNull
@Override @Override
public PseudoValue merge( public MergeInstruction merge(@NotNull JetExpression expression, @NotNull List<PseudoValue> inputValues) {
@NotNull JetExpression expression, @NotNull List<PseudoValue> inputValues
) {
return getDelegateBuilder().merge(expression, inputValues); return getDelegateBuilder().merge(expression, inputValues);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor) { public ReadValueInstruction readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor) {
return getDelegateBuilder().readThis(expression, parameterDescriptor); return getDelegateBuilder().readThis(expression, parameterDescriptor);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue readVariable( public ReadValueInstruction readVariable(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues) { @NotNull Map<PseudoValue, ReceiverValue> receiverValues) {
return getDelegateBuilder().readVariable(expression, resolvedCall, receiverValues); return getDelegateBuilder().readVariable(expression, resolvedCall, receiverValues);
} }
@Nullable @NotNull
@Override @Override
public PseudoValue call( public CallInstruction call(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues, @NotNull Map<PseudoValue, ReceiverValue> receiverValues,
@@ -114,7 +112,7 @@ public abstract class JetControlFlowBuilderAdapter implements JetControlFlowBuil
@NotNull @NotNull
@Override @Override
public PseudoValue predefinedOperation( public OperationInstruction predefinedOperation(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@NotNull PredefinedOperation operation, @NotNull PredefinedOperation operation,
@NotNull List<PseudoValue> inputValues @NotNull List<PseudoValue> inputValues
@@ -185,13 +185,13 @@ public class JetControlFlowProcessor {
@NotNull @NotNull
private PseudoValue createSyntheticValue(@NotNull JetElement instructionElement, JetElement... from) { private PseudoValue createSyntheticValue(@NotNull JetElement instructionElement, JetElement... from) {
List<PseudoValue> values = elementsToValues(from.length > 0 ? Arrays.asList(from) : Collections.<JetElement>emptyList()); List<PseudoValue> values = elementsToValues(from.length > 0 ? Arrays.asList(from) : Collections.<JetElement>emptyList());
return builder.magic(instructionElement, null, values, defaultTypeMap(values), true); return builder.magic(instructionElement, null, values, defaultTypeMap(values), true).getOutputValue();
} }
@NotNull @NotNull
private PseudoValue createNonSyntheticValue(@NotNull JetElement to, @NotNull List<? extends JetElement> from) { private PseudoValue createNonSyntheticValue(@NotNull JetElement to, @NotNull List<? extends JetElement> from) {
List<PseudoValue> values = elementsToValues(from); List<PseudoValue> values = elementsToValues(from);
return builder.magic(to, to, values, defaultTypeMap(values), false); return builder.magic(to, to, values, defaultTypeMap(values), false).getOutputValue();
} }
@NotNull @NotNull
@@ -883,7 +883,7 @@ public class JetControlFlowProcessor {
Collections.singletonList(loopRangeValue), Collections.singletonList(loopRangeValue),
Collections.singletonMap(loopRangeValue, loopRangeTypeSet), Collections.singletonMap(loopRangeValue, loopRangeTypeSet),
true true
); ).getOutputValue();
if (loopParameter != null) { if (loopParameter != null) {
generateInitializer(loopParameter, value); generateInitializer(loopParameter, value);
@@ -1128,7 +1128,7 @@ public class JetControlFlowProcessor {
resolvedCall, resolvedCall,
getReceiverValues(resolvedCall, false), getReceiverValues(resolvedCall, false),
Collections.<PseudoValue, ValueParameterDescriptor>emptyMap() Collections.<PseudoValue, ValueParameterDescriptor>emptyMap()
) ).getOutputValue()
: createSyntheticValue(entry, initializer); : createSyntheticValue(entry, initializer);
if (generateWriteForEntries) { if (generateWriteForEntries) {
generateInitializer(entry, writtenValue != null ? writtenValue : createSyntheticValue(entry)); generateInitializer(entry, writtenValue != null ? writtenValue : createSyntheticValue(entry));
@@ -401,32 +401,32 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
@NotNull @NotNull
@Override @Override
public PseudoValue loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) { public ValuedInstruction loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) {
return read(expression); return read(expression);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue createAnonymousObject(@NotNull JetObjectLiteralExpression expression) { public ValuedInstruction createAnonymousObject(@NotNull JetObjectLiteralExpression expression) {
return read(expression); return read(expression);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) { public ValuedInstruction createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) {
return read(expression); return read(expression);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue loadStringTemplate(@NotNull JetStringTemplateExpression expression, @NotNull List<PseudoValue> inputValues) { public ValuedInstruction loadStringTemplate(@NotNull JetStringTemplateExpression expression, @NotNull List<PseudoValue> inputValues) {
if (inputValues.isEmpty()) return read(expression); if (inputValues.isEmpty()) return read(expression);
return magic(expression, expression, inputValues, PseudocodePackage.expectedTypeFor(AllTypes.instance$, inputValues), false); return magic(expression, expression, inputValues, PseudocodePackage.expectedTypeFor(AllTypes.instance$, inputValues), false);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue magic( public MagicInstruction magic(
@NotNull JetElement instructionElement, @NotNull JetElement instructionElement,
@Nullable JetElement valueElement, @Nullable JetElement valueElement,
@NotNull List<PseudoValue> inputValues, @NotNull List<PseudoValue> inputValues,
@@ -437,26 +437,26 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
instructionElement, valueElement, getCurrentScope(), synthetic, inputValues, expectedTypes, valueFactory instructionElement, valueElement, getCurrentScope(), synthetic, inputValues, expectedTypes, valueFactory
); );
add(instruction); add(instruction);
return instruction.getOutputValue(); return instruction;
} }
@NotNull @NotNull
@Override @Override
public PseudoValue merge(@NotNull JetExpression expression, @NotNull List<PseudoValue> inputValues) { public MergeInstruction merge(@NotNull JetExpression expression, @NotNull List<PseudoValue> inputValues) {
MergeInstruction instruction = MergeInstruction.object$.create(expression, getCurrentScope(), inputValues, valueFactory); MergeInstruction instruction = MergeInstruction.object$.create(expression, getCurrentScope(), inputValues, valueFactory);
add(instruction); add(instruction);
return instruction.getOutputValue(); return instruction;
} }
@NotNull @NotNull
@Override @Override
public PseudoValue readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor) { public ReadValueInstruction readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor) {
return read(expression); return read(expression);
} }
@NotNull @NotNull
@Override @Override
public PseudoValue readVariable( public ReadValueInstruction readVariable(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues @NotNull Map<PseudoValue, ReceiverValue> receiverValues
@@ -464,16 +464,16 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
return read(expression, resolvedCall, receiverValues); return read(expression, resolvedCall, receiverValues);
} }
@Nullable @NotNull
@Override @Override
public PseudoValue call( public CallInstruction call(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues, @NotNull Map<PseudoValue, ReceiverValue> receiverValues,
@NotNull Map<PseudoValue, ValueParameterDescriptor> arguments @NotNull Map<PseudoValue, ValueParameterDescriptor> arguments
) { ) {
JetType returnType = resolvedCall.getResultingDescriptor().getReturnType(); JetType returnType = resolvedCall.getResultingDescriptor().getReturnType();
OperationInstruction instruction = CallInstruction.object$.create( CallInstruction instruction = CallInstruction.object$.create(
expression, expression,
getCurrentScope(), getCurrentScope(),
resolvedCall, resolvedCall,
@@ -482,12 +482,12 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
returnType != null && KotlinBuiltIns.getInstance().isNothing(returnType) ? null : valueFactory returnType != null && KotlinBuiltIns.getInstance().isNothing(returnType) ? null : valueFactory
); );
add(instruction); add(instruction);
return instruction.getOutputValue(); return instruction;
} }
@NotNull @NotNull
@Override @Override
public PseudoValue predefinedOperation( public OperationInstruction predefinedOperation(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@NotNull PredefinedOperation operation, @NotNull PredefinedOperation operation,
@NotNull List<PseudoValue> inputValues @NotNull List<PseudoValue> inputValues
@@ -515,7 +515,7 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
} }
@NotNull @NotNull
private PseudoValue read( private ReadValueInstruction read(
@NotNull JetExpression expression, @NotNull JetExpression expression,
@Nullable ResolvedCall<?> resolvedCall, @Nullable ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues) { @NotNull Map<PseudoValue, ReceiverValue> receiverValues) {
@@ -523,11 +523,11 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
ReadValueInstruction instruction = ReadValueInstruction instruction =
ReadValueInstruction.object$.create(expression, getCurrentScope(), accessTarget, receiverValues, valueFactory); ReadValueInstruction.object$.create(expression, getCurrentScope(), accessTarget, receiverValues, valueFactory);
add(instruction); add(instruction);
return instruction.getOutputValue(); return instruction;
} }
@NotNull @NotNull
private PseudoValue read(@NotNull JetExpression expression) { private ReadValueInstruction read(@NotNull JetExpression expression) {
return read(expression, null, Collections.<PseudoValue, ReceiverValue>emptyMap()); return read(expression, null, Collections.<PseudoValue, ReceiverValue>emptyMap());
} }
} }