From 4a5269bb2d2fc28232c77bc0e5477fb24c772564 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 22 Aug 2012 16:47:38 +0400 Subject: [PATCH] set LOCAL visibility for local functions (it can't be INHERIT) --- .../jet/lang/resolve/DeclarationsChecker.java | 3 +++ .../jet/lang/resolve/DescriptorResolver.java | 20 ++++++++++++++++++- .../localFunctionNoInheritVisibility.kt | 16 +++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/declarationChecks/localFunctionNoInheritVisibility.kt 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 9a84889bf44..d6ca3d0163b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -265,6 +265,9 @@ public class DeclarationsChecker { if (function.getBodyExpression() == null && !hasAbstractModifier) { trace.report(NON_MEMBER_FUNCTION_NO_BODY.on(function, functionDescriptor)); } + if (function.hasModifier(JetTokens.OVERRIDE_KEYWORD)) { + trace.report(ILLEGAL_MODIFIER.on(function.getModifierList().getModifierNode(JetTokens.OVERRIDE_KEYWORD).getPsi(), JetTokens.OVERRIDE_KEYWORD)); + } } private void checkAccessors(@NotNull JetProperty property, @NotNull PropertyDescriptor propertyDescriptor) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index b1e75e858aa..8763c34e28f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -49,6 +49,7 @@ import java.util.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.resolve.BindingContext.CONSTRUCTOR; +import static org.jetbrains.jet.lexer.JetTokens.OVERRIDE_KEYWORD; /** * @author abreslav @@ -273,7 +274,7 @@ public class DescriptorResolver { } boolean hasBody = function.getBodyExpression() != null; Modality modality = ModifiersChecker.resolveModalityFromModifiers(function, getDefaultModality(containingDescriptor, hasBody)); - Visibility visibility = ModifiersChecker.resolveVisibilityFromModifiers(function); + Visibility visibility = ModifiersChecker.resolveVisibilityFromModifiers(function, getDefaultVisibility(function, containingDescriptor)); JetModifierList modifierList = function.getModifierList(); boolean isInline = (modifierList != null) && modifierList.hasModifier(JetTokens.INLINE_KEYWORD); functionDescriptor.initialize( @@ -290,6 +291,23 @@ public class DescriptorResolver { return functionDescriptor; } + public static Visibility getDefaultVisibility(JetModifierListOwner modifierListOwner, DeclarationDescriptor containingDescriptor) { + Visibility defaultVisibility; + if (containingDescriptor instanceof ClassDescriptor) { + JetModifierList modifierList = modifierListOwner.getModifierList(); + defaultVisibility = modifierList != null && modifierList.hasModifier(OVERRIDE_KEYWORD) + ? Visibilities.INHERITED + : Visibilities.INTERNAL; + } + else if (containingDescriptor instanceof FunctionDescriptor) { + defaultVisibility = Visibilities.LOCAL; + } + else { + defaultVisibility = Visibilities.INTERNAL; + } + return defaultVisibility; + } + public static Modality getDefaultModality(DeclarationDescriptor containingDescriptor, boolean isBodyPresent) { Modality defaultModality; if (containingDescriptor instanceof ClassDescriptor) { diff --git a/compiler/testData/diagnostics/tests/declarationChecks/localFunctionNoInheritVisibility.kt b/compiler/testData/diagnostics/tests/declarationChecks/localFunctionNoInheritVisibility.kt new file mode 100644 index 00000000000..2d43f4e8d27 --- /dev/null +++ b/compiler/testData/diagnostics/tests/declarationChecks/localFunctionNoInheritVisibility.kt @@ -0,0 +1,16 @@ +package d + +class T { + fun baz() = 1 +} + +override fun zzz() {} + +fun foo(t: T) { + override fun T.baz() = 2 + + // was "Visibility is unknown yet exception" + t.baz() + + zzz() +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index c4d8484b46f..55fffd2418a 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1103,6 +1103,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/declarationChecks/localDeclarationModifiers.kt"); } + @TestMetadata("localFunctionNoInheritVisibility.kt") + public void testLocalFunctionNoInheritVisibility() throws Exception { + doTest("compiler/testData/diagnostics/tests/declarationChecks/localFunctionNoInheritVisibility.kt"); + } + @TestMetadata("LocalVariableWithNoTypeInformation.kt") public void testLocalVariableWithNoTypeInformation() throws Exception { doTest("compiler/testData/diagnostics/tests/declarationChecks/LocalVariableWithNoTypeInformation.kt");