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.Pseudocode;
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.ValueParameterDescriptor;
import org.jetbrains.jet.lang.psi.*;
@@ -103,16 +103,16 @@ public interface JetControlFlowBuilder {
void loadUnit(@NotNull JetExpression expression);
@NotNull
PseudoValue loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant);
ValuedInstruction loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant);
@NotNull
PseudoValue createAnonymousObject(@NotNull JetObjectLiteralExpression expression);
ValuedInstruction createAnonymousObject(@NotNull JetObjectLiteralExpression expression);
@NotNull
PseudoValue createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression);
ValuedInstruction createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression);
@NotNull
PseudoValue loadStringTemplate(@NotNull JetStringTemplateExpression expression, @NotNull List<PseudoValue> inputValues);
ValuedInstruction loadStringTemplate(@NotNull JetStringTemplateExpression expression, @NotNull List<PseudoValue> inputValues);
@NotNull
PseudoValue magic(
MagicInstruction magic(
@NotNull JetElement instructionElement,
@Nullable JetElement valueElement,
@NotNull List<PseudoValue> inputValues,
@@ -121,23 +121,22 @@ public interface JetControlFlowBuilder {
);
@NotNull
PseudoValue merge(
MergeInstruction merge(
@NotNull JetExpression expression,
@NotNull List<PseudoValue> inputValues
);
@NotNull
PseudoValue readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor);
ReadValueInstruction readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor);
@NotNull
PseudoValue readVariable(
ReadValueInstruction readVariable(
@NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues
);
@Nullable
PseudoValue call(
@NotNull
CallInstruction call(
@NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues,
@@ -150,7 +149,7 @@ public interface JetControlFlowBuilder {
NOT_NULL_ASSERTION
}
@NotNull
PseudoValue predefinedOperation(
OperationInstruction predefinedOperation(
@NotNull JetExpression expression,
@NotNull PredefinedOperation operation,
@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.Pseudocode;
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.ValueParameterDescriptor;
import org.jetbrains.jet.lang.psi.*;
@@ -44,31 +44,31 @@ public abstract class JetControlFlowBuilderAdapter implements JetControlFlowBuil
@NotNull
@Override
public PseudoValue loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) {
public ValuedInstruction loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) {
return getDelegateBuilder().loadConstant(expression, constant);
}
@NotNull
@Override
public PseudoValue createAnonymousObject(@NotNull JetObjectLiteralExpression expression) {
public ValuedInstruction createAnonymousObject(@NotNull JetObjectLiteralExpression expression) {
return getDelegateBuilder().createAnonymousObject(expression);
}
@NotNull
@Override
public PseudoValue createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) {
public ValuedInstruction createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) {
return getDelegateBuilder().createFunctionLiteral(expression);
}
@NotNull
@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);
}
@NotNull
@Override
public PseudoValue magic(
public MagicInstruction magic(
@NotNull JetElement instructionElement,
@Nullable JetElement valueElement,
@NotNull List<PseudoValue> inputValues,
@@ -80,30 +80,28 @@ public abstract class JetControlFlowBuilderAdapter implements JetControlFlowBuil
@NotNull
@Override
public PseudoValue merge(
@NotNull JetExpression expression, @NotNull List<PseudoValue> inputValues
) {
public MergeInstruction merge(@NotNull JetExpression expression, @NotNull List<PseudoValue> inputValues) {
return getDelegateBuilder().merge(expression, inputValues);
}
@NotNull
@Override
public PseudoValue readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor) {
public ReadValueInstruction readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor) {
return getDelegateBuilder().readThis(expression, parameterDescriptor);
}
@NotNull
@Override
public PseudoValue readVariable(
public ReadValueInstruction readVariable(
@NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues) {
return getDelegateBuilder().readVariable(expression, resolvedCall, receiverValues);
}
@Nullable
@NotNull
@Override
public PseudoValue call(
public CallInstruction call(
@NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues,
@@ -114,7 +112,7 @@ public abstract class JetControlFlowBuilderAdapter implements JetControlFlowBuil
@NotNull
@Override
public PseudoValue predefinedOperation(
public OperationInstruction predefinedOperation(
@NotNull JetExpression expression,
@NotNull PredefinedOperation operation,
@NotNull List<PseudoValue> inputValues
@@ -185,13 +185,13 @@ public class JetControlFlowProcessor {
@NotNull
private PseudoValue createSyntheticValue(@NotNull JetElement instructionElement, JetElement... from) {
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
private PseudoValue createNonSyntheticValue(@NotNull JetElement to, @NotNull List<? extends JetElement> 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
@@ -883,7 +883,7 @@ public class JetControlFlowProcessor {
Collections.singletonList(loopRangeValue),
Collections.singletonMap(loopRangeValue, loopRangeTypeSet),
true
);
).getOutputValue();
if (loopParameter != null) {
generateInitializer(loopParameter, value);
@@ -1128,7 +1128,7 @@ public class JetControlFlowProcessor {
resolvedCall,
getReceiverValues(resolvedCall, false),
Collections.<PseudoValue, ValueParameterDescriptor>emptyMap()
)
).getOutputValue()
: createSyntheticValue(entry, initializer);
if (generateWriteForEntries) {
generateInitializer(entry, writtenValue != null ? writtenValue : createSyntheticValue(entry));
@@ -401,32 +401,32 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
@NotNull
@Override
public PseudoValue loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) {
public ValuedInstruction loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) {
return read(expression);
}
@NotNull
@Override
public PseudoValue createAnonymousObject(@NotNull JetObjectLiteralExpression expression) {
public ValuedInstruction createAnonymousObject(@NotNull JetObjectLiteralExpression expression) {
return read(expression);
}
@NotNull
@Override
public PseudoValue createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) {
public ValuedInstruction createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) {
return read(expression);
}
@NotNull
@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);
return magic(expression, expression, inputValues, PseudocodePackage.expectedTypeFor(AllTypes.instance$, inputValues), false);
}
@NotNull
@Override
public PseudoValue magic(
public MagicInstruction magic(
@NotNull JetElement instructionElement,
@Nullable JetElement valueElement,
@NotNull List<PseudoValue> inputValues,
@@ -437,26 +437,26 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
instructionElement, valueElement, getCurrentScope(), synthetic, inputValues, expectedTypes, valueFactory
);
add(instruction);
return instruction.getOutputValue();
return instruction;
}
@NotNull
@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);
add(instruction);
return instruction.getOutputValue();
return instruction;
}
@NotNull
@Override
public PseudoValue readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor) {
public ReadValueInstruction readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor) {
return read(expression);
}
@NotNull
@Override
public PseudoValue readVariable(
public ReadValueInstruction readVariable(
@NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues
@@ -464,16 +464,16 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
return read(expression, resolvedCall, receiverValues);
}
@Nullable
@NotNull
@Override
public PseudoValue call(
public CallInstruction call(
@NotNull JetExpression expression,
@NotNull ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues,
@NotNull Map<PseudoValue, ValueParameterDescriptor> arguments
) {
JetType returnType = resolvedCall.getResultingDescriptor().getReturnType();
OperationInstruction instruction = CallInstruction.object$.create(
CallInstruction instruction = CallInstruction.object$.create(
expression,
getCurrentScope(),
resolvedCall,
@@ -482,12 +482,12 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
returnType != null && KotlinBuiltIns.getInstance().isNothing(returnType) ? null : valueFactory
);
add(instruction);
return instruction.getOutputValue();
return instruction;
}
@NotNull
@Override
public PseudoValue predefinedOperation(
public OperationInstruction predefinedOperation(
@NotNull JetExpression expression,
@NotNull PredefinedOperation operation,
@NotNull List<PseudoValue> inputValues
@@ -515,7 +515,7 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
}
@NotNull
private PseudoValue read(
private ReadValueInstruction read(
@NotNull JetExpression expression,
@Nullable ResolvedCall<?> resolvedCall,
@NotNull Map<PseudoValue, ReceiverValue> receiverValues) {
@@ -523,11 +523,11 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
ReadValueInstruction instruction =
ReadValueInstruction.object$.create(expression, getCurrentScope(), accessTarget, receiverValues, valueFactory);
add(instruction);
return instruction.getOutputValue();
return instruction;
}
@NotNull
private PseudoValue read(@NotNull JetExpression expression) {
private ReadValueInstruction read(@NotNull JetExpression expression) {
return read(expression, null, Collections.<PseudoValue, ReceiverValue>emptyMap());
}
}