diff --git a/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java b/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java index 69df62deb7a..3e41cf55ee7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java @@ -17,7 +17,9 @@ package org.jetbrains.jet.checkers; import com.google.common.base.Predicate; -import com.google.common.collect.*; +import com.google.common.collect.Collections2; +import com.google.common.collect.LinkedListMultimap; +import com.google.common.collect.Lists; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; @@ -30,12 +32,12 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory; import org.jetbrains.jet.lang.diagnostics.Severity; import org.jetbrains.jet.lang.diagnostics.rendering.AbstractDiagnosticWithParametersRenderer; import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages; -import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticFactoryToRendererMap; import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer; import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetExpression; @@ -87,7 +89,8 @@ public class CheckerTestUtil { public static List getDiagnosticsIncludingSyntaxErrors( @NotNull BindingContext bindingContext, @NotNull final PsiElement root, - boolean markDynamicCalls + boolean markDynamicCalls, + @Nullable List dynamicCallDescriptors ) { List diagnostics = new ArrayList(); diagnostics.addAll(Collections2.filter(bindingContext.getDiagnostics().all(), @@ -100,16 +103,17 @@ public class CheckerTestUtil { for (PsiErrorElement errorElement : AnalyzingUtils.getSyntaxErrorRanges(root)) { diagnostics.add(new SyntaxErrorDiagnostic(errorElement)); } - List debugAnnotations = getDebugInfoDiagnostics(root, bindingContext, markDynamicCalls); + List debugAnnotations = getDebugInfoDiagnostics(root, bindingContext, markDynamicCalls, dynamicCallDescriptors); diagnostics.addAll(debugAnnotations); return diagnostics; } @NotNull - public static List getDebugInfoDiagnostics( + private static List getDebugInfoDiagnostics( @NotNull PsiElement root, @NotNull BindingContext bindingContext, - final boolean markDynamicCalls + final boolean markDynamicCalls, + @Nullable final List dynamicCallDescriptors ) { final List debugAnnotations = Lists.newArrayList(); DebugInfoUtil.markDebugAnnotations(root, bindingContext, new DebugInfoUtil.DebugInfoReporter() { @@ -129,7 +133,11 @@ public class CheckerTestUtil { } @Override - public void reportDynamicCall(@NotNull JetElement element) { + public void reportDynamicCall(@NotNull JetElement element, DeclarationDescriptor declarationDescriptor) { + if (dynamicCallDescriptors != null) { + dynamicCallDescriptors.add(declarationDescriptor); + } + if (markDynamicCalls) { newDiagnostic(element, DebugInfoDiagnosticFactory.DYNAMIC); } diff --git a/compiler/frontend/src/org/jetbrains/jet/checkers/DebugInfoUtil.java b/compiler/frontend/src/org/jetbrains/jet/checkers/DebugInfoUtil.java index 0dcb2528d52..3bb634f930b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/checkers/DebugInfoUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/checkers/DebugInfoUtil.java @@ -64,7 +64,7 @@ public class DebugInfoUtil { public abstract void reportUnresolvedWithTarget(@NotNull JetReferenceExpression expression, @NotNull String target); - public void reportDynamicCall(@NotNull JetElement element) { } + public void reportDynamicCall(@NotNull JetElement element, DeclarationDescriptor declarationDescriptor) { } } public static void markDebugAnnotations( @@ -99,11 +99,9 @@ public class DebugInfoUtil { @Override public void visitForExpression(@NotNull JetForExpression expression) { JetExpression range = expression.getLoopRange(); - if (reportIfDynamicCall(range, range, LOOP_RANGE_ITERATOR_RESOLVED_CALL) || - reportIfDynamicCall(range, range, LOOP_RANGE_HAS_NEXT_RESOLVED_CALL) || - reportIfDynamicCall(range, range, LOOP_RANGE_NEXT_RESOLVED_CALL)) { - // for side-effect of the condition only - } + reportIfDynamicCall(range, range, LOOP_RANGE_ITERATOR_RESOLVED_CALL); + reportIfDynamicCall(range, range, LOOP_RANGE_HAS_NEXT_RESOLVED_CALL); + reportIfDynamicCall(range, range, LOOP_RANGE_NEXT_RESOLVED_CALL); super.visitForExpression(expression); } @@ -120,11 +118,9 @@ public class DebugInfoUtil { VariableDescriptor descriptor = bindingContext.get(VARIABLE, property); if (descriptor instanceof PropertyDescriptor && property.getDelegate() != null) { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; - if (reportIfDynamicCall(property.getDelegate(), propertyDescriptor.getGetter(), DELEGATED_PROPERTY_RESOLVED_CALL) - || reportIfDynamicCall(property.getDelegate(), propertyDescriptor.getSetter(), DELEGATED_PROPERTY_RESOLVED_CALL) - || reportIfDynamicCall(property.getDelegate(), propertyDescriptor, DELEGATED_PROPERTY_PD_RESOLVED_CALL)) { - // for side-effect of the condition only - } + reportIfDynamicCall(property.getDelegate(), propertyDescriptor.getGetter(), DELEGATED_PROPERTY_RESOLVED_CALL); + reportIfDynamicCall(property.getDelegate(), propertyDescriptor.getSetter(), DELEGATED_PROPERTY_RESOLVED_CALL); + reportIfDynamicCall(property.getDelegate(), propertyDescriptor, DELEGATED_PROPERTY_PD_RESOLVED_CALL); } super.visitProperty(property); } @@ -230,7 +226,7 @@ public class DebugInfoUtil { private static boolean reportIfDynamic(JetElement element, DeclarationDescriptor declarationDescriptor, DebugInfoReporter debugInfoReporter) { if (declarationDescriptor != null && TasksPackage.isDynamic(declarationDescriptor)) { - debugInfoReporter.reportDynamicCall(element); + debugInfoReporter.reportDynamicCall(element, declarationDescriptor); return true; } return false; diff --git a/compiler/testData/diagnostics/tests/dynamicTypes/withInvisibleSynthesized.dynamic.txt b/compiler/testData/diagnostics/tests/dynamicTypes/withInvisibleSynthesized.dynamic.txt new file mode 100644 index 00000000000..d2018ed95c6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dynamicTypes/withInvisibleSynthesized.dynamic.txt @@ -0,0 +1 @@ +public final fun sam(/*0*/ p0: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/block.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/block.dynamic.txt new file mode 100644 index 00000000000..d1b7029ea2b --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/block.dynamic.txt @@ -0,0 +1,5 @@ +public final fun foo(): dynamic +public final var bar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final fun baz(/*0*/ p0: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.dynamic.txt new file mode 100644 index 00000000000..7024580a062 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.dynamic.txt @@ -0,0 +1,72 @@ +public final fun plus(): dynamic +public final fun minus(): dynamic +public final fun not(): dynamic +public final fun plus(/*0*/ p0: dynamic): dynamic +public final fun plus(/*0*/ p0: dynamic): dynamic +public final fun minus(/*0*/ p0: dynamic): dynamic +public final fun times(/*0*/ p0: dynamic): dynamic +public final fun div(/*0*/ p0: dynamic): dynamic +public final fun mod(/*0*/ p0: dynamic): dynamic +public final fun rangeTo(/*0*/ p0: dynamic): dynamic +public final fun and(/*0*/ p0: dynamic): dynamic +public final fun contains(/*0*/ p0: dynamic): dynamic +public final fun contains(/*0*/ p0: dynamic): dynamic +public final fun contains(/*0*/ p0: dynamic): dynamic +public final fun contains(/*0*/ p0: dynamic): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun get(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic +public final fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic +public final fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic, /*2*/ p2: dynamic): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun inc(): dynamic +public final fun inc(): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun dec(): dynamic +public final fun dec(): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun invoke(): dynamic +public final fun invoke(/*0*/ p0: dynamic): dynamic +public final fun invoke(/*0*/ name: dynamic): dynamic +public final fun invoke(/*0*/ p0: () -> dynamic): dynamic +public final fun invoke(/*0*/ p0: dynamic): dynamic +public final fun compareTo(/*0*/ p0: dynamic): dynamic +public final fun compareTo(/*0*/ p0: dynamic): dynamic +public final fun compareTo(/*0*/ p0: dynamic): dynamic +public final fun compareTo(/*0*/ p0: dynamic): dynamic +public final fun foo(): dynamic +public final fun component1(): dynamic +public final fun component2(): dynamic +public final fun component3(): dynamic +public final fun foo(): dynamic +public final fun foo(): dynamic +public final fun foo(): dynamic +public final fun inc(): dynamic +public final fun inc(): dynamic +public final fun dec(): dynamic +public final fun dec(): dynamic +public final fun plusAssign(/*0*/ p0: dynamic): dynamic +public final fun minusAssign(/*0*/ p0: dynamic): dynamic +public final fun timesAssign(/*0*/ p0: dynamic): dynamic +public final fun divAssign(/*0*/ p0: dynamic): dynamic +public final fun modAssign(/*0*/ p0: dynamic): dynamic +public final fun plusAssign(/*0*/ p0: dynamic): dynamic +public final fun minusAssign(/*0*/ p0: dynamic): dynamic +public final fun timesAssign(/*0*/ p0: dynamic): dynamic +public final fun divAssign(/*0*/ p0: dynamic): dynamic +public final fun modAssign(/*0*/ p0: dynamic): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun plusAssign(/*0*/ p0: dynamic): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun minusAssign(/*0*/ p0: dynamic): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun timesAssign(/*0*/ p0: dynamic): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun divAssign(/*0*/ p0: dynamic): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun modAssign(/*0*/ p0: dynamic): dynamic +public fun get(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic +public fun propertyDelegated(/*0*/ p0: dynamic): dynamic +public fun get(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic +public fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic, /*2*/ p2: dynamic): dynamic +public fun propertyDelegated(/*0*/ p0: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.kt index 3e8da89b815..f52161bd368 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.kt @@ -60,7 +60,7 @@ fun test(d: dynamic) { d >= d d > d - for (i in d) { + for (i in d) { i.foo() } @@ -96,5 +96,5 @@ fun test(d: dynamic) { } val dyn: dynamic = null -val foo : Int by dyn -var bar : Int by dyn +val foo : Int by dyn +var bar : Int by dyn \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCalls.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCalls.dynamic.txt new file mode 100644 index 00000000000..a74f078ad91 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCalls.dynamic.txt @@ -0,0 +1,15 @@ +public final fun foo(): dynamic +public final fun isDynamic(): dynamic +public final fun foo(/*0*/ p0: dynamic): dynamic +public final fun isDynamic(): dynamic +public final fun foo(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic +public final fun isDynamic(): dynamic +public final fun foo(): dynamic +public final fun isDynamic(): dynamic +public final var foo: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final fun isDynamic(): dynamic +public final var foo: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCallsWithLambdas.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCallsWithLambdas.dynamic.txt new file mode 100644 index 00000000000..01c682a07b4 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCallsWithLambdas.dynamic.txt @@ -0,0 +1,17 @@ +public final fun foo(/*0*/ p0: () -> dynamic): dynamic +public final fun foo(/*0*/ p0: () -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: dynamic.(dynamic, dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: () -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic +public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicSafeCalls.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicSafeCalls.dynamic.txt new file mode 100644 index 00000000000..49b038831fd --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicSafeCalls.dynamic.txt @@ -0,0 +1,4 @@ +public final fun foo(): dynamic +public final fun isDynamic(): dynamic +public final fun foo(/*0*/ p0: dynamic): dynamic +public final fun isDynamic(): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.dynamic.txt new file mode 100644 index 00000000000..11e9d7506e6 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.dynamic.txt @@ -0,0 +1,36 @@ +public final var onAnyVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onAnyVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onAnyVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onAnyVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onAnyVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onAnyVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onNullableAnyVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onStringVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var memberVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var memberVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var memberExtensionVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var memberExtensionVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.dynamic.txt new file mode 100644 index 00000000000..08a5d948baf --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.dynamic.txt @@ -0,0 +1,36 @@ +public final var onAnyVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onAnyVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onAnyVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onAnyVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onAnyVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onAnyVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onNullableAnyVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var onStringVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var memberVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var memberExtensionVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var memberVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var memberExtensionVar: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.dynamic.txt new file mode 100644 index 00000000000..6fe443cd2e7 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.dynamic.txt @@ -0,0 +1,8 @@ +public final fun onAny(): dynamic +public final fun onAny(): dynamic +public final fun onAny(): dynamic +public final fun onAny(/*0*/ p0: dynamic): dynamic +public final fun onNullableAny(): dynamic +public final fun onString(): dynamic +public final fun member(): dynamic +public final fun memberExtension(): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/implicitDynamicReceiver.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/implicitDynamicReceiver.dynamic.txt new file mode 100644 index 00000000000..a74f078ad91 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/implicitDynamicReceiver.dynamic.txt @@ -0,0 +1,15 @@ +public final fun foo(): dynamic +public final fun isDynamic(): dynamic +public final fun foo(/*0*/ p0: dynamic): dynamic +public final fun isDynamic(): dynamic +public final fun foo(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic +public final fun isDynamic(): dynamic +public final fun foo(): dynamic +public final fun isDynamic(): dynamic +public final var foo: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final fun isDynamic(): dynamic +public final var foo: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/inference.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/inference.dynamic.txt new file mode 100644 index 00000000000..b7da058cae8 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/inference.dynamic.txt @@ -0,0 +1,4 @@ +public final fun foo(): dynamic +public final fun foo(): dynamic +public final fun doo(): dynamic +public final fun doo(): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/namedArguments.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/namedArguments.dynamic.txt new file mode 100644 index 00000000000..360dbe4c4df --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/namedArguments.dynamic.txt @@ -0,0 +1,3 @@ +public final fun foo(/*0*/ name: dynamic): dynamic +public final fun foo(/*0*/ p0: dynamic, /*1*/ name: dynamic): dynamic +public final fun foo(/*0*/ p0: dynamic, /*1*/ duplicate: dynamic, /*2*/ duplicate: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/nullable.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/nullable.dynamic.txt new file mode 100644 index 00000000000..969b82fbfef --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/nullable.dynamic.txt @@ -0,0 +1,9 @@ +public final fun foo(): dynamic +public final fun isDynamic(): dynamic +public final fun foo(): dynamic +public final fun isDynamic(): dynamic +public final fun foo(): dynamic +public final fun isDynamic(): dynamic +public final fun foo(): dynamic +public final fun foo(): dynamic +public final fun foo(): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/overloadingAmbiguity.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/overloadingAmbiguity.dynamic.txt new file mode 100644 index 00000000000..1c3db620d53 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/overloadingAmbiguity.dynamic.txt @@ -0,0 +1 @@ +public final fun foo(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/smartCast.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/smartCast.dynamic.txt new file mode 100644 index 00000000000..6d9ee1ebece --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/smartCast.dynamic.txt @@ -0,0 +1 @@ +public final fun baz(): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/spreadOperator.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/spreadOperator.dynamic.txt new file mode 100644 index 00000000000..5d192a9ae85 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/spreadOperator.dynamic.txt @@ -0,0 +1,10 @@ +public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array*/): dynamic +public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array*/): dynamic +public final fun foo(/*0*/ p0: dynamic, /*1*/ p1: dynamic, /*2*/ vararg p2: dynamic /*kotlin.Array*/): dynamic +public final fun foo(/*0*/ p0: dynamic, /*1*/ vararg p1: dynamic /*kotlin.Array*/, /*2*/ p2: () -> dynamic): dynamic +public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array*/, /*1*/ p1: () -> dynamic): dynamic +public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array*/): dynamic +public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array*/, /*1*/ p1: () -> dynamic): dynamic +public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array*/): dynamic +public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array*/): dynamic +public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array*/): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/staticCallsInDynamicContext.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/staticCallsInDynamicContext.dynamic.txt new file mode 100644 index 00000000000..de78a5e6c74 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/staticCallsInDynamicContext.dynamic.txt @@ -0,0 +1,16 @@ +public final fun foo(): dynamic +public final fun ext(): dynamic +public final fun bar(): dynamic +public final var baz: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final fun ext(): dynamic +public final fun extValFun(): dynamic +public final var extVal: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final fun extExtVal(): dynamic +public final fun invoke(): dynamic +public final fun plus(/*0*/ p0: dynamic): dynamic +public final fun invoke(): dynamic +public final fun foo(): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/substitution.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/substitution.dynamic.txt new file mode 100644 index 00000000000..66f8ff502e3 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/substitution.dynamic.txt @@ -0,0 +1 @@ +public final fun bar(): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/varargs.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/varargs.dynamic.txt new file mode 100644 index 00000000000..e07e1a87b38 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/varargs.dynamic.txt @@ -0,0 +1 @@ +public final fun foo(): dynamic diff --git a/compiler/tests/org/jetbrains/jet/checkers/AbstractJetDiagnosticsTest.java b/compiler/tests/org/jetbrains/jet/checkers/AbstractJetDiagnosticsTest.java index 8a5db1ba4f1..d7055abdb61 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/AbstractJetDiagnosticsTest.java +++ b/compiler/tests/org/jetbrains/jet/checkers/AbstractJetDiagnosticsTest.java @@ -61,6 +61,7 @@ import java.util.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.test.util.RecursiveDescriptorComparator.RECURSIVE; +import static org.jetbrains.jet.test.util.RecursiveDescriptorComparator.RECURSIVE_ALL; public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest { @@ -146,6 +147,15 @@ public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest { ok &= testFile.getActualText(moduleBindings.get(testFile.getModule()), actualText, shouldSkipJvmSignatureDiagnostics(groupedByModule)); } + Throwable exceptionFromDynamicCallDescriptorsValidation = null; + try { + File expectedFile = new File(FileUtil.getNameWithoutExtension(testDataFile.getAbsolutePath()) + ".dynamic.txt"); + checkDynamicCallDescriptors(expectedFile, testFiles); + } + catch (Throwable e) { + exceptionFromDynamicCallDescriptorsValidation = e; + } + JetTestUtils.assertEqualsToFile(testDataFile, actualText.toString()); assertTrue("Diagnostics mismatch. See the output above", ok); @@ -157,6 +167,28 @@ public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest { if (exceptionFromLazyResolveLogValidation != null) { throw UtilsPackage.rethrow(exceptionFromLazyResolveLogValidation); } + if (exceptionFromDynamicCallDescriptorsValidation != null) { + throw UtilsPackage.rethrow(exceptionFromDynamicCallDescriptorsValidation); + } + } + + private void checkDynamicCallDescriptors(File expectedFile, List testFiles) { + RecursiveDescriptorComparator serializer = new RecursiveDescriptorComparator(RECURSIVE_ALL); + + StringBuilder actualText = new StringBuilder(); + + for (TestFile testFile : testFiles) { + List dynamicCallDescriptors = testFile.getDynamicCallDescriptors(); + + for (DeclarationDescriptor descriptor : dynamicCallDescriptors) { + String actualSerialized = serializer.serializeRecursively(descriptor); + actualText.append(actualSerialized); + } + } + + if (actualText.length() != 0 || expectedFile.exists()) { + JetTestUtils.assertEqualsToFile(expectedFile, actualText.toString()); + } } public boolean shouldSkipJvmSignatureDiagnostics(Map> groupedByModule) { diff --git a/compiler/tests/org/jetbrains/jet/checkers/BaseDiagnosticsTest.java b/compiler/tests/org/jetbrains/jet/checkers/BaseDiagnosticsTest.java index 0cb515ed99f..d60867aebb5 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/BaseDiagnosticsTest.java +++ b/compiler/tests/org/jetbrains/jet/checkers/BaseDiagnosticsTest.java @@ -33,6 +33,7 @@ import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.asJava.AsJavaPackage; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.diagnostics.*; import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetFile; @@ -243,6 +244,7 @@ public abstract class BaseDiagnosticsTest extends private final boolean declareFlexibleType; public final boolean checkLazyLog; private final boolean markDynamicCalls; + private final List dynamicCallDescriptors = new ArrayList(); public TestFile( @Nullable TestModule module, @@ -325,6 +327,11 @@ public abstract class BaseDiagnosticsTest extends return jetFile; } + @NotNull + public List getDynamicCallDescriptors() { + return dynamicCallDescriptors; + } + public boolean getActualText(BindingContext bindingContext, StringBuilder actualText, boolean skipJvmSignatureDiagnostics) { if (this.jetFile == null) { // TODO: check java files too @@ -338,7 +345,7 @@ public abstract class BaseDiagnosticsTest extends final boolean[] ok = { true }; List diagnostics = ContainerUtil.filter( - KotlinPackage.plus(CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, jetFile, markDynamicCalls), + KotlinPackage.plus(CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, jetFile, markDynamicCalls, dynamicCallDescriptors), jvmSignatureDiagnostics), whatDiagnosticsToConsider ); diff --git a/compiler/tests/org/jetbrains/jet/checkers/CheckerTestUtilTest.java b/compiler/tests/org/jetbrains/jet/checkers/CheckerTestUtilTest.java index e54142d10f6..19e2e229f8c 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/CheckerTestUtilTest.java +++ b/compiler/tests/org/jetbrains/jet/checkers/CheckerTestUtilTest.java @@ -147,7 +147,7 @@ public class CheckerTestUtilTest extends JetLiteFixture { (JetFile) psiFile) .getBindingContext(); - String expectedText = CheckerTestUtil.addDiagnosticMarkersToText(psiFile, CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false)).toString(); + String expectedText = CheckerTestUtil.addDiagnosticMarkersToText(psiFile, CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false, null)).toString(); List diagnosedRanges = Lists.newArrayList(); CheckerTestUtil.parseDiagnosedRanges(expectedText, diagnosedRanges); @@ -155,7 +155,7 @@ public class CheckerTestUtilTest extends JetLiteFixture { diagnosedRange.setFile(psiFile); } - List diagnostics = CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false); + List diagnostics = CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false, null); Collections.sort(diagnostics, CheckerTestUtil.DIAGNOSTIC_COMPARATOR); makeTestData(diagnostics, diagnosedRanges); diff --git a/idea/src/org/jetbrains/jet/plugin/actions/internal/CopyAsDiagnosticTestAction.java b/idea/src/org/jetbrains/jet/plugin/actions/internal/CopyAsDiagnosticTestAction.java index 3822cd9ce0b..943c52921d9 100644 --- a/idea/src/org/jetbrains/jet/plugin/actions/internal/CopyAsDiagnosticTestAction.java +++ b/idea/src/org/jetbrains/jet/plugin/actions/internal/CopyAsDiagnosticTestAction.java @@ -42,7 +42,7 @@ public class CopyAsDiagnosticTestAction extends AnAction { BindingContext bindingContext = ResolvePackage.analyzeFully((JetFile) psiFile); - List diagnostics = CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false); + List diagnostics = CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false, null); String result = CheckerTestUtil.addDiagnosticMarkersToText(psiFile, diagnostics).toString(); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();