From aefabd132e255201739d97bc0998d136b782350d Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Thu, 29 Mar 2012 20:44:04 +0400 Subject: [PATCH] Added 'package member cannot be protected' error --- .../jet/lang/diagnostics/Errors.java | 2 ++ .../jet/lang/resolve/DeclarationsChecker.java | 21 ++++++++++++------- 2 files changed, 16 insertions(+), 7 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 c683d8948e6..1150da8e7c6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -125,6 +125,8 @@ public interface Errors { DiagnosticFactory ABSTRACT_PROPERTY_WITH_GETTER = DiagnosticFactory.create(ERROR, "Property with getter implementation cannot be abstract"); DiagnosticFactory ABSTRACT_PROPERTY_WITH_SETTER = DiagnosticFactory.create(ERROR, "Property with setter implementation cannot be abstract"); + DiagnosticFactory PACKAGE_MEMBER_CANNOT_BE_PROTECTED = DiagnosticFactory.create(ERROR, "Package member cannot be protected"); + DiagnosticFactory GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY = DiagnosticFactory.create(ERROR, "Getter visibility must be the same as property visibility"); DiagnosticFactory BACKING_FIELD_IN_TRAIT = DiagnosticFactory.create(ERROR, "Property in a trait cannot have a backing field", PositioningStrategies.POSITION_NAME_IDENTIFIER); DiagnosticFactory MUST_BE_INITIALIZED = DiagnosticFactory.create(ERROR, "Property must be initialized", PositioningStrategies.POSITION_NAME_IDENTIFIER); 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 a22e1a3c974..2acb2886028 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -71,7 +71,7 @@ public class DeclarationsChecker { if (!context.completeAnalysisNeeded(aClass)) continue; checkClass(aClass, classDescriptor); - checkModifiers(aClass.getModifierList()); + checkModifiers(aClass.getModifierList(), classDescriptor); } Map objects = context.getObjects(); @@ -90,7 +90,7 @@ public class DeclarationsChecker { if (!context.completeAnalysisNeeded(function)) continue; checkFunction(function, functionDescriptor); - checkModifiers(function.getModifierList()); + checkModifiers(function.getModifierList(), functionDescriptor); } Map properties = context.getProperties(); @@ -100,7 +100,7 @@ public class DeclarationsChecker { if (!context.completeAnalysisNeeded(property)) continue; checkProperty(property, propertyDescriptor); - checkModifiers(property.getModifierList()); + checkModifiers(property.getModifierList(), propertyDescriptor); } } @@ -162,7 +162,7 @@ public class DeclarationsChecker { JetFunction function = (JetFunction) member; hasDeferredType = function.getReturnTypeRef() == null && function.getBodyExpression() != null && !function.hasBlockBody(); } - if ((memberDescriptor.getVisibility() == Visibility.PUBLIC || memberDescriptor.getVisibility() == Visibility.PROTECTED) && hasDeferredType) { + if ((memberDescriptor.getVisibility().isPublicAPI()) && hasDeferredType) { trace.report(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE.on(member)); } } @@ -297,9 +297,9 @@ public class DeclarationsChecker { } } - private void checkModifiers(@Nullable JetModifierList modifierList) { + private void checkModifiers(@Nullable JetModifierList modifierList, @NotNull DeclarationDescriptor descriptor) { checkModalityModifiers(modifierList); - checkVisibilityModifiers(modifierList); + checkVisibilityModifiers(modifierList, descriptor); } private void checkModalityModifiers(@Nullable JetModifierList modifierList) { @@ -310,9 +310,16 @@ public class DeclarationsChecker { Lists.newArrayList(JetTokens.ABSTRACT_KEYWORD, JetTokens.OPEN_KEYWORD)); } - private void checkVisibilityModifiers(@Nullable JetModifierList modifierList) { + private void checkVisibilityModifiers(@Nullable JetModifierList modifierList, @NotNull DeclarationDescriptor descriptor) { if (modifierList == null) return; + DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); + if (containingDeclaration instanceof NamespaceDescriptor) { + if (modifierList.hasModifier(JetTokens.PROTECTED_KEYWORD)) { + trace.report(Errors.PACKAGE_MEMBER_CANNOT_BE_PROTECTED.on(modifierList.getModifierNode(JetTokens.PROTECTED_KEYWORD).getPsi())); + } + } + checkCompatibility(modifierList, Lists.newArrayList(JetTokens.PRIVATE_KEYWORD, JetTokens.PROTECTED_KEYWORD, JetTokens.PUBLIC_KEYWORD, JetTokens.INTERNAL_KEYWORD), Lists.newArrayList(JetTokens.PROTECTED_KEYWORD, JetTokens.INTERNAL_KEYWORD)); }