From 17c3eeb7bdabd188d7fdaea3492c1ffe105db377 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 29 Aug 2014 15:20:24 +0400 Subject: [PATCH] Added error 'NESTED_CLASS_SHOULD_BE_QUALIFIED' when nested class is resolved through implicit this --- .../org/jetbrains/jet/lang/diagnostics/Errors.java | 1 + .../diagnostics/rendering/DefaultErrorMessages.java | 1 + .../jet/lang/resolve/calls/CandidateResolver.java | 2 +- .../calls/tasks/AbstractTracingStrategy.java | 13 +++++++++++-- .../lang/resolve/calls/tasks/TracingStrategy.java | 12 ++++++++++-- .../expressions/ControlStructureTypingUtils.java | 4 +++- .../diagnostics/tests/inner/extensionFun.kt | 2 +- .../function/nestedConstructorFromExtension.kt | 2 +- 8 files changed, 29 insertions(+), 8 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 272a91b5c17..b74be84d3d7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -602,6 +602,7 @@ public interface Errors { DiagnosticFactory1 TYPE_PARAMETER_IS_NOT_AN_EXPRESSION = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 TYPE_PARAMETER_ON_LHS_OF_DOT = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 NESTED_CLASS_SHOULD_BE_QUALIFIED = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 INACCESSIBLE_OUTER_CLASS_EXPRESSION = DiagnosticFactory1.create(ERROR); DiagnosticFactory0 NESTED_CLASS_NOT_ALLOWED = DiagnosticFactory0.create(ERROR, DECLARATION_NAME); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index a9cdf4383f6..ed7af872641 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -262,6 +262,7 @@ public class DefaultErrorMessages { MAP.put(TYPE_PARAMETER_ON_LHS_OF_DOT, "Type parameter ''{0}'' cannot have or inherit a class object, so it cannot be on the left hand side of dot", NAME); MAP.put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, "Generic arguments of the base type must be specified"); MAP.put(NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE, "Nested {0} accessed via instance reference", RENDER_CLASS_OR_OBJECT_NAME); + MAP.put(NESTED_CLASS_SHOULD_BE_QUALIFIED, "Nested {0} should be qualified", RENDER_CLASS_OR_OBJECT_NAME); MAP.put(INACCESSIBLE_OUTER_CLASS_EXPRESSION, "Expression is inaccessible from a nested class ''{0}'', use ''inner'' keyword to make the class inner", NAME); MAP.put(NESTED_CLASS_NOT_ALLOWED, "Nested class is not allowed here, use ''inner'' keyword to make the class inner"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index c08194d4244..7cf07417766 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -188,7 +188,7 @@ public class CandidateResolver { nestedClass = ((FakeCallableDescriptorForObject) candidateDescriptor).getReferencedDescriptor(); } if (nestedClass != null) { - context.tracing.nestedClassAccessViaInstanceReference(context.trace, nestedClass); + context.tracing.nestedClassAccessViaInstanceReference(context.trace, nestedClass, candidateCall.getExplicitReceiverKind()); return false; } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java index a4c7fc9ebf9..a6cc013f722 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java @@ -128,8 +128,17 @@ public abstract class AbstractTracingStrategy implements TracingStrategy { } @Override - public void nestedClassAccessViaInstanceReference(@NotNull BindingTrace trace, @NotNull ClassDescriptor classDescriptor) { - trace.report(NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE.on(reference, classDescriptor)); + public void nestedClassAccessViaInstanceReference( + @NotNull BindingTrace trace, + @NotNull ClassDescriptor classDescriptor, + @NotNull ExplicitReceiverKind explicitReceiverKind + ) { + if (explicitReceiverKind == ExplicitReceiverKind.NO_EXPLICIT_RECEIVER) { + trace.report(NESTED_CLASS_SHOULD_BE_QUALIFIED.on(reference, classDescriptor)); + } + else { + trace.report(NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE.on(reference, classDescriptor)); + } } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TracingStrategy.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TracingStrategy.java index a885ac4c14f..f14d808deb6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TracingStrategy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TracingStrategy.java @@ -81,7 +81,11 @@ public interface TracingStrategy { public void instantiationOfAbstractClass(@NotNull BindingTrace trace) {} @Override - public void nestedClassAccessViaInstanceReference(@NotNull BindingTrace trace, @NotNull ClassDescriptor classDescriptor) {} + public void nestedClassAccessViaInstanceReference( + @NotNull BindingTrace trace, + @NotNull ClassDescriptor classDescriptor, + @NotNull ExplicitReceiverKind explicitReceiverKind + ) {} @Override public void unsafeCall(@NotNull BindingTrace trace, @NotNull JetType type, boolean isCallForImplicitInvoke) {} @@ -132,7 +136,11 @@ public interface TracingStrategy { void instantiationOfAbstractClass(@NotNull BindingTrace trace); - void nestedClassAccessViaInstanceReference(@NotNull BindingTrace trace, @NotNull ClassDescriptor classDescriptor); + void nestedClassAccessViaInstanceReference( + @NotNull BindingTrace trace, + @NotNull ClassDescriptor classDescriptor, + @NotNull ExplicitReceiverKind explicitReceiverKind + ); void unsafeCall(@NotNull BindingTrace trace, @NotNull JetType type, boolean isCallForImplicitInvoke); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java index 9ed077ef422..11e80ed9092 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java @@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.calls.inference.*; import org.jetbrains.jet.lang.resolve.calls.model.MutableDataFlowInfoForArguments; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults; +import org.jetbrains.jet.lang.resolve.calls.tasks.ExplicitReceiverKind; import org.jetbrains.jet.lang.resolve.calls.tasks.ResolutionCandidate; import org.jetbrains.jet.lang.resolve.calls.tasks.TracingStrategy; import org.jetbrains.jet.lang.resolve.calls.util.CallMaker; @@ -456,7 +457,8 @@ public class ControlStructureTypingUtils { @Override public void nestedClassAccessViaInstanceReference( - @NotNull BindingTrace trace, @NotNull ClassDescriptor classDescriptor + @NotNull BindingTrace trace, @NotNull ClassDescriptor classDescriptor, + @NotNull ExplicitReceiverKind explicitReceiverKind ) { throwError(); } diff --git a/compiler/testData/diagnostics/tests/inner/extensionFun.kt b/compiler/testData/diagnostics/tests/inner/extensionFun.kt index 61bc65eccac..a63aa44dfd3 100644 --- a/compiler/testData/diagnostics/tests/inner/extensionFun.kt +++ b/compiler/testData/diagnostics/tests/inner/extensionFun.kt @@ -23,6 +23,6 @@ class Outer { fun Outer.foo() { Outer() - Nested() + Nested() Inner() } diff --git a/compiler/testData/diagnostics/testsWithStdLib/callableReference/function/nestedConstructorFromExtension.kt b/compiler/testData/diagnostics/testsWithStdLib/callableReference/function/nestedConstructorFromExtension.kt index 2918dcdfa1f..0a0df534b29 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/callableReference/function/nestedConstructorFromExtension.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/callableReference/function/nestedConstructorFromExtension.kt @@ -6,7 +6,7 @@ class A { } fun A.main() { - ::Nested + ::Nested val y = A::Nested y : KFunction0