提交 01105c8c 编写于 作者: A Andrey Breslav

Labeled expressions supported in the type inferrer

上级 87d07007
package org.jetbrains.jet.lang.cfg;
import com.intellij.lang.ASTNode;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.JetSemanticServices;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lexer.JetTokens;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.*;
/**
* @author abreslav
*/
public class JetControlFlowProcessor {
private JetControlFlowBuilder builder;
private final Map<String, Stack<JetElement>> labeledElements = new HashMap<String, Stack<JetElement>>();
public JetControlFlowProcessor(JetControlFlowBuilder builder) {
private final JetSemanticServices semanticServices;
private final JetControlFlowBuilder builder;
public JetControlFlowProcessor(JetSemanticServices semanticServices, JetControlFlowBuilder builder) {
this.semanticServices = semanticServices;
this.builder = builder;
}
......@@ -32,11 +36,25 @@ public class JetControlFlowProcessor {
builder.exitSubroutine(subroutineElement);
}
private void registerLabeledElement(@NotNull JetSimpleNameExpression label, @NotNull JetExpression labeledExpression) {
throw new UnsupportedOperationException(); // TODO
private void enterLabeledElement(@NotNull String labelName, @NotNull JetElement labeledElement) {
Stack<JetElement> stack = labeledElements.get(labelName);
if (stack == null) {
stack = new Stack<JetElement>();
labeledElements.put(labelName, stack);
}
stack.push(labeledElement);
}
private void exitElement(JetElement element) {
// for (Iterator<Map.Entry<String, JetElement>> iterator = labeledElements.entrySet().iterator(); iterator.hasNext(); ) {
// Map.Entry<String, JetElement> entry = iterator.next();
// if (entry.getValue() == element) {
// iterator.remove();
// }
// }
}
private JetElement resolveLabel(JetSimpleNameExpression labelElement) {
private JetElement resolveLabel(@NotNull String labelName, @NotNull ASTNode labelNode) {
throw new UnsupportedOperationException(); // TODO
}
......@@ -70,7 +88,7 @@ public class JetControlFlowProcessor {
@Override
public void visitLabelQualifiedExpression(JetLabelQualifiedExpression expression) {
registerLabeledElement(expression.getTargetLabel(), expression.getLabeledExpression());
enterLabeledElement(expression.getLabelName(), expression.getLabeledExpression());
value(expression.getLabeledExpression(), false);
}
......@@ -216,7 +234,7 @@ public class JetControlFlowProcessor {
}
JetSimpleNameExpression labelElement = expression.getTargetLabel();
JetElement subroutine = (labelElement != null)
? resolveLabel(labelElement)
? resolveLabel(expression.getLabelName(), expression.getTargetLabel().getNode())
: builder.getCurrentSubroutine();
if (returnedExpression == null) {
builder.returnNoValue(subroutine);
......
......@@ -24,4 +24,10 @@ public class JetLabelQualifiedExpression extends JetExpression {
return findChildByClass(JetExpression.class);
}
@Nullable
public String getLabelName() {
JetSimpleNameExpression labelElement = getTargetLabel();
assert labelElement == null || labelElement.getText().startsWith("@");
return labelElement == null ? null : labelElement.getText().substring(1);
}
}
......@@ -24,15 +24,4 @@ public class JetThisExpression extends JetLabelQualifiedExpression {
return (JetTypeReference) findChildByType(JetNodeTypes.TYPE_REFERENCE);
}
@Nullable
public JetSimpleNameExpression getLabelElement() {
return findChildByClass(JetSimpleNameExpression.class);
}
@Nullable
public String getLabelName() {
JetSimpleNameExpression labelElement = getLabelElement();
assert labelElement == null || labelElement.getText().startsWith("@");
return labelElement == null ? null : labelElement.getText().substring(1);
}
}
......@@ -234,7 +234,7 @@ public class TopDownAnalyzer {
if (bodyExpression != null) {
System.out.println("-------------");
JetControlFlowInstructionsGenerator instructionsGenerator = new JetControlFlowInstructionsGenerator();
new JetControlFlowProcessor(instructionsGenerator).generate(function, bodyExpression);
new JetControlFlowProcessor(semanticServices, instructionsGenerator).generate(function, bodyExpression);
Pseudocode pseudocode = instructionsGenerator.getPseudocode();
pseudocode.postProcess();
pseudocode.dumpInstructions(System.out);
......
......@@ -558,10 +558,10 @@ public class JetTypeInferrer {
}
}
else if (size == 0) {
semanticServices.getErrorHandler().unresolvedReference(expression.getLabelElement());
semanticServices.getErrorHandler().unresolvedReference(expression.getTargetLabel());
}
else {
JetSimpleNameExpression labelElement = expression.getLabelElement();
JetSimpleNameExpression labelElement = expression.getTargetLabel();
assert labelElement != null;
semanticServices.getErrorHandler().genericError(labelElement.getNode(), "Ambiguous label");
}
......@@ -989,6 +989,11 @@ public class JetTypeInferrer {
@Override
public void visitUnaryExpression(JetUnaryExpression expression) {
JetSimpleNameExpression operationSign = expression.getOperationSign();
if (JetTokens.LABELS.contains(operationSign.getReferencedNameElementType())) {
// TODO : Some processing for the label?
result = getType(expression.getBaseExpression());
return;
}
IElementType operationType = operationSign.getReferencedNameElementType();
String name = unaryOperationNames.get(operationType);
if (name == null) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册