From 0fd882741b8493fb042ba35e3f2cc2f8c28d15b8 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 23 May 2012 22:04:22 +0400 Subject: [PATCH] function invocation with only type parameters prohibited --- .../jet/lang/diagnostics/Errors.java | 2 +- .../diagnostics/PositioningStrategies.java | 24 +++++++++++++++++++ .../BasicExpressionTypingVisitor.java | 24 ++++++++++++------- .../codegen/classes/initializerBlockDImpl.jet | 2 +- .../testData/codegen/regressions/kt581.jet | 2 +- compiler/testData/codegen/typeInfo/inner.jet | 2 +- .../testData/diagnostics/tests/Bounds.jet | 6 ++--- .../diagnostics/tests/ResolveToJava.jet | 6 ++--- .../tests/alt-headers/ArrayListAndMap.jet | 4 ++-- .../tests/alt-headers/ArrayListClone.jet | 2 +- .../tests/alt-headers/ArrayListToArray.jet | 2 +- .../diagnostics/tests/j+k/UnboxingNulls.jet | 2 +- .../diagnostics/tests/regressions/Jet72.jet | 2 +- .../tests/regressions/OutProjections.jet | 4 ++-- .../diagnostics/tests/regressions/kt580.jet | 2 +- .../diagnostics/tests/regressions/kt701.jet | 4 ++-- .../diagnostics/tests/regressions/kt716.jet | 4 ++-- .../diagnostics/tests/subtyping/kt-1457.jet | 2 +- .../ChangeToFunctionInvocationFix.java | 17 +++++++------ .../checker/BoundsWithSubstitutors.jet | 6 ++--- idea/testData/checker/ResolveToJava.jet | 4 ++-- idea/testData/checker/regression/Jet72.jet | 2 +- 22 files changed, 78 insertions(+), 47 deletions(-) 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 dbf8fbd70fc..4f5f88ebb3b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -321,7 +321,7 @@ public interface Errors { DiagnosticFactory2 CONFLICTING_OVERLOADS = DiagnosticFactory2.create(ERROR, DECLARATION); DiagnosticFactory2 FUNCTION_EXPECTED = DiagnosticFactory2.create(ERROR); - DiagnosticFactory2 FUNCTION_CALL_EXPECTED = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 FUNCTION_CALL_EXPECTED = DiagnosticFactory2.create(ERROR, CALL_EXPRESSION); DiagnosticFactory3 RESULT_TYPE_MISMATCH = DiagnosticFactory3.create(ERROR); DiagnosticFactory3 UNSAFE_INFIX_CALL = DiagnosticFactory3.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java index 2a8e3b23fbf..fe653778c4a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java @@ -298,4 +298,28 @@ public class PositioningStrategies { return markNode(element.getQuestionMarkNode()); } }; + + public static PositioningStrategy CALL_EXPRESSION = new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetExpression element) { + if (element instanceof JetCallExpression) { + JetCallExpression callExpression = (JetCallExpression) element; + PsiElement endElement; + JetTypeArgumentList typeArgumentList = callExpression.getTypeArgumentList(); + JetExpression calleeExpression = callExpression.getCalleeExpression(); + if (typeArgumentList != null) { + endElement = typeArgumentList; + } + else if (calleeExpression != null) { + endElement = calleeExpression; + } + else { + endElement = element; + } + return markRange(new TextRange(element.getTextRange().getStartOffset(), endElement.getTextRange().getEndOffset())); + } + return super.mark(element); + } + }; } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 375823e9608..fa1d0cf86f3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -77,6 +77,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { return type; // TODO : Extensions to this } + @Nullable private JetType lookupNamespaceOrClassObject(JetSimpleNameExpression expression, Name referencedName, ExpressionTypingContext context) { ClassifierDescriptor classifier = context.scope.getClassifier(referencedName); if (classifier != null) { @@ -90,9 +91,9 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { context.trace.report(NO_CLASS_OBJECT.on(expression, classifier)); } context.trace.record(REFERENCE_TARGET, expression, classifier); - if (result == null) { - return ErrorUtils.createErrorType("No class object in " + expression.getReferencedName()); - } + //if (result == null) { + // return ErrorUtils.createErrorType("No class object in " + expression.getReferencedName()); + //} return DataFlowUtils.checkType(result, expression, context); } } @@ -684,7 +685,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { if (result[0]) { traceForFunction.commit(); boolean hasValueParameters = functionDescriptor == null || functionDescriptor.getValueParameters().size() > 0; - context.trace.report(Errors.FUNCTION_CALL_EXPECTED.on(nameExpression, nameExpression, hasValueParameters)); + context.trace.report(FUNCTION_CALL_EXPECTED.on(nameExpression, nameExpression, hasValueParameters)); return functionDescriptor != null ? functionDescriptor.getReturnType() : null; } @@ -704,17 +705,23 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { context.replaceBindingTrace(traceForFunction), result); if (result[0]) { traceForFunction.commit(); + if (callExpression.getValueArgumentList() == null && callExpression.getFunctionLiteralArguments().isEmpty()) { + // there are only type arguments + boolean hasValueParameters = functionDescriptor == null || functionDescriptor.getValueParameters().size() > 0; + context.trace.report(FUNCTION_CALL_EXPECTED.on(callExpression, callExpression, hasValueParameters)); + } return functionDescriptor != null ? functionDescriptor.getReturnType() : null; } JetExpression calleeExpression = callExpression.getCalleeExpression(); - if (calleeExpression instanceof JetSimpleNameExpression) { + if (calleeExpression instanceof JetSimpleNameExpression && callExpression.getTypeArgumentList() == null) { TemporaryBindingTrace traceForVariable = TemporaryBindingTrace.create(context.trace); JetType type = getVariableType((JetSimpleNameExpression) calleeExpression, receiver, callOperationNode, - context.replaceBindingTrace(traceForVariable), result); + context.replaceBindingTrace(traceForVariable), result); if (result[0]) { traceForVariable.commit(); - context.trace.report(Errors.FUNCTION_EXPECTED.on((JetReferenceExpression) calleeExpression, callExpression, type != null ? type : ErrorUtils.createErrorType(""))); + context.trace.report(FUNCTION_EXPECTED.on((JetReferenceExpression) calleeExpression, calleeExpression, + type != null ? type : ErrorUtils.createErrorType(""))); return null; } } @@ -722,7 +729,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { return null; } - private static void checkSuper(@NotNull ReceiverDescriptor receiverDescriptor, @NotNull OverloadResolutionResults results, @NotNull BindingTrace trace, @NotNull JetExpression expression) { + private static void checkSuper(@NotNull ReceiverDescriptor receiverDescriptor, @NotNull OverloadResolutionResults results, + @NotNull BindingTrace trace, @NotNull JetExpression expression) { if (!results.isSingleResult()) return; if (!(receiverDescriptor instanceof ExpressionReceiver)) return; JetExpression receiver = ((ExpressionReceiver) receiverDescriptor).getExpression(); diff --git a/compiler/testData/codegen/classes/initializerBlockDImpl.jet b/compiler/testData/codegen/classes/initializerBlockDImpl.jet index aa3d227c80f..ba88877b35f 100644 --- a/compiler/testData/codegen/classes/initializerBlockDImpl.jet +++ b/compiler/testData/codegen/classes/initializerBlockDImpl.jet @@ -2,7 +2,7 @@ import java.util.* import java.io.* class World() { - public val items: ArrayList = ArrayList + public val items: ArrayList = ArrayList() class Item() { { diff --git a/compiler/testData/codegen/regressions/kt581.jet b/compiler/testData/codegen/regressions/kt581.jet index 4480994e57e..2ff762d2492 100644 --- a/compiler/testData/codegen/regressions/kt581.jet +++ b/compiler/testData/codegen/regressions/kt581.jet @@ -11,7 +11,7 @@ fun box() : String { // val vals = iarray(789, 678, 567, 456, 345, 234, 123, 012) val vals = iarray(789, 678, 567, 456, 345, 234, 123, 12) - val diffs = HashSet + val diffs = HashSet() for (i in vals.indices) for (j in i..vals.lastIndex()) diffs.add(vals[i] - vals[j]) diff --git a/compiler/testData/codegen/typeInfo/inner.jet b/compiler/testData/codegen/typeInfo/inner.jet index 62dad284a09..96e465d633d 100644 --- a/compiler/testData/codegen/typeInfo/inner.jet +++ b/compiler/testData/codegen/typeInfo/inner.jet @@ -10,5 +10,5 @@ class Box() { } fun box(): String { - return Box.inner().isT("OK") + return Box().inner().isT("OK") } diff --git a/compiler/testData/diagnostics/tests/Bounds.jet b/compiler/testData/diagnostics/tests/Bounds.jet index 8b39d32364d..39c6284401b 100644 --- a/compiler/testData/diagnostics/tests/Bounds.jet +++ b/compiler/testData/diagnostics/tests/Bounds.jet @@ -10,9 +10,9 @@ package boundsWithSubstitutors class X() - val b = X, C>> - val b0 = XAny?> - val b1 = X, String>> + val b = X, C>>() + val b0 = XAny?>() + val b1 = X, String>>() // FILE: b.kt open class A {} diff --git a/compiler/testData/diagnostics/tests/ResolveToJava.jet b/compiler/testData/diagnostics/tests/ResolveToJava.jet index 243fe24d783..9499dc3164b 100644 --- a/compiler/testData/diagnostics/tests/ResolveToJava.jet +++ b/compiler/testData/diagnostics/tests/ResolveToJava.jet @@ -18,8 +18,8 @@ fun test(l : java.util.List) { val f : java.io.File? = null - Collections.emptyList - Collections.emptyList + Collections.emptyList + Collections.emptyList Collections.emptyList() Collections.emptyList() @@ -51,4 +51,4 @@ fun test(l : java.util.List) { // FILE: f.kt package xxx - import java.lang.Class; + import java.lang.Class; \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/alt-headers/ArrayListAndMap.jet b/compiler/testData/diagnostics/tests/alt-headers/ArrayListAndMap.jet index c9084864299..bf44ac7ce79 100644 --- a/compiler/testData/diagnostics/tests/alt-headers/ArrayListAndMap.jet +++ b/compiler/testData/diagnostics/tests/alt-headers/ArrayListAndMap.jet @@ -4,12 +4,12 @@ package kotlin1 import java.util.* fun main(args : Array) { - val al : ArrayList = ArrayList + val al : ArrayList = ArrayList() val al1 = ArrayList(1) // for (x in al1) { // // } - val al2 = ArrayList(ArrayList) + val al2 = ArrayList(ArrayList()) al : RandomAccess al.clear() : Unit al.add(1) : Boolean diff --git a/compiler/testData/diagnostics/tests/alt-headers/ArrayListClone.jet b/compiler/testData/diagnostics/tests/alt-headers/ArrayListClone.jet index f6cb826d016..e45e0a7a99e 100644 --- a/compiler/testData/diagnostics/tests/alt-headers/ArrayListClone.jet +++ b/compiler/testData/diagnostics/tests/alt-headers/ArrayListClone.jet @@ -4,6 +4,6 @@ package kotlin1 import java.util.* fun main(args : Array) { - val al : ArrayList = ArrayList + val al : ArrayList = ArrayList() al.clone() : Object // A type mismatch on this line means that alt-headers were not loaded } diff --git a/compiler/testData/diagnostics/tests/alt-headers/ArrayListToArray.jet b/compiler/testData/diagnostics/tests/alt-headers/ArrayListToArray.jet index 16dad2f87f6..33e3ff9136d 100644 --- a/compiler/testData/diagnostics/tests/alt-headers/ArrayListToArray.jet +++ b/compiler/testData/diagnostics/tests/alt-headers/ArrayListToArray.jet @@ -4,7 +4,7 @@ package kotlin1 import java.util.* fun main(args : Array) { - val al : ArrayList = ArrayList + val al : ArrayList = ArrayList() // A type mismatch on this line means that alt-headers were not loaded al.toArray(Array(3, {1})) : Array diff --git a/compiler/testData/diagnostics/tests/j+k/UnboxingNulls.jet b/compiler/testData/diagnostics/tests/j+k/UnboxingNulls.jet index 2512d00714e..d5fbdaf7186 100644 --- a/compiler/testData/diagnostics/tests/j+k/UnboxingNulls.jet +++ b/compiler/testData/diagnostics/tests/j+k/UnboxingNulls.jet @@ -9,5 +9,5 @@ package a fun foo() { // If this fails, it means that we have broken the rule that Java returns are always nullable - a.Test.t() + 1 + a.Test().t() + 1 } diff --git a/compiler/testData/diagnostics/tests/regressions/Jet72.jet b/compiler/testData/diagnostics/tests/regressions/Jet72.jet index b85b278971b..d4b9a34d571 100644 --- a/compiler/testData/diagnostics/tests/regressions/Jet72.jet +++ b/compiler/testData/diagnostics/tests/regressions/Jet72.jet @@ -6,7 +6,7 @@ abstract class Item(val room: Object) { abstract val name : String } -val items: ArrayList = ArrayList +val items: ArrayList = ArrayList() fun test(room : Object) { for(val item: Item? in items) { diff --git a/compiler/testData/diagnostics/tests/regressions/OutProjections.jet b/compiler/testData/diagnostics/tests/regressions/OutProjections.jet index 6cfda3ca0a2..6860b429b93 100644 --- a/compiler/testData/diagnostics/tests/regressions/OutProjections.jet +++ b/compiler/testData/diagnostics/tests/regressions/OutProjections.jet @@ -3,7 +3,7 @@ class Point() { class G() {} -fun f(expression : T) : G = G +fun f(expression : T) : G = G() fun foo() : G { @@ -13,7 +13,7 @@ fun foo() : G { class Out() {} -fun fout(expression : T) : Out = Out +fun fout(expression : T) : Out = Out() fun fooout() : Out { val p = Point(); diff --git a/compiler/testData/diagnostics/tests/regressions/kt580.jet b/compiler/testData/diagnostics/tests/regressions/kt580.jet index 2d73aa7b74b..9226b8f5b39 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt580.jet +++ b/compiler/testData/diagnostics/tests/regressions/kt580.jet @@ -8,7 +8,7 @@ fun iarray(vararg a : String) = a // BUG fun main() { val vals = iarray("789", "678", "567") - val diffs = ArrayList + val diffs = ArrayList() for (i in vals.indices) { for (j in i..vals.lastIndex()) // Type inference failed diffs.add(vals[i].length - vals[j].length) diff --git a/compiler/testData/diagnostics/tests/regressions/kt701.jet b/compiler/testData/diagnostics/tests/regressions/kt701.jet index 81e8932af76..fab435ae4bf 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt701.jet +++ b/compiler/testData/diagnostics/tests/regressions/kt701.jet @@ -10,8 +10,8 @@ public class Throwables() { } } public fun propagateIfPossible(throwable : Throwable?) { - propagateIfInstanceOf(throwable, getJavaClass) //; Type inference failed: Mismatch while expanding constraints - propagateIfInstanceOf(throwable, getJavaClass) // Type inference failed: Mismatch while expanding constraints + propagateIfInstanceOf(throwable, getJavaClass()) //; Type inference failed: Mismatch while expanding constraints + propagateIfInstanceOf(throwable, getJavaClass()) // Type inference failed: Mismatch while expanding constraints } } } diff --git a/compiler/testData/diagnostics/tests/regressions/kt716.jet b/compiler/testData/diagnostics/tests/regressions/kt716.jet index ec22510913f..38c320eded1 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt716.jet +++ b/compiler/testData/diagnostics/tests/regressions/kt716.jet @@ -9,8 +9,8 @@ fun TypeInfo.getJavaClass() : java.lang.Class { return t.getClass() as java.lang.Class // inferred type is Object but Serializable was expected } -fun getJavaClass() = typeinfo.getJavaClass() +fun getJavaClass() = typeinfo().getJavaClass() fun main(args : Array) { - System.out.println(getJavaClass) + System.out.println(getJavaClass()) } diff --git a/compiler/testData/diagnostics/tests/subtyping/kt-1457.jet b/compiler/testData/diagnostics/tests/subtyping/kt-1457.jet index b84aeb6a9ad..29d85aa962a 100644 --- a/compiler/testData/diagnostics/tests/subtyping/kt-1457.jet +++ b/compiler/testData/diagnostics/tests/subtyping/kt-1457.jet @@ -3,5 +3,5 @@ import java.util.ArrayList class MyListOfPairs : ArrayList<#(T, T)>() { } fun test() { - MyListOfPairs : ArrayList<#(Int, Int)> + MyListOfPairs() : ArrayList<#(Int, Int)> } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToFunctionInvocationFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToFunctionInvocationFix.java index 339ad6e1cf1..3d7827a7d40 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToFunctionInvocationFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToFunctionInvocationFix.java @@ -22,17 +22,16 @@ import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.plugin.JetBundle; -import java.util.List; - /** * @author svtk */ -public class ChangeToFunctionInvocationFix extends JetIntentionAction { +public class ChangeToFunctionInvocationFix extends JetIntentionAction { - public ChangeToFunctionInvocationFix(@NotNull JetReferenceExpression element) { + public ChangeToFunctionInvocationFix(@NotNull JetExpression element) { super(element); } @@ -50,16 +49,16 @@ public class ChangeToFunctionInvocationFix extends JetIntentionAction createAction(Diagnostic diagnostic) { - if (diagnostic.getPsiElement() instanceof JetReferenceExpression) { - return new ChangeToFunctionInvocationFix((JetReferenceExpression) diagnostic.getPsiElement()); + public JetIntentionAction createAction(Diagnostic diagnostic) { + if (diagnostic.getPsiElement() instanceof JetExpression) { + return new ChangeToFunctionInvocationFix((JetExpression) diagnostic.getPsiElement()); } return null; } diff --git a/idea/testData/checker/BoundsWithSubstitutors.jet b/idea/testData/checker/BoundsWithSubstitutors.jet index 6b55415c7fb..4d346933c7e 100644 --- a/idea/testData/checker/BoundsWithSubstitutors.jet +++ b/idea/testData/checker/BoundsWithSubstitutors.jet @@ -8,6 +8,6 @@ class X() - val b = X, C>> - val b0 = XAny?> - val b1 = X, String>> + val b = X, C>>() + val b0 = XAny?>() + val b1 = X, String>>() diff --git a/idea/testData/checker/ResolveToJava.jet b/idea/testData/checker/ResolveToJava.jet index 718c029c7df..0f8e66cc428 100644 --- a/idea/testData/checker/ResolveToJava.jet +++ b/idea/testData/checker/ResolveToJava.jet @@ -16,8 +16,8 @@ fun test(l : java.util.List) { val f : java.io.File? = null - Collections.emptyList - Collections.emptyList + Collections.emptyList + Collections.emptyList Collections.emptyList() Collections.emptyList() diff --git a/idea/testData/checker/regression/Jet72.jet b/idea/testData/checker/regression/Jet72.jet index d41c4af13db..c5c6016b036 100644 --- a/idea/testData/checker/regression/Jet72.jet +++ b/idea/testData/checker/regression/Jet72.jet @@ -6,7 +6,7 @@ abstract class Item(val room: Object) { abstract val name : String } -val items: ArrayList = ArrayList +val items: ArrayList = ArrayList() fun test(room : Object) { for(val item: Item in items) {