@@ -594,14 +594,10 @@ class OperatorLookupDescriptor final {
594
594
using Storage = llvm::PointerUnion<FileUnit *, ModuleDecl *>;
595
595
Storage fileOrModule;
596
596
Identifier name;
597
- bool isCascading;
598
- SourceLoc diagLoc;
599
597
600
598
private:
601
- OperatorLookupDescriptor (Storage fileOrModule, Identifier name,
602
- bool isCascading, SourceLoc diagLoc)
603
- : fileOrModule(fileOrModule), name(name), isCascading(isCascading),
604
- diagLoc (diagLoc) {}
599
+ OperatorLookupDescriptor (Storage fileOrModule, Identifier name)
600
+ : fileOrModule(fileOrModule), name(name) {}
605
601
606
602
public:
607
603
// / Retrieves the files to perform lookup in.
@@ -613,66 +609,43 @@ class OperatorLookupDescriptor final {
613
609
return fileOrModule.dyn_cast <ModuleDecl *>();
614
610
}
615
611
612
+ // / Retrieve the file or module for the lookup, as a DeclContext.
613
+ DeclContext *getDC () const {
614
+ if (auto *module = getModule ())
615
+ return module ;
616
+ return fileOrModule.get <FileUnit *>();
617
+ }
618
+
616
619
friend llvm::hash_code hash_value (const OperatorLookupDescriptor &desc) {
617
- return llvm::hash_combine (desc.fileOrModule , desc.name , desc. isCascading );
620
+ return llvm::hash_combine (desc.fileOrModule , desc.name );
618
621
}
619
622
620
623
friend bool operator ==(const OperatorLookupDescriptor &lhs,
621
624
const OperatorLookupDescriptor &rhs) {
622
- return lhs.fileOrModule == rhs.fileOrModule && lhs.name == rhs.name &&
623
- lhs.isCascading == rhs.isCascading ;
625
+ return lhs.fileOrModule == rhs.fileOrModule && lhs.name == rhs.name ;
624
626
}
625
627
626
628
friend bool operator !=(const OperatorLookupDescriptor &lhs,
627
629
const OperatorLookupDescriptor &rhs) {
628
630
return !(lhs == rhs);
629
631
}
630
632
631
- static OperatorLookupDescriptor forFile (FileUnit *file, Identifier name,
632
- bool isCascading, SourceLoc diagLoc) {
633
- return OperatorLookupDescriptor (file, name, isCascading, diagLoc);
633
+ static OperatorLookupDescriptor forFile (FileUnit *file, Identifier name) {
634
+ return OperatorLookupDescriptor (file, name);
634
635
}
635
636
636
- static OperatorLookupDescriptor forModule (ModuleDecl *mod, Identifier name,
637
- bool isCascading,
638
- SourceLoc diagLoc) {
639
- return OperatorLookupDescriptor (mod, name, isCascading, diagLoc);
637
+ static OperatorLookupDescriptor forModule (ModuleDecl *mod, Identifier name) {
638
+ return OperatorLookupDescriptor (mod, name);
640
639
}
640
+
641
+ static OperatorLookupDescriptor forDC (const DeclContext *DC, Identifier name);
641
642
};
642
643
643
644
void simple_display (llvm::raw_ostream &out,
644
645
const OperatorLookupDescriptor &desc);
645
646
646
647
SourceLoc extractNearestSourceLoc (const OperatorLookupDescriptor &desc);
647
648
648
- template <typename OperatorType>
649
- class LookupOperatorRequest
650
- : public SimpleRequest<LookupOperatorRequest<OperatorType>,
651
- OperatorType *(OperatorLookupDescriptor),
652
- RequestFlags::Cached> {
653
- using SimpleRequest<LookupOperatorRequest<OperatorType>,
654
- OperatorType *(OperatorLookupDescriptor),
655
- RequestFlags::Cached>::SimpleRequest;
656
-
657
- private:
658
- friend SimpleRequest<LookupOperatorRequest<OperatorType>,
659
- OperatorType *(OperatorLookupDescriptor),
660
- RequestFlags::Cached>;
661
-
662
- // Evaluation.
663
- OperatorType *evaluate (Evaluator &evaluator,
664
- OperatorLookupDescriptor desc) const ;
665
-
666
- public:
667
- // Cached.
668
- bool isCached () const { return true ; }
669
- };
670
-
671
- using LookupPrefixOperatorRequest = LookupOperatorRequest<PrefixOperatorDecl>;
672
- using LookupInfixOperatorRequest = LookupOperatorRequest<InfixOperatorDecl>;
673
- using LookupPostfixOperatorRequest = LookupOperatorRequest<PostfixOperatorDecl>;
674
- using LookupPrecedenceGroupRequest = LookupOperatorRequest<PrecedenceGroupDecl>;
675
-
676
649
// / Looks up an operator in a given file or module without looking through
677
650
// / imports.
678
651
class DirectOperatorLookupRequest
@@ -770,6 +743,84 @@ class LookupConformanceInModuleRequest
770
743
ProtocolConformanceRef result) const ;
771
744
};
772
745
746
+ // / Look up an 'infix operator' decl by name.
747
+ class LookupInfixOperatorRequest
748
+ : public SimpleRequest<LookupInfixOperatorRequest,
749
+ TinyPtrVector<InfixOperatorDecl *>(
750
+ OperatorLookupDescriptor),
751
+ RequestFlags::Cached> {
752
+ public:
753
+ using SimpleRequest::SimpleRequest;
754
+
755
+ private:
756
+ friend SimpleRequest;
757
+
758
+ TinyPtrVector<InfixOperatorDecl *>
759
+ evaluate (Evaluator &evaluator, OperatorLookupDescriptor desc) const ;
760
+
761
+ public:
762
+ // Cached.
763
+ bool isCached () const { return true ; }
764
+ };
765
+
766
+ // / Look up an 'prefix operator' decl by name.
767
+ class LookupPrefixOperatorRequest
768
+ : public SimpleRequest<LookupPrefixOperatorRequest,
769
+ PrefixOperatorDecl *(OperatorLookupDescriptor),
770
+ RequestFlags::Cached> {
771
+ public:
772
+ using SimpleRequest::SimpleRequest;
773
+
774
+ private:
775
+ friend SimpleRequest;
776
+
777
+ PrefixOperatorDecl *evaluate (Evaluator &evaluator,
778
+ OperatorLookupDescriptor desc) const ;
779
+
780
+ public:
781
+ // Cached.
782
+ bool isCached () const { return true ; }
783
+ };
784
+
785
+ // / Look up an 'postfix operator' decl by name.
786
+ class LookupPostfixOperatorRequest
787
+ : public SimpleRequest<LookupPostfixOperatorRequest,
788
+ PostfixOperatorDecl *(OperatorLookupDescriptor),
789
+ RequestFlags::Cached> {
790
+ public:
791
+ using SimpleRequest::SimpleRequest;
792
+
793
+ private:
794
+ friend SimpleRequest;
795
+
796
+ PostfixOperatorDecl *evaluate (Evaluator &evaluator,
797
+ OperatorLookupDescriptor desc) const ;
798
+
799
+ public:
800
+ // Cached.
801
+ bool isCached () const { return true ; }
802
+ };
803
+
804
+ // / Look up a precedencegroup decl by name.
805
+ class LookupPrecedenceGroupRequest
806
+ : public SimpleRequest<LookupPrecedenceGroupRequest,
807
+ TinyPtrVector<PrecedenceGroupDecl *>(
808
+ OperatorLookupDescriptor),
809
+ RequestFlags::Cached> {
810
+ public:
811
+ using SimpleRequest::SimpleRequest;
812
+
813
+ private:
814
+ friend SimpleRequest;
815
+
816
+ TinyPtrVector<PrecedenceGroupDecl *>
817
+ evaluate (Evaluator &evaluator, OperatorLookupDescriptor descriptor) const ;
818
+
819
+ public:
820
+ // Cached.
821
+ bool isCached () const { return true ; }
822
+ };
823
+
773
824
#define SWIFT_TYPEID_ZONE NameLookup
774
825
#define SWIFT_TYPEID_HEADER " swift/AST/NameLookupTypeIDZone.def"
775
826
#include " swift/Basic/DefineTypeIDZone.h"
0 commit comments