Drop JetWhenConditionWithExpression, replaced with JetWhenConditionIsPattern with JetExpressionPattern inside

This commit is contained in:
Andrey Breslav
2011-07-07 16:08:43 +04:00
parent d42eedb0e0
commit 498f85e49e
12 changed files with 108 additions and 136 deletions
@@ -136,7 +136,6 @@ public interface JetNodeTypes {
JetNodeType WHEN_CONDITION_IN_RANGE = new JetNodeType("WHEN_CONDITION_IN_RANGE", JetWhenConditionInRange.class); JetNodeType WHEN_CONDITION_IN_RANGE = new JetNodeType("WHEN_CONDITION_IN_RANGE", JetWhenConditionInRange.class);
JetNodeType WHEN_CONDITION_IS_PATTERN = new JetNodeType("WHEN_CONDITION_IS_PATTERN", JetWhenConditionIsPattern.class); JetNodeType WHEN_CONDITION_IS_PATTERN = new JetNodeType("WHEN_CONDITION_IS_PATTERN", JetWhenConditionIsPattern.class);
JetNodeType WHEN_CONDITION_CALL = new JetNodeType("WHEN_CONDITION_CALL", JetWhenConditionCall.class); JetNodeType WHEN_CONDITION_CALL = new JetNodeType("WHEN_CONDITION_CALL", JetWhenConditionCall.class);
JetNodeType WHEN_CONDITION_EXPRESSION = new JetNodeType("WHEN_CONDITION_EXPRESSION", JetWhenConditionWithExpression.class);
JetNodeType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME", JetContainerNode.class); JetNodeType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME", JetContainerNode.class);
} }
@@ -1837,15 +1837,16 @@ public class ExpressionCodegen extends JetVisitor {
private StackValue generateWhenCondition(Type subjectType, int subjectLocal, JetWhenCondition condition, private StackValue generateWhenCondition(Type subjectType, int subjectLocal, JetWhenCondition condition,
@Nullable Label nextEntry) { @Nullable Label nextEntry) {
StackValue conditionValue; StackValue conditionValue;
if (condition instanceof JetWhenConditionWithExpression) { // if (condition instanceof JetWhenConditionWithExpression) {
v.load(subjectLocal, subjectType); // v.load(subjectLocal, subjectType);
JetExpression condExpression = ((JetWhenConditionWithExpression) condition).getExpression(); // JetExpression condExpression = ((JetWhenConditionWithExpression) condition).getExpression();
Type condType = isNumberPrimitive(subjectType) ? expressionType(condExpression) : OBJECT_TYPE; // Type condType = isNumberPrimitive(subjectType) ? expressionType(condExpression) : OBJECT_TYPE;
gen(condExpression, condType); // gen(condExpression, condType);
generateEqualsForExpressionsOnStack(JetTokens.EQEQ, subjectType, condType); // generateEqualsForExpressionsOnStack(JetTokens.EQEQ, subjectType, condType);
conditionValue = myStack.pop(); // conditionValue = myStack.pop();
} // }
else if (condition instanceof JetWhenConditionInRange) { // else
if (condition instanceof JetWhenConditionInRange) {
JetExpression range = ((JetWhenConditionInRange) condition).getRangeExpression(); JetExpression range = ((JetWhenConditionInRange) condition).getRangeExpression();
gen(range, RANGE_TYPE); gen(range, RANGE_TYPE);
new StackValue.Local(subjectLocal, subjectType).put(INTEGER_TYPE, v); new StackValue.Local(subjectLocal, subjectType).put(INTEGER_TYPE, v);
@@ -648,11 +648,6 @@ public class JetControlFlowProcessor {
condition.accept(new JetVisitor() { condition.accept(new JetVisitor() {
private final JetVisitor conditionVisitor = this; private final JetVisitor conditionVisitor = this;
@Override
public void visitWhenConditionWithExpression(JetWhenConditionWithExpression condition) {
value(condition.getExpression(), false, inCondition); // TODO : inCondition?
}
@Override @Override
public void visitWhenConditionCall(JetWhenConditionCall condition) { public void visitWhenConditionCall(JetWhenConditionCall condition) {
value(condition.getCallSuffixExpression(), false, inCondition); // TODO : inCondition? value(condition.getCallSuffixExpression(), false, inCondition); // TODO : inCondition?
@@ -758,18 +758,16 @@ public class JetExpressionParsing extends AbstractJetParsing {
else { else {
mark.drop(); mark.drop();
} }
// myJetParsing.parseTypeArgumentList();
// if (at(LPAR)) {
// parseValueArgumentList();
// }
condition.done(WHEN_CONDITION_CALL); condition.done(WHEN_CONDITION_CALL);
} else { } else {
PsiBuilder.Marker expressionPattern = mark();
if (atSet(WHEN_CONDITION_RECOVERY_SET_WITH_DOUBLE_ARROW)) { if (atSet(WHEN_CONDITION_RECOVERY_SET_WITH_DOUBLE_ARROW)) {
error("Expecting an element, is-condition or in-condition"); error("Expecting an element, is-condition or in-condition");
} else { } else {
parseExpression(); parseExpression();
} }
condition.done(WHEN_CONDITION_EXPRESSION); expressionPattern.done(EXPRESSION_PATTERN);
condition.done(WHEN_CONDITION_IS_PATTERN);
} }
myBuilder.restoreNewlinesState(); myBuilder.restoreNewlinesState();
} }
@@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode; import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/** /**
* @author abreslav * @author abreslav
@@ -11,7 +12,7 @@ public class JetExpressionPattern extends JetPattern {
super(node); super(node);
} }
@NotNull @Nullable @IfNotParsed
public JetExpression getExpression() { public JetExpression getExpression() {
return findChildByClass(JetExpression.class); return findChildByClass(JetExpression.class);
} }
@@ -354,10 +354,6 @@ public class JetVisitor extends PsiElementVisitor {
visitExpression(expression); visitExpression(expression);
} }
public void visitWhenConditionWithExpression(JetWhenConditionWithExpression condition) {
visitJetElement(condition);
}
public void visitWhenConditionCall(JetWhenConditionCall condition) { public void visitWhenConditionCall(JetWhenConditionCall condition) {
visitJetElement(condition); visitJetElement(condition);
} }
@@ -1,25 +0,0 @@
package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author abreslav
*/
public class JetWhenConditionWithExpression extends JetWhenCondition {
public JetWhenConditionWithExpression(@NotNull ASTNode node) {
super(node);
}
@Nullable
@IfNotParsed
public JetExpression getExpression() {
return findChildByClass(JetExpression.class);
}
@Override
public void accept(@NotNull JetVisitor visitor) {
visitor.visitWhenConditionWithExpression(this);
}
}
@@ -1345,18 +1345,6 @@ public class JetTypeInferrer {
private DataFlowInfo checkWhenCondition(@Nullable final JetExpression subjectExpression, final JetType subjectType, JetWhenCondition condition, final WritableScope scopeToExtend, final VariableDescriptor... subjectVariables) { private DataFlowInfo checkWhenCondition(@Nullable final JetExpression subjectExpression, final JetType subjectType, JetWhenCondition condition, final WritableScope scopeToExtend, final VariableDescriptor... subjectVariables) {
final DataFlowInfo[] newDataFlowInfo = new DataFlowInfo[]{context.dataFlowInfo}; final DataFlowInfo[] newDataFlowInfo = new DataFlowInfo[]{context.dataFlowInfo};
condition.accept(new JetVisitor() { condition.accept(new JetVisitor() {
@Override
public void visitWhenConditionWithExpression(JetWhenConditionWithExpression condition) {
JetExpression conditionExpression = condition.getExpression();
if (conditionExpression != null) {
JetType type = getType(context.scope, conditionExpression, false);
if (type != null && subjectType != null) {
if (TypeUtils.intersect(semanticServices.getTypeChecker(), Sets.newHashSet(subjectType, type)) == null) {
context.trace.getErrorHandler().genericError(conditionExpression.getNode(), "This condition can never hold");
}
}
}
}
@Override @Override
public void visitWhenConditionCall(JetWhenConditionCall condition) { public void visitWhenConditionCall(JetWhenConditionCall condition) {
+9 -8
View File
@@ -310,14 +310,15 @@ JetFile: NewlinesInParentheses.jet
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
CALL_EXPRESSION EXPRESSION_PATTERN
REFERENCE_EXPRESSION CALL_EXPRESSION
PsiElement(IDENTIFIER)('f') REFERENCE_EXPRESSION
PsiWhiteSpace('\n ') PsiElement(IDENTIFIER)('f')
VALUE_ARGUMENT_LIST PsiWhiteSpace('\n ')
PsiElement(LPAR)('(') VALUE_ARGUMENT_LIST
PsiElement(RPAR)(')') PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
+28 -24
View File
@@ -1146,35 +1146,39 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('c') PsiElement(IDENTIFIER)('c')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
INTEGER_CONSTANT EXPRESSION_PATTERN
PsiElement(INTEGER_LITERAL)('1') INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
CALL_EXPRESSION EXPRESSION_PATTERN
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
WHEN_CONDITION_IS_PATTERN
EXPRESSION_PATTERN
REFERENCE_EXPRESSION REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo') PsiElement(IDENTIFIER)('bar')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('bar') BINARY_EXPRESSION
PsiElement(COMMA)(',') INTEGER_CONSTANT
PsiWhiteSpace(' ') PsiElement(INTEGER_LITERAL)('2')
WHEN_CONDITION_EXPRESSION PsiWhiteSpace(' ')
BINARY_EXPRESSION OPERATION_REFERENCE
INTEGER_CONSTANT PsiElement(PLUS)('+')
PsiElement(INTEGER_LITERAL)('2') PsiWhiteSpace(' ')
PsiWhiteSpace(' ') INTEGER_CONSTANT
OPERATION_REFERENCE PsiElement(INTEGER_LITERAL)('3')
PsiElement(PLUS)('+')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('3')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_CONDITION_IS_PATTERN WHEN_CONDITION_IS_PATTERN
+8 -6
View File
@@ -80,9 +80,10 @@ JetFile: When_ERR.jet
PsiElement(IDENTIFIER)('foo') PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
PsiErrorElement:Expecting an element, is-condition or in-condition EXPRESSION_PATTERN
<empty list> PsiErrorElement:Expecting an element, is-condition or in-condition
<empty list>
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
REFERENCE_EXPRESSION REFERENCE_EXPRESSION
@@ -161,9 +162,10 @@ JetFile: When_ERR.jet
PsiElement(SEMICOLON)(';') PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
PsiErrorElement:Expecting an element, is-condition or in-condition EXPRESSION_PATTERN
<empty list> PsiErrorElement:Expecting an element, is-condition or in-condition
<empty list>
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiErrorElement:Expecting an element PsiErrorElement:Expecting an element
<empty list> <empty list>
+48 -36
View File
@@ -431,9 +431,10 @@ JetFile: BinaryTree.jet
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('EQ') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('EQ')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -441,9 +442,10 @@ JetFile: BinaryTree.jet
PsiElement(true)('true') PsiElement(true)('true')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('LS') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('LS')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -467,9 +469,10 @@ JetFile: BinaryTree.jet
PsiElement(RPAR)(')') PsiElement(RPAR)(')')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('GT') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('GT')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -707,9 +710,10 @@ JetFile: BinaryTree.jet
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('EQ') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('EQ')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -717,9 +721,10 @@ JetFile: BinaryTree.jet
PsiElement(false)('false') PsiElement(false)('false')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('LS') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('LS')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -745,9 +750,10 @@ JetFile: BinaryTree.jet
PsiElement(RPAR)(')') PsiElement(RPAR)(')')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('GT') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('GT')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -884,9 +890,10 @@ JetFile: BinaryTree.jet
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('EQ') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('EQ')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -897,9 +904,10 @@ JetFile: BinaryTree.jet
PsiElement(false)('false') PsiElement(false)('false')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('LS') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('LS')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
@@ -984,9 +992,10 @@ JetFile: BinaryTree.jet
PsiElement(RPAR)(')') PsiElement(RPAR)(')')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('GT') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('GT')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
@@ -1256,9 +1265,10 @@ JetFile: BinaryTree.jet
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('EQ') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('EQ')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -1266,9 +1276,10 @@ JetFile: BinaryTree.jet
PsiElement(IDENTIFIER)('node') PsiElement(IDENTIFIER)('node')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('LS') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('LS')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -1287,9 +1298,10 @@ JetFile: BinaryTree.jet
PsiElement(RPAR)(')') PsiElement(RPAR)(')')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
WHEN_ENTRY WHEN_ENTRY
WHEN_CONDITION_EXPRESSION WHEN_CONDITION_IS_PATTERN
REFERENCE_EXPRESSION EXPRESSION_PATTERN
PsiElement(IDENTIFIER)('GT') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('GT')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')