Pseudocode: Have builder return instructions rather than output values
This commit is contained in:
@@ -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
|
||||
|
||||
+12
-14
@@ -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));
|
||||
|
||||
+18
-18
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user