Skip to content

[SourceKit] Add global-configuration request to control SourceKit's behavior around .swiftsourceinfo files #28452

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 13 additions & 10 deletions lib/IDE/SwiftSourceDocInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -764,18 +764,21 @@ void swift::ide::getLocationInfo(const ValueDecl *VD,
auto ClangNode = VD->getClangNode();

if (VD->getLoc().isValid()) {
auto getSignatureRange = [&](const ValueDecl *VD) -> Optional<unsigned> {
if (auto FD = dyn_cast<AbstractFunctionDecl>(VD)) {
SourceRange R = FD->getSignatureSourceRange();
if (R.isValid())
return getCharLength(SM, R);
}
return None;
};
unsigned NameLen;
if (auto FD = dyn_cast<AbstractFunctionDecl>(VD)) {
SourceRange R = FD->getSignatureSourceRange();
if (R.isInvalid())
return;
NameLen = getCharLength(SM, R);
if (auto SigLen = getSignatureRange(VD)) {
NameLen = SigLen.getValue();
} else if (VD->hasName()) {
NameLen = VD->getBaseName().userFacingName().size();
} else {
if (VD->hasName()) {
NameLen = VD->getBaseName().userFacingName().size();
} else {
NameLen = getCharLength(SM, VD->getLoc());
}
NameLen = getCharLength(SM, VD->getLoc());
}

unsigned DeclBufID = SM.findBufferContainingLoc(VD->getLoc());
Expand Down
4 changes: 2 additions & 2 deletions test/Serialization/comments-batch-mode.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -enable-batch-mode -emit-module -emit-module-doc -emit-module-path %t/Foo.swiftmodule %S/Inputs/comments-batch/File1.swift %S/Inputs/comments-batch/File2.swift %S/Inputs/comments-batch/File3.swift %S/Inputs/comments-batch/File4.swift %S/Inputs/comments-batch/File5.swift -module-name Foo -emit-module-source-info-path %t/Foo.swiftsourceinfo -emit-module-doc-path %t/Foo.swiftdoc
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=Foo -source-filename %s -I %t | %FileCheck %s
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=Foo -enable-swiftsourceinfo -source-filename %s -I %t | %FileCheck %s

// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -wmo -emit-module -emit-module-doc -emit-module-path %t/Foo.swiftmodule %S/Inputs/comments-batch/File1.swift %S/Inputs/comments-batch/File2.swift %S/Inputs/comments-batch/File3.swift %S/Inputs/comments-batch/File4.swift %S/Inputs/comments-batch/File5.swift -module-name Foo -emit-module-source-info-path %t/Foo.swiftsourceinfo -emit-module-doc-path %t/Foo.swiftdoc
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=Foo -source-filename %s -I %t | %FileCheck %s
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=Foo -enable-swiftsourceinfo -source-filename %s -I %t | %FileCheck %s

// CHECK: Inputs/comments-batch/File1.swift:2:13: Func/FuncFromFile1 RawComment=[/// Comment in File1\n]
// CHECK: Inputs/comments-batch/File2.swift:2:13: Func/FuncFromFile2 RawComment=[/// Comment in File2\n]
Expand Down
4 changes: 2 additions & 2 deletions test/Serialization/comments-framework.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
// RUN: %empty-directory(%t/comments.framework/Modules/comments.swiftmodule/Project)

// RUN: %target-swift-frontend -module-name comments -emit-module -emit-module-path %t/comments.framework/Modules/comments.swiftmodule/%target-swiftmodule-name -emit-module-doc-path %t/comments.framework/Modules/comments.swiftmodule/%target-swiftdoc-name -emit-module-source-info-path %t/comments.framework/Modules/comments.swiftmodule/Project/%target-swiftsourceinfo-name %s
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=comments -source-filename %s -F %t | %FileCheck %s
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=comments -enable-swiftsourceinfo -source-filename %s -F %t | %FileCheck %s

// RUN: cp -r %t/comments.framework/Modules/comments.swiftmodule %t/comments.swiftmodule
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=comments -source-filename %s -I %t | %FileCheck %s
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=comments -enable-swiftsourceinfo -source-filename %s -I %t | %FileCheck %s

/// first_decl_class_1 Aaa.
public class first_decl_class_1 {
Expand Down
2 changes: 1 addition & 1 deletion test/Serialization/comments-hidden.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
//
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -enable-testing -module-name comments -emit-module -emit-module-path %t/comments.swiftmodule -emit-module-doc -emit-module-doc-path %t/comments.swiftdoc -emit-module-source-info-path %t/comments.swiftsourceinfo %s
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=comments -source-filename %s -I %t > %t.testing.txt
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=comments -enable-swiftsourceinfo -source-filename %s -I %t > %t.testing.txt
// RUN: %FileCheck %s -check-prefix=SOURCE-LOC < %t.testing.txt

/// PublicClass Documentation
Expand Down
4 changes: 2 additions & 2 deletions test/Serialization/comments.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
// RUN: llvm-bcanalyzer %t/comments.swiftmodule | %FileCheck %s -check-prefix=BCANALYZER
// RUN: llvm-bcanalyzer %t/comments.swiftdoc | %FileCheck %s -check-prefix=BCANALYZER
// RUN: llvm-bcanalyzer %t/comments.swiftsourceinfo | %FileCheck %s -check-prefix=BCANALYZER
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=comments -source-filename %s -I %t | %FileCheck %s -check-prefix=FIRST
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=comments -enable-swiftsourceinfo -source-filename %s -I %t | %FileCheck %s -check-prefix=FIRST

// Test the case when we have a multiple files in a module.
//
Expand All @@ -16,7 +16,7 @@
// RUN: llvm-bcanalyzer %t/comments.swiftmodule | %FileCheck %s -check-prefix=BCANALYZER
// RUN: llvm-bcanalyzer %t/comments.swiftdoc | %FileCheck %s -check-prefix=BCANALYZER
// RUN: llvm-bcanalyzer %t/comments.swiftsourceinfo | %FileCheck %s -check-prefix=BCANALYZER
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=comments -source-filename %s -I %t > %t.printed.txt
// RUN: %target-swift-ide-test -print-module-comments -module-to-print=comments -enable-swiftsourceinfo -source-filename %s -I %t > %t.printed.txt
// RUN: %FileCheck %s -check-prefix=FIRST < %t.printed.txt
// RUN: %FileCheck %s -check-prefix=SECOND < %t.printed.txt

Expand Down
4 changes: 2 additions & 2 deletions test/SourceKit/CompileNotifications/arg-parsing.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// ARG_PARSE_0: {
// ARG_PARSE_0: key.notification: source.notification.compile-will-start
// ARG_PARSE_0: key.compileid: [[CID1:".*"]]
// ARG_PARSE_0: key.compilerargs-string: "{{.*}}.swift -no-such-arg -Xfrontend -ignore-module-source-info"
// ARG_PARSE_0: key.compilerargs-string: "{{.*}}.swift -no-such-arg"
// ARG_PARSE_0: }
// ARG_PARSE_0: {
// ARG_PARSE_0: key.notification: source.notification.compile-did-finish
Expand All @@ -24,7 +24,7 @@
// ARG_PARSE_1: {
// ARG_PARSE_1: key.notification: source.notification.compile-will-start
// ARG_PARSE_1: key.compileid: [[CID1:".*"]]
// ARG_PARSE_1: key.compilerargs-string: "{{.*}}.swift -no-such-arg -Xfrontend -ignore-module-source-info"
// ARG_PARSE_1: key.compilerargs-string: "{{.*}}.swift -no-such-arg"
// ARG_PARSE_1: }
// ARG_PARSE_1: {
// ARG_PARSE_1: key.notification: source.notification.compile-did-finish
Expand Down
29 changes: 29 additions & 0 deletions test/SourceKit/CursorInfo/use-swift-source-info.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import Foo
func bar() {
foo()
}

// RUN: %empty-directory(%t)
// RUN: echo "/// Some doc" >> %t/Foo.swift
// RUN: echo "public func foo() { }" >> %t/Foo.swift
// RUN: %target-swift-frontend -enable-batch-mode -emit-module -emit-module-doc -emit-module-path %t/Foo.swiftmodule %t/Foo.swift -module-name Foo -emit-module-source-info-path %t/Foo.swiftsourceinfo -emit-module-doc-path %t/Foo.swiftdoc
//
// Test setting optimize for ide to false
// RUN: %sourcekitd-test -req=global-config -for-ide=0 == -req=cursor -pos=3:3 %s -- -I %t -target %target-triple %s | %FileCheck --check-prefixes=BOTH,WITH %s
//
// Test setting optimize for ide to true
// RUN: %sourcekitd-test -req=global-config -for-ide=1 == -req=cursor -pos=3:3 %s -- -I %t -target %target-triple %s | %FileCheck --check-prefixes=BOTH,WITHOUT %s
//
// Test sourcekitd-test's default global configuration request (optimize for ide is true)
// RUN: %sourcekitd-test -req=cursor -pos=3:3 %s -- -I %t -target %target-triple %s | %FileCheck --check-prefixes=BOTH,WITHOUT %s
//
// Test without sending any global configuration request to check the sevice's default settings (optimize for ide is false)
// RUN: %sourcekitd-test -suppress-config-request -req=cursor -pos=3:3 %s -- -I %t -target %target-triple %s | %FileCheck --check-prefixes=BOTH,WITH %s

// WITH: source.lang.swift.ref.function.free ({{.*}}/Foo.swift:2:13-2:16)
// WITHOUT: source.lang.swift.ref.function.free ()
// BOTH: foo()
// BOTH: s:3Foo3fooyyF
// BOTH: () -> ()
// BOTH: $syycD
// BOTH: Foo
12 changes: 6 additions & 6 deletions test/SourceKit/Misc/stats.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@ func foo() {}

// RUN: %sourcekitd-test -req=syntax-map %s == -req=stats | %FileCheck %s -check-prefix=SYNTAX_1

// SYNTAX_1: 2 {{.*}} source.statistic.num-requests
// SYNTAX_1: 3 {{.*}} source.statistic.num-requests
// SYNTAX_1: 0 {{.*}} source.statistic.num-semantic-requests
// SYNTAX_1: 0 {{.*}} source.statistic.num-ast-builds
// SYNTAX_1: 1 {{.*}} source.statistic.num-open-documents
// SYNTAX_1: 1 {{.*}} source.statistic.max-open-documents

// RUN: %sourcekitd-test -req=syntax-map %s == -req=close %s == -req=stats | %FileCheck %s -check-prefix=SYNTAX_2

// SYNTAX_2: 3 {{.*}} source.statistic.num-requests
// SYNTAX_2: 4 {{.*}} source.statistic.num-requests
// SYNTAX_2: 0 {{.*}} source.statistic.num-semantic-requests
// SYNTAX_2: 0 {{.*}} source.statistic.num-ast-builds
// SYNTAX_2: 0 {{.*}} source.statistic.num-open-documents
// SYNTAX_2: 1 {{.*}} source.statistic.max-open-documents

// RUN: %sourcekitd-test -req=sema %s -- %s == -req=stats | %FileCheck %s -check-prefix=SEMA_1

// SEMA_1: 3 {{.*}} source.statistic.num-requests
// SEMA_1: 4 {{.*}} source.statistic.num-requests
// SEMA_1: 0 {{.*}} source.statistic.num-semantic-requests
// SEMA_1: 1 {{.*}} source.statistic.num-ast-builds
// SEMA_1: 1 {{.*}} source.statistic.num-asts-in-memory
Expand All @@ -28,7 +28,7 @@ func foo() {}

// RUN: %sourcekitd-test -req=sema %s -- %s == -req=edit -pos=1:1 -replace=" " %s == -req=stats | %FileCheck %s -check-prefix=SEMA_2

// SEMA_2: 5 {{.*}} source.statistic.num-requests
// SEMA_2: 6 {{.*}} source.statistic.num-requests
// SEMA_2: 0 {{.*}} source.statistic.num-semantic-requests
// SEMA_2: 2 {{.*}} source.statistic.num-ast-builds
// NOTE: we cannot match num-asts-in-memory, or num-ast-cache-hits reliably when
Expand All @@ -40,7 +40,7 @@ func foo() {}

// RUN: %sourcekitd-test -req=sema %s -- %s == -req=cursor -pos=1:6 %s -- %s == -req=stats | %FileCheck %s -check-prefix=SEMA_3

// SEMA_3: 4 {{.*}} source.statistic.num-requests
// SEMA_3: 5 {{.*}} source.statistic.num-requests
// SEMA_3: 1 {{.*}} source.statistic.num-semantic-requests
// SEMA_3: 1 {{.*}} source.statistic.num-ast-builds
// SEMA_3: 1 {{.*}} source.statistic.num-asts-in-memory
Expand All @@ -50,7 +50,7 @@ func foo() {}

// RUN: %sourcekitd-test -req=sema %s -- %s == -req=related-idents -pos=1:6 %s -- %s == -req=stats | %FileCheck %s -check-prefix=SEMA_4

// SEMA_4: 4 {{.*}} source.statistic.num-requests
// SEMA_4: 5 {{.*}} source.statistic.num-requests
// SEMA_4: 1 {{.*}} source.statistic.num-semantic-requests
// SEMA_4: 1 {{.*}} source.statistic.num-ast-builds
// SEMA_4: 1 {{.*}} source.statistic.num-asts-in-memory
Expand Down
23 changes: 23 additions & 0 deletions tools/SourceKit/include/SourceKit/Core/Context.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "SourceKit/Core/LLVM.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/Mutex.h"
#include <memory>
#include <string>

Expand All @@ -27,10 +28,30 @@ namespace SourceKit {
class LangSupport;
class NotificationCenter;

class GlobalConfig {
public:
struct Settings {
/// When true, the default compiler options and other configuration flags will be chosen to optimize for
/// usage from an IDE.
///
/// At the time of writing this just means ignoring .swiftsourceinfo files.
bool OptimizeForIDE = false;
};

private:
Settings State;
mutable llvm::sys::Mutex Mtx;

public:
Settings update(Optional<bool> OptimizeForIDE);
bool shouldOptimizeForIDE() const;
};

class Context {
std::string RuntimeLibPath;
std::unique_ptr<LangSupport> SwiftLang;
std::shared_ptr<NotificationCenter> NotificationCtr;
std::shared_ptr<GlobalConfig> Config;

public:
Context(StringRef RuntimeLibPath,
Expand All @@ -44,6 +65,8 @@ class Context {
LangSupport &getSwiftLangSupport() { return *SwiftLang; }

std::shared_ptr<NotificationCenter> getNotificationCenter() { return NotificationCtr; }

std::shared_ptr<GlobalConfig> getGlobalConfiguration() { return Config; }
};

} // namespace SourceKit
Expand Down
16 changes: 15 additions & 1 deletion tools/SourceKit/lib/Core/Context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,25 @@

using namespace SourceKit;

GlobalConfig::Settings
GlobalConfig::update(Optional<bool> OptimizeForIDE) {
llvm::sys::ScopedLock L(Mtx);
if (OptimizeForIDE.hasValue())
State.OptimizeForIDE = *OptimizeForIDE;
return State;
};

bool GlobalConfig::shouldOptimizeForIDE() const {
llvm::sys::ScopedLock L(Mtx);
return State.OptimizeForIDE;
}

SourceKit::Context::Context(StringRef RuntimeLibPath,
llvm::function_ref<std::unique_ptr<LangSupport>(Context &)>
LangSupportFactoryFn,
bool shouldDispatchNotificationsOnMain) : RuntimeLibPath(RuntimeLibPath),
NotificationCtr(new NotificationCenter(shouldDispatchNotificationsOnMain)) {
NotificationCtr(new NotificationCenter(shouldDispatchNotificationsOnMain)),
Config(new GlobalConfig()) {
// Should be called last after everything is initialized.
SwiftLang = LangSupportFactoryFn(*this);
}
Expand Down
17 changes: 15 additions & 2 deletions tools/SourceKit/lib/SwiftLang/SwiftASTManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -371,11 +371,13 @@ struct CacheKeyHashInfo<ASTKey> {
struct SwiftASTManager::Implementation {
explicit Implementation(
std::shared_ptr<SwiftEditorDocumentFileMap> EditorDocs,
std::shared_ptr<GlobalConfig> Config,
std::shared_ptr<SwiftStatistics> Stats, StringRef RuntimeResourcePath)
: EditorDocs(EditorDocs), Stats(Stats),
: EditorDocs(EditorDocs), Config(Config), Stats(Stats),
RuntimeResourcePath(RuntimeResourcePath) {}

std::shared_ptr<SwiftEditorDocumentFileMap> EditorDocs;
std::shared_ptr<GlobalConfig> Config;
std::shared_ptr<SwiftStatistics> Stats;
std::string RuntimeResourcePath;
SourceManager SourceMgr;
Expand All @@ -401,8 +403,10 @@ struct SwiftASTManager::Implementation {

SwiftASTManager::SwiftASTManager(
std::shared_ptr<SwiftEditorDocumentFileMap> EditorDocs,
std::shared_ptr<GlobalConfig> Config,
std::shared_ptr<SwiftStatistics> Stats, StringRef RuntimeResourcePath)
: Impl(*new Implementation(EditorDocs, Stats, RuntimeResourcePath)) {}
: Impl(*new Implementation(EditorDocs, Config, Stats,
RuntimeResourcePath)) {}

SwiftASTManager::~SwiftASTManager() {
delete &Impl;
Expand Down Expand Up @@ -535,6 +539,15 @@ bool SwiftASTManager::initCompilerInvocation(
// We don't care about LLVMArgs
FrontendOpts.LLVMArgs.clear();

// SwiftSourceInfo files provide source location information for decls coming
// from loaded modules. For most IDE use cases it either has an undesirable
// impact on performance with no benefit (code completion), results in stale
// locations being used instead of more up-to-date indexer locations (cursor
// info), or has no observable effect (diagnostics, which are filtered to just
// those with a location in the primary file, and everything else).
if (Impl.Config->shouldOptimizeForIDE())
FrontendOpts.IgnoreSwiftSourceInfo = true;

// Disable expensive SIL options to reduce time spent in SILGen.
disableExpensiveSILOptions(Invocation.getSILOptions());

Expand Down
2 changes: 2 additions & 0 deletions tools/SourceKit/lib/SwiftLang/SwiftASTManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ namespace SourceKit {
class SwiftLangSupport;
class SwiftInvocation;
struct SwiftStatistics;
class GlobalConfig;
typedef RefPtr<SwiftInvocation> SwiftInvocationRef;
class EditorDiagConsumer;

Expand Down Expand Up @@ -89,6 +90,7 @@ typedef std::shared_ptr<SwiftASTConsumer> SwiftASTConsumerRef;
class SwiftASTManager : public std::enable_shared_from_this<SwiftASTManager> {
public:
explicit SwiftASTManager(std::shared_ptr<SwiftEditorDocumentFileMap>,
std::shared_ptr<GlobalConfig> Config,
std::shared_ptr<SwiftStatistics> Stats,
StringRef RuntimeResourcePath);
~SwiftASTManager();
Expand Down
4 changes: 2 additions & 2 deletions tools/SourceKit/lib/SwiftLang/SwiftCompletion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,8 @@ static bool swiftCodeCompleteImpl(
return false;
}

// Disable source location resolutions from .swiftsourceinfo file because
// they are somewhat heavy operations and are not needed for completions.
// Always disable source location resolutions from .swiftsourceinfo file
// because they're somewhat heavy operations and aren't needed for completion.
Invocation.getFrontendOptions().IgnoreSwiftSourceInfo = true;

const char *Position = InputFile->getBufferStart() + CodeCompletionOffset;
Expand Down
4 changes: 2 additions & 2 deletions tools/SourceKit/lib/SwiftLang/SwiftConformingMethodList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ static bool swiftConformingMethodListImpl(
return false;
}

// Disable source location resolutions from .swiftsourceinfo file because
// they are somewhat heavy operations and are not needed for completions.
// Always disable source location resolutions from .swiftsourceinfo file
// because they're somewhat heavy operations and aren't needed for completion.
Invocation.getFrontendOptions().IgnoreSwiftSourceInfo = true;

Invocation.setCodeCompletionPoint(newBuffer.get(), Offset);
Expand Down
5 changes: 3 additions & 2 deletions tools/SourceKit/lib/SwiftLang/SwiftLangSupport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,9 @@ SwiftLangSupport::SwiftLangSupport(SourceKit::Context &SKCtx)

Stats = std::make_shared<SwiftStatistics>();
EditorDocuments = std::make_shared<SwiftEditorDocumentFileMap>();
ASTMgr = std::make_shared<SwiftASTManager>(EditorDocuments, Stats,
RuntimeResourcePath);
ASTMgr = std::make_shared<SwiftASTManager>(EditorDocuments,
SKCtx.getGlobalConfiguration(),
Stats, RuntimeResourcePath);
// By default, just use the in-memory cache.
CCCache->inMemory = llvm::make_unique<ide::CodeCompletionCache>();

Expand Down
4 changes: 2 additions & 2 deletions tools/SourceKit/lib/SwiftLang/SwiftTypeContextInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ static bool swiftTypeContextInfoImpl(SwiftLangSupport &Lang,
return false;
}

// Disable source location resolutions from .swiftsourceinfo file because
// they are somewhat heavy operations and are not needed for completions.
// Always disable source location resolutions from .swiftsourceinfo file
// because they're somewhat heavy operations and aren't needed for completion.
Invocation.getFrontendOptions().IgnoreSwiftSourceInfo = true;

Invocation.setCodeCompletionPoint(newBuffer.get(), Offset);
Expand Down
6 changes: 6 additions & 0 deletions tools/SourceKit/tools/sourcekitd-test/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,12 @@ def vfs_files : CommaJoined<["-"], "vfs-files=">,
def vfs_name : Separate<["-"], "vfs-name">,
HelpText<"Specify a virtual filesystem name">;

def optimize_for_ide : Joined<["-"], "for-ide=">,
HelpText<"Value for the OptimizeForIde global configuration setting">;

def suppress_config_request : Flag<["-"], "suppress-config-request">,
HelpText<"Suppress the default global configuration request, that is otherwise sent before any other request (except for the global-config request itself)">;

def help : Flag<["-", "--"], "help">,
HelpText<"Display available options">;

Expand Down
Loading