Module interface printing: add an option to filter declarations based on

access control

Swift SVN r20399
This commit is contained in:
Dmitri Hrybenko
2014-07-23 15:03:58 +00:00
parent d3456b62d6
commit 1007ef3f95
5 changed files with 54 additions and 9 deletions

View File

@@ -13,6 +13,7 @@
#ifndef SWIFT_AST_PRINTOPTIONS_H
#define SWIFT_AST_PRINTOPTIONS_H
#include "swift/AST/Attr.h"
#include <vector>
namespace swift {
@@ -105,6 +106,9 @@ struct PrintOptions {
/// Whether to print accessibility information on all value decls.
bool PrintAccessibility = false;
/// Print all decls that have this or less restricted access.
Accessibility AccessibilityFilter = Accessibility::Private;
/// Whether we are printing for sil.
bool PrintForSIL = false;
@@ -142,6 +146,7 @@ struct PrintOptions {
result.PrintImplicitAttrs = true;
result.PrintAttrTransparent = true;
result.PrintAccessibility = true;
result.AccessibilityFilter = Accessibility::Private;
result.PrintDocumentationComments = true;
result.PrintRegularClangComments = true;
return result;

View File

@@ -549,6 +549,14 @@ bool PrintAST::shouldPrint(const Decl *D) {
if (Options.SkipUnavailable && D->getAttrs().isUnavailable())
return false;
// Skip declarations that are not accessible.
if (auto *VD = dyn_cast<ValueDecl>(D)) {
if (Options.AccessibilityFilter > Accessibility::Private &&
VD->hasAccessibility() &&
VD->getAccessibility() < Options.AccessibilityFilter)
return false;
}
if (Options.SkipPrivateStdlibDecls && D->isPrivateStdlibDecl())
return false;

View File

@@ -203,6 +203,14 @@ void swift::ide::printSubmoduleInterface(
if (Options.SkipUnavailable && D->getAttrs().isUnavailable())
continue;
// Skip declarations that are not accessible.
if (auto *VD = dyn_cast<ValueDecl>(D)) {
if (Options.AccessibilityFilter > Accessibility::Private &&
VD->hasAccessibility() &&
VD->getAccessibility() < Options.AccessibilityFilter)
continue;
}
auto ShouldPrintImport = [&](ImportDecl *ImportD) -> bool {
if (!InterestingClangModule)
return true;

View File

@@ -2,21 +2,23 @@
// RUN: mkdir %t
// RUN: %swift -emit-module -module-name Foo -o %t -F %S/Inputs/mock-sdk -module-cache-path %t/clang-module-cache %s
//
// RUN: %swift-ide-test -print-module -source-filename %s -I %t -F %S/Inputs/mock-sdk -module-cache-path %t/clang-module-cache -module-to-print=Foo > %t.printed.txt
// RUN: %swift-ide-test -print-module -source-filename %s -I %t -F %S/Inputs/mock-sdk -module-cache-path %t/clang-module-cache -module-to-print=Foo -accessibility-filter-public > %t.printed.txt
// RUN: FileCheck %s -check-prefix=PASS_WITH_OVERLAY -strict-whitespace < %t.printed.txt
// RUN: FileCheck %s -check-prefix=PASS_NO_INTERNAL -strict-whitespace < %t.printed.txt
//
// RUN: %swift-ide-test -print-module -source-filename %s -I %t -F %S/Inputs/mock-sdk -module-cache-path %t/clang-module-cache -module-to-print=Foo.FooSub > %t.printed.txt
// RUN: FileCheck %s -check-prefix=PASS_WITHOUT_OVERLAY -strict-whitespace < %t.printed.txt
@exported import Foo
func overlay_func() {}
public func overlay_func() {}
internal func overlay_func_internal() {}
class FooOverlayClassBase {
func f() {}
public class FooOverlayClassBase {
public func f() {}
}
class FooOverlayClassDerived : FooOverlayClassBase {
override func f() {}
public class FooOverlayClassDerived : FooOverlayClassBase {
override public func f() {}
}
// Check that given a top-level module with an overlay, AST printer prints
@@ -32,3 +34,5 @@ class FooOverlayClassDerived : FooOverlayClassBase {
// PASS_WITHOUT_OVERLAY-NOT: overlay_func
// PASS_NO_INTERNAL-NOT: overlay_func_internal

View File

@@ -292,6 +292,19 @@ SkipUnavailable("skip-unavailable",
llvm::cl::desc("Don't print unavailable declarations"),
llvm::cl::init(false));
static llvm::cl::opt<Accessibility>
AccessibilityFilter(
llvm::cl::desc("Accessibility filter:"),
llvm::cl::init(Accessibility::Private),
llvm::cl::values(
clEnumValN(Accessibility::Private, "accessibility-filter-private",
"Print all declarations"),
clEnumValN(Accessibility::Internal, "accessibility-filter-internal",
"Print internal and public declarations"),
clEnumValN(Accessibility::Public, "accessibility-filter-public",
"Print public declarations"),
clEnumValEnd));
static llvm::cl::opt<bool>
SkipPrivateStdlibDecls("skip-private-stdlib-decls",
llvm::cl::desc("Don't print declarations that start with '_'"),
@@ -988,7 +1001,8 @@ static int doPrintAST(const CompilerInvocation &InitInvok,
bool ExplodePatternBindingDecls,
bool PrintImplicitAttrs,
bool PrintAccessibility,
bool PrintUnavailableDecls) {
bool PrintUnavailableDecls,
Accessibility AccessibilityFilter) {
CompilerInvocation Invocation(InitInvok);
Invocation.addInputFilename(SourceFilename);
@@ -1010,6 +1024,7 @@ static int doPrintAST(const CompilerInvocation &InitInvok,
Options.ExplodePatternBindingDecls = ExplodePatternBindingDecls;
Options.PrintImplicitAttrs = PrintImplicitAttrs;
Options.PrintAccessibility = PrintAccessibility;
Options.AccessibilityFilter = AccessibilityFilter;
Options.SkipUnavailable = !PrintUnavailableDecls;
Module *M = CI.getMainModule();
@@ -1075,6 +1090,7 @@ static int doPrintModules(const CompilerInvocation &InitInvok,
bool PrintAccessibility,
bool PrintUnavailableDecls,
bool PrintRegularComments,
Accessibility AccessibilityFilter,
bool PrintPrivateStdlibDecls) {
CompilerInvocation Invocation(InitInvok);
@@ -1099,6 +1115,7 @@ static int doPrintModules(const CompilerInvocation &InitInvok,
Options.SynthesizeSugarOnTypes = SynthesizeSugarOnTypes;
Options.PrintImplicitAttrs = PrintImplicitAttrs;
Options.PrintAccessibility = PrintAccessibility;
Options.AccessibilityFilter = AccessibilityFilter;
Options.PrintRegularClangComments = PrintRegularComments;
Options.SkipPrivateStdlibDecls = !PrintPrivateStdlibDecls;
Options.SkipUnavailable = !PrintUnavailableDecls;
@@ -2125,7 +2142,8 @@ int main(int argc, char *argv[]) {
options::ExplodePatternBindingDecls,
options::PrintImplicitAttrs,
options::PrintAccessibility,
!options::SkipUnavailable);
!options::SkipUnavailable,
options::AccessibilityFilter);
break;
case ActionType::PrintASTTypeChecked:
@@ -2137,7 +2155,8 @@ int main(int argc, char *argv[]) {
options::ExplodePatternBindingDecls,
options::PrintImplicitAttrs,
options::PrintAccessibility,
!options::SkipUnavailable);
!options::SkipUnavailable,
options::AccessibilityFilter);
break;
case ActionType::PrintModule: {
@@ -2158,6 +2177,7 @@ int main(int argc, char *argv[]) {
options::PrintAccessibility,
!options::SkipUnavailable,
options::PrintRegularComments,
options::AccessibilityFilter,
!options::SkipPrivateStdlibDecls);
break;
}