Tests for return types

Transformation for Java boxed types
Lexer fixed for hexadecimal doubles
Longs detected from literals
compareTo with self defined for numbers (working around an unsupported case)
This commit is contained in:
Andrey Breslav
2011-04-07 17:39:40 +04:00
parent 3cc3f374b9
commit f99472e9dd
24 changed files with 394 additions and 167 deletions
+6
View File
@@ -66,6 +66,7 @@ class Number : Hashable {
} }
class Double : Number, Comparable<Double> { class Double : Number, Comparable<Double> {
fun compareTo(other : Double) : Int
fun compareTo(other : Float) : Int fun compareTo(other : Float) : Int
fun compareTo(other : Long) : Int fun compareTo(other : Long) : Int
fun compareTo(other : Int) : Int fun compareTo(other : Int) : Int
@@ -128,6 +129,7 @@ class Double : Number, Comparable<Double> {
class Float : Number, Comparable<Float> { class Float : Number, Comparable<Float> {
fun compareTo(other : Double) : Int fun compareTo(other : Double) : Int
fun compareTo(other : Float) : Int
fun compareTo(other : Long) : Int fun compareTo(other : Long) : Int
fun compareTo(other : Int) : Int fun compareTo(other : Int) : Int
fun compareTo(other : Short) : Int fun compareTo(other : Short) : Int
@@ -191,6 +193,7 @@ class Float : Number, Comparable<Float> {
class Long : Number, Comparable<Long> { class Long : Number, Comparable<Long> {
fun compareTo(other : Double) : Int fun compareTo(other : Double) : Int
fun compareTo(other : Float) : Int fun compareTo(other : Float) : Int
fun compareTo(other : Long) : Int
fun compareTo(other : Int) : Int fun compareTo(other : Int) : Int
fun compareTo(other : Short) : Int fun compareTo(other : Short) : Int
fun compareTo(other : Byte) : Int fun compareTo(other : Byte) : Int
@@ -319,6 +322,7 @@ class Char : Number, Comparable<Char> {
fun compareTo(other : Long) : Int fun compareTo(other : Long) : Int
fun compareTo(other : Int) : Int fun compareTo(other : Int) : Int
fun compareTo(other : Short) : Int fun compareTo(other : Short) : Int
fun compareTo(other : Char) : Int
fun compareTo(other : Byte) : Int fun compareTo(other : Byte) : Int
fun plus(other : Double) : Double fun plus(other : Double) : Double
@@ -380,6 +384,7 @@ class Short : Number, Comparable<Short> {
fun compareTo(other : Float) : Int fun compareTo(other : Float) : Int
fun compareTo(other : Long) : Int fun compareTo(other : Long) : Int
fun compareTo(other : Int) : Int fun compareTo(other : Int) : Int
fun compareTo(other : Short) : Int
fun compareTo(other : Byte) : Int fun compareTo(other : Byte) : Int
fun compareTo(other : Char) : Int fun compareTo(other : Char) : Int
@@ -444,6 +449,7 @@ class Byte : Number, Comparable<Byte> {
fun compareTo(other : Int) : Int fun compareTo(other : Int) : Int
fun compareTo(other : Short) : Int fun compareTo(other : Short) : Int
fun compareTo(other : Char) : Int fun compareTo(other : Char) : Int
fun compareTo(other : Byte) : Int
fun plus(other : Double) : Double fun plus(other : Double) : Double
fun plus(other : Float) : Float fun plus(other : Float) : Float
@@ -11,42 +11,44 @@ import org.jetbrains.jet.lang.psi.JetExpression;
*/ */
public interface JetControlFlowBuilder { public interface JetControlFlowBuilder {
void readNode(@NotNull JetExpression expression); void readNode(@NotNull JetExpression expression);
void readUnit(@NotNull JetExpression expression);
// General label management // General label management
@NotNull @NotNull
Label createUnboundLabel(); Label createUnboundLabel();
void bindLabel(@NotNull Label label);
void bindLabel(@NotNull Label label);
// Jumps // Jumps
void jump(@NotNull Label label); void jump(@NotNull Label label);
void jumpOnFalse(@NotNull Label label); void jumpOnFalse(@NotNull Label label);
void jumpOnTrue(@NotNull Label label); void jumpOnTrue(@NotNull Label label);
void nondeterministicJump(Label label); // Maybe, jump to label void nondeterministicJump(Label label); // Maybe, jump to label
// Entry/exit points // Entry/exit points
Label getEntryPoint(@NotNull JetElement labelElement); Label getEntryPoint(@NotNull JetElement labelElement);
Label getExitPoint(@NotNull JetElement labelElement);
Label getExitPoint(@NotNull JetElement labelElement);
// Loops // Loops
Label enterLoop(@NotNull JetExpression expression, Label loopExitPoint); Label enterLoop(@NotNull JetExpression expression, Label loopExitPoint);
void exitLoop(@NotNull JetExpression expression); void exitLoop(@NotNull JetExpression expression);
@Nullable @Nullable
JetElement getCurrentLoop(); JetElement getCurrentLoop();
// Finally // Finally
void enterTryFinally(@NotNull JetBlockExpression expression); void enterTryFinally(@NotNull JetBlockExpression expression);
void exitTryFinally();
void exitTryFinally();
// Subroutines // Subroutines
void enterSubroutine(@NotNull JetElement subroutine, boolean isFunctionLiteral); void enterSubroutine(@NotNull JetElement subroutine, boolean isFunctionLiteral);
void exitSubroutine(@NotNull JetElement subroutine, boolean functionLiteral); void exitSubroutine(@NotNull JetElement subroutine, boolean functionLiteral);
@Nullable @Nullable
JetElement getCurrentSubroutine(); JetElement getCurrentSubroutine();
void returnValue(@NotNull JetElement subroutine); void returnValue(@NotNull JetElement subroutine);
void returnNoValue(@NotNull JetElement expression, @NotNull JetElement subroutine); void returnNoValue(@NotNull JetElement expression, @NotNull JetElement subroutine);
void writeNode(@NotNull JetElement assignment, @NotNull JetElement lValue); void writeNode(@NotNull JetElement assignment, @NotNull JetElement lValue);
@@ -21,6 +21,11 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder {
builder.readNode(expression); builder.readNode(expression);
} }
@Override
public void readUnit(@NotNull JetExpression expression) {
builder.readUnit(expression);
}
@Override @Override
@NotNull @NotNull
public Label createUnboundLabel() { public Label createUnboundLabel() {
@@ -40,7 +40,7 @@ public class JetControlFlowProcessor {
boolean functionLiteral = subroutineElement instanceof JetFunctionLiteralExpression; boolean functionLiteral = subroutineElement instanceof JetFunctionLiteralExpression;
builder.enterSubroutine(subroutineElement, functionLiteral); builder.enterSubroutine(subroutineElement, functionLiteral);
for (JetElement statement : body) { for (JetElement statement : body) {
statement.accept(new CFPVisitor(preferBlocks)); statement.accept(new CFPVisitor(preferBlocks, false));
} }
builder.exitSubroutine(subroutineElement, functionLiteral); builder.exitSubroutine(subroutineElement, functionLiteral);
} }
@@ -89,18 +89,20 @@ public class JetControlFlowProcessor {
private class CFPVisitor extends JetVisitor { private class CFPVisitor extends JetVisitor {
private final boolean preferBlock; private final boolean preferBlock;
private final boolean inCondition;
private CFPVisitor(boolean preferBlock) { private CFPVisitor(boolean preferBlock, boolean inCondition) {
this.preferBlock = preferBlock; 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; CFPVisitor visitor;
if (this.preferBlock == preferBlock) { if (this.preferBlock == preferBlock && this.inCondition == inCondition) {
visitor = this; visitor = this;
} }
else { else {
visitor = new CFPVisitor(preferBlock); visitor = new CFPVisitor(preferBlock, inCondition);
} }
element.accept(visitor); element.accept(visitor);
exitElement(element); exitElement(element);
@@ -110,7 +112,7 @@ public class JetControlFlowProcessor {
public void visitParenthesizedExpression(JetParenthesizedExpression expression) { public void visitParenthesizedExpression(JetParenthesizedExpression expression) {
JetExpression innerExpression = expression.getExpression(); JetExpression innerExpression = expression.getExpression();
if (innerExpression != null) { if (innerExpression != null) {
value(innerExpression, false); value(innerExpression, false, inCondition);
} }
} }
@@ -142,7 +144,7 @@ public class JetControlFlowProcessor {
JetExpression deparenthesized = JetPsiUtil.deparenthesize(labeledExpression); JetExpression deparenthesized = JetPsiUtil.deparenthesize(labeledExpression);
if (deparenthesized != null) { if (deparenthesized != null) {
enterLabeledElement(labelName, deparenthesized); enterLabeledElement(labelName, deparenthesized);
value(labeledExpression, false); value(labeledExpression, false, inCondition);
} }
} }
@@ -151,27 +153,33 @@ public class JetControlFlowProcessor {
IElementType operationType = expression.getOperationReference().getReferencedNameElementType(); IElementType operationType = expression.getOperationReference().getReferencedNameElementType();
JetExpression right = expression.getRight(); JetExpression right = expression.getRight();
if (operationType == JetTokens.ANDAND) { if (operationType == JetTokens.ANDAND) {
value(expression.getLeft(), false); value(expression.getLeft(), false, true);
Label resultLabel = builder.createUnboundLabel(); Label resultLabel = builder.createUnboundLabel();
builder.jumpOnFalse(resultLabel); builder.jumpOnFalse(resultLabel);
if (right != null) { if (right != null) {
value(right, false); value(right, false, true);
} }
builder.bindLabel(resultLabel); builder.bindLabel(resultLabel);
if (!inCondition) {
builder.readNode(expression);
}
} }
else if (operationType == JetTokens.OROR) { else if (operationType == JetTokens.OROR) {
value(expression.getLeft(), false); value(expression.getLeft(), false, true);
Label resultLabel = builder.createUnboundLabel(); Label resultLabel = builder.createUnboundLabel();
builder.jumpOnTrue(resultLabel); builder.jumpOnTrue(resultLabel);
if (right != null) { if (right != null) {
value(right, false); value(right, false, true);
} }
builder.bindLabel(resultLabel); builder.bindLabel(resultLabel);
if (!inCondition) {
builder.readNode(expression);
}
} }
else if (operationType == JetTokens.EQ) { else if (operationType == JetTokens.EQ) {
JetExpression left = expression.getLeft(); JetExpression left = expression.getLeft();
if (right != null) { if (right != null) {
value(right, false); value(right, false, false);
} }
if (left instanceof JetSimpleNameExpression) { if (left instanceof JetSimpleNameExpression) {
builder.writeNode(expression, left); builder.writeNode(expression, left);
@@ -182,9 +190,9 @@ public class JetControlFlowProcessor {
} }
else if (JetTypeInferrer.assignmentOperationNames.containsKey(operationType)) { else if (JetTypeInferrer.assignmentOperationNames.containsKey(operationType)) {
JetExpression left = expression.getLeft(); JetExpression left = expression.getLeft();
value(left, false); value(left, false, false);
if (right != null) { if (right != null) {
value(right, false); value(right, false, false);
} }
if (left instanceof JetSimpleNameExpression) { if (left instanceof JetSimpleNameExpression) {
builder.writeNode(expression, left); builder.writeNode(expression, left);
@@ -194,11 +202,11 @@ public class JetControlFlowProcessor {
} }
} }
else { else {
value(expression.getLeft(), false); value(expression.getLeft(), false, false);
if (right != null) { if (right != null) {
value(right, false); value(right, false, false);
} }
value(expression.getOperationReference(), false); value(expression.getOperationReference(), false, false);
builder.readNode(expression); builder.readNode(expression);
} }
} }
@@ -218,22 +226,30 @@ public class JetControlFlowProcessor {
@Override @Override
public void visitIfExpression(JetIfExpression expression) { public void visitIfExpression(JetIfExpression expression) {
value(expression.getCondition(), false); value(expression.getCondition(), false, true);
Label elseLabel = builder.createUnboundLabel(); Label elseLabel = builder.createUnboundLabel();
builder.jumpOnFalse(elseLabel); builder.jumpOnFalse(elseLabel);
JetExpression then = expression.getThen(); JetExpression thenBranch = expression.getThen();
if (then != null) { if (thenBranch != null) {
value(then, true); value(thenBranch, true, inCondition);
}
else {
builder.readUnit(expression);
} }
Label resultLabel = builder.createUnboundLabel(); Label resultLabel = builder.createUnboundLabel();
builder.jump(resultLabel); builder.jump(resultLabel);
builder.bindLabel(elseLabel); builder.bindLabel(elseLabel);
JetExpression elseBranch = expression.getElse(); JetExpression elseBranch = expression.getElse();
if (elseBranch != null) { if (elseBranch != null) {
value(elseBranch, true); value(elseBranch, true, inCondition);
}
else {
builder.readUnit(expression);
} }
builder.bindLabel(resultLabel); builder.bindLabel(resultLabel);
// builder.readNode(element); // if (!inCondition) {
// builder.readNode(expression);
// }
} }
@Override @Override
@@ -245,13 +261,13 @@ public class JetControlFlowProcessor {
List<JetCatchClause> catchClauses = expression.getCatchClauses(); List<JetCatchClause> catchClauses = expression.getCatchClauses();
if (catchClauses.isEmpty()) { if (catchClauses.isEmpty()) {
value(expression.getTryBlock(), true); value(expression.getTryBlock(), true, false);
} }
else { else {
Label catchBlock = builder.createUnboundLabel(); Label catchBlock = builder.createUnboundLabel();
builder.nondeterministicJump(catchBlock); builder.nondeterministicJump(catchBlock);
value(expression.getTryBlock(), true); value(expression.getTryBlock(), true, false);
Label afterCatches = builder.createUnboundLabel(); Label afterCatches = builder.createUnboundLabel();
builder.jump(afterCatches); builder.jump(afterCatches);
@@ -259,7 +275,7 @@ public class JetControlFlowProcessor {
builder.bindLabel(catchBlock); builder.bindLabel(catchBlock);
for (Iterator<JetCatchClause> iterator = catchClauses.iterator(); iterator.hasNext(); ) { for (Iterator<JetCatchClause> iterator = catchClauses.iterator(); iterator.hasNext(); ) {
JetCatchClause catchClause = iterator.next(); JetCatchClause catchClause = iterator.next();
value(catchClause.getCatchBody(), true); value(catchClause.getCatchBody(), true, false);
if (iterator.hasNext()) { if (iterator.hasNext()) {
builder.nondeterministicJump(afterCatches); builder.nondeterministicJump(afterCatches);
} }
@@ -277,9 +293,9 @@ public class JetControlFlowProcessor {
public void visitWhileExpression(JetWhileExpression expression) { public void visitWhileExpression(JetWhileExpression expression) {
Label loopExitPoint = builder.createUnboundLabel(); Label loopExitPoint = builder.createUnboundLabel();
Label loopEntryPoint = builder.enterLoop(expression, loopExitPoint); Label loopEntryPoint = builder.enterLoop(expression, loopExitPoint);
value(expression.getCondition(), false); value(expression.getCondition(), false, true);
builder.jumpOnFalse(loopExitPoint); builder.jumpOnFalse(loopExitPoint);
value(expression.getBody(), true); value(expression.getBody(), true, false);
builder.jump(loopEntryPoint); builder.jump(loopEntryPoint);
builder.exitLoop(expression); builder.exitLoop(expression);
} }
@@ -288,18 +304,18 @@ public class JetControlFlowProcessor {
public void visitDoWhileExpression(JetDoWhileExpression expression) { public void visitDoWhileExpression(JetDoWhileExpression expression) {
Label loopExitPoint = builder.createUnboundLabel(); Label loopExitPoint = builder.createUnboundLabel();
Label loopEntryPoint = builder.enterLoop(expression, loopExitPoint); Label loopEntryPoint = builder.enterLoop(expression, loopExitPoint);
value(expression.getBody(), true); value(expression.getBody(), true, false);
value(expression.getCondition(), false); value(expression.getCondition(), false, true);
builder.jumpOnTrue(loopEntryPoint); builder.jumpOnTrue(loopEntryPoint);
builder.exitLoop(expression); builder.exitLoop(expression);
} }
@Override @Override
public void visitForExpression(JetForExpression expression) { public void visitForExpression(JetForExpression expression) {
value(expression.getLoopRange(), false); value(expression.getLoopRange(), false, false);
Label loopExitPoint = builder.createUnboundLabel(); Label loopExitPoint = builder.createUnboundLabel();
Label loopEntryPoint = builder.enterLoop(expression, loopExitPoint); Label loopEntryPoint = builder.enterLoop(expression, loopExitPoint);
value(expression.getBody(), true); value(expression.getBody(), true, false);
builder.nondeterministicJump(loopEntryPoint); builder.nondeterministicJump(loopEntryPoint);
builder.exitLoop(expression); builder.exitLoop(expression);
} }
@@ -351,7 +367,7 @@ public class JetControlFlowProcessor {
public void visitReturnExpression(JetReturnExpression expression) { public void visitReturnExpression(JetReturnExpression expression) {
JetExpression returnedExpression = expression.getReturnedExpression(); JetExpression returnedExpression = expression.getReturnedExpression();
if (returnedExpression != null) { if (returnedExpression != null) {
value(returnedExpression, false); value(returnedExpression, false, false);
} }
JetSimpleNameExpression labelElement = expression.getTargetLabel(); JetSimpleNameExpression labelElement = expression.getTargetLabel();
JetElement subroutine; JetElement subroutine;
@@ -377,7 +393,7 @@ public class JetControlFlowProcessor {
@Override @Override
public void visitBlockExpression(JetBlockExpression expression) { public void visitBlockExpression(JetBlockExpression expression) {
for (JetElement statement : expression.getStatements()) { for (JetElement statement : expression.getStatements()) {
value(statement, true); value(statement, true, false);
} }
} }
@@ -390,7 +406,7 @@ public class JetControlFlowProcessor {
public void visitFunctionLiteralExpression(JetFunctionLiteralExpression expression) { public void visitFunctionLiteralExpression(JetFunctionLiteralExpression expression) {
if (preferBlock && !expression.hasParameterSpecification()) { if (preferBlock && !expression.hasParameterSpecification()) {
for (JetElement statement : expression.getBody()) { for (JetElement statement : expression.getBody()) {
value(statement, true); value(statement, true, false);
} }
} }
else { else {
@@ -400,10 +416,10 @@ public class JetControlFlowProcessor {
@Override @Override
public void visitQualifiedExpression(JetQualifiedExpression expression) { public void visitQualifiedExpression(JetQualifiedExpression expression) {
value(expression.getReceiverExpression(), false); value(expression.getReceiverExpression(), false, false);
JetExpression selectorExpression = expression.getSelectorExpression(); JetExpression selectorExpression = expression.getSelectorExpression();
if (selectorExpression != null) { if (selectorExpression != null) {
value(selectorExpression, false); value(selectorExpression, false, false);
} }
builder.readNode(expression); builder.readNode(expression);
} }
@@ -411,21 +427,21 @@ public class JetControlFlowProcessor {
@Override @Override
public void visitCallExpression(JetCallExpression expression) { public void visitCallExpression(JetCallExpression expression) {
for (JetTypeProjection typeArgument : expression.getTypeArguments()) { for (JetTypeProjection typeArgument : expression.getTypeArguments()) {
value(typeArgument, false); value(typeArgument, false, false);
} }
for (JetArgument argument : expression.getValueArguments()) { for (JetArgument argument : expression.getValueArguments()) {
JetExpression argumentExpression = argument.getArgumentExpression(); JetExpression argumentExpression = argument.getArgumentExpression();
if (argumentExpression != null) { if (argumentExpression != null) {
value(argumentExpression, false); value(argumentExpression, false, false);
} }
} }
for (JetExpression functionLiteral : expression.getFunctionLiteralArguments()) { for (JetExpression functionLiteral : expression.getFunctionLiteralArguments()) {
value(functionLiteral, false); value(functionLiteral, false, false);
} }
value(expression.getCalleeExpression(), false); value(expression.getCalleeExpression(), false, false);
builder.readNode(expression); builder.readNode(expression);
} }
@@ -433,7 +449,7 @@ public class JetControlFlowProcessor {
public void visitProperty(JetProperty property) { public void visitProperty(JetProperty property) {
JetExpression initializer = property.getInitializer(); JetExpression initializer = property.getInitializer();
if (initializer != null) { if (initializer != null) {
value(initializer, false); value(initializer, false, false);
builder.writeNode(property, property); builder.writeNode(property, property);
} }
} }
@@ -441,7 +457,7 @@ public class JetControlFlowProcessor {
@Override @Override
public void visitTupleExpression(JetTupleExpression expression) { public void visitTupleExpression(JetTupleExpression expression) {
for (JetExpression entry : expression.getEntries()) { for (JetExpression entry : expression.getEntries()) {
value(entry, false); value(entry, false, false);
} }
builder.readNode(expression); builder.readNode(expression);
} }
@@ -58,4 +58,8 @@ public class InstructionVisitor {
public void visitWriteValue(WriteValueInstruction writeValueInstruction) { public void visitWriteValue(WriteValueInstruction writeValueInstruction) {
visitInstructionWithNext(writeValueInstruction); visitInstructionWithNext(writeValueInstruction);
} }
public void visitReadUnitValue(ReadUnitValueInstruction instruction) {
visitInstructionWithNext(instruction);
}
} }
@@ -170,6 +170,11 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
add(new ReadValueInstruction(expression)); add(new ReadValueInstruction(expression));
} }
@Override
public void readUnit(@NotNull JetExpression expression) {
add(new ReadUnitValueInstruction(expression));
}
@Override @Override
public void jump(@NotNull Label label) { public void jump(@NotNull Label label) {
add(new UnconditionalJumpInstruction(label)); add(new UnconditionalJumpInstruction(label));
@@ -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)";
}
}
@@ -24,7 +24,12 @@ public class JetConstantExpression extends JetExpression {
if (elementType == JetNodeTypes.INTEGER_CONSTANT) { if (elementType == JetNodeTypes.INTEGER_CONSTANT) {
if (nodeText.startsWith("0x") || nodeText.startsWith("0X")) { 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")) { if (nodeText.startsWith("0b") || nodeText.startsWith("0B")) {
return Integer.parseInt(nodeText.substring(2), 2); return Integer.parseInt(nodeText.substring(2), 2);
@@ -375,6 +375,11 @@ public class TopDownAnalyzer {
processPreviousInstructions(instruction, returnedExpressions, elementsReturningUnit); processPreviousInstructions(instruction, returnedExpressions, elementsReturningUnit);
} }
@Override
public void visitReadUnitValue(ReadUnitValueInstruction instruction) {
returnedExpressions.add((JetExpression) instruction.getElement());
}
@Override @Override
public void visitInstruction(Instruction instruction) { public void visitInstruction(Instruction instruction) {
if (instruction instanceof JetElementInstruction) { if (instruction instanceof JetElementInstruction) {
@@ -17,6 +17,7 @@ public class JavaTypeTransformer {
private final JavaDescriptorResolver resolver; private final JavaDescriptorResolver resolver;
private final JetStandardLibrary standardLibrary; private final JetStandardLibrary standardLibrary;
private Map<String, JetType> primitiveTypesMap; private Map<String, JetType> primitiveTypesMap;
private Map<String, JetType> classTypesMap;
public JavaTypeTransformer(JetStandardLibrary standardLibrary, JavaDescriptorResolver resolver) { public JavaTypeTransformer(JetStandardLibrary standardLibrary, JavaDescriptorResolver resolver) {
this.resolver = resolver; this.resolver = resolver;
@@ -33,12 +34,9 @@ public class JavaTypeTransformer {
return ErrorUtils.createErrorType("Unresolved java class: " + classType.getPresentableText()); return ErrorUtils.createErrorType("Unresolved java class: " + classType.getPresentableText());
} }
if ("java.lang.Object".equals(psiClass.getQualifiedName())) { JetType jetAnalog = getClassTypesMap().get(psiClass.getQualifiedName());
return JetStandardClasses.getNullableAnyType(); if (jetAnalog != null) {
} return jetAnalog;
if ("java.lang.String".equals(psiClass.getQualifiedName())) {
return standardLibrary.getNullableStringType();
} }
ClassDescriptor descriptor = resolver.resolveClass(psiClass); ClassDescriptor descriptor = resolver.resolveClass(psiClass);
@@ -85,7 +83,32 @@ public class JavaTypeTransformer {
primitiveTypesMap.put("double", standardLibrary.getDoubleType()); primitiveTypesMap.put("double", standardLibrary.getDoubleType());
primitiveTypesMap.put("boolean", standardLibrary.getBooleanType()); primitiveTypesMap.put("boolean", standardLibrary.getBooleanType());
primitiveTypesMap.put("void", JetStandardClasses.getUnitType()); 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; return primitiveTypesMap;
} }
public Map<String, JetType> getClassTypesMap() {
if (classTypesMap == null) {
classTypesMap = new HashMap<String, JetType>();
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;
}
} }
@@ -298,7 +298,12 @@ public class JetTypeInferrer {
} }
} }
else { 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; JetExpression expression = (JetExpression) element;
semanticServices.getErrorHandler().typeMismatch(expression, expectedReturnType, actualType); semanticServices.getErrorHandler().typeMismatch(expression, expectedReturnType, actualType);
} }
@@ -497,7 +502,13 @@ public class JetTypeInferrer {
IElementType elementType = expression.getNode().getElementType(); IElementType elementType = expression.getNode().getElementType();
JetStandardLibrary standardLibrary = semanticServices.getStandardLibrary(); JetStandardLibrary standardLibrary = semanticServices.getStandardLibrary();
if (elementType == JetNodeTypes.INTEGER_CONSTANT) { 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) { } else if (elementType == JetNodeTypes.LONG_CONSTANT) {
result = standardLibrary.getLongType(); result = standardLibrary.getLongType();
} else if (elementType == JetNodeTypes.FLOAT_CONSTANT) { } else if (elementType == JetNodeTypes.FLOAT_CONSTANT) {
@@ -1222,9 +1233,7 @@ public class JetTypeInferrer {
} }
private boolean isBoolean(@NotNull JetType type) { private boolean isBoolean(@NotNull JetType type) {
if (type.isNullable()) return false; return semanticServices.getTypeChecker().isConvertibleTo(type, semanticServices.getStandardLibrary().getBooleanType());
TypeConstructor booleanTypeConstructor = semanticServices.getStandardLibrary().getBoolean().getTypeConstructor();
return type.getConstructor().equals(booleanTypeConstructor) || ErrorUtils.isErrorType(type);
} }
@Override @Override
+2 -1
View File
@@ -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}[Dd]?
HEX_DOUBLE_LITERAL={HEX_SIGNIFICAND}{BINARY_EXPONENT}? HEX_DOUBLE_LITERAL={HEX_SIGNIFICAND}{BINARY_EXPONENT}?
BINARY_EXPONENT=[Pp][+-]?{DIGIT}+ 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})*("'"|\\)? CHARACTER_LITERAL="'"([^\\\'\n]|{ESCAPE_SEQUENCE})*("'"|\\)?
// TODO: introduce symbols (e.g. 'foo) as another way to write string literals // TODO: introduce symbols (e.g. 'foo) as another way to write string literals
+99 -100
View File
@@ -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. */ /* It's an automatically generated code. Do not modify it. */
package org.jetbrains.jet.lexer; package org.jetbrains.jet.lexer;
@@ -13,7 +13,7 @@ import org.jetbrains.jet.lexer.JetTokens;
/** /**
* This class is a scanner generated by * This class is a scanner generated by
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3 * <a href="http://www.jflex.de/">JFlex</a> 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
* <tt>/Users/abreslav/work/jet/idea/src/org/jetbrains/jet/lexer/Jet.flex</tt> * <tt>/Users/abreslav/work/jet/idea/src/org/jetbrains/jet/lexer/Jet.flex</tt>
*/ */
class _JetLexer implements FlexLexer { 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\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\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\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\42\1\73\4\0\1\13\1\74\1\3\1\75\6\3"+
"\1\75\6\3\1\76\6\3\1\77\1\100\4\3\1\101"+ "\1\76\6\3\1\77\1\100\4\3\1\101\1\102\1\103"+
"\1\102\1\103\1\104\1\105\1\106\1\36\1\37\1\0"+ "\1\104\1\105\1\106\1\36\1\37\1\0\2\73\1\35"+
"\2\73\1\35\2\0\1\3\1\107\1\3\1\110\2\3"+ "\2\0\1\3\1\107\1\3\1\110\2\3\1\111\1\112"+
"\1\111\1\112\1\113\5\3\1\114\1\3\1\115\1\42"+ "\1\113\5\3\1\114\1\3\1\115\1\42\2\0\3\3"+
"\2\0\3\3\1\116\1\3\1\117\2\3\1\120\1\121"+ "\1\116\1\3\1\117\2\3\1\120\1\121\1\122\1\74"+
"\1\122\1\74\3\3\1\123\1\124\1\125\5\3\1\126"+ "\3\3\1\123\1\124\1\125\5\3\1\126\1\127\1\130";
"\1\127\1\130";
private static int [] zzUnpackAction() { private static int [] zzUnpackAction() {
int [] result = new int[204]; 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"+ "\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\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"+ "\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"+ "\2\234\11\0\1\234\1\0\1\234\1\157\1\234\6\0"+
"\1\170\4\0\1\234\1\0\1\234\1\0\1\170\1\234"+ "\1\234\1\0\1\234\2\0\1\234\7\0\2\234\7\0"+
"\7\0\2\234\7\0\1\234\24\0\1\160\12\0\1\160"+ "\1\234\24\0\1\160\12\0\1\160\4\0\1\235\36\0"+
"\4\0\1\235\36\0\1\235\37\0\1\157\61\0\25\173"+ "\1\235\37\0\1\157\61\0\25\173\1\236\53\173\1\0"+
"\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\4\1\0\2\4\1\0\1\4\4\0\3\4\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"+ "\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"+ "\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"+ "\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"+ "\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"+ "\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"+ "\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"+ "\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() { private static int [] zzUnpackTrans() {
int [] result = new int[8775]; 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\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"+ "\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"+ "\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"+ "\1\11\2\0\2\1\4\0\1\11\30\1\6\11\1\0"+
"\6\11\1\0\1\1\1\11\1\1\2\0\21\1\1\11"+ "\1\1\1\11\1\1\2\0\21\1\1\11\2\0\13\1"+
"\2\0\13\1\1\11\16\1"; "\1\11\16\1";
private static int [] zzUnpackAttribute() { private static int [] zzUnpackAttribute() {
int [] result = new int[204]; 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() { public final CharSequence yytext() {
return zzBuffer.subSequence(zzStartRead, zzMarkedPos); 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. * the end of input is encountered or an I/O-Error occurs.
* *
* @return the next token * @return the next token
@@ -31,11 +31,13 @@ l3:
jf(l4) jf(l4)
r(false) r(false)
l4: l4:
r(true && false)
w(y) w(y)
r(false) r(false)
jf(l5) jf(l5)
r(true) r(true)
l5: l5:
r(false && true)
w(z) w(z)
l1: l1:
<END> <END>
+3 -1
View File
@@ -59,11 +59,13 @@ l0:
jf(l4) jf(l4)
r(true) r(true)
l4: l4:
r(a && true)
r(a) r(a)
jt(l5) jt(l5)
r(false) r(false)
l1:
l5: l5:
r(a || false)
l1:
<END> <END>
l2: l2:
<START> <START>
@@ -54,10 +54,12 @@ l9:
r(11) r(11)
jmp(l11) jmp(l11)
l10: l10:
read (Unit)
l11: l11:
r(12) r(12)
r(a) r(a)
jf(l12) jf(l12)
read (Unit)
jmp(l13) jmp(l13)
l12: l12:
r(13) r(13)
+3 -1
View File
@@ -11,8 +11,9 @@ l6:
r(1) r(1)
ret(*) ret(*)
jmp(l9) jmp(l9)
l7:
l8: l8:
read (Unit)
l7:
l9: l9:
<END> <END>
===================== =====================
@@ -62,6 +63,7 @@ l0:
ret(*) ret(*)
jmp(l3) jmp(l3)
l2: l2:
read (Unit)
l3: l3:
r(1) r(1)
rf({a => rf({a =>
@@ -0,0 +1,17 @@
== blockAndAndMismatch ==
fun blockAndAndMismatch() : Boolean {
(return true) || (return false)
}
---------------------
l0:
<START>
r(true)
ret(*)
jt(l2)
r(false)
ret(*)
l2:
r((return true) || (return false))
l1:
<END>
=====================
@@ -0,0 +1,3 @@
fun blockAndAndMismatch() : Boolean {
(return true) || (return false)
}
+71 -1
View File
@@ -9,7 +9,7 @@ fun unitShort() : Unit = ()
fun unitShortConv() : Unit = 1 fun unitShortConv() : Unit = 1
fun unitShortNull() : Unit = null fun unitShortNull() : Unit = null
<error>fun intEmpty() : Int {}</error> fun intEmpty() : Int <error>{}</error>
fun intShortInfer() = 1 fun intShortInfer() = 1
fun intShort() : Int = 1 fun intShort() : Int = 1
fun intBlockInfer() {1} fun intBlockInfer() {1}
@@ -18,3 +18,73 @@ fun intBlock() : Int {1}
fun blockReturnUnitMismatch() : Int {<error>return</error>} fun blockReturnUnitMismatch() : Int {<error>return</error>}
fun blockReturnValueTypeMismatch() : Int {return <error>3.4</error>} fun blockReturnValueTypeMismatch() : Int {return <error>3.4</error>}
fun blockReturnValueTypeMatch() : Int {return 1} fun blockReturnValueTypeMatch() : Int {return 1}
fun blockReturnValueTypeMismatchUnit() : Int {return <error>()</error>}
fun blockAndAndMismatch() : Int {
<error>true && false</error>
}
fun blockAndAndMismatch() : Int {
return <error>true && false</error>
}
fun blockAndAndMismatch() : Int {
<error>(return <error>true</error>) && (return <error>false</error>)</error>
}
/*
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
}
*/
+2 -1
View File
@@ -33,7 +33,8 @@ fun a(
a : foo = 10, a : foo = 10,
a : foo = 10, a : foo = 10,
a : foo = 10, a : foo = 10,
a : foo = 10 a : foo = 10,
a : foo = 0xffffffff.lng
) { ) {
return 10 return 10
return return
+20
View File
@@ -678,6 +678,26 @@ JetFile: SimpleExpressions.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
INTEGER_CONSTANT INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('10') 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') PsiWhiteSpace('\n')
PsiElement(RPAR)(')') PsiElement(RPAR)(')')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
+4
View File
@@ -47,3 +47,7 @@ fun <T> t(t : T) : T {
System.out.`java::java.io.PrintStream.print(Int)`print(1) System.out.`java::java.io.PrintStream.print(Int)`print(1)
System.out.`java::java.io.PrintStream.print(Double)`print(1.0) System.out.`java::java.io.PrintStream.print(Double)`print(1.0)
} }
fun typeTransform() {
Integer.getInteger("", 239)`:std::Int`
}
@@ -237,7 +237,7 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase {
} }
public void testLongCmp() throws Exception { 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()); System.out.println(generateToText());
final Method main = generateFunction(); final Method main = generateFunction();
assertEquals(0xffffffffL, main.invoke(null, 1, 1)); assertEquals(0xffffffffL, main.invoke(null, 1, 1));