mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
* spelling: accessibility Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: accessories Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: adjustments Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: all Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: ambiguous Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: arguments Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: assignment Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: associated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: assumes Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: auxiliary Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: availability Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: available Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: belongs Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: checking Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: clazz Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: compatibility Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: completely Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: completion Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: complicated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: conformance Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: constrained Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: constraint Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: contextual Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: conversion Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: convertible Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: couldn't Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: declaration Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: defaultable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: dependent Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: depending Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: describe Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: diagnostic Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: diagnostics Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: existential Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: expects Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: explicit Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: explicitly Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: expression Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: first Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: font Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: forward Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: generation Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: generic Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: given Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: global Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: guarantee Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: happened Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: hierarchy Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: identical Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: immediately Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: implicit Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: indicates Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: inferred Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: initialization Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: initialize Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: initializer Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: integrity Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: interpolation Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: introducing Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: involved Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: just Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: like Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: likewise Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: mismatch Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: missing Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: more Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: necessarily Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: noescape Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: nonetheless Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: occurrences Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: operators Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: optional Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: otherwise Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: outside Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: overload Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: overridden Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: override Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: parameter Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: parameters Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: penalize Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: platforms Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: precedence Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: preemptively Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: preliminary Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: preserve Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: propagate Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: propagated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: qualifier Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: question Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: really Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: received Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: references Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: replaceable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: replacement Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: representable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: representative Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: requirement Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: requires Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: resolved Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: retrieve Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: rewriting Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: satisfied Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: semantics Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: signature Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: similar Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: simplest Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: simplification Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: solver Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: struct Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: structurally Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: success Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: sure Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: symmetric Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: syntactically Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: target Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: that Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: the Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: themselves Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: these Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: this Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transform Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transparent Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: tread Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: truncation Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: type Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unconstructable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: universally Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unknown Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unwrapped Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: versioned Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: visible Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: where Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> Co-authored-by: Josh Soref <jsoref@users.noreply.github.com>
143 lines
5.6 KiB
C++
143 lines
5.6 KiB
C++
//===--- MiscDiagnostics.h - AST-Level Diagnostics --------------*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SWIFT_SEMA_MISC_DIAGNOSTICS_H
|
|
#define SWIFT_SEMA_MISC_DIAGNOSTICS_H
|
|
|
|
#include "swift/AST/ASTWalker.h"
|
|
#include "swift/AST/AttrKind.h"
|
|
#include "swift/AST/Pattern.h"
|
|
#include "swift/AST/Expr.h"
|
|
#include "swift/AST/Identifier.h"
|
|
#include "swift/Basic/LLVM.h"
|
|
#include "swift/Basic/SourceLoc.h"
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/ADT/Optional.h"
|
|
|
|
namespace swift {
|
|
class AbstractFunctionDecl;
|
|
class ApplyExpr;
|
|
class CallExpr;
|
|
class ClosureExpr;
|
|
class DeclContext;
|
|
class Decl;
|
|
class Expr;
|
|
class InFlightDiagnostic;
|
|
class Stmt;
|
|
class TopLevelCodeDecl;
|
|
class ValueDecl;
|
|
class ForEachStmt;
|
|
|
|
/// Emit diagnostics for syntactic restrictions on a given expression.
|
|
void performSyntacticExprDiagnostics(
|
|
const Expr *E, const DeclContext *DC,
|
|
bool isExprStmt, bool disableExprAvailabilityChecking = false);
|
|
|
|
/// Emit diagnostics for a given statement.
|
|
void performStmtDiagnostics(const Stmt *S, DeclContext *DC);
|
|
|
|
void performAbstractFuncDeclDiagnostics(AbstractFunctionDecl *AFD);
|
|
|
|
/// Perform diagnostics on the top level code declaration.
|
|
void performTopLevelDeclDiagnostics(TopLevelCodeDecl *TLCD);
|
|
|
|
/// Emit a fix-it to set the access of \p VD to \p desiredAccess.
|
|
///
|
|
/// This actually updates \p VD as well.
|
|
void fixItAccess(InFlightDiagnostic &diag,
|
|
ValueDecl *VD,
|
|
AccessLevel desiredAccess,
|
|
bool isForSetter = false,
|
|
bool shouldUseDefaultAccess = false);
|
|
|
|
/// Emit fix-its to correct the argument labels in \p argList.
|
|
///
|
|
/// If \p existingDiag is null, the fix-its will be attached to an appropriate
|
|
/// error diagnostic.
|
|
///
|
|
/// \returns true if the issue was diagnosed
|
|
bool diagnoseArgumentLabelError(ASTContext &ctx,
|
|
const ArgumentList *argList,
|
|
ArrayRef<Identifier> newNames,
|
|
bool isSubscript,
|
|
InFlightDiagnostic *existingDiag = nullptr);
|
|
|
|
/// If \p assignExpr has a destination expression that refers to a declaration
|
|
/// with a non-owning attribute, such as 'weak' or 'unowned' and the initializer
|
|
/// expression refers to a class constructor, emit a warning that the assigned
|
|
/// instance will be immediately deallocated.
|
|
void diagnoseUnownedImmediateDeallocation(ASTContext &ctx,
|
|
const AssignExpr *assignExpr);
|
|
|
|
/// If \p pattern binds to a declaration with a non-owning attribute, such as
|
|
/// 'weak' or 'unowned' and \p initializer refers to a class constructor,
|
|
/// emit a warning that the bound instance will be immediately deallocated.
|
|
void diagnoseUnownedImmediateDeallocation(ASTContext &ctx,
|
|
const Pattern *pattern,
|
|
SourceLoc equalLoc,
|
|
const Expr *initializer);
|
|
|
|
/// If \p expr is a call to a known function with a requirement that some
|
|
/// arguments must be constants, whether those arguments are passed only
|
|
/// constants. Otherwise, diagnose and emit errors.
|
|
void diagnoseConstantArgumentRequirement(const Expr *expr,
|
|
const DeclContext *declContext);
|
|
|
|
/// Attempt to fix the type of \p decl so that it's a valid override for
|
|
/// \p base...but only if we're highly confident that we know what the user
|
|
/// should have written.
|
|
///
|
|
/// The \p diag closure allows the caller to control the diagnostic that is
|
|
/// emitted. It is passed true if the diagnostic will be emitted with fixits
|
|
/// attached, and false otherwise. If None is returned, no diagnostics are
|
|
/// emitted. Else the fixits are attached to the returned diagnostic.
|
|
///
|
|
/// \returns true iff any fix-its were attached to \p diag.
|
|
bool computeFixitsForOverriddenDeclaration(
|
|
ValueDecl *decl, const ValueDecl *base,
|
|
llvm::function_ref<Optional<InFlightDiagnostic>(bool)> diag);
|
|
|
|
/// Emit fix-its to enclose trailing closure in argument parens.
|
|
void fixItEncloseTrailingClosure(ASTContext &ctx,
|
|
InFlightDiagnostic &diag,
|
|
const CallExpr *call,
|
|
Identifier closureLabel);
|
|
|
|
/// Check that we use the async version of a function where available
|
|
///
|
|
/// If a completion-handler function is called from an async context and it has
|
|
/// a '@available' attribute with renamed field pointing to an async function,
|
|
/// we emit a diagnostic suggesting the async call.
|
|
void checkFunctionAsyncUsage(AbstractFunctionDecl *decl);
|
|
void checkPatternBindingDeclAsyncUsage(PatternBindingDecl *decl);
|
|
|
|
/// Detect and diagnose a missing `try` in `for-in` loop sequence
|
|
/// expression in async context (denoted with `await` keyword).
|
|
bool diagnoseUnhandledThrowsInAsyncContext(DeclContext *dc,
|
|
ForEachStmt *forEach);
|
|
|
|
class BaseDiagnosticWalker : public ASTWalker {
|
|
bool walkToDeclPre(Decl *D) override;
|
|
|
|
bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *expr) override {
|
|
return false;
|
|
}
|
|
|
|
private:
|
|
static bool shouldWalkIntoDeclInClosureContext(Decl *D);
|
|
};
|
|
|
|
} // namespace swift
|
|
|
|
#endif // SWIFT_SEMA_MISC_DIAGNOSTICS_H
|
|
|