set LOCAL visibility for local functions

(it can't be INHERIT)
This commit is contained in:
Svetlana Isakova
2012-08-22 16:47:38 +04:00
parent ea611cb51d
commit 4a5269bb2d
4 changed files with 43 additions and 1 deletions
@@ -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) {
@@ -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) {
@@ -0,0 +1,16 @@
package d
class T {
fun baz() = 1
}
<!ILLEGAL_MODIFIER!>override<!> fun zzz() {}
fun foo(t: T) {
<!ILLEGAL_MODIFIER!>override<!> fun T.baz() = 2
// was "Visibility is unknown yet exception"
t.baz()
zzz()
}
@@ -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");