@@ -6423,6 +6423,17 @@ static void appendQualType(llvm::FoldingSetNodeID &ID, const QualType &Ty)
64236423 ID .AddInteger (Ty.getQualifiers ().getAsOpaqueValue ());
64246424}
64256425
6426+ static void appendSourceLocation (llvm::FoldingSetNodeID &ID , const SourceLocation& Loc)
6427+ {
6428+ ID .AddInteger (Loc.getHashValue ());
6429+ }
6430+
6431+ static void appendSourceRange (llvm::FoldingSetNodeID &ID , const SourceRange& Range)
6432+ {
6433+ appendSourceLocation (ID , Range.getBegin ());
6434+ appendSourceLocation (ID , Range.getEnd ());
6435+ }
6436+
64266437bool reflection_hash (APValue &Result, ASTContext &C, MetaActions &Meta,
64276438 EvalFn Evaluator, DiagFn Diagnoser, bool AllowInjection,
64286439 QualType ResultTy, SourceRange Range, ArrayRef<Expr *> Args,
@@ -6435,81 +6446,35 @@ bool reflection_hash(APValue &Result, ASTContext &C, MetaActions &Meta,
64356446 return true ;
64366447 }
64376448
6438- // TODO(Matt): find difference between isReflectionType() and C.MetaInfoTy
6439- // assert(ResultTy == C.MetaInfoTy);
6440-
64416449 llvm::FoldingSetNodeID ID ;
6450+ ID .AddInteger (static_cast <std::size_t >(R.getReflectionKind ()));
64426451
6443- std::size_t seed = 0 ; // to distinguish hashes of different kinds
64446452 switch (R.getReflectionKind ()) {
64456453 case ReflectionKind::Null: { // DONE
6446- seed = 0 ;
6454+ ID . AddInteger ( 0 ) ;
64476455 } break ;
64486456 case ReflectionKind::Type: { // DONE
6449- appendQualType (ID , R.getReflectedType ());
6450- seed = 1 ;
6457+ appendQualType (ID , R.getReflectedType ());
64516458 } break ;
6452- case ReflectionKind::Declaration: { // TODO
6453- seed = 2 ;
6454- ValueDecl *D = RV .getReflectedDecl ();
6455-
6456- switch (D->getDeclName ().getNameKind ()) {
6457- case DeclarationName::CXXConstructorName: {} break ;
6458- case DeclarationName::CXXDestructorName: {} break ;
6459- case DeclarationName::CXXConversionFunctionName: {} break ;
6460- case DeclarationName::CXXOperatorName: {} break ;
6461- case DeclarationName::CXXLiteralOperatorName: {} break ;
6462- default :
6463- if (auto *FD = dyn_cast<FieldDecl>(D)) {
6464- if (FD ->isUnnamedBitField ()) {}
6465- else if (FD ->isBitField ()) {}
6466- else { // non-static data member
6467- }
6468- }
6469- else if (isa<ParmVarDecl>(D)) {}
6470- else if (isa<VarDecl>(D)) {}
6471- else if (isa<BindingDecl>(D)) {}
6472- else if (isa<FunctionDecl>(D)) {}
6473- else if (isa<EnumConstantDecl>(D)) {}
6474- }
6475- llvm_unreachable (" unhandled declaration kind" );
6459+ case ReflectionKind::Declaration: { // DONE
6460+ appendSourceRange (ID , R.getReflectedDecl ()->getSourceRange ());
64766461 } break ;
64776462 case ReflectionKind::Object: { // TODO
6478- seed = 3 ;
6463+ llvm_unreachable ( " TODO - Object not yet hashable " ) ;
64796464 } break ;
6480- case ReflectionKind::Value: { // TODO
6481- seed = 4 ;
6482- APValue val = R.getReflectedValue ();
6483- val.Profile (ID );
6465+ case ReflectionKind::Value: { // DONE
6466+ R.getReflectedValue ().Profile (ID );
64846467 break ; }
6485- case ReflectionKind::Template: { // TODO
6486- seed = 5 ;
6468+ case ReflectionKind::Template: { // DONE
6469+ appendSourceRange ( ID , R. getReflectedTemplate (). getAsTemplateDecl ()-> getSourceRange ()) ;
64876470 } break ;
64886471 case ReflectionKind::Namespace: { // DONE
6489- seed = 6 ;
6490- Decl* D = R.getReflectedNamespace ();
6491- if (isa<TranslationUnitDecl>(D)) { // global namespace
6492- ID .AddInteger (0 ); // nothing else to do
6493- }
6494- else if (isa<NamespaceDecl>(D)) {
6495- NamespaceDecl* ND = dyn_cast<NamespaceDecl>(D);
6496- SourceLocation loc = ND ->getBeginLoc ();
6497- ID .AddInteger (loc.getHashValue ());
6498- }
6499- else if (isa<NamespaceAliasDecl>(D)) {
6500- NamespaceAliasDecl* ND = dyn_cast<NamespaceAliasDecl>(D);
6501- SourceLocation loc = ND ->getAliasLoc ();
6502- ID .AddInteger (loc.getHashValue ());
6503- }
6504- else {
6505- llvm_unreachable (" unhandled namespace kind" );
6506- }
6472+ appendSourceRange (ID , R.getReflectedNamespace ()->getSourceRange ());
65076473 } break ;
6508- case ReflectionKind::BaseSpecifier: { // TODO
6509- seed = 7 ;
6474+ case ReflectionKind::BaseSpecifier: { // DONE
6475+ appendSourceRange ( ID , R. getReflectedBaseSpecifier ()-> getSourceRange ());
65106476 } break ;
65116477 case ReflectionKind::DataMemberSpec: { // DONE
6512- seed = 8 ;
65136478 TagDataMemberSpec *TDMS = R.getReflectedDataMemberSpec ();
65146479 appendQualType (ID , TDMS ->Ty );
65156480 if (TDMS ->Name ) {
@@ -6523,13 +6488,13 @@ bool reflection_hash(APValue &Result, ASTContext &C, MetaActions &Meta,
65236488 }
65246489 ID .AddInteger (TDMS ->NoUniqueAddress );
65256490 } break ;
6526- case ReflectionKind::Annotation: { // TODO
6527- seed = 9 ;
6491+ case ReflectionKind::Annotation: { // DONE
6492+ appendSourceLocation ( ID , R. getReflectedAnnotation ()-> getEqLoc ());
65286493 } break ;
65296494 default :
65306495 llvm_unreachable (" unknown reflection kind" );
65316496 }
6532- ID . AddInteger (seed);
6497+
65336498 return SetAndSucceed (
65346499 Result,
65356500 APValue (C.MakeIntValue (ID .computeStableHash (), C.getSizeType ())));
0 commit comments