From fb9f9536a5760369457d0f9c49599415cbc36e07 Mon Sep 17 00:00:00 2001 From: Robert Widmann Date: Sat, 11 Jun 2016 09:52:18 -0700 Subject: [PATCH] Integrate fileprivate The majority of changes here are just plumbing needed to get the compiler to look at the (new!) FilePrivate as the (old!) Private and the (new!) Private as an even more closed-off form the of (old!) Private. The interesting changes are in `lib/AST/NameLookup.cpp` where (new!) private is defined as a declaration where our declcontext and their declcontext have to match or nest. (new!) Private predictably causes quite a lot more dead code elimination to fire in places which has lead to some interesting bugs that I will see about patches for (or at least SRs). --- docs/AccessControl.rst | 18 +- docs/OptimizationTips.rst | 22 +-- include/swift/AST/Attr.def | 1 + include/swift/AST/AttrKind.h | 4 +- include/swift/AST/Decl.h | 16 +- include/swift/AST/DiagnosticsSema.def | 100 ++++++------ include/swift/AST/PrintOptions.h | 2 +- include/swift/IDE/CodeCompletion.h | 2 +- include/swift/Parse/Tokens.def | 1 + include/swift/Serialization/ModuleFormat.h | 3 +- lib/AST/ASTDumper.cpp | 3 + lib/AST/ASTPrinter.cpp | 5 +- lib/AST/Attr.cpp | 2 + lib/AST/DeclContext.cpp | 10 +- lib/AST/Mangle.cpp | 4 +- lib/AST/Module.cpp | 7 +- lib/AST/NameLookup.cpp | 4 +- lib/ClangImporter/ImportDecl.cpp | 8 +- lib/FrontendTool/FrontendTool.cpp | 14 +- lib/IDE/CodeCompletion.cpp | 2 +- lib/IDE/CodeCompletionResultBuilder.h | 5 + lib/IDE/CommentConversion.cpp | 2 +- lib/IDE/ModuleInterfacePrinting.cpp | 2 +- lib/Parse/ParseDecl.cpp | 15 +- lib/SIL/DynamicCasts.cpp | 10 +- lib/SIL/SIL.cpp | 3 +- lib/SIL/SILDeclRef.cpp | 2 +- lib/SIL/SILModule.cpp | 1 + .../IPO/DeadFunctionElimination.cpp | 1 + lib/SILOptimizer/IPO/GlobalOpt.cpp | 2 +- lib/SILOptimizer/IPO/GlobalPropertyOpt.cpp | 1 + lib/SILOptimizer/IPO/LetPropertiesOpts.cpp | 15 +- .../Transforms/SpeculativeDevirtualizer.cpp | 1 + lib/SILOptimizer/Utils/Devirtualize.cpp | 2 + lib/SILOptimizer/Utils/Local.cpp | 1 + lib/Sema/CodeSynthesis.cpp | 10 +- lib/Sema/ITCDecl.cpp | 2 +- lib/Sema/MiscDiagnostics.cpp | 3 +- lib/Sema/TypeCheckDecl.cpp | 20 +-- lib/Sema/TypeCheckProtocol.cpp | 10 +- lib/Serialization/Deserialization.cpp | 1 + lib/Serialization/Serialization.cpp | 3 +- .../public/core/HashedCollections.swift.gyb | 2 +- stdlib/public/core/IntegerParsing.swift.gyb | 2 +- test/1_stdlib/Runtime.swift | 2 +- test/DebugInfo/PrivateDiscriminator.swift | 4 +- test/DebugInfo/typealias.swift | 4 +- .../Inputs/multithread_module/main.swift | 2 +- test/IRGen/coverage.swift | 2 +- test/IRGen/method_linkage.swift | 12 +- test/IRGen/report_dead_method_call.swift | 12 +- test/IRGen/zombies.swift | 2 +- test/Inputs/ObjCBridging/Appliances.swift | 2 +- .../Inputs/testability_helper.swift | 4 +- test/Interpreter/classes.swift | 4 +- .../Inputs/accessibility_other.swift | 14 +- .../Inputs/has_accessibility.swift | 4 +- test/NameBinding/accessibility.swift | 16 +- test/NameBinding/reference-dependencies.swift | 34 ++-- .../whole_module_optimization_helper.swift | 2 +- test/SIL/whole_module_optimization.swift | 2 +- .../Inputs/mangling_private_helper.swift | 6 +- test/SILGen/accessibility_warnings.swift | 8 +- test/SILGen/cdecl.swift | 2 +- test/SILGen/deinit_in_vtable.swift | 6 +- test/SILGen/mangling_private.swift | 20 +-- test/SILGen/objc_extensions.swift | 2 +- test/SILGen/protocol_resilience.swift | 2 +- .../Inputs/devirt_access_other_module.swift | 6 +- test/SILOptimizer/basic-callee-printer.sil | 4 +- test/SILOptimizer/cast_folding.swift | 4 +- test/SILOptimizer/dead_func_init_method.sil | 6 +- test/SILOptimizer/dead_inlined_func.swift | 2 +- test/SILOptimizer/dead_method.swift | 2 +- test/SILOptimizer/devirt_access.sil | 6 +- test/SILOptimizer/devirt_access.swift | 10 +- .../devirt_access_other_module.swift | 8 +- test/SILOptimizer/devirt_base_class.swift | 12 +- ...t_concrete_subclass_of_generic_class.swift | 20 +-- test/SILOptimizer/devirt_default_case.swift | 4 +- .../SILOptimizer/devirt_unbound_generic.swift | 14 +- test/SILOptimizer/function_order.sil | 30 ++-- test/SILOptimizer/let_properties_opts.swift | 10 +- .../let_properties_opts_runtime.swift | 2 +- test/Sema/accessibility.swift | 154 +++++++++--------- .../complete_override.swift.response | 9 + .../structure.swift.invalid.response | 2 +- test/attr/accessibility.swift | 1 + test/attr/accessibility_print.swift | 2 +- test/attr/attr_objc.swift | 18 +- .../protocol/conforms/near_miss_objc.swift | 16 +- test/expr/capture/top-level-guard.swift | 2 +- tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp | 5 +- 93 files changed, 460 insertions(+), 401 deletions(-) diff --git a/docs/AccessControl.rst b/docs/AccessControl.rst index 92afdd4207835..9b46878f483dc 100644 --- a/docs/AccessControl.rst +++ b/docs/AccessControl.rst @@ -7,16 +7,18 @@ The general guiding principle of Swift access control: **No entity can be defined in terms of another entity that has a lower access level.** -There are three levels of access: "private", "internal", and "public". -Private entities can only be accessed from within the source file where they -are defined. Internal entities can be accessed anywhere within the module they -are defined. Public entities can be accessed from anywhere within the module -and from any other context that imports the current module. +There are four levels of access: "private", "fileprivate", "internal", and +"public". Private entities can only be accessed from within the current +declaration where they are defined. FilePrivate entities can only be accessed +from within the source file where they are defined. Internal entities can be +accessed anywhere within the module they are defined. Public entities can be +accessed from anywhere within the module and from any other context that imports +the current module. The names ``public`` and ``private`` have precedent in many languages; -``internal`` comes from C#. In the future, ``public`` may be used for both API -and SPI, at which point we may design additional annotations to distinguish the -two. +``internal`` comes from C# and ``fileprivate`` from the Swift community. In the +future, ``public`` may be used for both API and SPI, at which point we may +design additional annotations to distinguish the two. By default, most entities in a source file have ``internal`` access. This optimizes for the most common case—a single-target application diff --git a/docs/OptimizationTips.rst b/docs/OptimizationTips.rst index ede57514e230d..bde48f4bf147e 100644 --- a/docs/OptimizationTips.rst +++ b/docs/OptimizationTips.rst @@ -134,17 +134,17 @@ in the following ``C.array1`` and ``D.array1`` will be accessed directly d.array2[i] = ... // Will access D.array2 through dynamic dispatch. } -Advice: Use 'private' when declaration does not need to be accessed outside of file ------------------------------------------------------------------------------------ - -Applying the ``private`` keyword to a declaration restricts the visibility of -the declaration to the file in which it is declared. This allows the compiler to -be able to ascertain all other potentially overriding declarations. Thus the -absence of any such declarations enables the compiler to infer the ``final`` -keyword automatically and remove indirect calls for methods and field accesses -accordingly. For instance in the following, ``e.doSomething()`` and -``f.myPrivateVar``, will be able to be accessed directly assuming ``E``, ``F`` -do not have any overriding declarations in the same file: +Advice: Use 'private' and 'fileprivate' when declaration does not need to be accessed outside of file +----------------------------------------------------------------------------------------------------- + +Applying the ``private`` or ``fileprivate`` keywords to a declaration restricts +the visibility of the declaration to the file in which it is declared. This +allows the compiler to be able to ascertain all other potentially overriding +declarations. Thus the absence of any such declarations enables the compiler to +infer the ``final`` keyword automatically and remove indirect calls for methods +and field accesses accordingly. For instance in the following, +``e.doSomething()`` and ``f.myPrivateVar``, will be able to be accessed directly +assuming ``E``, ``F`` do not have any overriding declarations in the same file: :: diff --git a/include/swift/AST/Attr.def b/include/swift/AST/Attr.def index da0843a75aea2..4e04dfef85dbd 100644 --- a/include/swift/AST/Attr.def +++ b/include/swift/AST/Attr.def @@ -192,6 +192,7 @@ DECL_ATTR(private, Accessibility, OnClass | OnProtocol | OnVar | OnSubscript | OnConstructor | DeclModifier | NotSerialized, /* Not serialized */ 46) +DECL_ATTR_ALIAS(fileprivate, Accessibility) DECL_ATTR_ALIAS(internal, Accessibility) DECL_ATTR_ALIAS(public, Accessibility) diff --git a/include/swift/AST/AttrKind.h b/include/swift/AST/AttrKind.h index 0f43e83ebc151..dae8f7ff71c96 100644 --- a/include/swift/AST/AttrKind.h +++ b/include/swift/AST/AttrKind.h @@ -48,8 +48,10 @@ enum class UnaryOperatorKind : uint8_t { /// Access control levels. // These are used in diagnostics, so please do not reorder existing values. enum class Accessibility : uint8_t { - /// Private access is limited to the current file. + /// Private access is limited to the current declaration. Private = 0, + /// FilePrivate access is limited to the current file. + FilePrivate, /// Internal access is limited to the current module. Internal, /// Public access is not limited. diff --git a/include/swift/AST/Decl.h b/include/swift/AST/Decl.h index b63eb2da26776..19a6a9bf1b9c6 100644 --- a/include/swift/AST/Decl.h +++ b/include/swift/AST/Decl.h @@ -544,7 +544,7 @@ class alignas(1 << DeclAlignInBits) Decl { /// This is encoded as (1 << maxAccess) | (1 << defaultAccess), which /// works because the maximum is always greater than or equal to the /// default. 0 represents an uncomputed value. - unsigned DefaultAndMaxAccessLevel : 3; + unsigned DefaultAndMaxAccessLevel : 4; /// Whether there is an active conformance loader for this /// extension. @@ -1701,6 +1701,9 @@ class ExtensionDecl final : public Decl, public DeclContext, if (ExtensionDeclBits.DefaultAndMaxAccessLevel & (1 << static_cast(Accessibility::Private))) return Accessibility::Private; + if (ExtensionDeclBits.DefaultAndMaxAccessLevel & + (1 << static_cast(Accessibility::FilePrivate))) + return Accessibility::FilePrivate; if (ExtensionDeclBits.DefaultAndMaxAccessLevel & (1 << static_cast(Accessibility::Internal))) return Accessibility::Internal; @@ -1715,6 +1718,9 @@ class ExtensionDecl final : public Decl, public DeclContext, if (ExtensionDeclBits.DefaultAndMaxAccessLevel & (1 << static_cast(Accessibility::Internal))) return Accessibility::Internal; + if (ExtensionDeclBits.DefaultAndMaxAccessLevel & + (1 << static_cast(Accessibility::FilePrivate))) + return Accessibility::FilePrivate; return Accessibility::Private; } @@ -2084,7 +2090,7 @@ class IfConfigDecl : public Decl { class ValueDecl : public Decl { DeclName Name; SourceLoc NameLoc; - llvm::PointerIntPair> TypeAndAccess; + llvm::PointerIntPair> TypeAndAccess; protected: ValueDecl(DeclKind K, @@ -3823,8 +3829,8 @@ class AbstractStorageDecl : public ValueDecl { void configureObservingRecord(ObservingRecord *record, FuncDecl *willSet, FuncDecl *didSet); - llvm::PointerIntPair> GetSetInfo; - llvm::PointerIntPair> + llvm::PointerIntPair> GetSetInfo; + llvm::PointerIntPair> BehaviorInfo; ObservingRecord &getDidSetInfo() const { @@ -5926,6 +5932,8 @@ inline Accessibility ValueDecl::getEffectiveAccess() const { return Accessibility::Public; } return Accessibility::Internal; + case Accessibility::FilePrivate: + return Accessibility::FilePrivate; case Accessibility::Private: return Accessibility::Private; } diff --git a/include/swift/AST/DiagnosticsSema.def b/include/swift/AST/DiagnosticsSema.def index 8bf19edb62da1..d1c051fe39199 100644 --- a/include/swift/AST/DiagnosticsSema.def +++ b/include/swift/AST/DiagnosticsSema.def @@ -105,11 +105,11 @@ ERROR(could_not_use_member_on_existential,none, (Type, DeclName)) ERROR(candidate_inaccessible,none, - "%0 is inaccessible due to '%select{private|internal|PUBLIC}1' " + "%0 is inaccessible due to '%select{private|fileprivate|internal|PUBLIC}1' " "protection level", (DeclName, Accessibility)) ERROR(init_candidate_inaccessible,none, - "%0 initializer is inaccessible due to '%select{private|internal|PUBLIC}1' " + "%0 initializer is inaccessible due to '%select{private|fileprivate|internal|PUBLIC}1' " "protection level", (Type, Accessibility)) @@ -924,34 +924,34 @@ ERROR(attr_methods_only,none, ERROR(access_control_in_protocol,none, "%0 modifier cannot be used in protocols", (DeclAttribute)) ERROR(access_control_setter,none, - "'%select{private|internal|public}0(set)' modifier can only be applied " + "'%select{private|fileprivate|internal|public}0(set)' modifier can only be applied " "to variables and subscripts", (Accessibility)) ERROR(access_control_setter_read_only,none, - "'%select{private|internal|public}0(set)' modifier cannot be applied to " + "'%select{private|fileprivate|internal|public}0(set)' modifier cannot be applied to " "%select{constants|read-only variables|read-only properties" "|read-only subscripts}1", (Accessibility, unsigned)) ERROR(access_control_setter_more,none, - "%select{private|internal|PUBLIC}0 " + "%select{private|fileprivate|internal|PUBLIC}0 " "%select{variable|property|subscript}1 cannot have " - "%select{PRIVATE|an internal|a public}2 setter", + "%select{PRIVATE|a fileprivate|an internal|a public}2 setter", (Accessibility, unsigned, Accessibility)) WARNING(access_control_member_more,none, - "declaring %select{PRIVATE|an internal|a public}0 %1 for " - "%select{a private|an internal|PUBLIC}2 %3", + "declaring %select{PRIVATE|a fileprivate|an internal|a public}0 %1 for " + "%select{a private|a fileprivate|an internal|PUBLIC}2 %3", (Accessibility, DescriptiveDeclKind, Accessibility, DescriptiveDeclKind)) WARNING(access_control_ext_member_more,none, - "declaring %select{PRIVATE|an internal|a public}0 %1 in " - "%select{a private|an internal|PUBLIC}2 extension", + "declaring %select{PRIVATE|a fileprivate|an internal|a public}0 %1 in " + "%select{a private|a fileprivate|an internal|PUBLIC}2 extension", (Accessibility, DescriptiveDeclKind, Accessibility)) ERROR(access_control_ext_requirement_member_more,none, - "cannot declare %select{PRIVATE|an internal|a public}0 %1 in " - "an extension with %select{private|internal|PUBLIC}2 requirements", + "cannot declare %select{PRIVATE|a fileprivate|an internal|a public}0 %1 in " + "an extension with %select{private|fileprivate|internal|PUBLIC}2 requirements", (Accessibility, DescriptiveDeclKind, Accessibility)) ERROR(access_control_extension_more,none, - "extension of %select{private|internal|PUBLIC}0 %1 cannot be " - "declared %select{PRIVATE|internal|public}2", + "extension of %select{private|fileprivate|internal|PUBLIC}0 %1 cannot be " + "declared %select{PRIVATE|fileprivate|internal|public}2", (Accessibility, DescriptiveDeclKind, Accessibility)) ERROR(invalid_decl_attribute_simple,none, @@ -1039,15 +1039,15 @@ ERROR(static_requires_initializer,none, "expression or getter/setter specifier", (StaticSpellingKind)) ERROR(pattern_type_access,none, "%select{%select{variable|constant}0|property}1 " - "%select{must be declared %select{private|internal|PUBLIC}4" - "|cannot be declared %select{PRIVATE|internal|public}3}2 because its " - "type uses %select{a private|an internal|PUBLIC}4 type", + "%select{must be declared %select{private|fileprivate|internal|PUBLIC}4" + "|cannot be declared %select{PRIVATE|fileprivate|internal|public}3}2 because its " + "type uses %select{a private|a fileprivate|an internal|PUBLIC}4 type", (bool, bool, bool, Accessibility, Accessibility)) ERROR(pattern_type_access_inferred,none, "%select{%select{variable|constant}0|property}1 " - "%select{must be declared %select{private|internal|PUBLIC}4" - "|cannot be declared %select{PRIVATE|internal|public}3}2 because its " - "type %5 uses %select{a private|an internal|PUBLIC}4 type", + "%select{must be declared %select{private|fileprivate|internal|PUBLIC}4" + "|cannot be declared %select{PRIVATE|fileprivate|internal|public}3}2 because its " + "type %5 uses %select{a private|a fileprivate|an internal|PUBLIC}4 type", (bool, bool, bool, Accessibility, Accessibility, Type)) ERROR(pattern_binds_no_variables,none, "%select{property|global variable}0 declaration does not bind any " @@ -1070,26 +1070,26 @@ ERROR(unsupported_type_nested_in_generic_function,none, ERROR(circular_type_alias,none, "type alias %0 circularly references itself", (Identifier)) ERROR(type_alias_underlying_type_access,none, - "type alias %select{must be declared %select{private|internal|PUBLIC}2" - "|cannot be declared %select{PRIVATE|internal|public}1}0 because its " - "underlying type uses %select{a private|an internal|PUBLIC}2 type", + "type alias %select{must be declared %select{private|fileprivate|internal|PUBLIC}2" + "|cannot be declared %select{PRIVATE|fileprivate|internal|public}1}0 because its " + "underlying type uses %select{a private|a fileprivate|an internal|PUBLIC}2 type", (bool, Accessibility, Accessibility)) // Subscripts ERROR(subscript_type_access,none, - "subscript %select{must be declared %select{private|internal|PUBLIC}2" - "|cannot be declared %select{PRIVATE|internal|public}1}0 because its " + "subscript %select{must be declared %select{private|fileprivate|internal|PUBLIC}2" + "|cannot be declared %select{PRIVATE|fileprivate|internal|public}1}0 because its " "%select{index|element type}3 uses " - "%select{a private|an internal|PUBLIC}2 type", + "%select{a private|a fileprivate|an internal|PUBLIC}2 type", (bool, Accessibility, Accessibility, bool)) // Functions ERROR(function_type_access,none, "%select{function|method|initializer}3 " - "%select{must be declared %select{private|internal|PUBLIC}2" - "|cannot be declared %select{PRIVATE|internal|public}1}0 because its " + "%select{must be declared %select{private|fileprivate|internal|PUBLIC}2" + "|cannot be declared %select{PRIVATE|fileprivate|internal|public}1}0 because its " "%select{parameter|result}4 uses " - "%select{a private|an internal|PUBLIC}2 type", + "%select{a private|a fileprivate|an internal|PUBLIC}2 type", (bool, Accessibility, Accessibility, unsigned, bool)) WARNING(non_trailing_closure_before_default_args,none, "closure parameter prior to parameters with default arguments will " @@ -1191,8 +1191,8 @@ ERROR(witness_requires_dynamic_self,none, ERROR(witness_not_accessible_proto,none, "%select{initializer %1|method %1|%select{|setter for }2property %1" "|subscript%select{| setter}2}0 must be declared " - "%select{PRIVATE|internal|public}3 because it matches a requirement " - "in %select{PRIVATE|internal|public}3 protocol %4", + "%select{PRIVATE|fileprivate|internal|public}3 because it matches a requirement " + "in %select{PRIVATE|fileprivate|internal|public}3 protocol %4", (RequirementKind, DeclName, bool, Accessibility, DeclName)) ERROR(witness_not_accessible_type,none, "%select{initializer %1|method %1|%select{|setter for }2property %1" @@ -1200,8 +1200,8 @@ ERROR(witness_not_accessible_type,none, "type because it matches a requirement in protocol %4", (RequirementKind, DeclName, bool, Accessibility, DeclName)) ERROR(type_witness_not_accessible_proto,none, - "%0 %1 must be declared %select{PRIVATE|internal|public}2 because it " - "matches a requirement in %select{PRIVATE|internal|public}2 protocol %3", + "%0 %1 must be declared %select{PRIVATE|fileprivate|internal|public}2 because it " + "matches a requirement in %select{PRIVATE|fileprivate|internal|public}2 protocol %3", (DescriptiveDeclKind, DeclName, Accessibility, DeclName)) ERROR(type_witness_not_accessible_type,none, "%0 %1 must be as accessible as its enclosing type because it " @@ -1209,10 +1209,10 @@ ERROR(type_witness_not_accessible_type,none, (DescriptiveDeclKind, DeclName, Accessibility, DeclName)) ERROR(protocol_refine_access,none, - "%select{protocol must be declared %select{private|internal|PUBLIC}2 " + "%select{protocol must be declared %select{private|fileprivate|internal|PUBLIC}2 " "because it refines" - "|%select{PRIVATE|internal|public}1 protocol cannot refine}0 " - "%select{a private|an internal|PUBLIC}2 protocol", + "|%select{PRIVATE|fileprivate|internal|public}1 protocol cannot refine}0 " + "%select{a private|a fileprivate|an internal|PUBLIC}2 protocol", (bool, Accessibility, Accessibility)) ERROR(protocol_property_must_be_computed_var,none, "immutable property requirement must be declared as 'var' with a " @@ -1240,8 +1240,8 @@ NOTE(default_associated_type_req_fail,none, "does not conform to %3", (Type, DeclName, Type, Type)) ERROR(associated_type_access,none, - "associated type in %select{PRIVATE|an internal|a public}0 protocol " - "uses %select{a private|an internal|PUBLIC}1 type in its " + "associated type in %select{PRIVATE|a fileprivate|an internal|a public}0 protocol " + "uses %select{a private|a fileprivate|an internal|PUBLIC}1 type in its " "%select{default definition|requirement}2 ", (Accessibility, Accessibility, unsigned)) @@ -1345,7 +1345,7 @@ NOTE(optional_req_near_match_move,none, NOTE(optional_req_near_match_nonobjc,none, "add '@nonobjc' to silence this %select{warning|error}0", (bool)) NOTE(optional_req_near_match_accessibility,none, - "make %0 %select{ERROR|private|private or internal}1 to silence this " + "make %0 %select{ERROR|ERROR|fileprivate|fileprivate or internal}1 to silence this " "warning", (DeclName, Accessibility)) // Protocols and existentials @@ -1397,10 +1397,10 @@ ERROR(requires_generic_param_same_type_does_not_conform,none, (Type, Identifier)) ERROR(generic_param_access,none, - "%0 %select{must be declared %select{private|internal|PUBLIC}3" - "|cannot be declared %select{PRIVATE|internal|public}2}1 because its " + "%0 %select{must be declared %select{private|fileprivate|internal|PUBLIC}3" + "|cannot be declared %select{PRIVATE|fileprivate|internal|public}2}1 because its " "generic %select{parameter|requirement}4 uses " - "%select{a private|an internal|PUBLIC}3 type", + "%select{a private|a fileprivate|an internal|PUBLIC}3 type", (DescriptiveDeclKind, bool, Accessibility, Accessibility, bool)) ERROR(override_multiple_decls_base,none, @@ -1576,8 +1576,8 @@ ERROR(inheritance_from_objc_runtime_visible_class,none, // Enums ERROR(enum_case_access,none, - "enum case in %select{PRIVATE|an internal|a public}0 enum uses " - "%select{a private|an internal|PUBLIC}1 type", + "enum case in %select{PRIVATE|a fileprivate|an internal|a public}0 enum uses " + "%select{a private|a fileprivate|an internal|PUBLIC}1 type", (Accessibility, Accessibility)) ERROR(enum_stored_property,none, "enums may not contain stored properties", ()) @@ -1596,9 +1596,9 @@ ERROR(enum_raw_type_not_equatable,none, "RawRepresentable 'init' cannot be synthesized because raw type %0 is not " "Equatable", (Type)) ERROR(enum_raw_type_access,none, - "enum %select{must be declared %select{private|internal|PUBLIC}2" - "|cannot be declared %select{PRIVATE|internal|public}1}0 because its " - "raw type uses %select{a private|an internal|PUBLIC}2 type", + "enum %select{must be declared %select{private|fileprivate|internal|PUBLIC}2" + "|cannot be declared %select{PRIVATE|fileprivate|internal|public}1}0 because its " + "raw type uses %select{a private|a fileprivate|an internal|PUBLIC}2 type", (bool, Accessibility, Accessibility)) NOTE(enum_here,none, @@ -2490,9 +2490,9 @@ ERROR(self_in_nominal,none, "'Self' is only available in a protocol or as the result of a " "method in a class; did you mean %0?", (Identifier)) ERROR(class_super_access,none, - "class %select{must be declared %select{private|internal|PUBLIC}2" - "|cannot be declared %select{PRIVATE|internal|public}1}0 because its " - "superclass is %select{private|internal|PUBLIC}2", + "class %select{must be declared %select{private|fileprivate|internal|PUBLIC}2" + "|cannot be declared %select{PRIVATE|fileprivate|internal|public}1}0 because its " + "superclass is %select{private|fileprivate|internal|PUBLIC}2", (bool, Accessibility, Accessibility)) ERROR(dot_protocol_on_non_existential,none, "cannot use 'Protocol' with non-protocol type %0", (Type)) diff --git a/include/swift/AST/PrintOptions.h b/include/swift/AST/PrintOptions.h index 1c0ea4c14ea0c..a7ddc96e4eabc 100644 --- a/include/swift/AST/PrintOptions.h +++ b/include/swift/AST/PrintOptions.h @@ -249,7 +249,7 @@ struct PrintOptions { bool PrintInternalAccessibilityKeyword = true; /// Print all decls that have at least this level of access. - Accessibility AccessibilityFilter = Accessibility::Private; + Accessibility AccessibilityFilter = Accessibility::FilePrivate; /// Print IfConfigDecls and IfConfigStmts. bool PrintIfConfig = true; diff --git a/include/swift/IDE/CodeCompletion.h b/include/swift/IDE/CodeCompletion.h index 90bc63bf97c75..e90a4c7e2f3a7 100644 --- a/include/swift/IDE/CodeCompletion.h +++ b/include/swift/IDE/CodeCompletion.h @@ -63,7 +63,7 @@ class CodeCompletionStringChunk { public: enum class ChunkKind { - /// "internal", "private" or "public". + /// "internal", "private", "fileprivate", or "public". AccessControlKeyword, /// such as @"availability". diff --git a/include/swift/Parse/Tokens.def b/include/swift/Parse/Tokens.def index 80c438cac6c5e..34893b4ca3d4f 100644 --- a/include/swift/Parse/Tokens.def +++ b/include/swift/Parse/Tokens.def @@ -91,6 +91,7 @@ DECL_KEYWORD(associatedtype) DECL_KEYWORD(var) DECL_KEYWORD(internal) +DECL_KEYWORD(fileprivate) DECL_KEYWORD(private) DECL_KEYWORD(public) DECL_KEYWORD(static) diff --git a/include/swift/Serialization/ModuleFormat.h b/include/swift/Serialization/ModuleFormat.h index 8c30d852e788b..336df388ca8c8 100644 --- a/include/swift/Serialization/ModuleFormat.h +++ b/include/swift/Serialization/ModuleFormat.h @@ -53,7 +53,7 @@ const uint16_t VERSION_MAJOR = 0; /// in source control, you should also update the comment to briefly /// describe what change you made. The content of this comment isn't important; /// it just ensures a conflict if two people change the module format. -const uint16_t VERSION_MINOR = 251; // Last change: SILFunctionType::isPseudogeneric +const uint16_t VERSION_MINOR = 252; // Last change: serialization::AccessibilityKind ([File]Private) using DeclID = PointerEmbeddedInt; using DeclIDField = BCFixed<31>; @@ -287,6 +287,7 @@ using LibraryKindField = BCFixed<1>; // VERSION_MAJOR. enum class AccessibilityKind : uint8_t { Private = 0, + FilePrivate, Internal, Public, }; diff --git a/lib/AST/ASTDumper.cpp b/lib/AST/ASTDumper.cpp index ebeacbf2ae991..26b115904944f 100644 --- a/lib/AST/ASTDumper.cpp +++ b/lib/AST/ASTDumper.cpp @@ -570,6 +570,9 @@ namespace { case Accessibility::Private: OS << "private"; break; + case Accessibility::FilePrivate: + OS << "fileprivate"; + break; case Accessibility::Internal: OS << "internal"; break; diff --git a/lib/AST/ASTPrinter.cpp b/lib/AST/ASTPrinter.cpp index 333d0b6ac058e..6aaec1a5869f5 100644 --- a/lib/AST/ASTPrinter.cpp +++ b/lib/AST/ASTPrinter.cpp @@ -1125,6 +1125,9 @@ class PrintAST : public ASTVisitor { case Accessibility::Private: Printer << tok::kw_private; break; + case Accessibility::FilePrivate: + Printer << tok::kw_fileprivate; + break; case Accessibility::Internal: if (!Options.PrintInternalAccessibilityKeyword) return; @@ -1606,7 +1609,7 @@ bool swift::shouldPrint(const Decl *D, PrintOptions &Options) { // Skip declarations that are not accessible. if (auto *VD = dyn_cast(D)) { - if (Options.AccessibilityFilter > Accessibility::Private && + if (Options.AccessibilityFilter > Accessibility::FilePrivate && VD->hasAccessibility() && VD->getFormalAccess() < Options.AccessibilityFilter) return false; diff --git a/lib/AST/Attr.cpp b/lib/AST/Attr.cpp index 18ded09fe7ca3..29af52605f0c0 100644 --- a/lib/AST/Attr.cpp +++ b/lib/AST/Attr.cpp @@ -543,6 +543,8 @@ StringRef DeclAttribute::getAttrName() const { switch (cast(this)->getAccess()) { case Accessibility::Private: return "private"; + case Accessibility::FilePrivate: + return "fileprivate"; case Accessibility::Internal: return "internal"; case Accessibility::Public: diff --git a/lib/AST/DeclContext.cpp b/lib/AST/DeclContext.cpp index 1bd200b6bb776..f52c8e54545df 100644 --- a/lib/AST/DeclContext.cpp +++ b/lib/AST/DeclContext.cpp @@ -530,14 +530,14 @@ DeclContext::isCascadingContextForLookup(bool functionsAreNonCascading) const { return false; auto *AFD = cast(this); if (AFD->hasAccessibility()) - return AFD->getFormalAccess() > Accessibility::Private; + return AFD->getFormalAccess() > Accessibility::FilePrivate; break; } case DeclContextKind::SubscriptDecl: { auto *SD = cast(this); if (SD->hasAccessibility()) - return SD->getFormalAccess() > Accessibility::Private; + return SD->getFormalAccess() > Accessibility::FilePrivate; break; } @@ -548,17 +548,17 @@ DeclContext::isCascadingContextForLookup(bool functionsAreNonCascading) const { case DeclContextKind::GenericTypeDecl: { auto *nominal = cast(this); if (nominal->hasAccessibility()) - return nominal->getFormalAccess() > Accessibility::Private; + return nominal->getFormalAccess() > Accessibility::FilePrivate; break; } case DeclContextKind::ExtensionDecl: { auto *extension = cast(this); if (extension->hasDefaultAccessibility()) - return extension->getDefaultAccessibility() > Accessibility::Private; + return extension->getDefaultAccessibility() > Accessibility::FilePrivate; // FIXME: duplicated from computeDefaultAccessibility in TypeCheckDecl.cpp. if (auto *AA = extension->getAttrs().getAttribute()) - return AA->getAccess() > Accessibility::Private; + return AA->getAccess() > Accessibility::FilePrivate; if (Type extendedTy = extension->getExtendedType()) { // Need to check if extendedTy is ErrorType diff --git a/lib/AST/Mangle.cpp b/lib/AST/Mangle.cpp index 16f729ae9a7f3..b0b476188b747 100644 --- a/lib/AST/Mangle.cpp +++ b/lib/AST/Mangle.cpp @@ -387,7 +387,7 @@ void Mangler::mangleDeclName(const ValueDecl *decl) { // Fall through to mangle the . } else if (decl->hasAccessibility() && - decl->getFormalAccess() == Accessibility::Private) { + decl->getFormalAccess() <= Accessibility::FilePrivate) { // Mangle non-local private declarations with a textual discriminator // based on their enclosing file. // decl-name ::= 'P' identifier identifier @@ -405,7 +405,7 @@ void Mangler::mangleDeclName(const ValueDecl *decl) { auto nominal = dyn_cast(DC); if (!nominal) nominal = cast(DC)->getExtendedType()->getAnyNominal(); - return nominal->getFormalAccess() == Accessibility::Private; + return nominal->getFormalAccess() <= Accessibility::FilePrivate; }; if (!isWithinPrivateNominal(decl)) { diff --git a/lib/AST/Module.cpp b/lib/AST/Module.cpp index 3cbc92b747ff5..96e24192797f4 100644 --- a/lib/AST/Module.cpp +++ b/lib/AST/Module.cpp @@ -488,7 +488,8 @@ void Module::lookupMember(SmallVectorImpl &results, }); alreadyInPrivateContext = - (nominal->getFormalAccess() == Accessibility::Private); + (nominal->getFormalAccess() == Accessibility::FilePrivate + || nominal->getFormalAccess() == Accessibility::Private); break; } @@ -504,14 +505,14 @@ void Module::lookupMember(SmallVectorImpl &results, } else if (privateDiscriminator.empty()) { auto newEnd = std::remove_if(results.begin()+oldSize, results.end(), [](const ValueDecl *VD) -> bool { - return VD->getFormalAccess() <= Accessibility::Private; + return VD->getFormalAccess() <= Accessibility::FilePrivate; }); results.erase(newEnd, results.end()); } else { auto newEnd = std::remove_if(results.begin()+oldSize, results.end(), [=](const ValueDecl *VD) -> bool { - if (VD->getFormalAccess() > Accessibility::Private) + if (VD->getFormalAccess() > Accessibility::FilePrivate) return true; auto enclosingFile = cast(VD->getDeclContext()->getModuleScopeContext()); diff --git a/lib/AST/NameLookup.cpp b/lib/AST/NameLookup.cpp index 09366534d9437..2b8dcc561534a 100644 --- a/lib/AST/NameLookup.cpp +++ b/lib/AST/NameLookup.cpp @@ -322,7 +322,7 @@ bool swift::removeShadowedDecls(SmallVectorImpl &decls, static bool matchesDiscriminator(Identifier discriminator, const ValueDecl *value) { - if (value->getFormalAccess() != Accessibility::Private) + if (value->getFormalAccess() > Accessibility::FilePrivate) return false; auto containingFile = @@ -1015,6 +1015,8 @@ static bool checkAccessibility(const DeclContext *useDC, switch (access) { case Accessibility::Private: +// return useDC == sourceDC || useDC->isChildContextOf(sourceDC); + case Accessibility::FilePrivate: return useDC->getModuleScopeContext() == sourceDC->getModuleScopeContext(); case Accessibility::Internal: { const Module *sourceModule = sourceDC->getParentModule(); diff --git a/lib/ClangImporter/ImportDecl.cpp b/lib/ClangImporter/ImportDecl.cpp index 7d44bbd885bb5..1f6fbba14a6fa 100644 --- a/lib/ClangImporter/ImportDecl.cpp +++ b/lib/ClangImporter/ImportDecl.cpp @@ -1754,7 +1754,7 @@ namespace { ArrayRef protocols, MakeStructRawValuedOptions options = getDefaultMakeStructRawValuedOptions(), - Accessibility setterAccessibility = Accessibility::Private) { + Accessibility setterAccessibility = Accessibility::FilePrivate) { auto &cxt = Impl.SwiftContext; addProtocolsToStruct(structDecl, synthesizedProtocolAttrs, protocols); @@ -1816,7 +1816,7 @@ namespace { PatternBindingDecl *storedPatternBinding; std::tie(storedVar, storedPatternBinding) = createVarWithPattern( cxt, structDecl, storedVarName, storedUnderlyingType, /*isLet=*/false, - /*isImplicit=*/true, Accessibility::Private); + /*isImplicit=*/true, Accessibility::FilePrivate); // // Create a computed value variable @@ -1826,7 +1826,7 @@ namespace { structDecl); computedVar->setImplicit(); computedVar->setAccessibility(Accessibility::Public); - computedVar->setSetterAccessibility(Accessibility::Private); + computedVar->setSetterAccessibility(Accessibility::FilePrivate); // Create the getter for the computed value variable. auto computedVarGetter = makeNewtypeBridgedRawValueGetter( @@ -2311,7 +2311,7 @@ namespace { underlyingType, enumDecl); rawValue->setImplicit(); rawValue->setAccessibility(Accessibility::Public); - rawValue->setSetterAccessibility(Accessibility::Private); + rawValue->setSetterAccessibility(Accessibility::FilePrivate); // Create a pattern binding to describe the variable. Pattern *varPattern = createTypedNamedPattern(rawValue); diff --git a/lib/FrontendTool/FrontendTool.cpp b/lib/FrontendTool/FrontendTool.cpp index b23698781d0ba..04b5b7c52abb9 100644 --- a/lib/FrontendTool/FrontendTool.cpp +++ b/lib/FrontendTool/FrontendTool.cpp @@ -158,7 +158,7 @@ static bool declIsPrivate(const Decl *member) { } } - return VD->getFormalAccess() == Accessibility::Private; + return VD->getFormalAccess() <= Accessibility::FilePrivate; } static bool extendedTypeIsPrivate(TypeLoc inheritedType) { @@ -227,7 +227,7 @@ static bool emitReferenceDependencies(DiagnosticEngine &diags, if (!NTD) break; if (NTD->hasAccessibility() && - NTD->getFormalAccess() == Accessibility::Private) { + NTD->getFormalAccess() <= Accessibility::FilePrivate) { break; } @@ -261,7 +261,7 @@ static bool emitReferenceDependencies(DiagnosticEngine &diags, if (!NTD->hasName()) break; if (NTD->hasAccessibility() && - NTD->getFormalAccess() == Accessibility::Private) { + NTD->getFormalAccess() <= Accessibility::FilePrivate) { break; } out << "- \"" << escape(NTD->getName()) << "\"\n"; @@ -277,7 +277,7 @@ static bool emitReferenceDependencies(DiagnosticEngine &diags, if (!VD->hasName()) break; if (VD->hasAccessibility() && - VD->getFormalAccess() == Accessibility::Private) { + VD->getFormalAccess() <= Accessibility::FilePrivate) { break; } out << "- \"" << escape(VD->getName()) << "\"\n"; @@ -326,7 +326,7 @@ static bool emitReferenceDependencies(DiagnosticEngine &diags, for (auto *member : ED->getMembers()) { auto *VD = dyn_cast(member); if (!VD || !VD->hasName() || - VD->getFormalAccess() == Accessibility::Private) { + VD->getFormalAccess() <= Accessibility::FilePrivate) { continue; } out << "- [\"" << mangledName << "\", \"" @@ -391,7 +391,7 @@ static bool emitReferenceDependencies(DiagnosticEngine &diags, for (auto &entry : sortedMembers) { assert(entry.first.first != nullptr); if (entry.first.first->hasAccessibility() && - entry.first.first->getFormalAccess() == Accessibility::Private) + entry.first.first->getFormalAccess() <= Accessibility::FilePrivate) continue; out << "- "; @@ -414,7 +414,7 @@ static bool emitReferenceDependencies(DiagnosticEngine &diags, } if (i->first.first->hasAccessibility() && - i->first.first->getFormalAccess() == Accessibility::Private) + i->first.first->getFormalAccess() <= Accessibility::FilePrivate) continue; out << "- "; diff --git a/lib/IDE/CodeCompletion.cpp b/lib/IDE/CodeCompletion.cpp index 5bf49b7e3d28d..2cc78d6cf90d4 100644 --- a/lib/IDE/CodeCompletion.cpp +++ b/lib/IDE/CodeCompletion.cpp @@ -3942,7 +3942,7 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer { ->getFormalAccess(); bool missingDeclIntroducer = !hasVarIntroducer && !hasFuncIntroducer; - bool missingAccess = !isKeywordSpecified("private") && + bool missingAccess = !isKeywordSpecified("fileprivate") && !isKeywordSpecified("public") && !isKeywordSpecified("internal"); bool missingOverride = Reason == DeclVisibilityKind::MemberOfSuper && diff --git a/lib/IDE/CodeCompletionResultBuilder.h b/lib/IDE/CodeCompletionResultBuilder.h index e77d98eaebe80..55ebb8e5df3b1 100644 --- a/lib/IDE/CodeCompletionResultBuilder.h +++ b/lib/IDE/CodeCompletionResultBuilder.h @@ -115,6 +115,11 @@ class CodeCompletionResultBuilder { CodeCompletionString::Chunk::ChunkKind::AccessControlKeyword, "private "); break; + case Accessibility::FilePrivate: + addChunkWithTextNoCopy( + CodeCompletionString::Chunk::ChunkKind::AccessControlKeyword, + "fileprivate "); + break; case Accessibility::Internal: // 'internal' is the default, don't add it. break; diff --git a/lib/IDE/CommentConversion.cpp b/lib/IDE/CommentConversion.cpp index 15dc6b4641ab2..63eb067a73d84 100644 --- a/lib/IDE/CommentConversion.cpp +++ b/lib/IDE/CommentConversion.cpp @@ -340,7 +340,7 @@ void CommentToXMLConverter::visitDocComment(const DocComment *DC) { { PrintOptions PO = PrintOptions::printInterface(); PO.PrintAccessibility = false; - PO.AccessibilityFilter = Accessibility::Private; + PO.AccessibilityFilter = Accessibility::FilePrivate; PO.PrintDocumentationComments = false; PO.TypeDefinitions = false; PO.VarInitializers = false; diff --git a/lib/IDE/ModuleInterfacePrinting.cpp b/lib/IDE/ModuleInterfacePrinting.cpp index ba4054985fe13..5d0a8079372d9 100644 --- a/lib/IDE/ModuleInterfacePrinting.cpp +++ b/lib/IDE/ModuleInterfacePrinting.cpp @@ -303,7 +303,7 @@ void swift::ide::printSubmoduleInterface( // Skip declarations that are not accessible. if (auto *VD = dyn_cast(D)) { - if (Options.AccessibilityFilter > Accessibility::Private && + if (Options.AccessibilityFilter > Accessibility::FilePrivate && VD->hasAccessibility() && VD->getFormalAccess() < Options.AccessibilityFilter) continue; diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 976f30e5c0b20..b45953a1109b6 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -173,10 +173,10 @@ namespace { /// An RAII type to exclude tokens contributing to private decls from the /// interface hash of the source file. On destruct, it checks if the set of - /// attributes includes the "private" attribute; if so, it resets the MD5 - /// hash of the source file to what it was when the IgnorePrivateDeclTokens - /// instance was created, thus excluding from the interface hash all tokens - /// parsed in the meantime. + /// attributes includes the "private" or "fileprivate" attribute; if so, it + /// resets the MD5 hash of the source file to what it was when the + /// IgnorePrivateDeclTokens instance was created, thus excluding from the + /// interface hash all tokens parsed in the meantime. struct IgnorePrivateDeclTokens { Parser &TheParser; DeclAttributes &Attributes; @@ -198,7 +198,7 @@ namespace { return; if (auto *attr = Attributes.getAttribute()) { - if (attr->getAccess() == Accessibility::Private) { + if (attr->getAccess() <= Accessibility::FilePrivate) { TheParser.SF.setInterfaceHashState(*SavedHashState); } } @@ -536,6 +536,7 @@ bool Parser::parseNewDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc, auto access = llvm::StringSwitch(AttrName) .Case("private", Accessibility::Private) + .Case("fileprivate", Accessibility::FilePrivate) .Case("public", Accessibility::Public) .Case("internal", Accessibility::Internal); @@ -1725,8 +1726,9 @@ static bool isKeywordPossibleDeclStart(const Token &Tok) { case tok::kw_internal: case tok::kw_let: case tok::kw_operator: - case tok::kw_private: case tok::kw_protocol: + case tok::kw_private: + case tok::kw_fileprivate: case tok::kw_public: case tok::kw_static: case tok::kw_struct: @@ -1975,6 +1977,7 @@ ParserStatus Parser::parseDecl(ParseDeclOptions Flags, } case tok::kw_private: + case tok::kw_fileprivate: case tok::kw_internal: case tok::kw_public: // We still model these specifiers as attributes. diff --git a/lib/SIL/DynamicCasts.cpp b/lib/SIL/DynamicCasts.cpp index 21132fd189ce0..7d063b8a4006b 100644 --- a/lib/SIL/DynamicCasts.cpp +++ b/lib/SIL/DynamicCasts.cpp @@ -128,12 +128,12 @@ classifyDynamicCastToProtocol(CanType source, } } - // If the source type is private or target protocol is private, - // then conformances cannot be changed at run-time, because only this - // file could have implemented them, but no conformances were found. + // If the source type is private, fileprivate, or target protocol is private + // or fileprivate, then conformances cannot be changed at run-time, because + // only this file could have implemented them, but no conformances were found. // Therefore it is safe to make a negative decision at compile-time. - if (SourceNominalTy->getEffectiveAccess() == Accessibility::Private || - TargetProtocol->getEffectiveAccess() == Accessibility::Private) { + if (SourceNominalTy->getEffectiveAccess() <= Accessibility::FilePrivate || + TargetProtocol->getEffectiveAccess() <= Accessibility::FilePrivate) { // This cast is always false. Replace it with a branch to the // failure block. return DynamicCastFeasibility::WillFail; diff --git a/lib/SIL/SIL.cpp b/lib/SIL/SIL.cpp index fe108f02d4fa7..9aa4498060f68 100644 --- a/lib/SIL/SIL.cpp +++ b/lib/SIL/SIL.cpp @@ -70,6 +70,7 @@ FormalLinkage swift::getDeclLinkage(const ValueDecl *D) { return FormalLinkage::PublicUnique; return FormalLinkage::HiddenUnique; case Accessibility::Private: + case Accessibility::FilePrivate: // Why "hidden" instead of "private"? Because the debugger may need to // access these symbols. return FormalLinkage::HiddenUnique; @@ -144,7 +145,7 @@ swift::getLinkageForProtocolConformance(const NormalProtocolConformance *C, // FIXME: This should be using std::min(protocol's access, type's access). switch (C->getProtocol()->getEffectiveAccess()) { - case Accessibility::Private: + case Accessibility::FilePrivate: return (definition ? SILLinkage::Private : SILLinkage::PrivateExternal); case Accessibility::Internal: diff --git a/lib/SIL/SILDeclRef.cpp b/lib/SIL/SILDeclRef.cpp index 4da3cc5c515b2..1c65850a3ef66 100644 --- a/lib/SIL/SILDeclRef.cpp +++ b/lib/SIL/SILDeclRef.cpp @@ -335,7 +335,7 @@ SILLinkage SILDeclRef::getLinkage(ForDefinition_t forDefinition) const { // Otherwise, we have external linkage. switch (d->getEffectiveAccess()) { - case Accessibility::Private: + case Accessibility::FilePrivate: return (forDefinition ? SILLinkage::Private : SILLinkage::PrivateExternal); case Accessibility::Internal: diff --git a/lib/SIL/SILModule.cpp b/lib/SIL/SILModule.cpp index a6d225426ba19..533de5117d6d0 100644 --- a/lib/SIL/SILModule.cpp +++ b/lib/SIL/SILModule.cpp @@ -269,6 +269,7 @@ static SILFunction::ClassVisibility_t getClassVisibility(SILDeclRef constant) { switch (classType->getEffectiveAccess()) { case Accessibility::Private: + case Accessibility::FilePrivate: return SILFunction::NotRelevant; case Accessibility::Internal: return SILFunction::InternalClass; diff --git a/lib/SILOptimizer/IPO/DeadFunctionElimination.cpp b/lib/SILOptimizer/IPO/DeadFunctionElimination.cpp index 8bcba7bb94229..08fed9d932145 100644 --- a/lib/SILOptimizer/IPO/DeadFunctionElimination.cpp +++ b/lib/SILOptimizer/IPO/DeadFunctionElimination.cpp @@ -202,6 +202,7 @@ class FunctionLivenessComputation { SILLinkage linkage; switch (accessibility) { case Accessibility::Private: + case Accessibility::FilePrivate: linkage = SILLinkage::Private; break; case Accessibility::Internal: diff --git a/lib/SILOptimizer/IPO/GlobalOpt.cpp b/lib/SILOptimizer/IPO/GlobalOpt.cpp index 0b47515294daa..532926c5f1312 100644 --- a/lib/SILOptimizer/IPO/GlobalOpt.cpp +++ b/lib/SILOptimizer/IPO/GlobalOpt.cpp @@ -741,7 +741,7 @@ static bool canBeChangedExternally(SILGlobalVariable *SILG) { // if possible. if (auto *Decl = SILG->getDecl()) { auto Access = Decl->getFormalAccess(); - if (Access == Accessibility::Private) + if (Access <= Accessibility::FilePrivate) return false; if (Access == Accessibility::Internal && SILG->getModule().isWholeModule()) diff --git a/lib/SILOptimizer/IPO/GlobalPropertyOpt.cpp b/lib/SILOptimizer/IPO/GlobalPropertyOpt.cpp index 86201e09a4e5a..a73db8c40a8d5 100644 --- a/lib/SILOptimizer/IPO/GlobalPropertyOpt.cpp +++ b/lib/SILOptimizer/IPO/GlobalPropertyOpt.cpp @@ -134,6 +134,7 @@ class GlobalPropertyOpt { SILLinkage linkage; switch (accessibility) { case Accessibility::Private: + case Accessibility::FilePrivate: linkage = SILLinkage::Private; break; case Accessibility::Internal: diff --git a/lib/SILOptimizer/IPO/LetPropertiesOpts.cpp b/lib/SILOptimizer/IPO/LetPropertiesOpts.cpp index bd65ca0a5c598..717f31bdeef54 100644 --- a/lib/SILOptimizer/IPO/LetPropertiesOpts.cpp +++ b/lib/SILOptimizer/IPO/LetPropertiesOpts.cpp @@ -161,9 +161,9 @@ void LetPropertiesOpt::optimizeLetPropertyAccess(VarDecl *Property, // Check if a given let property can be removed, because it // is not accessible elsewhere. This can happen if this property - // is private or if it is internal and WMO mode is used. - if (TypeAccess == Accessibility::Private || - PropertyAccess == Accessibility::Private + // is private or fileprivate or if it is internal and WMO mode is used. + if (TypeAccess <= Accessibility::FilePrivate || + PropertyAccess <= Accessibility::FilePrivate || ((TypeAccess == Accessibility::Internal || PropertyAccess == Accessibility::Internal) && Module->isWholeModule())) { @@ -280,6 +280,7 @@ static bool isAssignableExternally(VarDecl *Property, SILModule *Module) { SILLinkage linkage; switch (accessibility) { case Accessibility::Private: + case Accessibility::FilePrivate: linkage = SILLinkage::Private; DEBUG(llvm::dbgs() << "Property " << *Property << " has private access\n"); break; @@ -312,12 +313,12 @@ static bool isAssignableExternally(VarDecl *Property, SILModule *Module) { if (isa(Ty)) return false; - // Check if there are any private properties or any internal properties and - // it is a whole module compilation. In this case, no external initializer - // may exist. + // Check if there are any private or fileprivate properties or any internal + // properties and it is a whole module compilation. In this case, no + // external initializer may exist. for (auto SP : Ty->getStoredProperties()) { auto storedPropertyAccessibility = SP->getEffectiveAccess(); - if (storedPropertyAccessibility == Accessibility::Private || + if (storedPropertyAccessibility <= Accessibility::FilePrivate || (storedPropertyAccessibility == Accessibility::Internal && Module->isWholeModule())) { DEBUG(llvm::dbgs() << "Property " << *Property diff --git a/lib/SILOptimizer/Transforms/SpeculativeDevirtualizer.cpp b/lib/SILOptimizer/Transforms/SpeculativeDevirtualizer.cpp index 64a83b59f942d..cebdbfa632eba 100644 --- a/lib/SILOptimizer/Transforms/SpeculativeDevirtualizer.cpp +++ b/lib/SILOptimizer/Transforms/SpeculativeDevirtualizer.cpp @@ -252,6 +252,7 @@ static bool isDefaultCaseKnown(ClassHierarchyAnalysis *CHA, return false; break; case Accessibility::Private: + case Accessibility::FilePrivate: break; } diff --git a/lib/SILOptimizer/Utils/Devirtualize.cpp b/lib/SILOptimizer/Utils/Devirtualize.cpp index 40b2bff653a52..d04d0a18a16d1 100644 --- a/lib/SILOptimizer/Utils/Devirtualize.cpp +++ b/lib/SILOptimizer/Utils/Devirtualize.cpp @@ -185,6 +185,7 @@ static bool isKnownFinalClass(ClassDecl *CD, SILModule &M, return false; break; case Accessibility::Private: + case Accessibility::FilePrivate: break; } @@ -204,6 +205,7 @@ static bool isKnownFinalClass(ClassDecl *CD, SILModule &M, return false; break; case Accessibility::Private: + case Accessibility::FilePrivate: break; } diff --git a/lib/SILOptimizer/Utils/Local.cpp b/lib/SILOptimizer/Utils/Local.cpp index 59c69e15042c5..05abf6034c16f 100644 --- a/lib/SILOptimizer/Utils/Local.cpp +++ b/lib/SILOptimizer/Utils/Local.cpp @@ -2582,6 +2582,7 @@ bool swift::calleesAreStaticallyKnowable(SILModule &M, SILDeclRef Decl) { case Accessibility::Internal: return M.isWholeModule(); case Accessibility::Private: + case Accessibility::FilePrivate: return true; } } diff --git a/lib/Sema/CodeSynthesis.cpp b/lib/Sema/CodeSynthesis.cpp index c9dc82078e1fe..0524c05049d1c 100644 --- a/lib/Sema/CodeSynthesis.cpp +++ b/lib/Sema/CodeSynthesis.cpp @@ -1177,8 +1177,8 @@ void TypeChecker::completePropertyBehaviorStorage(VarDecl *VD, if (VD->getDeclContext()->getAsClassOrClassExtensionContext()) makeFinal(Context, Storage); Storage->setImplicit(); - Storage->setAccessibility(Accessibility::Private); - Storage->setSetterAccessibility(Accessibility::Private); + Storage->setAccessibility(Accessibility::FilePrivate); + Storage->setSetterAccessibility(Accessibility::FilePrivate); addMemberToContextIfNeeded(Storage, DC); @@ -1407,7 +1407,7 @@ void TypeChecker::completePropertyBehaviorParameter(VarDecl *VD, if (DC->getAsClassOrClassExtensionContext()) makeFinal(Context, Parameter); Parameter->setImplicit(); - Parameter->setAccessibility(Accessibility::Private); + Parameter->setAccessibility(Accessibility::FilePrivate); Parameter->setIsBeingTypeChecked(); Parameter->setBodyResultType(SubstBodyResultTy); @@ -1641,8 +1641,8 @@ void TypeChecker::completeLazyVarImplementation(VarDecl *VD) { if (VD->getDeclContext()->getAsClassOrClassExtensionContext()) makeFinal(Context, Storage); Storage->setImplicit(); - Storage->setAccessibility(Accessibility::Private); - Storage->setSetterAccessibility(Accessibility::Private); + Storage->setAccessibility(Accessibility::FilePrivate); + Storage->setSetterAccessibility(Accessibility::FilePrivate); typeCheckDecl(Get, true); typeCheckDecl(Get, false); diff --git a/lib/Sema/ITCDecl.cpp b/lib/Sema/ITCDecl.cpp index 1371b77b31bc0..f43e6bd9a347a 100644 --- a/lib/Sema/ITCDecl.cpp +++ b/lib/Sema/ITCDecl.cpp @@ -314,7 +314,7 @@ void IterativeTypeChecker::processResolveTypeDecl( TypeResolutionOptions options; options |= TR_GlobalTypeAlias; - if (typeAliasDecl->getFormalAccess() == Accessibility::Private) + if (typeAliasDecl->getFormalAccess() <= Accessibility::FilePrivate) options |= TR_KnownNonCascadingDependency; // Note: recursion into old type checker is okay when passing in an diff --git a/lib/Sema/MiscDiagnostics.cpp b/lib/Sema/MiscDiagnostics.cpp index b3e08567c2d52..a2dcb663dc101 100644 --- a/lib/Sema/MiscDiagnostics.cpp +++ b/lib/Sema/MiscDiagnostics.cpp @@ -3150,7 +3150,8 @@ void swift::fixItAccessibility(InFlightDiagnostic &diag, ValueDecl *VD, Accessibility desiredAccess, bool isForSetter) { StringRef fixItString; switch (desiredAccess) { - case Accessibility::Private: fixItString = "private "; break; + case Accessibility::Private: fixItString = "private "; break; + case Accessibility::FilePrivate: fixItString = "fileprivate "; break; case Accessibility::Internal: fixItString = "internal "; break; case Accessibility::Public: fixItString = "public "; break; } diff --git a/lib/Sema/TypeCheckDecl.cpp b/lib/Sema/TypeCheckDecl.cpp index a1a3637b9e5c2..eaa591e5189b6 100644 --- a/lib/Sema/TypeCheckDecl.cpp +++ b/lib/Sema/TypeCheckDecl.cpp @@ -1005,7 +1005,7 @@ static void checkRedeclaration(TypeChecker &tc, ValueDecl *current) { ReferencedNameTracker *tracker = currentFile->getReferencedNameTracker(); bool isCascading = true; if (current->hasAccessibility()) - isCascading = (current->getFormalAccess() > Accessibility::Private); + isCascading = (current->getFormalAccess() > Accessibility::FilePrivate); // Find other potential definitions. SmallVector otherDefinitionsVec; @@ -1318,7 +1318,7 @@ class TypeAccessibilityChecker : private TypeWalker { explicit TypeAccessibilityChecker(TypeAccessibilityCacheMap &cache) : Cache(cache) { // Always have something on the stack. - AccessStack.push_back(Accessibility::Private); + AccessStack.push_back(Accessibility::FilePrivate); } bool shouldVisitOriginalSubstitutedType() override { return true; } @@ -1455,7 +1455,7 @@ void TypeChecker::computeAccessibility(ValueDecl *D) { case DeclContextKind::TopLevelCodeDecl: case DeclContextKind::AbstractFunctionDecl: case DeclContextKind::SubscriptDecl: - D->setAccessibility(Accessibility::Private); + D->setAccessibility(Accessibility::FilePrivate); break; case DeclContextKind::Module: case DeclContextKind::FileUnit: @@ -1535,7 +1535,7 @@ static void checkTypeAccessibility( llvm::function_ref diagnose) { // Don't spend time checking private access; this is always valid. // This includes local declarations. - if (contextAccess == Accessibility::Private || !TL.getType()) + if (contextAccess <= Accessibility::FilePrivate || !TL.getType()) return; Accessibility typeAccess = @@ -2064,7 +2064,7 @@ static Optional shouldMarkAsObjC(TypeChecker &TC, // Implicitly generated declarations are not @objc, except for constructors. else if (!allowImplicit && VD->isImplicit()) return None; - else if (VD->getFormalAccess() == Accessibility::Private) + else if (VD->getFormalAccess() <= Accessibility::FilePrivate) return None; // If this declaration is part of a class with implicitly @objc members, @@ -3484,7 +3484,7 @@ class DeclChecker : public DeclVisitor { TypeResolutionOptions options; if (!TAD->getDeclContext()->isTypeContext()) options |= TR_GlobalTypeAlias; - if (TAD->getFormalAccess() == Accessibility::Private) + if (TAD->getFormalAccess() <= Accessibility::FilePrivate) options |= TR_KnownNonCascadingDependency; if (TAD->getDeclContext()->isModuleScopeContext()) { @@ -3848,7 +3848,7 @@ class DeclChecker : public DeclVisitor { if (auto *SF = CD->getParentSourceFile()) { if (auto *tracker = SF->getReferencedNameTracker()) { - bool isPrivate = CD->getFormalAccess() == Accessibility::Private; + bool isPrivate = CD->getFormalAccess() <= Accessibility::FilePrivate; tracker->addUsedMember({Super, Identifier()}, !isPrivate); } } @@ -3915,7 +3915,7 @@ class DeclChecker : public DeclVisitor { if (auto *SF = PD->getParentSourceFile()) { if (auto *tracker = SF->getReferencedNameTracker()) { - bool isNonPrivate = (PD->getFormalAccess() != Accessibility::Private); + bool isNonPrivate = (PD->getFormalAccess() > Accessibility::FilePrivate); for (auto *parentProto : PD->getInheritedProtocols(nullptr)) tracker->addUsedMember({parentProto, Identifier()}, isNonPrivate); } @@ -5161,7 +5161,7 @@ class DeclChecker : public DeclVisitor { std::min(classDecl->getFormalAccess(), matchDecl->getFormalAccess()); bool shouldDiagnose = false; bool shouldDiagnoseSetter = false; - if (requiredAccess > Accessibility::Private && + if (requiredAccess > Accessibility::FilePrivate && !isa(decl)) { shouldDiagnose = (decl->getFormalAccess() < requiredAccess); @@ -6927,7 +6927,7 @@ void TypeChecker::validateAccessibility(ValueDecl *D) { case DeclKind::Destructor: case DeclKind::EnumElement: { if (D->isInvalid()) { - D->setAccessibility(Accessibility::Private); + D->setAccessibility(Accessibility::FilePrivate); } else { auto container = cast(D->getDeclContext()); validateAccessibility(container); diff --git a/lib/Sema/TypeCheckProtocol.cpp b/lib/Sema/TypeCheckProtocol.cpp index d0a793d968ebd..5e50663ee600f 100644 --- a/lib/Sema/TypeCheckProtocol.cpp +++ b/lib/Sema/TypeCheckProtocol.cpp @@ -1227,7 +1227,7 @@ checkWitnessAccessibility(Accessibility *requiredAccess, // FIXME: Handle "private(set)" requirements. *requiredAccess = std::min(Proto->getFormalAccess(), *requiredAccess); - if (*requiredAccess > Accessibility::Private) { + if (*requiredAccess > Accessibility::FilePrivate) { if (witness->getFormalAccess() < *requiredAccess) return true; @@ -4435,13 +4435,13 @@ static void diagnosePotentialWitness(TypeChecker &tc, witness->getFullName(), static_cast(*move)); } - // If adding 'private' or 'internal' can help, suggest that. - if (accessibility != Accessibility::Private && + // If adding 'fileprivate' or 'internal' can help, suggest that. + if (accessibility != Accessibility::FilePrivate && !witness->getAttrs().hasAttribute()) { tc.diagnose(witness, diag::optional_req_near_match_accessibility, witness->getFullName(), accessibility) - .fixItInsert(witness->getAttributeInsertionLoc(true), "private "); + .fixItInsert(witness->getAttributeInsertionLoc(true), "fileprivate "); } // If adding @nonobjc can help, suggest that. @@ -4528,7 +4528,7 @@ void TypeChecker::checkConformancesInContext(DeclContext *dc, if (tracker) tracker->addUsedMember({conformance->getProtocol(), Identifier()}, - defaultAccessibility != Accessibility::Private); + defaultAccessibility > Accessibility::FilePrivate); } // Diagnose any conflicts attributed to this declaration context. diff --git a/lib/Serialization/Deserialization.cpp b/lib/Serialization/Deserialization.cpp index 3e18d900c0785..bacfde9cfad7f 100644 --- a/lib/Serialization/Deserialization.cpp +++ b/lib/Serialization/Deserialization.cpp @@ -1653,6 +1653,7 @@ getActualAccessibility(uint8_t raw) { case serialization::AccessibilityKind::NAME: \ return Accessibility::NAME; CASE(Private) + CASE(FilePrivate) CASE(Internal) CASE(Public) #undef CASE diff --git a/lib/Serialization/Serialization.cpp b/lib/Serialization/Serialization.cpp index f55a4318b649c..66b5ff0bb65e3 100644 --- a/lib/Serialization/Serialization.cpp +++ b/lib/Serialization/Serialization.cpp @@ -1545,6 +1545,7 @@ static uint8_t getRawStableAccessibility(Accessibility access) { case Accessibility::NAME: \ return static_cast(serialization::AccessibilityKind::NAME); CASE(Private) + CASE(FilePrivate) CASE(Internal) CASE(Public) #undef CASE @@ -2020,7 +2021,7 @@ void Serializer::writeDecl(const Decl *D) { if (auto *value = dyn_cast(D)) { if (value->hasAccessibility() && - value->getFormalAccess() == Accessibility::Private && + value->getFormalAccess() <= Accessibility::FilePrivate && !value->getDeclContext()->isLocalContext()) { // FIXME: We shouldn't need to encode this for /all/ private decls. // In theory we can follow the same rules as mangling and only include diff --git a/stdlib/public/core/HashedCollections.swift.gyb b/stdlib/public/core/HashedCollections.swift.gyb index f6b0fc1830b5b..a681e928a43aa 100644 --- a/stdlib/public/core/HashedCollections.swift.gyb +++ b/stdlib/public/core/HashedCollections.swift.gyb @@ -1209,7 +1209,7 @@ public func == (lhs: Set, rhs: Set) -> Boo } extension Set : CustomStringConvertible, CustomDebugStringConvertible { - private func makeDescription(isDebug: Bool) -> String { + fileprivate func makeDescription(isDebug: Bool) -> String { var result = isDebug ? "Set([" : "[" var first = true for member in self { diff --git a/stdlib/public/core/IntegerParsing.swift.gyb b/stdlib/public/core/IntegerParsing.swift.gyb index 534bc11cd87f5..448c5b65b84c4 100644 --- a/stdlib/public/core/IntegerParsing.swift.gyb +++ b/stdlib/public/core/IntegerParsing.swift.gyb @@ -107,7 +107,7 @@ internal func _parseAsciiAsIntMax( } /// Strip an optional single leading ASCII plus/minus sign from `utf16`. -private func _parseOptionalAsciiSign( +fileprivate func _parseOptionalAsciiSign( _ utf16: String.UTF16View ) -> (digitsUTF16: String.UTF16View, isMinus: Bool) { switch utf16.first { diff --git a/test/1_stdlib/Runtime.swift b/test/1_stdlib/Runtime.swift index 2d8a144a13e5b..4098f5b8cb72b 100644 --- a/test/1_stdlib/Runtime.swift +++ b/test/1_stdlib/Runtime.swift @@ -279,7 +279,7 @@ extension Int { var description: String { return "abc" } } - private class PrivateExtensionClassConformsToP2 : P2 { + fileprivate class PrivateExtensionClassConformsToP2 : P2 { var description: String { return "def" } } } diff --git a/test/DebugInfo/PrivateDiscriminator.swift b/test/DebugInfo/PrivateDiscriminator.swift index 803d3a4375d7a..74c43d7321aa4 100644 --- a/test/DebugInfo/PrivateDiscriminator.swift +++ b/test/DebugInfo/PrivateDiscriminator.swift @@ -8,14 +8,14 @@ func markUsed(_ t: T) {} -private class A { +fileprivate class A { init(val : Int64) { member = val } private let member : Int64 // CHECK: !DISubprogram(name: "getMember" // CHECK-SAME: linkageName: "{{[^"]*}}[[DISCRIMINATOR]] // CHECK-SAME: line: [[@LINE+2]] // CHECK-SAME: isLocal: true, isDefinition: true - private func getMember() -> Int64 { return member } + fileprivate func getMember() -> Int64 { return member } func getVal() -> Int64 { return getMember() } } diff --git a/test/DebugInfo/typealias.swift b/test/DebugInfo/typealias.swift index 812c6ed1763a6..7ab2b6f99e5ec 100644 --- a/test/DebugInfo/typealias.swift +++ b/test/DebugInfo/typealias.swift @@ -8,8 +8,8 @@ class DWARF { typealias DIEOffset = UInt32 // CHECK-DAG: ![[VOID:.*]] = !DICompositeType({{.*}}identifier: "_TtT_" // CHECK-DAG: ![[PRIVATETYPE:.*]] = !DIDerivedType(tag: DW_TAG_typedef, name: "_TtaC9typealias5DWARFP{{.+}}11PrivateType",{{.*}} line: [[@LINE+1]], baseType: ![[VOID]]) - private typealias PrivateType = () - private static func usePrivateType() -> PrivateType { return () } + fileprivate typealias PrivateType = () + fileprivate static func usePrivateType() -> PrivateType { return () } } func main () { diff --git a/test/IRGen/Inputs/multithread_module/main.swift b/test/IRGen/Inputs/multithread_module/main.swift index a7ed75ce5a22d..f5773870487fe 100644 --- a/test/IRGen/Inputs/multithread_module/main.swift +++ b/test/IRGen/Inputs/multithread_module/main.swift @@ -10,7 +10,7 @@ class Derived : Base { } } -private struct MyStruct : MyProto { +fileprivate struct MyStruct : MyProto { var x: Int diff --git a/test/IRGen/coverage.swift b/test/IRGen/coverage.swift index 9bcd6bddb2ef0..c6dc135fe2c91 100644 --- a/test/IRGen/coverage.swift +++ b/test/IRGen/coverage.swift @@ -9,7 +9,7 @@ internal func f1() {} // SIL-DAG: sil private @_TF8coverageP33_[[F2HASH:[_a-zA-Z0-9]+]] // SIL-DAG: string_literal utf8 "{{.*}}coverage.swift:_TF8coverageP33_[[F2HASH]]" // IR-DAG: @"__profn_{{.*}}coverage.swift:_TF8coverageP33_[[F2HASH:[_a-zA-Z0-9]+]]" {{.*}} c"{{.*}}coverage.swift:_TF8coverageP33_[[F2HASH]]" -private func f2() {} +fileprivate func f2() {} // SIL-DAG: sil @_TF8coverage2f3FT_T_ // SIL-DAG: string_literal utf8 "_TF8coverage2f3FT_T_" diff --git a/test/IRGen/method_linkage.swift b/test/IRGen/method_linkage.swift index edb6d4f1dbe60..39054dd7c2660 100644 --- a/test/IRGen/method_linkage.swift +++ b/test/IRGen/method_linkage.swift @@ -7,37 +7,37 @@ class Base { // CHECK: define hidden void @_TFC14method_linkage4Base{{.*}}3foofT_T_ @inline(never) - private func foo() { + fileprivate func foo() { } // CHECK: define internal void @_TFC14method_linkage4Base{{.*}}3barfT_T_ @inline(never) - private final func bar() { + fileprivate final func bar() { } // CHECK: define hidden void @_TFC14method_linkage4Base{{.*}}5otherfT_T_ @inline(never) - private func other() { + fileprivate func other() { } } class Derived : Base { // CHECK: define hidden void @_TFC14method_linkage7Derived{{.*}}3foofT_T_ @inline(never) - private final override func foo() { + fileprivate final override func foo() { } } extension Base { // CHECK: define internal void @_TFC14method_linkage4Base{{.*}}7extfuncfT_T_ @inline(never) - private func extfunc() { + fileprivate func extfunc() { } } public class PublicClass { // CHECK: define{{( protected)?}} void @_TFC14method_linkage11PublicClass{{.*}}4pfoofT_T_ @inline(never) - private func pfoo() { + fileprivate func pfoo() { } // CHECK: define{{( protected)?}} void @_TFC14method_linkage11PublicClass4pbarfT_T_ diff --git a/test/IRGen/report_dead_method_call.swift b/test/IRGen/report_dead_method_call.swift index 1f65efe6c622c..41d6d2ec5bfd5 100644 --- a/test/IRGen/report_dead_method_call.swift +++ b/test/IRGen/report_dead_method_call.swift @@ -11,7 +11,7 @@ // RUN: %target-run %t/report_dead_method_call // REQUIRES: executable_test -private protocol PrivateProto { +fileprivate protocol PrivateProto { func abc() } @@ -22,7 +22,7 @@ struct PrivateStructC : PrivateProto { struct Container { - private var p: PrivateProto = PrivateStructC() + fileprivate var p: PrivateProto = PrivateStructC() } @inline(never) @@ -30,19 +30,19 @@ func callProto() { testProto(Container()) } -private class Base { +fileprivate class Base { func def() { } } -private class Derived : Base { +fileprivate class Derived : Base { override func def() { } } struct ClassContainer { - private var p: Base = Derived() + fileprivate var p: Base = Derived() } @inline(never) @@ -51,7 +51,7 @@ func callClass() { } public class PublicBase { - private func ghi() { + fileprivate func ghi() { } } diff --git a/test/IRGen/zombies.swift b/test/IRGen/zombies.swift index aaaf778b1a555..d4d7da8356840 100644 --- a/test/IRGen/zombies.swift +++ b/test/IRGen/zombies.swift @@ -4,7 +4,7 @@ // Ideally, these wouldn't be in the v-table at all; but as long as they // are, we need to emit symbols for them. class C { - private var i: Int + fileprivate var i: Int init(i: Int) { self.i = i } } diff --git a/test/Inputs/ObjCBridging/Appliances.swift b/test/Inputs/ObjCBridging/Appliances.swift index e45d6092af2f6..89ca952d19707 100644 --- a/test/Inputs/ObjCBridging/Appliances.swift +++ b/test/Inputs/ObjCBridging/Appliances.swift @@ -35,7 +35,7 @@ extension Refrigerator : _ObjectiveCBridgeable { } public struct ManufacturerInfo { - private var impl: APPManufacturerInfo + fileprivate var impl: APPManufacturerInfo public var value: DataType { return impl.value } diff --git a/test/Interpreter/Inputs/testability_helper.swift b/test/Interpreter/Inputs/testability_helper.swift index a0d3c0ffeab4c..b9df14d54fd60 100644 --- a/test/Interpreter/Inputs/testability_helper.swift +++ b/test/Interpreter/Inputs/testability_helper.swift @@ -9,7 +9,7 @@ internal class Base : CustomStringConvertible { var description: String { return "instance \(id)" } - private func privateFn() -> String { + fileprivate func privateFn() -> String { return "private \(id)" } func callPrivate() -> String { @@ -17,7 +17,7 @@ internal class Base : CustomStringConvertible { } } -private class PrivateSub : Base { +fileprivate class PrivateSub : Base { override func privateFn() -> String { return "really private" } diff --git a/test/Interpreter/classes.swift b/test/Interpreter/classes.swift index 4b22e8be4b983..f96d00b51b8a5 100644 --- a/test/Interpreter/classes.swift +++ b/test/Interpreter/classes.swift @@ -173,7 +173,7 @@ print((b as Bank).deposit(Account(owner: "A"))) // rdar://25412647 -private class Parent { +fileprivate class Parent { required init() {} func doSomething() { @@ -185,7 +185,7 @@ private class Parent { } } -private class Child: Parent { +fileprivate class Child: Parent { override func overriddenMethod() { print("Heaven!") } diff --git a/test/NameBinding/Inputs/accessibility_other.swift b/test/NameBinding/Inputs/accessibility_other.swift index 75a5bbaa86262..cd40fd151f471 100644 --- a/test/NameBinding/Inputs/accessibility_other.swift +++ b/test/NameBinding/Inputs/accessibility_other.swift @@ -2,21 +2,21 @@ import has_accessibility public let a = 0 // expected-note * {{did you mean 'a'?}} internal let b = 0 // expected-note * {{did you mean 'b'?}} -private let c = 0 +fileprivate let c = 0 extension Foo { public static func a() {} internal static func b() {} - private static func c() {} // expected-note {{'c' declared here}} + fileprivate static func c() {} // expected-note {{'c' declared here}} } struct PrivateInit { - private init() {} // expected-note {{'init' declared here}} + fileprivate init() {} // expected-note {{'init' declared here}} } extension Foo { - private func method() {} - private typealias TheType = Float + fileprivate func method() {} + fileprivate typealias TheType = Float } extension OriginallyEmpty { @@ -24,6 +24,6 @@ extension OriginallyEmpty { typealias TheType = Float } -private func privateInBothFiles() {} +fileprivate func privateInBothFiles() {} func privateInPrimaryFile() {} // expected-note {{previously declared here}} -private func privateInOtherFile() {} // expected-error {{invalid redeclaration}} +fileprivate func privateInOtherFile() {} // expected-error {{invalid redeclaration}} diff --git a/test/NameBinding/Inputs/has_accessibility.swift b/test/NameBinding/Inputs/has_accessibility.swift index 9b0268c471d5f..2cd9ebb0adaa3 100644 --- a/test/NameBinding/Inputs/has_accessibility.swift +++ b/test/NameBinding/Inputs/has_accessibility.swift @@ -1,6 +1,6 @@ public let x: Int = 0 internal let y: Int = 0 -private let z: Int = 0 +fileprivate let z: Int = 0 #if DEFINE_VAR_FOR_SCOPED_IMPORT internal let zz: Int = 0 @@ -11,7 +11,7 @@ public struct Foo { public static func x() {} internal static func y() {} - private static func z() {} + fileprivate static func z() {} } public class Base { diff --git a/test/NameBinding/accessibility.swift b/test/NameBinding/accessibility.swift index c263070d5e0c5..897283b4fde3d 100644 --- a/test/NameBinding/accessibility.swift +++ b/test/NameBinding/accessibility.swift @@ -44,18 +44,18 @@ markUsed(c) // expected-error {{use of unresolved identifier 'c'}} Foo.x() Foo.y() // expected-error {{'y' is inaccessible due to 'internal' protection level}} -Foo.z() // expected-error {{'z' is inaccessible due to 'private' protection level}} +Foo.z() // expected-error {{'z' is inaccessible due to 'fileprivate' protection level}} // TESTABLE-NOT: :[[@LINE-3]]:{{[^:]+}}: // TESTABLE-NOT: :[[@LINE-3]]:{{[^:]+}}: -// TESTABLE: :[[@LINE-3]]:{{[^:]+}}: error: 'z' is inaccessible due to 'private' protection level +// TESTABLE: :[[@LINE-3]]:{{[^:]+}}: error: 'z' is inaccessible due to 'fileprivate' protection level Foo.a() Foo.b() -Foo.c() // expected-error {{'c' is inaccessible due to 'private' protection level}} +Foo.c() // expected-error {{'c' is inaccessible due to 'fileprivate' protection level}} _ = Foo() // expected-error {{'Foo' initializer is inaccessible due to 'internal' protection level}} // TESTABLE-NOT: :[[@LINE-1]]:{{[^:]+}}: -_ = PrivateInit() // expected-error {{'PrivateInit' initializer is inaccessible due to 'private' protection level}} -// TESTABLE: :[[@LINE-1]]:{{[^:]+}}: error: 'PrivateInit' initializer is inaccessible due to 'private' protection level +_ = PrivateInit() // expected-error {{'PrivateInit' initializer is inaccessible due to 'fileprivate' protection level}} +// TESTABLE: :[[@LINE-1]]:{{[^:]+}}: error: 'PrivateInit' initializer is inaccessible due to 'fileprivate' protection level var s = StructWithPrivateSetter() s.x = 42 // expected-error {{cannot assign to property: 'x' setter is inaccessible}} @@ -124,13 +124,13 @@ func privateInOtherFile() {} // expected-note {{previously declared here}} #if !ACCESS_DISABLED // rdar://problem/21408035 -private class PrivateBox { // expected-note 2 {{type declared here}} +fileprivate class PrivateBox { // expected-note 2 {{type declared here}} typealias ValueType = T typealias AlwaysFloat = Float } -let boxUnboxInt: PrivateBox.ValueType = 0 // expected-error {{constant must be declared private because its type uses a private type}} -let boxFloat: PrivateBox.AlwaysFloat = 0 // expected-error {{constant must be declared private because its type uses a private type}} +let boxUnboxInt: PrivateBox.ValueType = 0 // expected-error {{constant must be declared fileprivate because its type uses a fileprivate type}} +let boxFloat: PrivateBox.AlwaysFloat = 0 // expected-error {{constant must be declared fileprivate because its type uses a fileprivate type}} #endif diff --git a/test/NameBinding/reference-dependencies.swift b/test/NameBinding/reference-dependencies.swift index b5a41a28b66d7..f201d9cfdd8c9 100644 --- a/test/NameBinding/reference-dependencies.swift +++ b/test/NameBinding/reference-dependencies.swift @@ -61,7 +61,7 @@ struct IntWrapper: Comparable { // CHECK-DAG: - "TypeReferencedOnlyByPrivateSubscript" // FIXME: This should be marked "!private". - private subscript(_: TypeReferencedOnlyByPrivateSubscript) -> Void { return () } + fileprivate subscript(_: TypeReferencedOnlyByPrivateSubscript) -> Void { return () } } // CHECK-DAG: "IntWrapper" @@ -112,7 +112,7 @@ protocol ExtraFloatLiteralConvertible : OtherFileAliasForFloatLiteralConvertible { } // CHECK-DAG: !private "UnicodeScalarLiteralConvertible" -private protocol ExtraCharLiteralConvertible : UnicodeScalarLiteralConvertible { +fileprivate protocol ExtraCharLiteralConvertible : UnicodeScalarLiteralConvertible { } prefix operator ~~~ {} @@ -120,14 +120,14 @@ protocol ThreeTilde { prefix func ~~~(lhs: Self) } -private struct ThreeTildeTypeImpl : ThreeTilde { +fileprivate struct ThreeTildeTypeImpl : ThreeTilde { } func overloadedOnProto(_: T) {} func overloadedOnProto(_: T) {} // CHECK-DAG: - "~~~" -private prefix func ~~~(_: ThreeTildeTypeImpl) {} +fileprivate prefix func ~~~(_: ThreeTildeTypeImpl) {} var topLevelComputedProperty: Bool { return true @@ -235,7 +235,7 @@ struct Outer { } // CHECK-DAG: !private "privateFunc" -private func privateFunc() {} +fileprivate func privateFunc() {} // CHECK-DAG: - "topLevel1" var use1 = topLevel1() @@ -256,7 +256,7 @@ _ = 42 * 30 // CHECK-DAG: - "topLevel6" _ = topLevel6() // CHECK-DAG: - "topLevel7" -private var use7 = topLevel7() +fileprivate var use7 = topLevel7() // CHECK-DAG: - "topLevel8" var use8: Int = topLevel8() // CHECK-DAG: - "topLevel9" @@ -292,7 +292,7 @@ struct StructForDeclaringProperties { func private1(_ a: Int = privateTopLevel1()) {} // CHECK-DAG: !private "privateTopLevel2" // CHECK-DAG: !private "PrivateProto1" -private struct Private2 : PrivateProto1 { +fileprivate struct Private2 : PrivateProto1 { var private2 = privateTopLevel2() } // CHECK-DAG: !private "privateTopLevel3" @@ -301,7 +301,7 @@ func outerPrivate3() { } // CHECK-DAG: !private "PrivateTopLevelTy1" -private extension Use4 { +fileprivate extension Use4 { var privateTy1: PrivateTopLevelTy1? { return nil } } // CHECK-DAG: !private "PrivateTopLevelTy2" @@ -315,38 +315,38 @@ func outerPrivateTy3() { inner(nil) } // CHECK-DAG: !private "PrivateTopLevelStruct3" -private typealias PrivateTy4 = PrivateTopLevelStruct3.ValueType +fileprivate typealias PrivateTy4 = PrivateTopLevelStruct3.ValueType // CHECK-DAG: !private "PrivateTopLevelStruct4" -private func privateTy5(_ x: PrivateTopLevelStruct4.ValueType) -> PrivateTopLevelStruct4.ValueType { +fileprivate func privateTy5(_ x: PrivateTopLevelStruct4.ValueType) -> PrivateTopLevelStruct4.ValueType { return x } // Deliberately empty. -private struct PrivateTy6 {} +fileprivate struct PrivateTy6 {} // CHECK-DAG: !private "PrivateProto3" extension PrivateTy6 : PrivateProto3 {} // CHECK-DAG: - "ProtoReferencedOnlyInGeneric" func genericTest(_: T) {} // CHECK-DAG: !private "ProtoReferencedOnlyInPrivateGeneric" -private func privateGenericTest(_: T) {} +fileprivate func privateGenericTest(_: T) {} struct PrivateStoredProperty { // CHECK-DAG: - "TypeReferencedOnlyByPrivateVar" - private var value: TypeReferencedOnlyByPrivateVar + fileprivate var value: TypeReferencedOnlyByPrivateVar } class PrivateStoredPropertyRef { // CHECK-DAG: - "TypeReferencedOnlyByPrivateClassVar" - private var value: TypeReferencedOnlyByPrivateClassVar? + fileprivate var value: TypeReferencedOnlyByPrivateClassVar? } struct Sentinel1 {} -private protocol ExtensionProto {} +fileprivate protocol ExtensionProto {} extension OtherFileTypeToBeExtended : ExtensionProto { - private func foo() {} + fileprivate func foo() {} } -private extension OtherFileTypeToBeExtended { +fileprivate extension OtherFileTypeToBeExtended { var bar: Bool { return false } } diff --git a/test/SIL/Inputs/whole_module_optimization_helper.swift b/test/SIL/Inputs/whole_module_optimization_helper.swift index 2ef208ff03523..2e39cd2707b08 100644 --- a/test/SIL/Inputs/whole_module_optimization_helper.swift +++ b/test/SIL/Inputs/whole_module_optimization_helper.swift @@ -2,6 +2,6 @@ func compute(_ fn: () -> Int32) -> Int32 { return fn() + privateFn() } -private func privateFn() -> Int32 { +fileprivate func privateFn() -> Int32 { return 40 } diff --git a/test/SIL/whole_module_optimization.swift b/test/SIL/whole_module_optimization.swift index 15f1951171127..bd2550371a6cd 100644 --- a/test/SIL/whole_module_optimization.swift +++ b/test/SIL/whole_module_optimization.swift @@ -9,7 +9,7 @@ // RUN: FileCheck %s < %t.testing.sil // RUN: FileCheck %s -check-prefix=NEGATIVE-TESTABLE < %t.testing.sil -private func privateFn() -> Int32 { +fileprivate func privateFn() -> Int32 { return 2 } diff --git a/test/SILGen/Inputs/mangling_private_helper.swift b/test/SILGen/Inputs/mangling_private_helper.swift index a50fdfc46ba58..f4773f17bdd41 100644 --- a/test/SILGen/Inputs/mangling_private_helper.swift +++ b/test/SILGen/Inputs/mangling_private_helper.swift @@ -1,9 +1,9 @@ public class Base { - private func privateMethod() {} + fileprivate func privateMethod() {} } // Demonstrate the need for a vtable entry for privateMethod(). // This isn't strictly necessary. -private class Subclass : Base { - override private func privateMethod() {} +fileprivate class Subclass : Base { + override fileprivate func privateMethod() {} } diff --git a/test/SILGen/accessibility_warnings.swift b/test/SILGen/accessibility_warnings.swift index 1aed324cbc674..d6f417ed9e5ee 100644 --- a/test/SILGen/accessibility_warnings.swift +++ b/test/SILGen/accessibility_warnings.swift @@ -20,8 +20,8 @@ internal struct InternalStruct { public var publicVarGetSet: Int { get { return 0 } set {} } // expected-warning {{declaring a public var for an internal struct}} {{3-9=internal}} } -private struct PrivateStruct { - public var publicVar = 0 // expected-warning {{declaring a public var for a private struct}} {{3-9=private}} +fileprivate struct PrivateStruct { + public var publicVar = 0 // expected-warning {{declaring a public var for a fileprivate struct}} {{3-9=fileprivate}} } @@ -38,9 +38,9 @@ extension InternalStruct { } extension PrivateStruct { - public init(x: Int) { self.init() } // expected-warning {{declaring a public initializer for a private struct}} {{3-9=private}} + public init(x: Int) { self.init() } // expected-warning {{declaring a public initializer for a fileprivate struct}} {{3-9=fileprivate}} - public var publicVarExtension: Int { get { return 0 } set {} } // expected-warning {{declaring a public var for a private struct}} {{3-9=private}} + public var publicVarExtension: Int { get { return 0 } set {} } // expected-warning {{declaring a public var for a fileprivate struct}} {{3-9=fileprivate}} } public extension PublicStruct { diff --git a/test/SILGen/cdecl.swift b/test/SILGen/cdecl.swift index 869a9ef14deb1..c03de62687cab 100644 --- a/test/SILGen/cdecl.swift +++ b/test/SILGen/cdecl.swift @@ -33,7 +33,7 @@ public func broccoli(_ x: Int) -> Int { // CHECK: function_ref @_TF5cdeclP[[PRIVATE:.*]]4kale // CHECK: sil private @_TF5cdeclP[[PRIVATE:.*]]4kale @_cdecl("collard_greens") -private func kale(_ x: Int) -> Int { +fileprivate func kale(_ x: Int) -> Int { return x } diff --git a/test/SILGen/deinit_in_vtable.swift b/test/SILGen/deinit_in_vtable.swift index 80ee7657373f1..9255bfe7691da 100644 --- a/test/SILGen/deinit_in_vtable.swift +++ b/test/SILGen/deinit_in_vtable.swift @@ -3,14 +3,14 @@ // The second run tests is it can be compiled without crashes. // RUN: %target-swift-frontend -Xllvm -sil-full-demangle -O -S %s -private class A { +fileprivate class A { func foo() -> Int { return 0 } } // CHECK-LABEL: deinit_in_vtable.(A in {{.*}}).__deallocating_deinit // CHECK: sil private @[[A:.*]] : -private class B : A { +fileprivate class B : A { override func foo() -> Int { return 1 } } @@ -18,7 +18,7 @@ private class B : A { // CHECK: sil private @[[B:.*]] : @inline(never) -private func testfunc(_ a: A) -> Int { +fileprivate func testfunc(_ a: A) -> Int { return a.foo() } diff --git a/test/SILGen/mangling_private.swift b/test/SILGen/mangling_private.swift index 09f1114fcd123..c7f14764153f9 100644 --- a/test/SILGen/mangling_private.swift +++ b/test/SILGen/mangling_private.swift @@ -14,44 +14,44 @@ import mangling_private_helper // CHECK-LABEL: sil private @_TF16mangling_privateP33_A3CCBB841DB59E79A4AD4EE45865506811privateFuncFT_Si // OTHER-NAME-LABEL: sil private @_TF16mangling_privateP33_CF726049E48876D30EA29D63CF139F1D11privateFuncFT_Si -private func privateFunc() -> Int { +fileprivate func privateFunc() -> Int { return 0 } public struct PublicStruct { // CHECK-LABEL: sil private @_TZFV16mangling_private12PublicStructP33_A3CCBB841DB59E79A4AD4EE45865506813privateMethodfT_T_ - private static func privateMethod() {} + fileprivate static func privateMethod() {} } public struct InternalStruct { // CHECK-LABEL: sil private @_TZFV16mangling_private14InternalStructP33_A3CCBB841DB59E79A4AD4EE45865506813privateMethodfT_T_ - private static func privateMethod() {} + fileprivate static func privateMethod() {} } -private struct PrivateStruct { +fileprivate struct PrivateStruct { // CHECK-LABEL: sil private @_TZFV16mangling_privateP33_A3CCBB841DB59E79A4AD4EE45865506813PrivateStruct13privateMethodfT_T_ - private static func privateMethod() {} + fileprivate static func privateMethod() {} struct Inner { // CHECK-LABEL: sil private @_TZFVV16mangling_privateP33_A3CCBB841DB59E79A4AD4EE45865506813PrivateStruct5Inner13privateMethodfT_T_ - private static func privateMethod() {} + fileprivate static func privateMethod() {} } } func localTypes() { struct LocalStruct { // CHECK-LABEL: sil shared @_TZFVF16mangling_private10localTypesFT_T_L_11LocalStruct13privateMethodfT_T_ - private static func privateMethod() {} + fileprivate static func privateMethod() {} } } extension PublicStruct { // CHECK-LABEL: sil private @_TFV16mangling_private12PublicStructP33_A3CCBB841DB59E79A4AD4EE45865506816extPrivateMethodfT_T_ - private func extPrivateMethod() {} + fileprivate func extPrivateMethod() {} } extension PrivateStruct { // CHECK-LABEL: sil private @_TFV16mangling_privateP33_A3CCBB841DB59E79A4AD4EE45865506813PrivateStruct16extPrivateMethodfT_T_ - private func extPrivateMethod() {} + fileprivate func extPrivateMethod() {} } @@ -61,6 +61,6 @@ class Sub : Base { // CHECK-DAG: #Base.privateMethod!1: _TFC23mangling_private_helper4BaseP33_0E108371B0D5773E608A345AC52C767413privateMethodfT_T_ // CHECK-DAG: #Sub.subMethod!1: _TFC16mangling_private3SubP33_A3CCBB841DB59E79A4AD4EE4586550689subMethodfT_T_ - private func subMethod() {} + fileprivate func subMethod() {} } // CHECK: {{^[}]$}} diff --git a/test/SILGen/objc_extensions.swift b/test/SILGen/objc_extensions.swift index d743879681732..f121a0f6c22f5 100644 --- a/test/SILGen/objc_extensions.swift +++ b/test/SILGen/objc_extensions.swift @@ -60,7 +60,7 @@ extension SubSub { // SR-1025 extension Base { - private static var x = 1 + fileprivate static var x = 1 } // CHECK-LABEL: sil hidden @_TF15objc_extensions19testStaticVarAccessFT_T_ diff --git a/test/SILGen/protocol_resilience.swift b/test/SILGen/protocol_resilience.swift index 0470ee0cf935e..f59436ef6cfcc 100644 --- a/test/SILGen/protocol_resilience.swift +++ b/test/SILGen/protocol_resilience.swift @@ -53,7 +53,7 @@ extension ResilientMethods { public static func staticDefaultWitness(_ x: Int) -> Self {} // CHECK-LABEL: sil private @_TFE19protocol_resiliencePS_16ResilientMethodsP{{.*}}25defaultWitnessIsNotPublicfT_T_ - private func defaultWitnessIsNotPublic() {} + fileprivate func defaultWitnessIsNotPublic() {} } diff --git a/test/SILOptimizer/Inputs/devirt_access_other_module.swift b/test/SILOptimizer/Inputs/devirt_access_other_module.swift index dc72453b5b5d9..81b3b19f6caf1 100644 --- a/test/SILOptimizer/Inputs/devirt_access_other_module.swift +++ b/test/SILOptimizer/Inputs/devirt_access_other_module.swift @@ -1,5 +1,5 @@ public class ExternalClass { - private func foo() {} + fileprivate func foo() {} } public func getExternalClass() -> ExternalClass { @@ -13,6 +13,6 @@ public func getExternalClass() -> ExternalClass { obj.foo() } -private class PrivateSubclass : ExternalClass { - override private func foo() {} +fileprivate class PrivateSubclass : ExternalClass { + override fileprivate func foo() {} } diff --git a/test/SILOptimizer/basic-callee-printer.sil b/test/SILOptimizer/basic-callee-printer.sil index 42b618b9ff8aa..8aed4d2cd637e 100644 --- a/test/SILOptimizer/basic-callee-printer.sil +++ b/test/SILOptimizer/basic-callee-printer.sil @@ -119,11 +119,11 @@ bb0: } -private class private_base { +fileprivate class private_base { func foo() } -private class private_derived : private_base { +fileprivate class private_derived : private_base { override func foo() } diff --git a/test/SILOptimizer/cast_folding.swift b/test/SILOptimizer/cast_folding.swift index ef8b96b4d1459..c18c072b3a67e 100644 --- a/test/SILOptimizer/cast_folding.swift +++ b/test/SILOptimizer/cast_folding.swift @@ -16,11 +16,11 @@ class X {} class B:P {} -private struct S:P {} +fileprivate struct S:P {} struct T:Q {} -private struct U {} +fileprivate struct U {} public protocol CP1: class {} diff --git a/test/SILOptimizer/dead_func_init_method.sil b/test/SILOptimizer/dead_func_init_method.sil index 06e5829594a6f..4c9251a50b369 100644 --- a/test/SILOptimizer/dead_func_init_method.sil +++ b/test/SILOptimizer/dead_func_init_method.sil @@ -8,11 +8,11 @@ import Builtin import Swift import SwiftShims -private class Base { - private init() +fileprivate class Base { + fileprivate init() } -private class Derived : Base { +fileprivate class Derived : Base { } sil private @BaseInit : $@convention(method) (@owned Base) -> @owned Base { diff --git a/test/SILOptimizer/dead_inlined_func.swift b/test/SILOptimizer/dead_inlined_func.swift index 36d9fbcd37bd5..f756d7db12f54 100644 --- a/test/SILOptimizer/dead_inlined_func.swift +++ b/test/SILOptimizer/dead_inlined_func.swift @@ -10,7 +10,7 @@ // But: we want debug info for it. // CHECK-IR: !DISubprogram(name: "to_be_inlined" -private func to_be_inlined(_ x: Int) -> Int { +fileprivate func to_be_inlined(_ x: Int) -> Int { return x + 1 } diff --git a/test/SILOptimizer/dead_method.swift b/test/SILOptimizer/dead_method.swift index d169498cc5c03..eb237f2ec666b 100644 --- a/test/SILOptimizer/dead_method.swift +++ b/test/SILOptimizer/dead_method.swift @@ -1,6 +1,6 @@ // RUN: %target-swift-frontend -O -primary-file %s %S/Inputs/public_class.swift -parse-as-library -emit-sil | FileCheck %s -private class Derived : Base { +fileprivate class Derived : Base { override func visible() { } func is_dead() { diff --git a/test/SILOptimizer/devirt_access.sil b/test/SILOptimizer/devirt_access.sil index 2c9c8b0382e21..0b9fe72168c37 100644 --- a/test/SILOptimizer/devirt_access.sil +++ b/test/SILOptimizer/devirt_access.sil @@ -8,7 +8,7 @@ import SwiftShims class K { func ping() -> Int - private func pong() -> Int + fileprivate func pong() -> Int @objc deinit init() } @@ -40,7 +40,7 @@ sil_vtable K { class X { - private func ping() -> Int + fileprivate func ping() -> Int @objc deinit init() } @@ -53,7 +53,7 @@ class Y : X class A { - private func ping() -> Int + fileprivate func ping() -> Int @objc deinit init() } diff --git a/test/SILOptimizer/devirt_access.swift b/test/SILOptimizer/devirt_access.swift index 28a26fbbe0332..d623e6b520fa0 100644 --- a/test/SILOptimizer/devirt_access.swift +++ b/test/SILOptimizer/devirt_access.swift @@ -40,7 +40,7 @@ func testInternalPrivate() { class LocalInternalClass { - private func foo() {} + fileprivate func foo() {} func bar() {} } @@ -71,12 +71,12 @@ func testLocalPrivate() { } -private class PrivateClass { - private func foo() {} - private func bar() {} +fileprivate class PrivateClass { + fileprivate func foo() {} + fileprivate func bar() {} } -private class LocalPrivateSubclass : PrivateClass { +fileprivate class LocalPrivateSubclass : PrivateClass { override func foo() {} } diff --git a/test/SILOptimizer/devirt_access_other_module.swift b/test/SILOptimizer/devirt_access_other_module.swift index e1da65b725ad9..458a116079304 100644 --- a/test/SILOptimizer/devirt_access_other_module.swift +++ b/test/SILOptimizer/devirt_access_other_module.swift @@ -8,7 +8,7 @@ // rdar://21408247 public class ExternalClass { - private func foo() {} + fileprivate func foo() {} } public func getExternalClass() -> ExternalClass { @@ -31,10 +31,10 @@ public func getExternalClass() -> ExternalClass { obj.foo() } -private class PrivateSubclass : ExternalClass { - override private func foo() {} +fileprivate class PrivateSubclass : ExternalClass { + override fileprivate func foo() {} } internal class InternalSubclass : ExternalClass { - override private func foo() {} + override fileprivate func foo() {} } diff --git a/test/SILOptimizer/devirt_base_class.swift b/test/SILOptimizer/devirt_base_class.swift index 7ac4db033d34d..e387150044734 100644 --- a/test/SILOptimizer/devirt_base_class.swift +++ b/test/SILOptimizer/devirt_base_class.swift @@ -5,18 +5,18 @@ public class Base1 { @inline(never) func f() -> Int { return 0 } } public class Base2: Base1 { } -private class A: Base2 { } +fileprivate class A: Base2 { } -private class B : A { +fileprivate class B : A { @inline(never) override func f() -> Int { return 1 } } -private class C : A { +fileprivate class C : A { @inline(never) override func f() -> Int { return 2 } } @inline(never) -private func foo(_ a: A) -> Int { +fileprivate func foo(_ a: A) -> Int { // Check that a.f() call can be devirtualized, even @@ -41,7 +41,7 @@ private func foo(_ a: A) -> Int { print("foo(C()) = \(foo(C()))") -private class F1 { +fileprivate class F1 { init() { } @@ -53,7 +53,7 @@ private class F1 { } } -private class F2 : F1 { +fileprivate class F2 : F1 { init (v : Int) { super.init() addConstraint() diff --git a/test/SILOptimizer/devirt_concrete_subclass_of_generic_class.swift b/test/SILOptimizer/devirt_concrete_subclass_of_generic_class.swift index 1ea65c8ada4b6..30e04a07bbd82 100644 --- a/test/SILOptimizer/devirt_concrete_subclass_of_generic_class.swift +++ b/test/SILOptimizer/devirt_concrete_subclass_of_generic_class.swift @@ -60,7 +60,7 @@ print(test5(Derived())) // Check that we handle indirect devirtualization through an intermediate // method. rdar://problem/24993618 -private class IndirectMethodCall { +fileprivate class IndirectMethodCall { func bug() { overrideMe() } @@ -69,46 +69,46 @@ private class IndirectMethodCall { func overrideMe() { } } -private class IndirectChildConcrete: IndirectMethodCall { +fileprivate class IndirectChildConcrete: IndirectMethodCall { @inline(never) override func overrideMe() { } } -private class IndirectChildTuple: IndirectMethodCall<(U, U)> { +fileprivate class IndirectChildTuple: IndirectMethodCall<(U, U)> { @inline(never) override func overrideMe() { } } -private class IndirectChildTupleConcrete: IndirectChildTuple { +fileprivate class IndirectChildTupleConcrete: IndirectChildTuple { @inline(never) override func overrideMe() { } } -private class IndirectChildMeta: IndirectMethodCall { +fileprivate class IndirectChildMeta: IndirectMethodCall { @inline(never) override func overrideMe() { } } -private class IndirectChildMetaConcrete: IndirectChildMeta { +fileprivate class IndirectChildMetaConcrete: IndirectChildMeta { @inline(never) override func overrideMe() { } } -private class IndirectChildBoundGeneric: IndirectMethodCall> { +fileprivate class IndirectChildBoundGeneric: IndirectMethodCall> { @inline(never) override func overrideMe() { } } -private class IndirectChildBoundGenericConcrete: +fileprivate class IndirectChildBoundGenericConcrete: IndirectChildBoundGeneric { @inline(never) override func overrideMe() { } } -private class IndirectChildFunction: IndirectMethodCall<(U) -> U> { +fileprivate class IndirectChildFunction: IndirectMethodCall<(U) -> U> { @inline(never) override func overrideMe() { } } -private class IndirectChildFunctionConcrete: IndirectChildFunction { +fileprivate class IndirectChildFunctionConcrete: IndirectChildFunction { @inline(never) override func overrideMe() { } } diff --git a/test/SILOptimizer/devirt_default_case.swift b/test/SILOptimizer/devirt_default_case.swift index ce6bcfc309274..19980828c4819 100644 --- a/test/SILOptimizer/devirt_default_case.swift +++ b/test/SILOptimizer/devirt_default_case.swift @@ -25,14 +25,14 @@ public class Derived1 : Base1 { } // private class -private class Base2 { +fileprivate class Base2 { @inline(never) func inner() { action(3)} func middle() { inner() } func outer() { middle() } } // private class -private class Derived2 : Base2 { +fileprivate class Derived2 : Base2 { override func inner() { action(4) } @inline(never) final override func middle() { inner() } } diff --git a/test/SILOptimizer/devirt_unbound_generic.swift b/test/SILOptimizer/devirt_unbound_generic.swift index d4d4ae0b1a71e..55cf2c739c09c 100644 --- a/test/SILOptimizer/devirt_unbound_generic.swift +++ b/test/SILOptimizer/devirt_unbound_generic.swift @@ -79,7 +79,7 @@ public protocol ProtocolWithAssocType { associatedtype Element } -private class CP { +fileprivate class CP { var value: Base.Element init(_ v: Base.Element) { value = v @@ -90,16 +90,16 @@ private class CP { } } -private class Base1: ProtocolWithAssocType { +fileprivate class Base1: ProtocolWithAssocType { typealias Element = Int32 } -private class Base2: ProtocolWithAssocType { +fileprivate class Base2: ProtocolWithAssocType { typealias Element = Int32 } -private class CP2: CP> { +fileprivate class CP2: CP> { init() { super.init(1) } @@ -109,7 +109,7 @@ private class CP2: CP> { } } -private class CP3: CP> { +fileprivate class CP3: CP> { init() { super.init(1) } @@ -181,7 +181,7 @@ public func testDevirt(_ c: CC) -> T? { // CHECK-NOT: class_method // CHECK: } @inline(never) -private func test6(_ c: CP) -> T.Element { +fileprivate func test6(_ c: CP) -> T.Element { return c.value } @@ -195,7 +195,7 @@ public func doTest6() { // CHECK-NOT: class_method // CHECK: } @inline(never) -private func test7(_ c: CP) -> Int32 { +fileprivate func test7(_ c: CP) -> Int32 { return c.getCount() } diff --git a/test/SILOptimizer/function_order.sil b/test/SILOptimizer/function_order.sil index 18cd7dfdb4ac2..25994ddc7ce8a 100644 --- a/test/SILOptimizer/function_order.sil +++ b/test/SILOptimizer/function_order.sil @@ -112,19 +112,19 @@ bb0: return %0 : $() } -private class private_base { +fileprivate class private_base { func foo() } -private class private_derived : private_base { +fileprivate class private_derived : private_base { override func foo() } -@inline(never) private func call_private(b: private_base) +@inline(never) fileprivate func call_private(b: private_base) class internal_base { func foo() - private func bar() + fileprivate func bar() } class internal_derived : internal_base { @@ -137,7 +137,7 @@ class internal_derived : internal_base { public class public_base { func foo() public func bar() - private func baz() + fileprivate func baz() } public class public_derived : public_base { @@ -305,17 +305,17 @@ sil_vtable public_derived { #public_base.baz!1: public_derived_baz } -private protocol private_proto_1 { +fileprivate protocol private_proto_1 { func theMethod() } -private class private_proto_private_class : private_proto_1 { +fileprivate class private_proto_private_class : private_proto_1 { func theMethod() } -private func call_through_private_proto_1(x: T) +fileprivate func call_through_private_proto_1(x: T) -private protocol private_proto_2 { +fileprivate protocol private_proto_2 { func theMethod() } @@ -323,9 +323,9 @@ class private_proto_internal_class : private_proto_2 { func theMethod() } -private func call_through_private_proto_2(x: T) +fileprivate func call_through_private_proto_2(x: T) -private protocol private_proto_3 { +fileprivate protocol private_proto_3 { func theMethod() } @@ -333,17 +333,17 @@ public class private_proto_public_class : private_proto_3 { public func theMethod() } -private func call_through_private_proto_3(x: T) +fileprivate func call_through_private_proto_3(x: T) -private protocol private_proto_4 { +fileprivate protocol private_proto_4 { func theMethod() } public class private_proto_public_class_private_method : private_proto_4 { - private func theMethod() + fileprivate func theMethod() } -private func call_through_private_proto_4(x: T) +fileprivate func call_through_private_proto_4(x: T) sil private @private_proto_private_class_theMethod : $@convention(method) (@guaranteed private_proto_private_class) -> () { bb0(%0 : $private_proto_private_class): diff --git a/test/SILOptimizer/let_properties_opts.swift b/test/SILOptimizer/let_properties_opts.swift index 8181196aab7f9..f91473ff502f8 100644 --- a/test/SILOptimizer/let_properties_opts.swift +++ b/test/SILOptimizer/let_properties_opts.swift @@ -58,7 +58,7 @@ public class Foo { public let Prop0: Int32 = 1 let Prop1: Int32 = 1 + 4/2 + 8 - private let Prop2: Int32 = 3*7 + fileprivate let Prop2: Int32 = 3*7 internal let Prop3: Int32 = 4*8 public init(i:Int32) {} public init(i:Int64) {} @@ -66,7 +66,7 @@ public class Foo { public class Foo1 { let Prop1: Int32 - private let Prop2: Int32 = 3*7 + fileprivate let Prop2: Int32 = 3*7 internal let Prop3: Int32 = 4*8 public init(i:Int32) { Prop1 = 11 @@ -80,7 +80,7 @@ public class Foo1 { public struct Boo { public let Prop0: Int32 = 1 let Prop1: Int32 = 1 + 4/2 + 8 - private let Prop2: Int32 = 3*7 + fileprivate let Prop2: Int32 = 3*7 internal let Prop3: Int32 = 4*8 public init(i:Int32) {} public init(i:Int64) {} @@ -104,7 +104,7 @@ struct Boo3 { //public let Prop0: Int32 let Prop1: Int32 - private let Prop2: Int32 + fileprivate let Prop2: Int32 internal let Prop3: Int32 @inline(__always) @@ -154,7 +154,7 @@ public struct StructWithPublicAndInternalLetProperties { public struct StructWithPublicAndInternalAndPrivateLetProperties { public let Prop0: Int32 internal let Prop1: Int32 - private let Prop2: Int32 + fileprivate let Prop2: Int32 init(_ v: Int32, _ u: Int32) { Prop0 = 10 diff --git a/test/SILOptimizer/let_properties_opts_runtime.swift b/test/SILOptimizer/let_properties_opts_runtime.swift index bd3e8358a8ddb..74f6f3c759c69 100644 --- a/test/SILOptimizer/let_properties_opts_runtime.swift +++ b/test/SILOptimizer/let_properties_opts_runtime.swift @@ -56,7 +56,7 @@ struct Boo3 { //public let Prop0: Int32 let Prop1: Int32 - private let Prop2: Int32 + fileprivate let Prop2: Int32 internal let Prop3: Int32 @inline(__always) diff --git a/test/Sema/accessibility.swift b/test/Sema/accessibility.swift index 31ff3a5ab6656..b7079b84d3014 100644 --- a/test/Sema/accessibility.swift +++ b/test/Sema/accessibility.swift @@ -10,7 +10,7 @@ internal protocol InternalProto { } // expected-note@+1 * {{type declared here}} -private protocol PrivateProto { +fileprivate protocol PrivateProto { func privateReq() } @@ -32,12 +32,12 @@ internal struct InternalStruct: PublicProto, InternalProto, PrivateProto { } // expected-note@+1 * {{type declared here}} -private struct PrivateStruct: PublicProto, InternalProto, PrivateProto { +fileprivate struct PrivateStruct: PublicProto, InternalProto, PrivateProto { private func publicReq() {} private func internalReq() {} private func privateReq() {} - public var publicVar = 0 // expected-warning {{declaring a public var for a private struct}} {{3-9=private}} + public var publicVar = 0 // expected-warning {{declaring a public var for a fileprivate struct}} {{3-9=fileprivate}} } extension PublicStruct { @@ -49,7 +49,7 @@ extension InternalStruct { } extension PrivateStruct { - public init(x: Int) { self.init() } // expected-warning {{declaring a public initializer for a private struct}} {{3-9=private}} + public init(x: Int) { self.init() } // expected-warning {{declaring a public initializer for a fileprivate struct}} {{3-9=fileprivate}} } public extension PublicStruct { @@ -76,11 +76,11 @@ private extension InternalStruct { public func extMemberPrivate() {} // expected-warning {{declaring a public instance method in a private extension}} {{3-9=private}} private func extImplPrivate() {} } -public extension PrivateStruct { // expected-error {{extension of private struct cannot be declared public}} {{1-8=}} - public func extMemberPublic() {} // expected-warning {{declaring a public instance method for a private struct}} {{3-9=private}} +public extension PrivateStruct { // expected-error {{extension of fileprivate struct cannot be declared public}} {{1-8=}} + public func extMemberPublic() {} // expected-warning {{declaring a public instance method for a fileprivate struct}} {{3-9=fileprivate}} private func extImplPublic() {} } -internal extension PrivateStruct { // expected-error {{extension of private struct cannot be declared internal}} {{1-10=}} +internal extension PrivateStruct { // expected-error {{extension of fileprivate struct cannot be declared internal}} {{1-10=}} public func extMemberInternal() {} // expected-warning {{declaring a public instance method in an internal extension}} {{3-9=internal}} private func extImplInternal() {} } @@ -152,22 +152,22 @@ internal class InternalSubPrivateSet: Base { public typealias PublicTA1 = PublicStruct public typealias PublicTA2 = InternalStruct // expected-error {{type alias cannot be declared public because its underlying type uses an internal type}} -public typealias PublicTA3 = PrivateStruct // expected-error {{type alias cannot be declared public because its underlying type uses a private type}} +public typealias PublicTA3 = PrivateStruct // expected-error {{type alias cannot be declared public because its underlying type uses a fileprivate type}} // expected-note@+1 {{type declared here}} internal typealias InternalTA1 = PublicStruct internal typealias InternalTA2 = InternalStruct -internal typealias InternalTA3 = PrivateStruct // expected-error {{type alias cannot be declared internal because its underlying type uses a private type}} +internal typealias InternalTA3 = PrivateStruct // expected-error {{type alias cannot be declared internal because its underlying type uses a fileprivate type}} public typealias PublicFromInternal = InternalTA1 // expected-error {{type alias cannot be declared public because its underlying type uses an internal type}} -typealias FunctionType1 = (PrivateStruct) -> PublicStruct // expected-error {{type alias must be declared private because its underlying type uses a private type}} -typealias FunctionType2 = (PublicStruct) -> PrivateStruct // expected-error {{type alias must be declared private because its underlying type uses a private type}} -typealias FunctionType3 = (PrivateStruct) -> PrivateStruct // expected-error {{type alias must be declared private because its underlying type uses a private type}} +typealias FunctionType1 = (PrivateStruct) -> PublicStruct // expected-error {{type alias must be declared fileprivate because its underlying type uses a fileprivate type}} +typealias FunctionType2 = (PublicStruct) -> PrivateStruct // expected-error {{type alias must be declared fileprivate because its underlying type uses a fileprivate type}} +typealias FunctionType3 = (PrivateStruct) -> PrivateStruct // expected-error {{type alias must be declared fileprivate because its underlying type uses a fileprivate type}} -typealias ArrayType = [PrivateStruct] // expected-error {{type alias must be declared private because its underlying type uses a private type}} -typealias DictType = [String : PrivateStruct] // expected-error {{type alias must be declared private because its underlying type uses a private type}} -typealias GenericArgs = Optional // expected-error {{type alias must be declared private because its underlying type uses a private type}} +typealias ArrayType = [PrivateStruct] // expected-error {{type alias must be declared fileprivate because its underlying type uses a fileprivate type}} +typealias DictType = [String : PrivateStruct] // expected-error {{type alias must be declared fileprivate because its underlying type uses a fileprivate type}} +typealias GenericArgs = Optional // expected-error {{type alias must be declared fileprivate because its underlying type uses a fileprivate type}} public protocol HasAssocType { @@ -181,53 +181,53 @@ public struct AssocTypeImpl: HasAssocType { public let _: AssocTypeImpl.Inferred? -public let x: PrivateStruct = PrivateStruct() // expected-error {{constant cannot be declared public because its type uses a private type}} -public var a: PrivateStruct?, b: PrivateStruct? // expected-error 2 {{variable cannot be declared public because its type uses a private type}} -public var (c, d): (PrivateStruct?, PrivateStruct?) // expected-error {{variable cannot be declared public because its type uses a private type}} +public let x: PrivateStruct = PrivateStruct() // expected-error {{constant cannot be declared public because its type uses a fileprivate type}} +public var a: PrivateStruct?, b: PrivateStruct? // expected-error 2 {{variable cannot be declared public because its type uses a fileprivate type}} +public var (c, d): (PrivateStruct?, PrivateStruct?) // expected-error {{variable cannot be declared public because its type uses a fileprivate type}} -var internalVar: PrivateStruct? // expected-error {{variable must be declared private because its type uses a private type}} +var internalVar: PrivateStruct? // expected-error {{variable must be declared fileprivate because its type uses a fileprivate type}} -let internalConstant = PrivateStruct() // expected-error {{constant must be declared private because its type 'PrivateStruct' uses a private type}} +let internalConstant = PrivateStruct() // expected-error {{constant must be declared fileprivate because its type 'PrivateStruct' uses a fileprivate type}} public let publicConstant = [InternalStruct]() // expected-error {{constant cannot be declared public because its type '[InternalStruct]' uses an internal type}} public struct Properties { - public let x: PrivateStruct = PrivateStruct() // expected-error {{property cannot be declared public because its type uses a private type}} - public var a: PrivateStruct?, b: PrivateStruct? // expected-error 2 {{property cannot be declared public because its type uses a private type}} - public var (c, d): (PrivateStruct?, PrivateStruct?) // expected-error {{property cannot be declared public because its type uses a private type}} + public let x: PrivateStruct = PrivateStruct() // expected-error {{property cannot be declared public because its type uses a fileprivate type}} + public var a: PrivateStruct?, b: PrivateStruct? // expected-error 2 {{property cannot be declared public because its type uses a fileprivate type}} + public var (c, d): (PrivateStruct?, PrivateStruct?) // expected-error {{property cannot be declared public because its type uses a fileprivate type}} - let y = PrivateStruct() // expected-error {{property must be declared private because its type 'PrivateStruct' uses a private type}} + let y = PrivateStruct() // expected-error {{property must be declared fileprivate because its type 'PrivateStruct' uses a fileprivate type}} } public struct Subscripts { - subscript (a: PrivateStruct) -> Int { return 0 } // expected-error {{subscript must be declared private because its index uses a private type}} - subscript (a: Int) -> PrivateStruct { return PrivateStruct() } // expected-error {{subscript must be declared private because its element type uses a private type}} + subscript (a: PrivateStruct) -> Int { return 0 } // expected-error {{subscript must be declared fileprivate because its index uses a fileprivate type}} + subscript (a: Int) -> PrivateStruct { return PrivateStruct() } // expected-error {{subscript must be declared fileprivate because its element type uses a fileprivate type}} - public subscript (a: PrivateStruct, b: Int) -> Int { return 0 } // expected-error {{subscript cannot be declared public because its index uses a private type}} - public subscript (a: Int, b: PrivateStruct) -> Int { return 0 } // expected-error {{subscript cannot be declared public because its index uses a private type}} - public subscript (a: InternalStruct, b: PrivateStruct) -> InternalStruct { return InternalStruct() } // expected-error {{subscript cannot be declared public because its index uses a private type}} - public subscript (a: PrivateStruct, b: InternalStruct) -> PrivateStruct { return PrivateStruct() } // expected-error {{subscript cannot be declared public because its index uses a private type}} + public subscript (a: PrivateStruct, b: Int) -> Int { return 0 } // expected-error {{subscript cannot be declared public because its index uses a fileprivate type}} + public subscript (a: Int, b: PrivateStruct) -> Int { return 0 } // expected-error {{subscript cannot be declared public because its index uses a fileprivate type}} + public subscript (a: InternalStruct, b: PrivateStruct) -> InternalStruct { return InternalStruct() } // expected-error {{subscript cannot be declared public because its index uses a fileprivate type}} + public subscript (a: PrivateStruct, b: InternalStruct) -> PrivateStruct { return PrivateStruct() } // expected-error {{subscript cannot be declared public because its index uses a fileprivate type}} public subscript (a: Int, b: Int) -> InternalStruct { return InternalStruct() } // expected-error {{subscript cannot be declared public because its element type uses an internal type}} } public struct Methods { - func foo(a: PrivateStruct) -> Int { return 0 } // expected-error {{method must be declared private because its parameter uses a private type}} - func bar(a: Int) -> PrivateStruct { return PrivateStruct() } // expected-error {{method must be declared private because its result uses a private type}} + func foo(a: PrivateStruct) -> Int { return 0 } // expected-error {{method must be declared fileprivate because its parameter uses a fileprivate type}} + func bar(a: Int) -> PrivateStruct { return PrivateStruct() } // expected-error {{method must be declared fileprivate because its result uses a fileprivate type}} - public func a(a: PrivateStruct, b: Int) -> Int { return 0 } // expected-error {{method cannot be declared public because its parameter uses a private type}} - public func b(a: Int, b: PrivateStruct) -> Int { return 0 } // expected-error {{method cannot be declared public because its parameter uses a private type}} - public func c(a: InternalStruct, b: PrivateStruct) -> InternalStruct { return InternalStruct() } // expected-error {{method cannot be declared public because its parameter uses a private type}} - public func d(a: PrivateStruct, b: InternalStruct) -> PrivateStruct { return PrivateStruct() } // expected-error {{method cannot be declared public because its parameter uses a private type}} + public func a(a: PrivateStruct, b: Int) -> Int { return 0 } // expected-error {{method cannot be declared public because its parameter uses a fileprivate type}} + public func b(a: Int, b: PrivateStruct) -> Int { return 0 } // expected-error {{method cannot be declared public because its parameter uses a fileprivate type}} + public func c(a: InternalStruct, b: PrivateStruct) -> InternalStruct { return InternalStruct() } // expected-error {{method cannot be declared public because its parameter uses a fileprivate type}} + public func d(a: PrivateStruct, b: InternalStruct) -> PrivateStruct { return PrivateStruct() } // expected-error {{method cannot be declared public because its parameter uses a fileprivate type}} public func e(a: Int, b: Int) -> InternalStruct { return InternalStruct() } // expected-error {{method cannot be declared public because its result uses an internal type}} } -func privateParam(a: PrivateStruct) {} // expected-error {{function must be declared private because its parameter uses a private type}} +func privateParam(a: PrivateStruct) {} // expected-error {{function must be declared fileprivate because its parameter uses a fileprivate type}} public struct Initializers { - init(a: PrivateStruct) {} // expected-error {{initializer must be declared private because its parameter uses a private type}} + init(a: PrivateStruct) {} // expected-error {{initializer must be declared fileprivate because its parameter uses a fileprivate type}} - public init(a: PrivateStruct, b: Int) {} // expected-error {{initializer cannot be declared public because its parameter uses a private type}} - public init(a: Int, b: PrivateStruct) {} // expected-error {{initializer cannot be declared public because its parameter uses a private type}} - public init(a: InternalStruct, b: PrivateStruct) {} // expected-error {{initializer cannot be declared public because its parameter uses a private type}} - public init(a: PrivateStruct, b: InternalStruct) { } // expected-error {{initializer cannot be declared public because its parameter uses a private type}} + public init(a: PrivateStruct, b: Int) {} // expected-error {{initializer cannot be declared public because its parameter uses a fileprivate type}} + public init(a: Int, b: PrivateStruct) {} // expected-error {{initializer cannot be declared public because its parameter uses a fileprivate type}} + public init(a: InternalStruct, b: PrivateStruct) {} // expected-error {{initializer cannot be declared public because its parameter uses a fileprivate type}} + public init(a: PrivateStruct, b: InternalStruct) { } // expected-error {{initializer cannot be declared public because its parameter uses a fileprivate type}} } @@ -235,93 +235,93 @@ public class PublicClass {} // expected-note@+1 * {{type declared here}} internal class InternalClass {} // expected-note@+1 * {{type declared here}} -private class PrivateClass {} +fileprivate class PrivateClass {} public protocol AssocTypes { associatedtype Foo associatedtype Internal: InternalClass // expected-error {{associated type in a public protocol uses an internal type in its requirement}} associatedtype InternalConformer: InternalProto // expected-error {{associated type in a public protocol uses an internal type in its requirement}} - associatedtype PrivateConformer: PrivateProto // expected-error {{associated type in a public protocol uses a private type in its requirement}} - associatedtype PI: PrivateProto, InternalProto // expected-error {{associated type in a public protocol uses a private type in its requirement}} - associatedtype IP: InternalProto, PrivateProto // expected-error {{associated type in a public protocol uses a private type in its requirement}} + associatedtype PrivateConformer: PrivateProto // expected-error {{associated type in a public protocol uses a fileprivate type in its requirement}} + associatedtype PI: PrivateProto, InternalProto // expected-error {{associated type in a public protocol uses a fileprivate type in its requirement}} + associatedtype IP: InternalProto, PrivateProto // expected-error {{associated type in a public protocol uses a fileprivate type in its requirement}} - associatedtype PrivateDefault = PrivateStruct // expected-error {{associated type in a public protocol uses a private type in its default definition}} + associatedtype PrivateDefault = PrivateStruct // expected-error {{associated type in a public protocol uses a fileprivate type in its default definition}} associatedtype PublicDefault = PublicStruct - associatedtype PrivateDefaultConformer: PublicProto = PrivateStruct // expected-error {{associated type in a public protocol uses a private type in its default definition}} - associatedtype PublicDefaultConformer: PrivateProto = PublicStruct // expected-error {{associated type in a public protocol uses a private type in its requirement}} - associatedtype PrivatePrivateDefaultConformer: PrivateProto = PrivateStruct // expected-error {{associated type in a public protocol uses a private type in its requirement}} + associatedtype PrivateDefaultConformer: PublicProto = PrivateStruct // expected-error {{associated type in a public protocol uses a fileprivate type in its default definition}} + associatedtype PublicDefaultConformer: PrivateProto = PublicStruct // expected-error {{associated type in a public protocol uses a fileprivate type in its requirement}} + associatedtype PrivatePrivateDefaultConformer: PrivateProto = PrivateStruct // expected-error {{associated type in a public protocol uses a fileprivate type in its requirement}} associatedtype PublicPublicDefaultConformer: PublicProto = PublicStruct } public protocol RequirementTypes { - var x: PrivateStruct { get } // expected-error {{property cannot be declared public because its type uses a private type}} + var x: PrivateStruct { get } // expected-error {{property cannot be declared public because its type uses a fileprivate type}} subscript(x: Int) -> InternalStruct { get set } // expected-error {{subscript cannot be declared public because its element type uses an internal type}} - func foo() -> PrivateStruct // expected-error {{method cannot be declared public because its result uses a private type}} - init(x: PrivateStruct) // expected-error {{initializer cannot be declared public because its parameter uses a private type}} + func foo() -> PrivateStruct // expected-error {{method cannot be declared public because its result uses a fileprivate type}} + init(x: PrivateStruct) // expected-error {{initializer cannot be declared public because its parameter uses a fileprivate type}} } -protocol DefaultRefinesPrivate : PrivateProto {} // expected-error {{protocol must be declared private because it refines a private protocol}} -public protocol PublicRefinesPrivate : PrivateProto {} // expected-error {{public protocol cannot refine a private protocol}} +protocol DefaultRefinesPrivate : PrivateProto {} // expected-error {{protocol must be declared fileprivate because it refines a fileprivate protocol}} +public protocol PublicRefinesPrivate : PrivateProto {} // expected-error {{public protocol cannot refine a fileprivate protocol}} public protocol PublicRefinesInternal : InternalProto {} // expected-error {{public protocol cannot refine an internal protocol}} -public protocol PublicRefinesPI : PrivateProto, InternalProto {} // expected-error {{public protocol cannot refine a private protocol}} -public protocol PublicRefinesIP : InternalProto, PrivateProto {} // expected-error {{public protocol cannot refine a private protocol}} +public protocol PublicRefinesPI : PrivateProto, InternalProto {} // expected-error {{public protocol cannot refine a fileprivate protocol}} +public protocol PublicRefinesIP : InternalProto, PrivateProto {} // expected-error {{public protocol cannot refine a fileprivate protocol}} // expected-note@+1 * {{type declared here}} -private typealias PrivateInt = Int -enum DefaultRawPrivate : PrivateInt { // expected-error {{enum must be declared private because its raw type uses a private type}} +fileprivate typealias PrivateInt = Int +enum DefaultRawPrivate : PrivateInt { // expected-error {{enum must be declared fileprivate because its raw type uses a fileprivate type}} case A } -public enum PublicRawPrivate : PrivateInt { // expected-error {{enum cannot be declared public because its raw type uses a private type}} +public enum PublicRawPrivate : PrivateInt { // expected-error {{enum cannot be declared public because its raw type uses a fileprivate type}} case A } -public enum MultipleConformance : PrivateProto, PrivateInt { // expected-error {{enum cannot be declared public because its raw type uses a private type}} expected-error {{must appear first}} {{35-35=PrivateInt, }} {{47-59=}} +public enum MultipleConformance : PrivateProto, PrivateInt { // expected-error {{enum cannot be declared public because its raw type uses a fileprivate type}} expected-error {{must appear first}} {{35-35=PrivateInt, }} {{47-59=}} case A func privateReq() {} } public class PublicSubclassPublic : PublicClass {} public class PublicSubclassInternal : InternalClass {} // expected-error {{class cannot be declared public because its superclass is internal}} -public class PublicSubclassPrivate : PrivateClass {} // expected-error {{class cannot be declared public because its superclass is private}} +public class PublicSubclassPrivate : PrivateClass {} // expected-error {{class cannot be declared public because its superclass is fileprivate}} class DefaultSubclassPublic : PublicClass {} class DefaultSubclassInternal : InternalClass {} -class DefaultSubclassPrivate : PrivateClass {} // expected-error {{class must be declared private because its superclass is private}} +class DefaultSubclassPrivate : PrivateClass {} // expected-error {{class must be declared fileprivate because its superclass is fileprivate}} public enum PublicEnumPrivate { - case A(PrivateStruct) // expected-error {{enum case in a public enum uses a private type}} + case A(PrivateStruct) // expected-error {{enum case in a public enum uses a fileprivate type}} } enum DefaultEnumPrivate { - case A(PrivateStruct) // expected-error {{enum case in an internal enum uses a private type}} + case A(PrivateStruct) // expected-error {{enum case in an internal enum uses a fileprivate type}} } public enum PublicEnumPI { case A(InternalStruct) // expected-error {{enum case in a public enum uses an internal type}} - case B(PrivateStruct, InternalStruct) // expected-error {{enum case in a public enum uses a private type}} - case C(InternalStruct, PrivateStruct) // expected-error {{enum case in a public enum uses a private type}} + case B(PrivateStruct, InternalStruct) // expected-error {{enum case in a public enum uses a fileprivate type}} + case C(InternalStruct, PrivateStruct) // expected-error {{enum case in a public enum uses a fileprivate type}} } enum DefaultEnumPublic { case A(PublicStruct) // no-warning } struct DefaultGeneric {} -struct DefaultGenericPrivate {} // expected-error {{generic struct must be declared private because its generic parameter uses a private type}} -struct DefaultGenericPrivate2 {} // expected-error {{generic struct must be declared private because its generic parameter uses a private type}} +struct DefaultGenericPrivate {} // expected-error {{generic struct must be declared fileprivate because its generic parameter uses a fileprivate type}} +struct DefaultGenericPrivate2 {} // expected-error {{generic struct must be declared fileprivate because its generic parameter uses a fileprivate type}} struct DefaultGenericPrivateReq {} // expected-error {{same-type requirement makes generic parameter 'T' non-generic}} -// expected-error@-1 {{generic struct must be declared private because its generic requirement uses a private type}} -struct DefaultGenericPrivateReq2 {} // expected-error {{generic struct must be declared private because its generic requirement uses a private type}} +// expected-error@-1 {{generic struct must be declared fileprivate because its generic requirement uses a fileprivate type}} +struct DefaultGenericPrivateReq2 {} // expected-error {{generic struct must be declared fileprivate because its generic requirement uses a fileprivate type}} public struct PublicGenericInternal {} // expected-error {{generic struct cannot be declared public because its generic parameter uses an internal type}} -public struct PublicGenericPI {} // expected-error {{generic struct cannot be declared public because its generic parameter uses a private type}} -public struct PublicGenericIP {} // expected-error {{generic struct cannot be declared public because its generic parameter uses a private type}} -public struct PublicGenericPIReq {} // expected-error {{generic struct cannot be declared public because its generic parameter uses a private type}} -public struct PublicGenericIPReq {} // expected-error {{generic struct cannot be declared public because its generic requirement uses a private type}} +public struct PublicGenericPI {} // expected-error {{generic struct cannot be declared public because its generic parameter uses a fileprivate type}} +public struct PublicGenericIP {} // expected-error {{generic struct cannot be declared public because its generic parameter uses a fileprivate type}} +public struct PublicGenericPIReq {} // expected-error {{generic struct cannot be declared public because its generic parameter uses a fileprivate type}} +public struct PublicGenericIPReq {} // expected-error {{generic struct cannot be declared public because its generic requirement uses a fileprivate type}} public func genericFunc(_: T) {} // expected-error {{function cannot be declared public because its generic parameter uses an internal type}} {} public class GenericClass { // expected-error {{generic class cannot be declared public because its generic parameter uses an internal type}} - public init(_: T) {} // expected-error {{initializer cannot be declared public because its generic parameter uses a private type}} - public func genericMethod(_: T) {} // expected-error {{instance method cannot be declared public because its generic parameter uses a private type}} + public init(_: T) {} // expected-error {{initializer cannot be declared public because its generic parameter uses a fileprivate type}} + public func genericMethod(_: T) {} // expected-error {{instance method cannot be declared public because its generic parameter uses a fileprivate type}} } public enum GenericEnum { // expected-error {{generic enum cannot be declared public because its generic parameter uses an internal type}} case A diff --git a/test/SourceKit/CodeComplete/complete_override.swift.response b/test/SourceKit/CodeComplete/complete_override.swift.response index adb4334cc7685..c1499fe8c7cd8 100644 --- a/test/SourceKit/CodeComplete/complete_override.swift.response +++ b/test/SourceKit/CodeComplete/complete_override.swift.response @@ -74,6 +74,15 @@ key.associated_usrs: "s:FC17complete_override4Base1fFT5getMeSi1bSd_T_", key.modulename: "complete_override" }, + { + key.kind: source.lang.swift.keyword, + key.name: "fileprivate", + key.sourcetext: "fileprivate", + key.description: "fileprivate", + key.typename: "", + key.context: source.codecompletion.context.none, + key.num_bytes_to_erase: 0 + }, { key.kind: source.lang.swift.keyword, key.name: "final", diff --git a/test/SourceKit/DocumentStructure/structure.swift.invalid.response b/test/SourceKit/DocumentStructure/structure.swift.invalid.response index 7ff16daf3d7b1..1ed0459116ed8 100644 --- a/test/SourceKit/DocumentStructure/structure.swift.invalid.response +++ b/test/SourceKit/DocumentStructure/structure.swift.invalid.response @@ -37,7 +37,7 @@ key.substructure: [ { key.kind: source.lang.swift.decl.class, - key.accessibility: source.lang.swift.accessibility.private, + key.accessibility: source.lang.swift.accessibility.fileprivate, key.name: "MyCoolClass", key.offset: 47, key.length: 22, diff --git a/test/attr/accessibility.swift b/test/attr/accessibility.swift index 0f85057af84b1..db3ca2cf25845 100644 --- a/test/attr/accessibility.swift +++ b/test/attr/accessibility.swift @@ -221,3 +221,4 @@ extension ProtoWithReqs where Self : ReqProvider2 { public struct AdoptViaCombinedProtocol : ProtoWithReqs, ReqProvider2 { public typealias Assoc = Int } + diff --git a/test/attr/accessibility_print.swift b/test/attr/accessibility_print.swift index 1d7b3ad21c7b3..462558c172414 100644 --- a/test/attr/accessibility_print.swift +++ b/test/attr/accessibility_print.swift @@ -246,7 +246,7 @@ public protocol HA_PublicProtocol { internal protocol HB_InternalProtocol { associatedtype Assoc } -private protocol HC_PrivateProtocol { +fileprivate protocol HC_PrivateProtocol { associatedtype Assoc } public struct HA_PublicStruct {} diff --git a/test/attr/attr_objc.swift b/test/attr/attr_objc.swift index 69ec4bf851f6f..615f53180a4a2 100644 --- a/test/attr/attr_objc.swift +++ b/test/attr/attr_objc.swift @@ -1851,10 +1851,10 @@ typealias BadBlock = @convention(block) (NotObjCEnum) -> () // expected-error{{' @objc class AccessControl { // CHECK: @objc func foo func foo() {} - // CHECK: {{^}} private func bar - private func bar() {} - // CHECK: @objc private func baz - @objc private func baz() {} + // CHECK: {{^}} fileprivate func bar + fileprivate func bar() {} + // CHECK: @objc fileprivate func baz + @objc fileprivate func baz() {} } //===--- Ban @objc +load methods @@ -2033,11 +2033,11 @@ class ConformsToProtocolThrowsObjCName1 : ProtocolThrowsObjCName { } class ConformsToProtocolThrowsObjCName2 : ProtocolThrowsObjCName { - @objc func doThing(_ x: Int) throws -> String { return "" } - // expected-warning@-1{{instance method 'doThing' nearly matches optional requirement 'doThing' of protocol 'ProtocolThrowsObjCName'}} - // expected-note@-2{{move 'doThing' to an extension to silence this warning}} - // expected-note@-3{{make 'doThing' private to silence this warning}}{{9-9=private }} - // expected-note@-4{{candidate has non-matching type '(Int) throws -> String'}} + @objc func doThing(_ x: Int) throws -> String { return "" } +// expected-warning@-1{{instance method 'doThing' nearly matches optional requirement 'doThing' of protocol 'ProtocolThrowsObjCName'}} +// expected-note@-2 {{candidate has non-matching type '(Int) throws -> String'}} +// expected-note@-3 {{move 'doThing' to an extension to silence this warning}} +// expected-note@-4 {{make 'doThing' fileprivate to silence this warning}} } @objc class DictionaryTest { diff --git a/test/decl/protocol/conforms/near_miss_objc.swift b/test/decl/protocol/conforms/near_miss_objc.swift index f72c87f965538..74927ced70929 100644 --- a/test/decl/protocol/conforms/near_miss_objc.swift +++ b/test/decl/protocol/conforms/near_miss_objc.swift @@ -12,7 +12,7 @@ class C1a : P1 { // expected-warning@-1{{instance method 'doSomething(a:c:)' nearly matches optional requirement 'doSomething(a:b:)' of protocol 'P1'}} // expected-note@-2{{rename to 'doSomething(a:b:)' to satisfy this requirement}}{{34-34=b }}{{none}} // expected-note@-3{{move 'doSomething(a:c:)' to an extension to silence this warning}} - // expected-note@-4{{make 'doSomething(a:c:)' private to silence this warning}}{{9-9=private }} + // expected-note@-4{{make 'doSomething(a:c:)' fileprivate to silence this warning}}{{9-9=fileprivate }} } class C1b : P1 { @@ -30,11 +30,11 @@ extension C1c : P1 { // expected-warning@-1{{instance method 'doSomething(a:c:)' nearly matches optional requirement 'doSomething(a:b:)' of protocol 'P1'}} // expected-note@-2{{rename to 'doSomething(a:b:)' to satisfy this requirement}}{{28-28=b }}{{none}} // expected-note@-3{{move 'doSomething(a:c:)' to another extension to silence this warning}} - // expected-note@-4{{make 'doSomething(a:c:)' private to silence this warning}}{{3-3=private }} + // expected-note@-4{{make 'doSomething(a:c:)' fileprivate to silence this warning}}{{3-3=fileprivate }} } class C1d : P1 { - @objc private func doSomething(a: Int, c: Double) { } // don't warn + @objc fileprivate func doSomething(a: Int, c: Double) { } // don't warn } class C1e : P1 { @@ -62,7 +62,7 @@ class C3a : P3 { // expected-warning@-1{{instance method 'doSomething(priority:d:)' nearly matches optional requirement 'doSomethingWithPriority(_:d:)' of protocol 'P3'}} // expected-note@-2{{rename to 'doSomethingWithPriority(_:d:)' to satisfy this requirement}}{{20-20=_ }} // expected-note@-3{{move 'doSomething(priority:d:)' to an extension to silence this warning}} - // expected-note@-4{{make 'doSomething(priority:d:)' private to silence this warning}}{{3-3=private }} + // expected-note@-4{{make 'doSomething(priority:d:)' fileprivate to silence this warning}}{{3-3=fileprivate }} } @objc protocol P4 { @@ -74,7 +74,7 @@ class C4a : P4 { // expected-warning@-1{{instance method 'doSomethingWithPriority(_:d:)' nearly matches optional requirement 'doSomething(priority:d:)' of protocol 'P4'}} // expected-note@-2{{rename to 'doSomething(priority:d:)' to satisfy this requirement}}{{32-33=priority}} // expected-note@-3{{move 'doSomethingWithPriority(_:d:)' to an extension to silence this warning}} - // expected-note@-4{{make 'doSomethingWithPriority(_:d:)' private to silence this warning}}{{3-3=private }} + // expected-note@-4{{make 'doSomethingWithPriority(_:d:)' fileprivate to silence this warning}}{{3-3=fileprivate }} } @objc class SomeClass { } @@ -89,7 +89,7 @@ class C5a : P5 { // expected-warning@-1{{instance method 'method(_:for:dividing:)' nearly matches optional requirement 'methodWithInt(_:forSomeClass:dividingDouble:)' of protocol 'P5'}} // expected-note@-2{{rename to 'methodWithInt(_:forSomeClass:dividingDouble:)' to satisfy this requirement}}{{8-14=methodWithInt}}{{23-26=forSomeClass}}{{49-57=dividingDouble}}{{none}} // expected-note@-3{{move 'method(_:for:dividing:)' to an extension to silence this warning}} - // expected-note@-4{{make 'method(_:for:dividing:)' private to silence this warning}}{{3-3=private }} + // expected-note@-4{{make 'method(_:for:dividing:)' fileprivate to silence this warning}}{{3-3=fileprivate }} } @objc protocol P6 { @@ -102,7 +102,7 @@ class C6a : P6 { // expected-warning@-1{{instance method 'methodWithInt(_:forSomeClass:dividingDouble:)' nearly matches optional requirement 'method(_:for:dividing:)' of protocol 'P6'}} // expected-note@-2{{rename to 'method(_:for:dividing:)' to satisfy this requirement}}{{8-21=method}}{{30-30=for }}{{55-55=dividing }}{{none}} // expected-note@-3{{move 'methodWithInt(_:forSomeClass:dividingDouble:)' to an extension to silence this warning}} - // expected-note@-4{{make 'methodWithInt(_:forSomeClass:dividingDouble:)' private to silence this warning}}{{3-3=private }} + // expected-note@-4{{make 'methodWithInt(_:forSomeClass:dividingDouble:)' fileprivate to silence this warning}}{{3-3=fileprivate }} } // Use the first note to always describe why it didn't match. @@ -116,6 +116,6 @@ class C7a : P7 { // expected-warning@-1{{instance method 'method(foo:)' nearly matches optional requirement 'method(foo:)' of protocol 'P7'}} // expected-note@-2{{candidate has non-matching type '(foo: Double) -> ()'}} // expected-note@-3{{move 'method(foo:)' to an extension to silence this warning}} - // expected-note@-4{{make 'method(foo:)' private to silence this warning}} + // expected-note@-4{{make 'method(foo:)' fileprivate to silence this warning}} } diff --git a/test/expr/capture/top-level-guard.swift b/test/expr/capture/top-level-guard.swift index 352230344a9ed..e68bbc04930d9 100644 --- a/test/expr/capture/top-level-guard.swift +++ b/test/expr/capture/top-level-guard.swift @@ -39,7 +39,7 @@ let closureCapture: () -> Void = { [x] in } // CHECK-LABEL: (defer_stmt -// CHECK-NEXT: (func_decl implicit "$defer()" type='() -> ()' access=private captures=(x) +// CHECK-NEXT: (func_decl implicit "$defer()" type='() -> ()' access=fileprivate captures=(x) defer { _ = x } diff --git a/tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp b/tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp index 9f88051a5d149..17397369ed777 100644 --- a/tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp +++ b/tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp @@ -958,11 +958,14 @@ namespace { static UIdent getAccessibilityUID(Accessibility Access) { static UIdent AccessPublic("source.lang.swift.accessibility.public"); static UIdent AccessInternal("source.lang.swift.accessibility.internal"); + static UIdent AccessFilePrivate("source.lang.swift.accessibility.fileprivate"); static UIdent AccessPrivate("source.lang.swift.accessibility.private"); switch (Access) { case Accessibility::Private: return AccessPrivate; + case Accessibility::FilePrivate: + return AccessFilePrivate; case Accessibility::Internal: return AccessInternal; case Accessibility::Public: @@ -1001,7 +1004,7 @@ static Accessibility inferAccessibility(const ValueDecl *D) { case DeclContextKind::TopLevelCodeDecl: case DeclContextKind::AbstractFunctionDecl: case DeclContextKind::SubscriptDecl: - return Accessibility::Private; + return Accessibility::FilePrivate; case DeclContextKind::Module: case DeclContextKind::FileUnit: return Accessibility::Internal;