diff --git a/idea/src/jet/lang/Library.jet b/idea/src/jet/lang/Library.jet index feb6203270a..269dbcae6c7 100644 --- a/idea/src/jet/lang/Library.jet +++ b/idea/src/jet/lang/Library.jet @@ -66,6 +66,7 @@ class Number : Hashable { } class Double : Number, Comparable { + fun compareTo(other : Double) : Int fun compareTo(other : Float) : Int fun compareTo(other : Long) : Int fun compareTo(other : Int) : Int @@ -128,6 +129,7 @@ class Double : Number, Comparable { class Float : Number, Comparable { fun compareTo(other : Double) : Int + fun compareTo(other : Float) : Int fun compareTo(other : Long) : Int fun compareTo(other : Int) : Int fun compareTo(other : Short) : Int @@ -191,6 +193,7 @@ class Float : Number, Comparable { class Long : Number, Comparable { fun compareTo(other : Double) : Int fun compareTo(other : Float) : Int + fun compareTo(other : Long) : Int fun compareTo(other : Int) : Int fun compareTo(other : Short) : Int fun compareTo(other : Byte) : Int @@ -319,6 +322,7 @@ class Char : Number, Comparable { fun compareTo(other : Long) : Int fun compareTo(other : Int) : Int fun compareTo(other : Short) : Int + fun compareTo(other : Char) : Int fun compareTo(other : Byte) : Int fun plus(other : Double) : Double @@ -380,6 +384,7 @@ class Short : Number, Comparable { fun compareTo(other : Float) : Int fun compareTo(other : Long) : Int fun compareTo(other : Int) : Int + fun compareTo(other : Short) : Int fun compareTo(other : Byte) : Int fun compareTo(other : Char) : Int @@ -444,6 +449,7 @@ class Byte : Number, Comparable { fun compareTo(other : Int) : Int fun compareTo(other : Short) : Int fun compareTo(other : Char) : Int + fun compareTo(other : Byte) : Int fun plus(other : Double) : Double fun plus(other : Float) : Float diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java index 361dd64f128..8af1ae5b281 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java @@ -11,42 +11,44 @@ import org.jetbrains.jet.lang.psi.JetExpression; */ public interface JetControlFlowBuilder { void readNode(@NotNull JetExpression expression); + void readUnit(@NotNull JetExpression expression); // General label management @NotNull Label createUnboundLabel(); - void bindLabel(@NotNull Label label); + void bindLabel(@NotNull Label label); // Jumps void jump(@NotNull Label label); void jumpOnFalse(@NotNull Label label); + void jumpOnTrue(@NotNull Label label); void nondeterministicJump(Label label); // Maybe, jump to label - // Entry/exit points Label getEntryPoint(@NotNull JetElement labelElement); - Label getExitPoint(@NotNull JetElement labelElement); + Label getExitPoint(@NotNull JetElement labelElement); // Loops Label enterLoop(@NotNull JetExpression expression, Label loopExitPoint); + void exitLoop(@NotNull JetExpression expression); @Nullable JetElement getCurrentLoop(); - // Finally void enterTryFinally(@NotNull JetBlockExpression expression); - void exitTryFinally(); + void exitTryFinally(); // Subroutines void enterSubroutine(@NotNull JetElement subroutine, boolean isFunctionLiteral); + void exitSubroutine(@NotNull JetElement subroutine, boolean functionLiteral); @Nullable JetElement getCurrentSubroutine(); - void returnValue(@NotNull JetElement subroutine); + void returnNoValue(@NotNull JetElement expression, @NotNull JetElement subroutine); void writeNode(@NotNull JetElement assignment, @NotNull JetElement lValue); diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java index df5c84c5749..0e0c62b68bd 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java @@ -21,6 +21,11 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder { builder.readNode(expression); } + @Override + public void readUnit(@NotNull JetExpression expression) { + builder.readUnit(expression); + } + @Override @NotNull public Label createUnboundLabel() { diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index a1f7407f6b9..ef5eb18a511 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -40,7 +40,7 @@ public class JetControlFlowProcessor { boolean functionLiteral = subroutineElement instanceof JetFunctionLiteralExpression; builder.enterSubroutine(subroutineElement, functionLiteral); for (JetElement statement : body) { - statement.accept(new CFPVisitor(preferBlocks)); + statement.accept(new CFPVisitor(preferBlocks, false)); } builder.exitSubroutine(subroutineElement, functionLiteral); } @@ -89,18 +89,20 @@ public class JetControlFlowProcessor { private class CFPVisitor extends JetVisitor { private final boolean preferBlock; + private final boolean inCondition; - private CFPVisitor(boolean preferBlock) { + private CFPVisitor(boolean preferBlock, boolean inCondition) { this.preferBlock = preferBlock; + this.inCondition = inCondition; } - private void value(@NotNull JetElement element, boolean preferBlock) { + private void value(@NotNull JetElement element, boolean preferBlock, boolean inCondition) { CFPVisitor visitor; - if (this.preferBlock == preferBlock) { + if (this.preferBlock == preferBlock && this.inCondition == inCondition) { visitor = this; } else { - visitor = new CFPVisitor(preferBlock); + visitor = new CFPVisitor(preferBlock, inCondition); } element.accept(visitor); exitElement(element); @@ -110,7 +112,7 @@ public class JetControlFlowProcessor { public void visitParenthesizedExpression(JetParenthesizedExpression expression) { JetExpression innerExpression = expression.getExpression(); if (innerExpression != null) { - value(innerExpression, false); + value(innerExpression, false, inCondition); } } @@ -142,7 +144,7 @@ public class JetControlFlowProcessor { JetExpression deparenthesized = JetPsiUtil.deparenthesize(labeledExpression); if (deparenthesized != null) { enterLabeledElement(labelName, deparenthesized); - value(labeledExpression, false); + value(labeledExpression, false, inCondition); } } @@ -151,27 +153,33 @@ public class JetControlFlowProcessor { IElementType operationType = expression.getOperationReference().getReferencedNameElementType(); JetExpression right = expression.getRight(); if (operationType == JetTokens.ANDAND) { - value(expression.getLeft(), false); + value(expression.getLeft(), false, true); Label resultLabel = builder.createUnboundLabel(); builder.jumpOnFalse(resultLabel); if (right != null) { - value(right, false); + value(right, false, true); } builder.bindLabel(resultLabel); + if (!inCondition) { + builder.readNode(expression); + } } else if (operationType == JetTokens.OROR) { - value(expression.getLeft(), false); + value(expression.getLeft(), false, true); Label resultLabel = builder.createUnboundLabel(); builder.jumpOnTrue(resultLabel); if (right != null) { - value(right, false); + value(right, false, true); } builder.bindLabel(resultLabel); + if (!inCondition) { + builder.readNode(expression); + } } else if (operationType == JetTokens.EQ) { JetExpression left = expression.getLeft(); if (right != null) { - value(right, false); + value(right, false, false); } if (left instanceof JetSimpleNameExpression) { builder.writeNode(expression, left); @@ -182,9 +190,9 @@ public class JetControlFlowProcessor { } else if (JetTypeInferrer.assignmentOperationNames.containsKey(operationType)) { JetExpression left = expression.getLeft(); - value(left, false); + value(left, false, false); if (right != null) { - value(right, false); + value(right, false, false); } if (left instanceof JetSimpleNameExpression) { builder.writeNode(expression, left); @@ -194,11 +202,11 @@ public class JetControlFlowProcessor { } } else { - value(expression.getLeft(), false); + value(expression.getLeft(), false, false); if (right != null) { - value(right, false); + value(right, false, false); } - value(expression.getOperationReference(), false); + value(expression.getOperationReference(), false, false); builder.readNode(expression); } } @@ -218,22 +226,30 @@ public class JetControlFlowProcessor { @Override public void visitIfExpression(JetIfExpression expression) { - value(expression.getCondition(), false); + value(expression.getCondition(), false, true); Label elseLabel = builder.createUnboundLabel(); builder.jumpOnFalse(elseLabel); - JetExpression then = expression.getThen(); - if (then != null) { - value(then, true); + JetExpression thenBranch = expression.getThen(); + if (thenBranch != null) { + value(thenBranch, true, inCondition); + } + else { + builder.readUnit(expression); } Label resultLabel = builder.createUnboundLabel(); builder.jump(resultLabel); builder.bindLabel(elseLabel); JetExpression elseBranch = expression.getElse(); if (elseBranch != null) { - value(elseBranch, true); + value(elseBranch, true, inCondition); + } + else { + builder.readUnit(expression); } builder.bindLabel(resultLabel); - // builder.readNode(element); +// if (!inCondition) { +// builder.readNode(expression); +// } } @Override @@ -245,13 +261,13 @@ public class JetControlFlowProcessor { List catchClauses = expression.getCatchClauses(); if (catchClauses.isEmpty()) { - value(expression.getTryBlock(), true); + value(expression.getTryBlock(), true, false); } else { Label catchBlock = builder.createUnboundLabel(); builder.nondeterministicJump(catchBlock); - value(expression.getTryBlock(), true); + value(expression.getTryBlock(), true, false); Label afterCatches = builder.createUnboundLabel(); builder.jump(afterCatches); @@ -259,7 +275,7 @@ public class JetControlFlowProcessor { builder.bindLabel(catchBlock); for (Iterator iterator = catchClauses.iterator(); iterator.hasNext(); ) { JetCatchClause catchClause = iterator.next(); - value(catchClause.getCatchBody(), true); + value(catchClause.getCatchBody(), true, false); if (iterator.hasNext()) { builder.nondeterministicJump(afterCatches); } @@ -277,9 +293,9 @@ public class JetControlFlowProcessor { public void visitWhileExpression(JetWhileExpression expression) { Label loopExitPoint = builder.createUnboundLabel(); Label loopEntryPoint = builder.enterLoop(expression, loopExitPoint); - value(expression.getCondition(), false); + value(expression.getCondition(), false, true); builder.jumpOnFalse(loopExitPoint); - value(expression.getBody(), true); + value(expression.getBody(), true, false); builder.jump(loopEntryPoint); builder.exitLoop(expression); } @@ -288,18 +304,18 @@ public class JetControlFlowProcessor { public void visitDoWhileExpression(JetDoWhileExpression expression) { Label loopExitPoint = builder.createUnboundLabel(); Label loopEntryPoint = builder.enterLoop(expression, loopExitPoint); - value(expression.getBody(), true); - value(expression.getCondition(), false); + value(expression.getBody(), true, false); + value(expression.getCondition(), false, true); builder.jumpOnTrue(loopEntryPoint); builder.exitLoop(expression); } @Override public void visitForExpression(JetForExpression expression) { - value(expression.getLoopRange(), false); + value(expression.getLoopRange(), false, false); Label loopExitPoint = builder.createUnboundLabel(); Label loopEntryPoint = builder.enterLoop(expression, loopExitPoint); - value(expression.getBody(), true); + value(expression.getBody(), true, false); builder.nondeterministicJump(loopEntryPoint); builder.exitLoop(expression); } @@ -351,7 +367,7 @@ public class JetControlFlowProcessor { public void visitReturnExpression(JetReturnExpression expression) { JetExpression returnedExpression = expression.getReturnedExpression(); if (returnedExpression != null) { - value(returnedExpression, false); + value(returnedExpression, false, false); } JetSimpleNameExpression labelElement = expression.getTargetLabel(); JetElement subroutine; @@ -377,7 +393,7 @@ public class JetControlFlowProcessor { @Override public void visitBlockExpression(JetBlockExpression expression) { for (JetElement statement : expression.getStatements()) { - value(statement, true); + value(statement, true, false); } } @@ -390,7 +406,7 @@ public class JetControlFlowProcessor { public void visitFunctionLiteralExpression(JetFunctionLiteralExpression expression) { if (preferBlock && !expression.hasParameterSpecification()) { for (JetElement statement : expression.getBody()) { - value(statement, true); + value(statement, true, false); } } else { @@ -400,10 +416,10 @@ public class JetControlFlowProcessor { @Override public void visitQualifiedExpression(JetQualifiedExpression expression) { - value(expression.getReceiverExpression(), false); + value(expression.getReceiverExpression(), false, false); JetExpression selectorExpression = expression.getSelectorExpression(); if (selectorExpression != null) { - value(selectorExpression, false); + value(selectorExpression, false, false); } builder.readNode(expression); } @@ -411,21 +427,21 @@ public class JetControlFlowProcessor { @Override public void visitCallExpression(JetCallExpression expression) { for (JetTypeProjection typeArgument : expression.getTypeArguments()) { - value(typeArgument, false); + value(typeArgument, false, false); } for (JetArgument argument : expression.getValueArguments()) { JetExpression argumentExpression = argument.getArgumentExpression(); if (argumentExpression != null) { - value(argumentExpression, false); + value(argumentExpression, false, false); } } for (JetExpression functionLiteral : expression.getFunctionLiteralArguments()) { - value(functionLiteral, false); + value(functionLiteral, false, false); } - value(expression.getCalleeExpression(), false); + value(expression.getCalleeExpression(), false, false); builder.readNode(expression); } @@ -433,7 +449,7 @@ public class JetControlFlowProcessor { public void visitProperty(JetProperty property) { JetExpression initializer = property.getInitializer(); if (initializer != null) { - value(initializer, false); + value(initializer, false, false); builder.writeNode(property, property); } } @@ -441,7 +457,7 @@ public class JetControlFlowProcessor { @Override public void visitTupleExpression(JetTupleExpression expression) { for (JetExpression entry : expression.getEntries()) { - value(entry, false); + value(entry, false, false); } builder.readNode(expression); } diff --git a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java index df589c62d82..3356be8f18f 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java @@ -58,4 +58,8 @@ public class InstructionVisitor { public void visitWriteValue(WriteValueInstruction writeValueInstruction) { visitInstructionWithNext(writeValueInstruction); } + + public void visitReadUnitValue(ReadUnitValueInstruction instruction) { + visitInstructionWithNext(instruction); + } } diff --git a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java index a2c4f584646..a0dbf9091c9 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java @@ -170,6 +170,11 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd add(new ReadValueInstruction(expression)); } + @Override + public void readUnit(@NotNull JetExpression expression) { + add(new ReadUnitValueInstruction(expression)); + } + @Override public void jump(@NotNull Label label) { add(new UnconditionalJumpInstruction(label)); diff --git a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadUnitValueInstruction.java b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadUnitValueInstruction.java new file mode 100644 index 00000000000..0151ed71905 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadUnitValueInstruction.java @@ -0,0 +1,24 @@ +package org.jetbrains.jet.lang.cfg.pseudocode; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetExpression; + +/** +* @author abreslav +*/ +public class ReadUnitValueInstruction extends InstructionWithNext { + + public ReadUnitValueInstruction(@NotNull JetExpression expression) { + super(expression); + } + + @Override + public void accept(InstructionVisitor visitor) { + visitor.visitReadUnitValue(this); + } + + @Override + public String toString() { + return "read (Unit)"; + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetConstantExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetConstantExpression.java index b0c14587035..baea44abd4e 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetConstantExpression.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetConstantExpression.java @@ -24,7 +24,12 @@ public class JetConstantExpression extends JetExpression { if (elementType == JetNodeTypes.INTEGER_CONSTANT) { if (nodeText.startsWith("0x") || nodeText.startsWith("0X")) { - return Integer.parseInt(nodeText.substring(2), 16); + String hexString = nodeText.substring(2); + long longValue = Long.parseLong(hexString, 16); + if (Integer.MIN_VALUE <= longValue && longValue <= Integer.MAX_VALUE) { + return (int) longValue; + } + return longValue; } if (nodeText.startsWith("0b") || nodeText.startsWith("0B")) { return Integer.parseInt(nodeText.substring(2), 2); diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 853bf3a9f50..51faa346f18 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -375,6 +375,11 @@ public class TopDownAnalyzer { processPreviousInstructions(instruction, returnedExpressions, elementsReturningUnit); } + @Override + public void visitReadUnitValue(ReadUnitValueInstruction instruction) { + returnedExpressions.add((JetExpression) instruction.getElement()); + } + @Override public void visitInstruction(Instruction instruction) { if (instruction instanceof JetElementInstruction) { diff --git a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java index afde9b8ee6c..395f25e0912 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java @@ -17,6 +17,7 @@ public class JavaTypeTransformer { private final JavaDescriptorResolver resolver; private final JetStandardLibrary standardLibrary; private Map primitiveTypesMap; + private Map classTypesMap; public JavaTypeTransformer(JetStandardLibrary standardLibrary, JavaDescriptorResolver resolver) { this.resolver = resolver; @@ -33,12 +34,9 @@ public class JavaTypeTransformer { return ErrorUtils.createErrorType("Unresolved java class: " + classType.getPresentableText()); } - if ("java.lang.Object".equals(psiClass.getQualifiedName())) { - return JetStandardClasses.getNullableAnyType(); - } - - if ("java.lang.String".equals(psiClass.getQualifiedName())) { - return standardLibrary.getNullableStringType(); + JetType jetAnalog = getClassTypesMap().get(psiClass.getQualifiedName()); + if (jetAnalog != null) { + return jetAnalog; } ClassDescriptor descriptor = resolver.resolveClass(psiClass); @@ -85,7 +83,32 @@ public class JavaTypeTransformer { primitiveTypesMap.put("double", standardLibrary.getDoubleType()); primitiveTypesMap.put("boolean", standardLibrary.getBooleanType()); primitiveTypesMap.put("void", JetStandardClasses.getUnitType()); + primitiveTypesMap.put("java.lang.Byte", TypeUtils.makeNullable(standardLibrary.getByteType())); + primitiveTypesMap.put("java.lang.Short", TypeUtils.makeNullable(standardLibrary.getShortType())); + primitiveTypesMap.put("java.lang.Character", TypeUtils.makeNullable(standardLibrary.getCharType())); + primitiveTypesMap.put("java.lang.Integer", TypeUtils.makeNullable(standardLibrary.getIntType())); + primitiveTypesMap.put("java.lang.Long", TypeUtils.makeNullable(standardLibrary.getLongType())); + primitiveTypesMap.put("java.lang.Float", TypeUtils.makeNullable(standardLibrary.getFloatType())); + primitiveTypesMap.put("java.lang.Double", TypeUtils.makeNullable(standardLibrary.getDoubleType())); + primitiveTypesMap.put("java.lang.Boolean", TypeUtils.makeNullable(standardLibrary.getBooleanType())); } return primitiveTypesMap; } + + public Map getClassTypesMap() { + if (classTypesMap == null) { + classTypesMap = new HashMap(); + classTypesMap.put("java.lang.Byte", TypeUtils.makeNullable(standardLibrary.getByteType())); + classTypesMap.put("java.lang.Short", TypeUtils.makeNullable(standardLibrary.getShortType())); + classTypesMap.put("java.lang.Character", TypeUtils.makeNullable(standardLibrary.getCharType())); + classTypesMap.put("java.lang.Integer", TypeUtils.makeNullable(standardLibrary.getIntType())); + classTypesMap.put("java.lang.Long", TypeUtils.makeNullable(standardLibrary.getLongType())); + classTypesMap.put("java.lang.Float", TypeUtils.makeNullable(standardLibrary.getFloatType())); + classTypesMap.put("java.lang.Double", TypeUtils.makeNullable(standardLibrary.getDoubleType())); + classTypesMap.put("java.lang.Boolean", TypeUtils.makeNullable(standardLibrary.getBooleanType())); + classTypesMap.put("java.lang.Object", JetStandardClasses.getNullableAnyType()); + classTypesMap.put("java.lang.String", standardLibrary.getNullableStringType()); + } + return classTypesMap; + } } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 9b9fa6166be..0c432266a1e 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -298,7 +298,12 @@ public class JetTypeInferrer { } } else { - if (element instanceof JetExpression) { + if (element == function) { + JetExpression bodyExpression = function.getBodyExpression(); + assert bodyExpression != null; + semanticServices.getErrorHandler().genericError(bodyExpression.getNode(), "This function must return a value of type " + expectedReturnType); + } + else if (element instanceof JetExpression) { JetExpression expression = (JetExpression) element; semanticServices.getErrorHandler().typeMismatch(expression, expectedReturnType, actualType); } @@ -497,7 +502,13 @@ public class JetTypeInferrer { IElementType elementType = expression.getNode().getElementType(); JetStandardLibrary standardLibrary = semanticServices.getStandardLibrary(); if (elementType == JetNodeTypes.INTEGER_CONSTANT) { - result = standardLibrary.getIntType(); + if (expression.getValue() instanceof Long) { + result = standardLibrary.getLongType(); + } + else { + result = standardLibrary.getIntType(); + } + // TODO : other ranges } else if (elementType == JetNodeTypes.LONG_CONSTANT) { result = standardLibrary.getLongType(); } else if (elementType == JetNodeTypes.FLOAT_CONSTANT) { @@ -1222,9 +1233,7 @@ public class JetTypeInferrer { } private boolean isBoolean(@NotNull JetType type) { - if (type.isNullable()) return false; - TypeConstructor booleanTypeConstructor = semanticServices.getStandardLibrary().getBoolean().getTypeConstructor(); - return type.getConstructor().equals(booleanTypeConstructor) || ErrorUtils.isErrorType(type); + return semanticServices.getTypeChecker().isConvertibleTo(type, semanticServices.getStandardLibrary().getBooleanType()); } @Override diff --git a/idea/src/org/jetbrains/jet/lexer/Jet.flex b/idea/src/org/jetbrains/jet/lexer/Jet.flex index 271d7867c0e..ddfbc115d5b 100644 --- a/idea/src/org/jetbrains/jet/lexer/Jet.flex +++ b/idea/src/org/jetbrains/jet/lexer/Jet.flex @@ -54,7 +54,8 @@ HEX_FLOAT_LITERAL={HEX_SIGNIFICAND}{BINARY_EXPONENT}[Ff] //HEX_DOUBLE_LITERAL={HEX_SIGNIFICAND}{BINARY_EXPONENT}[Dd]? HEX_DOUBLE_LITERAL={HEX_SIGNIFICAND}{BINARY_EXPONENT}? BINARY_EXPONENT=[Pp][+-]?{DIGIT}+ -HEX_SIGNIFICAND={HEX_INTEGER_LITERAL}|{HEX_INTEGER_LITERAL}\.|0[Xx]{HEX_DIGIT}*\.{HEX_DIGIT}+ +HEX_SIGNIFICAND={HEX_INTEGER_LITERAL}|0[Xx]{HEX_DIGIT}*\.{HEX_DIGIT}+ +//HEX_SIGNIFICAND={HEX_INTEGER_LITERAL}|{HEX_INTEGER_LITERAL}\.|0[Xx]{HEX_DIGIT}*\.{HEX_DIGIT}+ CHARACTER_LITERAL="'"([^\\\'\n]|{ESCAPE_SEQUENCE})*("'"|\\)? // TODO: introduce symbols (e.g. 'foo) as another way to write string literals diff --git a/idea/src/org/jetbrains/jet/lexer/_JetLexer.java b/idea/src/org/jetbrains/jet/lexer/_JetLexer.java index cf78da8b5e8..058f8b15a56 100644 --- a/idea/src/org/jetbrains/jet/lexer/_JetLexer.java +++ b/idea/src/org/jetbrains/jet/lexer/_JetLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 3/16/11 3:06 PM */ +/* The following code was generated by JFlex 1.4.3 on 4/7/11 5:16 PM */ /* It's an automatically generated code. Do not modify it. */ package org.jetbrains.jet.lexer; @@ -13,7 +13,7 @@ import org.jetbrains.jet.lexer.JetTokens; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 3/16/11 3:06 PM from the specification file + * on 4/7/11 5:16 PM from the specification file * /Users/abreslav/work/jet/idea/src/org/jetbrains/jet/lexer/Jet.flex */ class _JetLexer implements FlexLexer { @@ -149,14 +149,13 @@ class _JetLexer implements FlexLexer { "\1\51\7\3\1\52\1\53\1\54\11\3\1\55\1\56"+ "\1\57\1\0\1\60\1\61\1\62\1\63\1\64\1\65"+ "\1\66\1\67\1\70\1\71\1\72\1\35\1\3\2\0"+ - "\1\42\1\73\1\0\1\35\2\0\1\13\1\74\1\3"+ - "\1\75\6\3\1\76\6\3\1\77\1\100\4\3\1\101"+ - "\1\102\1\103\1\104\1\105\1\106\1\36\1\37\1\0"+ - "\2\73\1\35\2\0\1\3\1\107\1\3\1\110\2\3"+ - "\1\111\1\112\1\113\5\3\1\114\1\3\1\115\1\42"+ - "\2\0\3\3\1\116\1\3\1\117\2\3\1\120\1\121"+ - "\1\122\1\74\3\3\1\123\1\124\1\125\5\3\1\126"+ - "\1\127\1\130"; + "\1\42\1\73\4\0\1\13\1\74\1\3\1\75\6\3"+ + "\1\76\6\3\1\77\1\100\4\3\1\101\1\102\1\103"+ + "\1\104\1\105\1\106\1\36\1\37\1\0\2\73\1\35"+ + "\2\0\1\3\1\107\1\3\1\110\2\3\1\111\1\112"+ + "\1\113\5\3\1\114\1\3\1\115\1\42\2\0\3\3"+ + "\1\116\1\3\1\117\2\3\1\120\1\121\1\122\1\74"+ + "\3\3\1\123\1\124\1\125\5\3\1\126\1\127\1\130"; private static int [] zzUnpackAction() { int [] result = new int[204]; @@ -355,99 +354,99 @@ class _JetLexer implements FlexLexer { "\2\163\1\230\1\163\4\0\3\163\1\0\1\163\1\0"+ "\1\163\3\0\30\163\23\0\12\164\1\231\66\164\11\232"+ "\1\233\1\165\66\232\1\0\1\100\12\0\1\100\65\0"+ - "\2\234\11\0\1\234\1\0\1\234\1\157\1\234\1\0"+ - "\1\170\4\0\1\234\1\0\1\234\1\0\1\170\1\234"+ - "\7\0\2\234\7\0\1\234\24\0\1\160\12\0\1\160"+ - "\4\0\1\235\36\0\1\235\37\0\1\157\61\0\25\173"+ - "\1\236\53\173\1\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\3\4"+ - "\1\237\24\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\23\4"+ - "\1\240\4\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\3\4"+ - "\1\241\24\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\3\4"+ - "\1\242\24\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\10\4"+ - "\1\243\17\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\4\4"+ - "\1\244\23\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\3\4"+ - "\1\245\24\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\3\4"+ - "\1\246\24\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\4\4"+ - "\1\247\23\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\12\4"+ - "\1\250\15\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\3\4"+ - "\1\251\24\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\13\4"+ - "\1\252\14\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\4\4"+ - "\1\253\23\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\1\4"+ - "\1\254\26\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\1\255"+ - "\27\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\23\4\1\256"+ - "\4\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\4\4\1\257"+ - "\23\4\23\0\11\164\1\260\1\231\66\164\12\232\1\261"+ - "\66\232\1\0\2\234\11\0\1\234\1\0\1\234\1\0"+ - "\1\234\1\0\1\170\4\0\1\234\1\0\1\234\1\0"+ - "\1\170\1\234\7\0\2\234\7\0\1\234\23\0\25\173"+ - "\1\262\53\173\1\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\4\4"+ - "\1\263\23\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\1\264"+ - "\27\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\11\4\1\265"+ - "\16\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\4\4\1\266"+ - "\23\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\12\4\1\267"+ - "\15\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\21\4\1\270"+ - "\6\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\6\4\1\271"+ - "\21\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\14\4\1\272"+ - "\13\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\3\4\1\273"+ - "\24\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\24\4\1\274"+ - "\3\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\3\4\1\275"+ - "\24\4\23\0\11\232\1\233\1\261\66\232\25\173\1\276"+ - "\53\173\1\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\5\4\1\277"+ - "\22\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\4\4\1\300"+ - "\23\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\1\301\27\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\16\4\1\302\11\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\10\4\1\303\17\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\1\304\27\4\24\0"+ + "\2\234\11\0\1\234\1\0\1\234\1\157\1\234\6\0"+ + "\1\234\1\0\1\234\2\0\1\234\7\0\2\234\7\0"+ + "\1\234\24\0\1\160\12\0\1\160\4\0\1\235\36\0"+ + "\1\235\37\0\1\157\61\0\25\173\1\236\53\173\1\0"+ "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\1\4\1\305\26\4\24\0"+ + "\1\4\1\0\1\4\3\0\3\4\1\237\24\4\24\0"+ "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\11\4\1\306\16\4\24\0"+ + "\1\4\1\0\1\4\3\0\23\4\1\240\4\4\24\0"+ "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\13\4\1\307\14\4\24\0"+ + "\1\4\1\0\1\4\3\0\3\4\1\241\24\4\24\0"+ "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\6\4\1\310\21\4\24\0"+ + "\1\4\1\0\1\4\3\0\3\4\1\242\24\4\24\0"+ "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\12\4\1\311\15\4\24\0"+ + "\1\4\1\0\1\4\3\0\10\4\1\243\17\4\24\0"+ "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\3\4\1\312\24\4\24\0"+ + "\1\4\1\0\1\4\3\0\4\4\1\244\23\4\24\0"+ "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\3\4\1\313\24\4\24\0"+ + "\1\4\1\0\1\4\3\0\3\4\1\245\24\4\24\0"+ "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\1\314\27\4\23\0"; + "\1\4\1\0\1\4\3\0\3\4\1\246\24\4\24\0"+ + "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ + "\1\4\1\0\1\4\3\0\4\4\1\247\23\4\24\0"+ + "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ + "\1\4\1\0\1\4\3\0\12\4\1\250\15\4\24\0"+ + "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ + "\1\4\1\0\1\4\3\0\3\4\1\251\24\4\24\0"+ + "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ + "\1\4\1\0\1\4\3\0\13\4\1\252\14\4\24\0"+ + "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ + "\1\4\1\0\1\4\3\0\4\4\1\253\23\4\24\0"+ + "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ + "\1\4\1\0\1\4\3\0\1\4\1\254\26\4\24\0"+ + "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ + "\1\4\1\0\1\4\3\0\1\255\27\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\23\4\1\256\4\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\4\4\1\257\23\4\23\0\11\164"+ + "\1\260\1\231\66\164\12\232\1\261\66\232\1\0\2\234"+ + "\11\0\1\234\1\0\1\234\1\0\1\234\1\0\1\170"+ + "\4\0\1\234\1\0\1\234\1\0\1\170\1\234\7\0"+ + "\2\234\7\0\1\234\23\0\25\173\1\262\53\173\1\0"+ + "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ + "\1\4\1\0\1\4\3\0\4\4\1\263\23\4\24\0"+ + "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ + "\1\4\1\0\1\4\3\0\1\264\27\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\11\4\1\265\16\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\4\4\1\266\23\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\12\4\1\267\15\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\21\4\1\270\6\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\6\4\1\271\21\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\14\4\1\272\13\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\3\4\1\273\24\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\24\4\1\274\3\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\3\4\1\275\24\4\23\0\11\232"+ + "\1\233\1\261\66\232\25\173\1\276\53\173\1\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\5\4\1\277\22\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\4\4\1\300\23\4\24\0\2\4"+ + "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ + "\1\0\1\4\3\0\1\301\27\4\24\0\2\4\1\0"+ + "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ + "\1\4\3\0\16\4\1\302\11\4\24\0\2\4\1\0"+ + "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ + "\1\4\3\0\10\4\1\303\17\4\24\0\2\4\1\0"+ + "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ + "\1\4\3\0\1\304\27\4\24\0\2\4\1\0\2\4"+ + "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ + "\3\0\1\4\1\305\26\4\24\0\2\4\1\0\2\4"+ + "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ + "\3\0\11\4\1\306\16\4\24\0\2\4\1\0\2\4"+ + "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ + "\3\0\13\4\1\307\14\4\24\0\2\4\1\0\2\4"+ + "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ + "\3\0\6\4\1\310\21\4\24\0\2\4\1\0\2\4"+ + "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ + "\3\0\12\4\1\311\15\4\24\0\2\4\1\0\2\4"+ + "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ + "\3\0\3\4\1\312\24\4\24\0\2\4\1\0\2\4"+ + "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ + "\3\0\3\4\1\313\24\4\24\0\2\4\1\0\2\4"+ + "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ + "\3\0\1\314\27\4\23\0"; private static int [] zzUnpackTrans() { int [] result = new int[8775]; @@ -494,9 +493,9 @@ class _JetLexer implements FlexLexer { "\1\0\1\11\43\1\1\11\1\1\11\11\1\0\1\1"+ "\1\0\1\1\1\0\1\1\1\0\1\11\2\1\2\11"+ "\4\1\5\11\35\1\1\11\1\0\1\1\12\11\1\1"+ - "\1\11\2\0\2\1\1\0\1\1\2\0\1\11\30\1"+ - "\6\11\1\0\1\1\1\11\1\1\2\0\21\1\1\11"+ - "\2\0\13\1\1\11\16\1"; + "\1\11\2\0\2\1\4\0\1\11\30\1\6\11\1\0"+ + "\1\1\1\11\1\1\2\0\21\1\1\11\2\0\13\1"+ + "\1\11\16\1"; private static int [] zzUnpackAttribute() { int [] result = new int[204]; @@ -640,7 +639,7 @@ class _JetLexer implements FlexLexer { /** - * Returns the text matched by the current regular element. + * Returns the text matched by the current regular expression. */ public final CharSequence yytext() { return zzBuffer.subSequence(zzStartRead, zzMarkedPos); @@ -727,7 +726,7 @@ class _JetLexer implements FlexLexer { /** - * Resumes scanning until the next regular element is matched, + * Resumes scanning until the next regular expression is matched, * the end of input is encountered or an I/O-Error occurs. * * @return the next token diff --git a/idea/testData/cfg/Assignments.instructions b/idea/testData/cfg/Assignments.instructions index b4421226be1..4fae5a8e674 100644 --- a/idea/testData/cfg/Assignments.instructions +++ b/idea/testData/cfg/Assignments.instructions @@ -31,11 +31,13 @@ l3: jf(l4) r(false) l4: + r(true && false) w(y) r(false) jf(l5) r(true) l5: + r(false && true) w(z) l1: diff --git a/idea/testData/cfg/Basic.instructions b/idea/testData/cfg/Basic.instructions index 56ac9c3888c..71f22395150 100644 --- a/idea/testData/cfg/Basic.instructions +++ b/idea/testData/cfg/Basic.instructions @@ -59,11 +59,13 @@ l0: jf(l4) r(true) l4: + r(a && true) r(a) jt(l5) r(false) -l1: l5: + r(a || false) +l1: l2: diff --git a/idea/testData/cfg/LazyBooleans.instructions b/idea/testData/cfg/LazyBooleans.instructions index 0819868b671..4b3f69e0e8e 100644 --- a/idea/testData/cfg/LazyBooleans.instructions +++ b/idea/testData/cfg/LazyBooleans.instructions @@ -54,10 +54,12 @@ l9: r(11) jmp(l11) l10: + read (Unit) l11: r(12) r(a) jf(l12) + read (Unit) jmp(l13) l12: r(13) diff --git a/idea/testData/cfg/Nonlocals.instructions b/idea/testData/cfg/Nonlocals.instructions index 56c7b0564ea..042f52d49af 100644 --- a/idea/testData/cfg/Nonlocals.instructions +++ b/idea/testData/cfg/Nonlocals.instructions @@ -11,8 +11,9 @@ l6: r(1) ret(*) jmp(l9) -l7: l8: + read (Unit) +l7: l9: ===================== @@ -62,6 +63,7 @@ l0: ret(*) jmp(l3) l2: + read (Unit) l3: r(1) rf({a => diff --git a/idea/testData/cfg/ReturnFromExpression.instructions b/idea/testData/cfg/ReturnFromExpression.instructions new file mode 100644 index 00000000000..1051a3a5a15 --- /dev/null +++ b/idea/testData/cfg/ReturnFromExpression.instructions @@ -0,0 +1,17 @@ +== blockAndAndMismatch == +fun blockAndAndMismatch() : Boolean { + (return true) || (return false) +} +--------------------- +l0: + + r(true) + ret(*) + jt(l2) + r(false) + ret(*) +l2: + r((return true) || (return false)) +l1: + +===================== diff --git a/idea/testData/cfg/ReturnFromExpression.jet b/idea/testData/cfg/ReturnFromExpression.jet new file mode 100644 index 00000000000..2bc7603b44b --- /dev/null +++ b/idea/testData/cfg/ReturnFromExpression.jet @@ -0,0 +1,3 @@ +fun blockAndAndMismatch() : Boolean { + (return true) || (return false) +} diff --git a/idea/testData/checker/FunctionReturnTypes.jet b/idea/testData/checker/FunctionReturnTypes.jet index fddd7b9b307..488d89c30c0 100644 --- a/idea/testData/checker/FunctionReturnTypes.jet +++ b/idea/testData/checker/FunctionReturnTypes.jet @@ -9,7 +9,7 @@ fun unitShort() : Unit = () fun unitShortConv() : Unit = 1 fun unitShortNull() : Unit = null -fun intEmpty() : Int {} +fun intEmpty() : Int {} fun intShortInfer() = 1 fun intShort() : Int = 1 fun intBlockInfer() {1} @@ -18,3 +18,73 @@ fun intBlock() : Int {1} fun blockReturnUnitMismatch() : Int {return} fun blockReturnValueTypeMismatch() : Int {return 3.4} fun blockReturnValueTypeMatch() : Int {return 1} +fun blockReturnValueTypeMismatchUnit() : Int {return ()} + +fun blockAndAndMismatch() : Int { + true && false +} +fun blockAndAndMismatch() : Int { + return true && false +} +fun blockAndAndMismatch() : Int { + (return true) && (return false) +} +/* +fun blockAndAndMismatch() : Int { + true || false +} +fun blockAndAndMismatch() : Int { + return true || false +} +fun blockAndAndMismatch() : Int { + (return true) || (return false) +} +fun blockReturnValueTypeMatch() : Int { + return if (1 > 2) 1.0 else 2.0 +} +fun blockReturnValueTypeMatch() : Int { + return if (1 > 2) 1.0 +} +fun blockReturnValueTypeMatch() : Int { + return if (1 > 2) else 1.0 +} +fun blockReturnValueTypeMatch() : Int { + if (1 > 2) + return 1.0 + else return 2.0 +} +fun blockReturnValueTypeMatch() : Int { + if (1 > 2) + return 1.0 + return 2.0 +} +fun blockReturnValueTypeMatch() : Int { + if (1 > 2) + else return 1.0 + return 2.0 +} +fun blockReturnValueTypeMatch() : Int { + if (1 > 2) + 1.0 + else 2.0 +} +fun blockReturnValueTypeMatch() : Int { + if (1 > 2) + 1.0 + else 2.0 + return 1 +} +fun blockReturnValueTypeMatch() : Int { + if (1 > 2) + 1.0 +} +fun blockReturnValueTypeMatch() : Int { + if (1 > 2) + else 1.0; +} +fun blockReturnValueTypeMatch() : Int { + if (1 > 2) + 1 + else 1.0 +} +*/ \ No newline at end of file diff --git a/idea/testData/psi/SimpleExpressions.jet b/idea/testData/psi/SimpleExpressions.jet index c162d289cae..8f0898dc334 100644 --- a/idea/testData/psi/SimpleExpressions.jet +++ b/idea/testData/psi/SimpleExpressions.jet @@ -33,7 +33,8 @@ fun a( a : foo = 10, a : foo = 10, a : foo = 10, - a : foo = 10 + a : foo = 10, + a : foo = 0xffffffff.lng ) { return 10 return diff --git a/idea/testData/psi/SimpleExpressions.txt b/idea/testData/psi/SimpleExpressions.txt index 8f4dc0157c4..ca1bbc6aad4 100644 --- a/idea/testData/psi/SimpleExpressions.txt +++ b/idea/testData/psi/SimpleExpressions.txt @@ -678,6 +678,26 @@ JetFile: SimpleExpressions.jet PsiWhiteSpace(' ') INTEGER_CONSTANT PsiElement(INTEGER_LITERAL)('10') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + DOT_QUALIFIED_EXPRESSION + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('0xffffffff') + PsiElement(DOT)('.') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('lng') PsiWhiteSpace('\n') PsiElement(RPAR)(')') PsiWhiteSpace(' ') diff --git a/idea/testData/resolve/ResolveToJava.jet b/idea/testData/resolve/ResolveToJava.jet index 379371816ef..1d41eb154ca 100644 --- a/idea/testData/resolve/ResolveToJava.jet +++ b/idea/testData/resolve/ResolveToJava.jet @@ -47,3 +47,7 @@ fun t(t : T) : T { System.out.`java::java.io.PrintStream.print(Int)`print(1) System.out.`java::java.io.PrintStream.print(Double)`print(1.0) } + +fun typeTransform() { + Integer.getInteger("", 239)`:std::Int` +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index 1cdda55e4be..96f69c92ad1 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -237,7 +237,7 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase { } public void testLongCmp() throws Exception { - loadText("fun foo(a: Long, b: Long): Long = if (a == b) 0xffffffffL else 0L"); + loadText("fun foo(a: Long, b: Long): Long = if (a == b) 0xffffffff else 0.lng"); System.out.println(generateToText()); final Method main = generateFunction(); assertEquals(0xffffffffL, main.invoke(null, 1, 1));