set LOCAL visibility for local functions
(it can't be INHERIT)
This commit is contained in:
@@ -265,6 +265,9 @@ public class DeclarationsChecker {
|
|||||||
if (function.getBodyExpression() == null && !hasAbstractModifier) {
|
if (function.getBodyExpression() == null && !hasAbstractModifier) {
|
||||||
trace.report(NON_MEMBER_FUNCTION_NO_BODY.on(function, functionDescriptor));
|
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) {
|
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.diagnostics.Errors.*;
|
||||||
import static org.jetbrains.jet.lang.resolve.BindingContext.CONSTRUCTOR;
|
import static org.jetbrains.jet.lang.resolve.BindingContext.CONSTRUCTOR;
|
||||||
|
import static org.jetbrains.jet.lexer.JetTokens.OVERRIDE_KEYWORD;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
@@ -273,7 +274,7 @@ public class DescriptorResolver {
|
|||||||
}
|
}
|
||||||
boolean hasBody = function.getBodyExpression() != null;
|
boolean hasBody = function.getBodyExpression() != null;
|
||||||
Modality modality = ModifiersChecker.resolveModalityFromModifiers(function, getDefaultModality(containingDescriptor, hasBody));
|
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();
|
JetModifierList modifierList = function.getModifierList();
|
||||||
boolean isInline = (modifierList != null) && modifierList.hasModifier(JetTokens.INLINE_KEYWORD);
|
boolean isInline = (modifierList != null) && modifierList.hasModifier(JetTokens.INLINE_KEYWORD);
|
||||||
functionDescriptor.initialize(
|
functionDescriptor.initialize(
|
||||||
@@ -290,6 +291,23 @@ public class DescriptorResolver {
|
|||||||
return functionDescriptor;
|
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) {
|
public static Modality getDefaultModality(DeclarationDescriptor containingDescriptor, boolean isBodyPresent) {
|
||||||
Modality defaultModality;
|
Modality defaultModality;
|
||||||
if (containingDescriptor instanceof ClassDescriptor) {
|
if (containingDescriptor instanceof ClassDescriptor) {
|
||||||
|
|||||||
+16
@@ -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");
|
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")
|
@TestMetadata("LocalVariableWithNoTypeInformation.kt")
|
||||||
public void testLocalVariableWithNoTypeInformation() throws Exception {
|
public void testLocalVariableWithNoTypeInformation() throws Exception {
|
||||||
doTest("compiler/testData/diagnostics/tests/declarationChecks/LocalVariableWithNoTypeInformation.kt");
|
doTest("compiler/testData/diagnostics/tests/declarationChecks/LocalVariableWithNoTypeInformation.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user