diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index d947f685776..91c126fd77d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -200,7 +200,7 @@ public class ExpressionCodegen extends JetVisitor { final JetExpression loopRange = expression.getLoopRange(); final JetType expressionType = bindingContext.get(BindingContext.EXPRESSION_TYPE, loopRange); Type loopRangeType = typeMapper.mapType(expressionType); - if (state.getStandardLibrary().getArray().equals(expressionType.getConstructor().getDeclarationDescriptor())) { + if (loopRangeType.getSort() == Type.ARRAY) { new ForInArrayLoopGenerator(expression, loopRangeType).invoke(); return StackValue.none(); } @@ -1688,12 +1688,21 @@ public class ExpressionCodegen extends JetVisitor { private void generateNewArray(JetCallExpression expression, JetType arrayType) { List args = expression.getValueArguments(); - if (args.size() != 1) { - throw new CompilationException("array constructor requires one value argument"); + + boolean isArray = state.getStandardLibrary().getArray().equals(arrayType.getConstructor().getDeclarationDescriptor()); + if(isArray) { + if (args.size() != 2 && !arrayType.getArguments().get(0).getType().isNullable()) { + throw new CompilationException("array constructor of non-nullable type requires two arguments"); + } + } + else { + if (args.size() != 1) { + throw new CompilationException("primitive array constructor requires one argument"); + } } gen(args.get(0).getArgumentExpression(), Type.INT_TYPE); - if(state.getStandardLibrary().getArray().equals(arrayType.getConstructor().getDeclarationDescriptor())) { + if(isArray) { JetType elementType = typeMapper.getGenericsElementType(arrayType); if(elementType != null) { generateTypeInfo(elementType); @@ -1707,6 +1716,42 @@ public class ExpressionCodegen extends JetVisitor { Type type = typeMapper.mapType(arrayType, OwnerKind.IMPLEMENTATION); v.newarray(type.getElementType()); } + + if(args.size() == 2) { + int sizeIndex = myMap.enterTemp(2); + int indexIndex = sizeIndex+1; + + v.dup(); + v.arraylength(); + v.store(sizeIndex, Type.INT_TYPE); + + v.iconst(0); + v.store(indexIndex, Type.INT_TYPE); + + gen(args.get(1).getArgumentExpression(), JetTypeMapper.TYPE_FUNCTION1); + + Label begin = new Label(); + Label end = new Label(); + v.visitLabel(begin); + v.load(indexIndex, Type.INT_TYPE); + v.load(sizeIndex, Type.INT_TYPE); + v.ificmpge(end); + + v.dup2(); + v.load(indexIndex, Type.INT_TYPE); + v.invokestatic("java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;"); + v.invokevirtual("jet/Function1", "invoke", "(Ljava/lang/Object;)Ljava/lang/Object;"); + v.load(indexIndex, Type.INT_TYPE); + v.iinc(indexIndex, 1); + v.swap(); + v.astore(JetTypeMapper.TYPE_OBJECT); + + v.goTo(begin); + v.visitLabel(end); + v.pop(); + + myMap.leaveTemp(2); + } } @Override diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 59ed3af11e1..61a1584b381 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.codegen; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import jet.Function1; import jet.JetObject; import jet.typeinfo.TypeInfo; import jet.typeinfo.TypeInfoProjection; @@ -56,6 +57,7 @@ public class JetTypeMapper { private final Map anonymousSubclassesCount = new HashMap(); private final HashMap knowTypes = new HashMap(); + public static final Type TYPE_FUNCTION1 = Type.getObjectType("jet/Function1"); public JetTypeMapper(JetStandardLibrary standardLibrary, BindingContext bindingContext) { this.standardLibrary = standardLibrary; diff --git a/compiler/frontend/src/jet/Library.jet b/compiler/frontend/src/jet/Library.jet index 672fc1ffe5a..f11575b99d3 100644 --- a/compiler/frontend/src/jet/Library.jet +++ b/compiler/frontend/src/jet/Library.jet @@ -49,7 +49,7 @@ trait Iterable { fun iterator() : Iterator } -class Array(val size : Int) { +class Array(val size : Int, init : fun(Int) : T = null ) { fun get(index : Int) : T fun set(index : Int, value : T) : Unit diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index cabc78f70a6..7cff43d00f5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -100,7 +100,6 @@ public interface Errors { DiagnosticWithParameterFactory PROPERTY_INITIALIZER_IN_TRAIT = DiagnosticWithParameterFactory.create(ERROR, "Property initializers are not allowed in traits", DiagnosticParameters.TYPE); SimpleDiagnosticFactory PROPERTY_INITIALIZER_NO_BACKING_FIELD = SimpleDiagnosticFactory.create(ERROR, "Initializer is not allowed here because this property has no backing field"); DiagnosticWithParameterFactory PROPERTY_INITIALIZER_NO_PRIMARY_CONSTRUCTOR = DiagnosticWithParameterFactory.create(ERROR, "Property initializers are not allowed when no primary constructor is present", DiagnosticParameters.CLASS); - SimplePsiElementOnlyDiagnosticFactory REDUNDANT_ABSTRACT = SimplePsiElementOnlyDiagnosticFactory.create(WARNING, "Abstract modifier is redundant in traits"); PsiElementOnlyDiagnosticFactory3 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = new PsiElementOnlyDiagnosticFactory3(ERROR, "Abstract property {0} in non-abstract class {1}") { @NotNull protected DiagnosticWithPsiElement on(@NotNull JetModifierListOwner elementToBlame, @NotNull TextRange textRangeToMark, @NotNull String s, @NotNull ClassDescriptor classDescriptor, @NotNull JetClass aClass) { @@ -122,7 +121,7 @@ public interface Errors { DiagnosticWithParameterFactory NON_FINAL_MEMBER_IN_FINAL_CLASS = DiagnosticWithParameterFactory.create(ERROR, "Non final member in a final class", DiagnosticParameters.CLASS); DiagnosticWithParameterFactory NON_FINAL_ACCESSOR_OF_FINAL_PROPERTY = DiagnosticWithParameterFactory.create(ERROR, "Non final accessor of a final property", DiagnosticParameters.PROPERTY); - DiagnosticWithParameterFactory ABSTRACT_ACCESSOR_OF_NON_ABSTRACT_PROPERTY = DiagnosticWithParameterFactory.create(ERROR, "Abstract accessor of a non abstract property", DiagnosticParameters.PROPERTY); + DiagnosticWithParameterFactory ABSTRACT_ACCESSOR_OF_NON_ABSTRACT_PROPERTY = DiagnosticWithParameterFactory.create(ERROR, "Abstract accessor of a final property", DiagnosticParameters.PROPERTY); SimpleDiagnosticFactory PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT = SimpleDiagnosticFactory.create(ERROR, "Projections are not allowed on type arguments of functions and properties"); // TODO : better positioning SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED = SimpleDiagnosticFactory.create(ERROR, "This type has a constructor, and thus must be initialized here"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PsiElementOnlyDiagnosticFactory2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PsiElementOnlyDiagnosticFactory2.java index 49e27db67f7..5e34f33c0fc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PsiElementOnlyDiagnosticFactory2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PsiElementOnlyDiagnosticFactory2.java @@ -6,10 +6,18 @@ import com.intellij.psi.PsiElement; * @author svtk */ public class PsiElementOnlyDiagnosticFactory2 extends DiagnosticFactoryWithPsiElement2 implements PsiElementOnlyDiagnosticFactory { + public static PsiElementOnlyDiagnosticFactory2 create(Severity severity, String messageStub, Renderer renderer) { + return new PsiElementOnlyDiagnosticFactory2(severity, messageStub, renderer); + } + public static PsiElementOnlyDiagnosticFactory2 create(Severity severity, String messageStub) { return new PsiElementOnlyDiagnosticFactory2(severity, messageStub); } + public PsiElementOnlyDiagnosticFactory2(Severity severity, String message, Renderer renderer) { + super(severity, message, renderer); + } + protected PsiElementOnlyDiagnosticFactory2(Severity severity, String message) { super(severity, message); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java index 5e6a291fe84..97efea7d0d9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -156,7 +156,7 @@ public class DeclarationsChecker { return; } if (classDescriptor.getKind() == ClassKind.TRAIT) { - context.getTrace().report(REDUNDANT_ABSTRACT.on(property, abstractNode)); + context.getTrace().report(REDUNDANT_MODIFIER_IN_TRAIT.on(modifierList, abstractNode, JetTokens.ABSTRACT_KEYWORD)); } } @@ -254,7 +254,7 @@ public class DeclarationsChecker { context.getTrace().report(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS.on(functionOrPropertyAccessor, abstractNode, functionDescriptor.getName(), classDescriptor, (JetClass) classElement)); } if (hasAbstractModifier && inTrait && !isPropertyAccessor) { - context.getTrace().report(REDUNDANT_ABSTRACT.on(functionOrPropertyAccessor, abstractNode)); + context.getTrace().report(REDUNDANT_MODIFIER_IN_TRAIT.on(modifierList, abstractNode, JetTokens.ABSTRACT_KEYWORD)); } if (function.getBodyExpression() != null && hasAbstractModifier) { context.getTrace().report(ABSTRACT_FUNCTION_WITH_BODY.on(functionOrPropertyAccessor, abstractNode, functionDescriptor)); @@ -283,6 +283,7 @@ public class DeclarationsChecker { ? propertyDescriptor.getGetter() : propertyDescriptor.getSetter(); checkFunction(accessor, accessorDescriptor); + checkModifiers(accessor.getModifierList()); if (propertyDescriptor.getModality() == Modality.FINAL && accessor.hasModifier(JetTokens.OPEN_KEYWORD)) { ASTNode openModifierNode = accessor.getModifierList().getModifierNode(JetTokens.OPEN_KEYWORD); context.getTrace().report(NON_FINAL_ACCESSOR_OF_FINAL_PROPERTY.on(accessor, openModifierNode, property)); diff --git a/docs/CSClub_Kotlin.key b/docs/CSClub_Kotlin.key new file mode 100644 index 00000000000..23031fec620 Binary files /dev/null and b/docs/CSClub_Kotlin.key differ diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java index 3a647100c87..de64087a558 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java @@ -40,11 +40,6 @@ public class AddModifierFix extends ModifierFix { return "Add modifier"; } - @Override - public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { - return element.isValid(); - } - @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { element.replace(addModifier(element, modifier, modifiersThanCanBeReplaced, project)); diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixUtil.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixUtil.java index 40bb408a736..02ffaa2b339 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixUtil.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixUtil.java @@ -1,6 +1,11 @@ package org.jetbrains.jet.plugin.quickfix; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.DiagnosticParameter; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; @@ -10,7 +15,8 @@ import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElementImpl; * @author svtk */ public class QuickFixUtil { - private QuickFixUtil() {} + private QuickFixUtil() { + } public static JetIntentionActionFactory createFactoryRedirectingAdditionalInfoToAnotherFactory(final JetIntentionActionFactory factory, final DiagnosticParameter

parameter) { return new JetIntentionActionFactory() { @@ -18,10 +24,49 @@ public class QuickFixUtil { public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { DiagnosticWithParameters diagnosticWithParameters = JetIntentionAction.assertAndCastToDiagnosticWithParameters(diagnostic, parameter); - T element = diagnosticWithParameters.getParameter(parameter); + P element = diagnosticWithParameters.getParameter(parameter); return (JetIntentionAction) factory.createAction(new DiagnosticWithPsiElementImpl(diagnostic.getFactory(), diagnostic.getSeverity(), diagnostic.getMessage(), element)); } }; } - + + public static JetIntentionActionFactory createFactoryRedirectingAdditionalInfoIfAnyToAnotherFactory(final JetIntentionActionFactory factory, final DiagnosticParameter

parameter) { + return new JetIntentionActionFactory() { + @Override + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { + + if (diagnostic instanceof DiagnosticWithParameters && ((DiagnosticWithParameters) diagnostic).hasParameter(parameter)) { + P element = ((DiagnosticWithParameters) diagnostic).getParameter(parameter); + return (JetIntentionAction) factory.createAction(new DiagnosticWithPsiElementImpl(diagnostic.getFactory(), diagnostic.getSeverity(), diagnostic.getMessage(), element)); + } + return createDoNothingAction(diagnostic); + } + }; + } + + public static JetIntentionAction createDoNothingAction(DiagnosticWithPsiElement diagnostic) { + return new JetIntentionAction(diagnostic.getPsiElement()) { + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + return false; + } + + @NotNull + @Override + public String getText() { + throw new UnsupportedOperationException(); + } + + @NotNull + @Override + public String getFamilyName() { + throw new UnsupportedOperationException(); + } + + @Override + public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + throw new UnsupportedOperationException(); + } + }; + } } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java index c67c49bd977..a2f4fb48753 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java @@ -48,7 +48,6 @@ public class QuickFixes { add(Errors.PROPERTY_INITIALIZER_IN_TRAIT, removePartsFromPropertyFactory); add(Errors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT, addAbstractModifierFactory); - add(Errors.REDUNDANT_ABSTRACT, removeAbstractModifierFactory); JetIntentionActionFactory addAbstractToClassFactory = QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addAbstractModifierFactory, DiagnosticParameters.CLASS); add(Errors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, removeAbstractModifierFactory); @@ -70,7 +69,7 @@ public class QuickFixes { add(Errors.NON_MEMBER_FUNCTION_NO_BODY, addFunctionBodyFactory); add(Errors.NOTHING_TO_OVERRIDE, RemoveModifierFix.createFactory(JetTokens.OVERRIDE_KEYWORD)); - add(Errors.VIRTUAL_MEMBER_HIDDEN, AddModifierFix.createFactory(JetTokens.OVERRIDE_KEYWORD)); + add(Errors.VIRTUAL_MEMBER_HIDDEN, AddModifierFix.createFactory(JetTokens.OVERRIDE_KEYWORD, new JetToken[] {JetTokens.OPEN_KEYWORD})); add(Errors.VAL_WITH_SETTER, ChangeVariableMutabilityFix.createFactory()); @@ -80,16 +79,16 @@ public class QuickFixes { JetIntentionActionFactory changeAccessorTypeFactory = ChangeAccessorTypeFix.createFactory(); add(Errors.WRONG_SETTER_PARAMETER_TYPE, changeAccessorTypeFactory); add(Errors.WRONG_GETTER_RETURN_TYPE, changeAccessorTypeFactory); - + add(Errors.USELESS_ELVIS, RemoveRightPartOfBinaryExpressionFix.createRemoveElvisOperatorFactory()); - + add(Errors.UNNECESSARY_SAFE_CALL, ReplaceSafeCallToDotCall.createFactory()); JetIntentionActionFactory removeRedundantModifierFactory = RemoveRedundantModifierFix.createFactory(); add(Errors.REDUNDANT_MODIFIER, removeRedundantModifierFactory); add(Errors.REDUNDANT_MODIFIER_IN_TRAIT, removeRedundantModifierFactory); add(Errors.TRAIT_CAN_NOT_BE_FINAL, RemoveModifierFix.createFactory(JetTokens.FINAL_KEYWORD)); - + add(Errors.PROPERTY_INITIALIZER_NO_PRIMARY_CONSTRUCTOR, RemovePartsFromPropertyFix.createRemoveInitializerFactory()); JetIntentionActionFactory addPrimaryConstructorFactory = AddPrimaryConstructorFix.createFactory(); diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveModifierFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveModifierFix.java index b4e7afe9ce8..ac68ec8c38c 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveModifierFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveModifierFix.java @@ -41,11 +41,6 @@ public class RemoveModifierFix extends ModifierFix { return "Remove modifier"; } - @Override - public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { - return element.isValid(); - } - @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { JetModifierListOwner newElement = (JetModifierListOwner) element.copy(); diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/RemovePartsFromPropertyFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/RemovePartsFromPropertyFix.java index faa272f521d..34c99ff3155 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/RemovePartsFromPropertyFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/RemovePartsFromPropertyFix.java @@ -76,11 +76,6 @@ public class RemovePartsFromPropertyFix extends JetIntentionAction return "Remove parts from property to make it abstract"; } - @Override - public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { - return element.isValid(); - } - @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { JetProperty newElement = (JetProperty) element.copy(); diff --git a/idea/testData/checkerWithErrorTypes/full/Abstract.jet b/idea/testData/checkerWithErrorTypes/full/Abstract.jet index 1d3420ce16d..a1c73c553d7 100644 --- a/idea/testData/checkerWithErrorTypes/full/Abstract.jet +++ b/idea/testData/checkerWithErrorTypes/full/Abstract.jet @@ -92,29 +92,29 @@ trait MyTrait { //properties val a: Int val a1: Int = 1 - abstract val a2: Int - abstract val a3: Int = 1 + abstract val a2: Int + abstract val a3: Int = 1 var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { $c = v } var c1: Int = 0; set(v: Int) { $c1 = v } - abstract var c2: Int set(v: Int) { $c2 = v } - abstract var c3: Int = 0; set(v: Int) { $c3 = v } + abstract var c2: Int set(v: Int) { $c2 = v } + abstract var c3: Int = 0; set(v: Int) { $c3 = v } val e: Int get() = a val e1: Int = 0; get() = a - abstract val e2: Int get() = a - abstract val e3: Int = 0; get() = a + abstract val e2: Int get() = a + abstract val e3: Int = 0; get() = a //methods fun f() fun g() {} - abstract fun h() - abstract fun j() {} + abstract fun h() + abstract fun j() {} //property accessors var i: Int abstract get abstract set diff --git a/idea/testData/codegen/controlStructures/forIntArray.jet b/idea/testData/codegen/controlStructures/forIntArray.jet index 56b16c9bce3..abfce4113f7 100644 --- a/idea/testData/codegen/controlStructures/forIntArray.jet +++ b/idea/testData/codegen/controlStructures/forIntArray.jet @@ -1,5 +1,5 @@ fun box() : String { - val a = Array (5) + val a = Array (5, {0}) var i = 0 var sum = 0 for(el in 0..4) { diff --git a/idea/testData/codegen/controlStructures/forPrimitiveIntArray.jet b/idea/testData/codegen/controlStructures/forPrimitiveIntArray.jet new file mode 100644 index 00000000000..0822b4f6aac --- /dev/null +++ b/idea/testData/codegen/controlStructures/forPrimitiveIntArray.jet @@ -0,0 +1,14 @@ +fun box() : String { + val a = IntArray (5) + var i = 0 + var sum = 0 + for(el in 0..4) { + a[i] = i++ + } + for (el in a) { + sum = sum + el + } + if(sum != 10) return "a failed" + + return "OK" +} \ No newline at end of file diff --git a/idea/testData/codegen/controlStructures/forUserType.jet b/idea/testData/codegen/controlStructures/forUserType.jet index 1d90ceee938..0332dc28bf1 100644 --- a/idea/testData/codegen/controlStructures/forUserType.jet +++ b/idea/testData/codegen/controlStructures/forUserType.jet @@ -44,7 +44,7 @@ fun box() : String { } if(sum != 15) return "c4 failed" - val a : Array = Array (5) + val a : Array = Array (5, {0}) for(el in 0..4) { a[i] = i++ } diff --git a/idea/testData/codegen/regressions/kt237.jet b/idea/testData/codegen/regressions/kt237.jet index adc16c93b60..aaa60b5904f 100644 --- a/idea/testData/codegen/regressions/kt237.jet +++ b/idea/testData/codegen/regressions/kt237.jet @@ -5,7 +5,7 @@ fun main(args: Array?) { //do not compile System.out?.println(fff(())) //do not compile System.out?.println(id(y)) //do not compile - System.out?.println(fff(id(y)) == id(foreach(Array(0),{(e : Int) : Unit => }))) //do not compile + System.out?.println(fff(id(y)) == id(foreach(Array(0,{0}),{(e : Int) : Unit => }))) //do not compile } class A() @@ -30,7 +30,7 @@ fun almostFilter(array: Array, action: fun(Int): Int) { } fun box() : String { - val a = Array (3) + val a = Array (3,{-1}) a[0] = 0 a[1] = 1 a[2] = 2 diff --git a/idea/testData/codegen/regressions/kt238.jet b/idea/testData/codegen/regressions/kt238.jet index d890c1aea61..9332cbf870f 100644 --- a/idea/testData/codegen/regressions/kt238.jet +++ b/idea/testData/codegen/regressions/kt238.jet @@ -5,7 +5,7 @@ fun t1 () { } fun t2 () { - val a2 = Array(1) + val a2 = Array(1,{0}) a2[0] = 0 //ok var i = a2[0] //ok } diff --git a/idea/testData/codegen/regressions/kt326.jet b/idea/testData/codegen/regressions/kt326.jet index 1c5d3b19fdf..8afc31e7eab 100644 --- a/idea/testData/codegen/regressions/kt326.jet +++ b/idea/testData/codegen/regressions/kt326.jet @@ -28,7 +28,7 @@ fun box() : String { println(b.a[0]) val c = List>(1) - c.a[0] = Array(4) + c.a[0] = Array(4,{-1}) println(c.a[0].size) val e = List(5) diff --git a/idea/testData/quickfix/abstract/afterRedundantAbstract.kt b/idea/testData/quickfix/abstract/afterRedundantAbstract.kt index a6244c18332..6fc13b24bc1 100644 --- a/idea/testData/quickfix/abstract/afterRedundantAbstract.kt +++ b/idea/testData/quickfix/abstract/afterRedundantAbstract.kt @@ -1,4 +1,4 @@ -// "Make 'foo' not abstract" "true" +// "Remove redundant 'abstract' modifier" "true" trait A { fun foo() } \ No newline at end of file diff --git a/idea/testData/quickfix/abstract/beforeRedundantAbstract.kt b/idea/testData/quickfix/abstract/beforeRedundantAbstract.kt index 81599e7cefa..4cf5dd59500 100644 --- a/idea/testData/quickfix/abstract/beforeRedundantAbstract.kt +++ b/idea/testData/quickfix/abstract/beforeRedundantAbstract.kt @@ -1,4 +1,4 @@ -// "Make 'foo' not abstract" "true" +// "Remove redundant 'abstract' modifier" "true" trait A { abstract fun foo() } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/codegen/ArrayGenTest.java b/idea/tests/org/jetbrains/jet/codegen/ArrayGenTest.java index f788cb5a4e9..dcd5e4d9783 100644 --- a/idea/tests/org/jetbrains/jet/codegen/ArrayGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/ArrayGenTest.java @@ -17,15 +17,24 @@ public class ArrayGenTest extends CodegenTestCase { } public void testCreateMultiInt () throws Exception { - loadText("fun foo() = Array> (5)"); + loadText("fun foo() = Array> (5, { Array(it, {239}) })"); Method foo = generateFunction(); - Object invoke = foo.invoke(null); - System.out.println(invoke.getClass()); - assertTrue(invoke instanceof Integer[][]); + Integer[][] invoke = (Integer[][]) foo.invoke(null); + assertEquals(invoke[2].length, 2); + assertEquals(invoke[4].length, 4); + assertEquals(invoke[4][2].intValue(), 239); + } + + public void testCreateMultiIntNullable () throws Exception { + loadText("fun foo() = Array> (5, { Array(it) })"); + Method foo = generateFunction(); + Integer[][] invoke = (Integer[][]) foo.invoke(null); + assertEquals(invoke[2].length, 2); + assertEquals(invoke[4].length, 4); } public void testCreateMultiString () throws Exception { - loadText("fun foo() = Array> (5)"); + loadText("fun foo() = Array> (5, { Array(0,{\"\"}) })"); Method foo = generateFunction(); Object invoke = foo.invoke(null); System.out.println(invoke.getClass()); diff --git a/idea/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java b/idea/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java index 4991959a8aa..581ef507d36 100644 --- a/idea/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java @@ -151,6 +151,10 @@ public class ControlStructuresTest extends CodegenTestCase { blackBoxFile("controlStructures/forIntArray.jet"); } + public void testForPrimitiveIntArray() throws Exception { + blackBoxFile("controlStructures/forPrimitiveIntArray.jet"); + } + public void testForNullableIntArray() throws Exception { blackBoxFile("controlStructures/forNullableIntArray.jet"); } diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index 8f43eec11e7..a1f2940a78e 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -374,13 +374,24 @@ public class NamespaceGenTest extends CodegenTestCase { } public void testArrayNew() throws Exception { - loadText("fun foo() = Array(4)"); + loadText("fun foo() = Array(4, { it })"); + System.out.println(generateToText()); + final Method main = generateFunction(); + Integer[] result = (Integer[]) main.invoke(null); + assertEquals(4, result.length); + assertEquals(0, result[0].intValue()); + assertEquals(1, result[1].intValue()); + assertEquals(2, result[2].intValue()); + assertEquals(3, result[3].intValue()); + } + + public void testArrayNewNullable() throws Exception { + loadText("fun foo() = Array(4)"); System.out.println(generateToText()); final Method main = generateFunction(); Integer[] result = (Integer[]) main.invoke(null); assertEquals(4, result.length); } - public void testFloatArrayNew() throws Exception { loadText("fun foo() = FloatArray(4)"); System.out.println(generateToText()); @@ -390,11 +401,12 @@ public class NamespaceGenTest extends CodegenTestCase { } public void testFloatArrayArrayNew() throws Exception { - loadText("fun foo() = Array(4)"); + loadText("fun foo() = Array(4, { FloatArray(5-it) })"); System.out.println(generateToText()); final Method main = generateFunction(); float[][] result = (float[][]) main.invoke(null); assertEquals(4, result.length); + assertEquals(2, result[3].length); } public void testArraySize() throws Exception {