diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index e6b360c3a23..68b3e01aede 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -1,22 +1,26 @@ 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> labeledElements = new HashMap>(); - 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 stack = labeledElements.get(labelName); + if (stack == null) { + stack = new Stack(); + labeledElements.put(labelName, stack); + } + stack.push(labeledElement); } - private JetElement resolveLabel(JetSimpleNameExpression labelElement) { + private void exitElement(JetElement element) { +// for (Iterator> iterator = labeledElements.entrySet().iterator(); iterator.hasNext(); ) { +// Map.Entry entry = iterator.next(); +// if (entry.getValue() == element) { +// iterator.remove(); +// } +// } + } + + 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); diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetLabelQualifiedExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetLabelQualifiedExpression.java index f7c37923e65..c6ce9d39988 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetLabelQualifiedExpression.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetLabelQualifiedExpression.java @@ -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); + } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetThisExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetThisExpression.java index 83c9905dc6e..f7d3a7c6abe 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetThisExpression.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetThisExpression.java @@ -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); - } } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index ce40c647589..16d9a1ce5b3 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -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); diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 03abcc60dce..a973548efd3 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -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) {