Skip to content

Commit 67b37df

Browse files
committed
---
yaml --- r: 348781 b: refs/heads/master c: 2fe3ce8 h: refs/heads/master i: 348779: 12d6a7e
1 parent 214a9d6 commit 67b37df

File tree

177 files changed

+5504
-5882
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

177 files changed

+5504
-5882
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 8c5dcc0fe5c9c4aa3bf3ccb15a6b6a342ba393ad
2+
refs/heads/master: 2fe3ce8af87cb0c0744e16ad8ee137fb805370d6
33
refs/heads/master-next: 203b3026584ecad859eb328b2e12490099409cd5
44
refs/tags/osx-passed: b6b74147ef8a386f532cf9357a1bde006e552c54
55
refs/tags/swift-2.2-SNAPSHOT-2015-12-01-a: 6bb18e013c2284f2b45f5f84f2df2887dc0f7dea

trunk/include/swift/AST/ASTTypeIDZone.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ SWIFT_TYPEID(Type)
2626
SWIFT_TYPEID(TypePair)
2727
SWIFT_TYPEID_NAMED(CustomAttr *, CustomAttr)
2828
SWIFT_TYPEID_NAMED(Decl *, Decl)
29+
SWIFT_TYPEID_NAMED(EnumDecl *, EnumDecl)
2930
SWIFT_TYPEID_NAMED(GenericParamList *, GenericParamList)
3031
SWIFT_TYPEID_NAMED(GenericTypeParamType *, GenericTypeParamType)
3132
SWIFT_TYPEID_NAMED(InfixOperatorDecl *, InfixOperatorDecl)

trunk/include/swift/AST/ASTTypeIDs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class AbstractFunctionDecl;
2525
class BraceStmt;
2626
class CustomAttr;
2727
class Decl;
28+
class EnumDecl;
2829
class GenericParamList;
2930
class GenericSignature;
3031
class GenericTypeParamType;

trunk/include/swift/AST/Decl.h

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3519,12 +3519,37 @@ class NominalTypeDecl : public GenericTypeDecl, public IterableDeclContext {
35193519
class EnumDecl final : public NominalTypeDecl {
35203520
SourceLoc EnumLoc;
35213521

3522+
enum SemanticInfoFlags : uint8_t {
3523+
// Is the raw type valid?
3524+
HasComputedRawType = 1 << 0,
3525+
// Is the complete set of (auto-incremented) raw values available?
3526+
HasFixedRawValues = 1 << 1,
3527+
// Is the complete set of raw values type checked?
3528+
HasFixedRawValuesAndTypes = 1 << 2,
3529+
};
3530+
35223531
struct {
35233532
/// The raw type and a bit to indicate whether the
35243533
/// raw was computed yet or not.
3525-
llvm::PointerIntPair<Type, 1, bool> RawType;
3534+
llvm::PointerIntPair<Type, 3, OptionSet<SemanticInfoFlags>> RawTypeAndFlags;
3535+
3536+
bool hasRawType() const {
3537+
return RawTypeAndFlags.getInt().contains(HasComputedRawType);
3538+
}
3539+
void cacheRawType(Type ty) {
3540+
auto flags = RawTypeAndFlags.getInt() | HasComputedRawType;
3541+
RawTypeAndFlags.setPointerAndInt(ty, flags);
3542+
}
3543+
3544+
bool hasFixedRawValues() const {
3545+
return RawTypeAndFlags.getInt().contains(HasFixedRawValues);
3546+
}
3547+
bool hasCheckedRawValues() const {
3548+
return RawTypeAndFlags.getInt().contains(HasFixedRawValuesAndTypes);
3549+
}
35263550
} LazySemanticInfo;
35273551

3552+
friend class EnumRawValuesRequest;
35283553
friend class EnumRawTypeRequest;
35293554
friend class TypeChecker;
35303555

@@ -3583,6 +3608,9 @@ class EnumDecl final : public NominalTypeDecl {
35833608
Bits.EnumDecl.Circularity = static_cast<unsigned>(circularity);
35843609
}
35853610

3611+
/// Record that this enum has had all of its raw values computed.
3612+
void setHasFixedRawValues();
3613+
35863614
// Implement isa/cast/dyncast/etc.
35873615
static bool classof(const Decl *D) {
35883616
return D->getKind() == DeclKind::Enum;
@@ -3612,9 +3640,11 @@ class EnumDecl final : public NominalTypeDecl {
36123640

36133641
/// Set the raw type of the enum from its inheritance clause.
36143642
void setRawType(Type rawType) {
3615-
LazySemanticInfo.RawType.setPointerAndInt(rawType, true);
3643+
auto flags = LazySemanticInfo.RawTypeAndFlags.getInt();
3644+
LazySemanticInfo.RawTypeAndFlags.setPointerAndInt(
3645+
rawType, flags | HasComputedRawType);
36163646
}
3617-
3647+
36183648
/// True if none of the enum cases have associated values.
36193649
///
36203650
/// Note that this is true for enums with absolutely no cases.
@@ -6354,6 +6384,8 @@ class EnumCaseDecl final : public Decl,
63546384
/// parent EnumDecl, although syntactically they are subordinate to the
63556385
/// EnumCaseDecl.
63566386
class EnumElementDecl : public DeclContext, public ValueDecl {
6387+
friend class EnumRawValuesRequest;
6388+
63576389
/// This is the type specified with the enum element, for
63586390
/// example 'Int' in 'case Y(Int)'. This is null if there is no type
63596391
/// associated with this element, as in 'case Z' or in all elements of enum
@@ -6394,9 +6426,20 @@ class EnumElementDecl : public DeclContext, public ValueDecl {
63946426

63956427
ParameterList *getParameterList() const { return Params; }
63966428

6397-
bool hasRawValueExpr() const { return RawValueExpr; }
6398-
LiteralExpr *getRawValueExpr() const { return RawValueExpr; }
6399-
void setRawValueExpr(LiteralExpr *e) { RawValueExpr = e; }
6429+
/// Retrieves a fully typechecked raw value expression associated
6430+
/// with this enum element, if it exists.
6431+
LiteralExpr *getRawValueExpr() const;
6432+
6433+
/// Retrieves a "structurally" checked raw value expression associated
6434+
/// with this enum element, if it exists.
6435+
///
6436+
/// The structural raw value may or may not have a type set, but it is
6437+
/// guaranteed to be suitable for retrieving any non-semantic information
6438+
/// like digit text for an integral raw value or user text for a string raw value.
6439+
LiteralExpr *getStructuralRawValueExpr() const;
6440+
6441+
/// Reset the raw value expression.
6442+
void setRawValueExpr(LiteralExpr *e);
64006443

64016444
/// Return the containing EnumDecl.
64026445
EnumDecl *getParentEnum() const {
@@ -6419,6 +6462,10 @@ class EnumElementDecl : public DeclContext, public ValueDecl {
64196462
bool isIndirect() const {
64206463
return getAttrs().hasAttribute<IndirectAttr>();
64216464
}
6465+
6466+
/// Do not call this!
6467+
/// It exists to let the AST walkers get the raw value without forcing a request.
6468+
LiteralExpr *getRawValueUnchecked() const { return RawValueExpr; }
64226469

64236470
static bool classof(const Decl *D) {
64246471
return D->getKind() == DeclKind::EnumElement;

trunk/include/swift/AST/DiagnosticConsumer.h

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,10 @@ enum class DiagnosticKind : uint8_t {
3838
Note
3939
};
4040

41-
/// Information about a diagnostic passed to DiagnosticConsumers.
41+
/// Extra information carried along with a diagnostic, which may or
42+
/// may not be of interest to a given diagnostic consumer.
4243
struct DiagnosticInfo {
4344
DiagID ID = DiagID(0);
44-
SourceLoc Loc;
45-
DiagnosticKind Kind;
46-
StringRef FormatString;
47-
ArrayRef<DiagnosticArgument> FormatArgs;
48-
SourceLoc BufferIndirectlyCausingDiagnostic;
49-
50-
/// DiagnosticInfo of notes which are children of this diagnostic, if any
51-
ArrayRef<DiagnosticInfo *> ChildDiagnosticInfo;
5245

5346
/// Represents a fix-it, a replacement of one range of text with another.
5447
class FixIt {
@@ -67,24 +60,6 @@ struct DiagnosticInfo {
6760

6861
/// Extra source ranges that are attached to the diagnostic.
6962
ArrayRef<FixIt> FixIts;
70-
71-
/// This is a note which has a parent error or warning
72-
bool IsChildNote = false;
73-
74-
DiagnosticInfo() {}
75-
76-
DiagnosticInfo(DiagID ID, SourceLoc Loc, DiagnosticKind Kind,
77-
StringRef FormatString,
78-
ArrayRef<DiagnosticArgument> FormatArgs,
79-
SourceLoc BufferIndirectlyCausingDiagnostic,
80-
ArrayRef<DiagnosticInfo *> ChildDiagnosticInfo,
81-
ArrayRef<CharSourceRange> Ranges, ArrayRef<FixIt> FixIts,
82-
bool IsChildNote)
83-
: ID(ID), Loc(Loc), Kind(Kind), FormatString(FormatString),
84-
FormatArgs(FormatArgs),
85-
BufferIndirectlyCausingDiagnostic(BufferIndirectlyCausingDiagnostic),
86-
ChildDiagnosticInfo(ChildDiagnosticInfo), Ranges(Ranges),
87-
FixIts(FixIts), IsChildNote(IsChildNote) {}
8863
};
8964

9065
/// Abstract interface for classes that present diagnostics to the user.

trunk/include/swift/AST/DiagnosticEngine.h

Lines changed: 2 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -337,9 +337,7 @@ namespace swift {
337337
SmallVector<DiagnosticArgument, 3> Args;
338338
SmallVector<CharSourceRange, 2> Ranges;
339339
SmallVector<FixIt, 2> FixIts;
340-
std::vector<Diagnostic> ChildNotes;
341340
SourceLoc Loc;
342-
bool IsChildNote = false;
343341
const Decl *Decl = nullptr;
344342

345343
friend DiagnosticEngine;
@@ -364,13 +362,10 @@ namespace swift {
364362
ArrayRef<DiagnosticArgument> getArgs() const { return Args; }
365363
ArrayRef<CharSourceRange> getRanges() const { return Ranges; }
366364
ArrayRef<FixIt> getFixIts() const { return FixIts; }
367-
ArrayRef<Diagnostic> getChildNotes() const { return ChildNotes; }
368-
bool isChildNote() const { return IsChildNote; }
369365
SourceLoc getLoc() const { return Loc; }
370366
const class Decl *getDecl() const { return Decl; }
371367

372368
void setLoc(SourceLoc loc) { Loc = loc; }
373-
void setIsChildNote(bool isChildNote) { IsChildNote = isChildNote; }
374369
void setDecl(const class Decl *decl) { Decl = decl; }
375370

376371
/// Returns true if this object represents a particular diagnostic.
@@ -391,8 +386,6 @@ namespace swift {
391386
void addFixIt(FixIt &&F) {
392387
FixIts.push_back(std::move(F));
393388
}
394-
395-
void addChildNote(Diagnostic &&D);
396389
};
397390

398391
/// Describes an in-flight diagnostic, which is currently active
@@ -672,8 +665,7 @@ namespace swift {
672665

673666
friend class InFlightDiagnostic;
674667
friend class DiagnosticTransaction;
675-
friend class CompoundDiagnosticTransaction;
676-
668+
677669
public:
678670
explicit DiagnosticEngine(SourceManager &SourceMgr)
679671
: SourceMgr(SourceMgr), ActiveDiagnostic(),
@@ -886,15 +878,6 @@ namespace swift {
886878
return diagnose(decl, Diagnostic(id, std::move(args)...));
887879
}
888880

889-
/// Emit a parent diagnostic and attached notes.
890-
///
891-
/// \param parentDiag An InFlightDiagnostic representing the parent diag.
892-
///
893-
/// \param builder A closure which builds and emits notes to be attached to
894-
/// the parent diag.
895-
void diagnoseWithNotes(InFlightDiagnostic parentDiag,
896-
llvm::function_ref<void(void)> builder);
897-
898881
/// \returns true if diagnostic is marked with PointsToFirstBadToken
899882
/// option.
900883
bool isDiagnosticPointsToFirstBadToken(DiagID id) const;
@@ -922,10 +905,6 @@ namespace swift {
922905
/// Retrieve the active diagnostic.
923906
Diagnostic &getActiveDiagnostic() { return *ActiveDiagnostic; }
924907

925-
/// Generate DiagnosticInfo for a Diagnostic to be passed to consumers.
926-
Optional<DiagnosticInfo>
927-
diagnosticInfoForDiagnostic(const Diagnostic &diagnostic);
928-
929908
/// Send \c diag to all diagnostic consumers.
930909
void emitDiagnostic(const Diagnostic &diag);
931910

@@ -966,7 +945,6 @@ namespace swift {
966945
/// in LIFO order. An open transaction is implicitly committed upon
967946
/// destruction.
968947
class DiagnosticTransaction {
969-
protected:
970948
DiagnosticEngine &Engine;
971949

972950
/// How many tentative diagnostics there were when the transaction
@@ -990,6 +968,7 @@ namespace swift {
990968
Depth(Engine.TransactionCount),
991969
IsOpen(true)
992970
{
971+
assert(!Engine.ActiveDiagnostic);
993972
Engine.TransactionCount++;
994973
}
995974

@@ -1032,61 +1011,6 @@ namespace swift {
10321011
"transactions must be closed LIFO");
10331012
}
10341013
};
1035-
1036-
/// Represents a diagnostic transaction which constructs a compound diagnostic
1037-
/// from any diagnostics emitted inside. A compound diagnostic consists of a
1038-
/// parent error, warning, or remark followed by a variable number of child
1039-
/// notes. The semantics are otherwise the same as a regular
1040-
/// DiagnosticTransaction.
1041-
class CompoundDiagnosticTransaction : public DiagnosticTransaction {
1042-
public:
1043-
explicit CompoundDiagnosticTransaction(DiagnosticEngine &engine)
1044-
: DiagnosticTransaction(engine) {}
1045-
1046-
~CompoundDiagnosticTransaction() {
1047-
if (IsOpen) {
1048-
commit();
1049-
}
1050-
1051-
if (Depth == 0) {
1052-
Engine.TransactionStrings.clear();
1053-
Engine.TransactionAllocator.Reset();
1054-
}
1055-
}
1056-
1057-
void commit() {
1058-
assert(PrevDiagnostics < Engine.TentativeDiagnostics.size() &&
1059-
"CompoundDiagnosticTransaction must contain at least one diag");
1060-
1061-
// The first diagnostic is assumed to be the parent. If this is not an
1062-
// error or warning, we'll assert later when trying to add children.
1063-
Diagnostic &parent = Engine.TentativeDiagnostics[PrevDiagnostics];
1064-
1065-
// Associate the children with the parent.
1066-
for (auto diag =
1067-
Engine.TentativeDiagnostics.begin() + PrevDiagnostics + 1;
1068-
diag != Engine.TentativeDiagnostics.end(); ++diag) {
1069-
diag->setIsChildNote(true);
1070-
parent.addChildNote(std::move(*diag));
1071-
}
1072-
1073-
// Erase the children, they'll be emitted alongside their parent.
1074-
Engine.TentativeDiagnostics.erase(Engine.TentativeDiagnostics.begin() +
1075-
PrevDiagnostics + 1,
1076-
Engine.TentativeDiagnostics.end());
1077-
1078-
DiagnosticTransaction::commit();
1079-
}
1080-
};
1081-
1082-
inline void
1083-
DiagnosticEngine::diagnoseWithNotes(InFlightDiagnostic parentDiag,
1084-
llvm::function_ref<void(void)> builder) {
1085-
CompoundDiagnosticTransaction transaction(*this);
1086-
parentDiag.flush();
1087-
builder();
1088-
}
1089-
10901014
} // end namespace swift
10911015

10921016
#endif

trunk/include/swift/AST/TypeCheckRequests.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,6 +1230,31 @@ class OperatorPrecedenceGroupRequest
12301230
bool isCached() const { return true; }
12311231
};
12321232

1233+
class EnumRawValuesRequest :
1234+
public SimpleRequest<EnumRawValuesRequest,
1235+
bool (EnumDecl *, TypeResolutionStage),
1236+
CacheKind::SeparatelyCached> {
1237+
public:
1238+
using SimpleRequest::SimpleRequest;
1239+
1240+
private:
1241+
friend SimpleRequest;
1242+
1243+
// Evaluation.
1244+
llvm::Expected<bool>
1245+
evaluate(Evaluator &evaluator, EnumDecl *ED, TypeResolutionStage stage) const;
1246+
1247+
public:
1248+
// Cycle handling.
1249+
void diagnoseCycle(DiagnosticEngine &diags) const;
1250+
void noteCycleStep(DiagnosticEngine &diags) const;
1251+
1252+
// Separate caching.
1253+
bool isCached() const;
1254+
Optional<bool> getCachedResult() const;
1255+
void cacheResult(bool value) const;
1256+
};
1257+
12331258
// Allow AnyValue to compare two Type values, even though Type doesn't
12341259
// support ==.
12351260
template<>

trunk/include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ SWIFT_REQUEST(TypeChecker, DefaultTypeRequest,
3636
NoLocationInfo)
3737
SWIFT_REQUEST(TypeChecker, EmittedMembersRequest, DeclRange(ClassDecl *),
3838
SeparatelyCached, NoLocationInfo)
39+
SWIFT_REQUEST(TypeChecker, EnumRawValuesRequest,
40+
bool (EnumDecl *, TypeResolutionStage), SeparatelyCached,
41+
NoLocationInfo)
3942
SWIFT_REQUEST(TypeChecker, EnumRawTypeRequest,
4043
Type(EnumDecl *, TypeResolutionStage), SeparatelyCached,
4144
NoLocationInfo)

0 commit comments

Comments
 (0)