зеркало из https://github.com/microsoft/clang-1.git
Implement AST import for C++ member functions, including constructors, destructors, and conversions. Unfortunately, this cannot be tested yet, since we don't have C++ PCH support.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96741 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
788c62d1e8
Коммит
c144f3534e
|
@ -91,6 +91,10 @@ namespace {
|
|||
Decl *VisitRecordDecl(RecordDecl *D);
|
||||
Decl *VisitEnumConstantDecl(EnumConstantDecl *D);
|
||||
Decl *VisitFunctionDecl(FunctionDecl *D);
|
||||
Decl *VisitCXXMethodDecl(CXXMethodDecl *D);
|
||||
Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D);
|
||||
Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D);
|
||||
Decl *VisitCXXConversionDecl(CXXConversionDecl *D);
|
||||
Decl *VisitFieldDecl(FieldDecl *D);
|
||||
Decl *VisitObjCIvarDecl(ObjCIvarDecl *D);
|
||||
Decl *VisitVarDecl(VarDecl *D);
|
||||
|
@ -1855,11 +1859,33 @@ Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
|
|||
|
||||
// Create the imported function.
|
||||
TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
|
||||
FunctionDecl *ToFunction
|
||||
= FunctionDecl::Create(Importer.getToContext(), DC, Loc,
|
||||
Name, T, TInfo, D->getStorageClass(),
|
||||
D->isInlineSpecified(),
|
||||
D->hasWrittenPrototype());
|
||||
FunctionDecl *ToFunction = 0;
|
||||
if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
|
||||
ToFunction = CXXConstructorDecl::Create(Importer.getToContext(),
|
||||
cast<CXXRecordDecl>(DC),
|
||||
Loc, Name, T, TInfo,
|
||||
FromConstructor->isExplicit(),
|
||||
D->isInlineSpecified(),
|
||||
D->isImplicit());
|
||||
} else if (isa<CXXDestructorDecl>(D)) {
|
||||
ToFunction = CXXDestructorDecl::Create(Importer.getToContext(),
|
||||
cast<CXXRecordDecl>(DC),
|
||||
Loc, Name, T,
|
||||
D->isInlineSpecified(),
|
||||
D->isImplicit());
|
||||
} else if (CXXConversionDecl *FromConversion
|
||||
= dyn_cast<CXXConversionDecl>(D)) {
|
||||
ToFunction = CXXConversionDecl::Create(Importer.getToContext(),
|
||||
cast<CXXRecordDecl>(DC),
|
||||
Loc, Name, T, TInfo,
|
||||
D->isInlineSpecified(),
|
||||
FromConversion->isExplicit());
|
||||
} else {
|
||||
ToFunction = FunctionDecl::Create(Importer.getToContext(), DC, Loc,
|
||||
Name, T, TInfo, D->getStorageClass(),
|
||||
D->isInlineSpecified(),
|
||||
D->hasWrittenPrototype());
|
||||
}
|
||||
ToFunction->setLexicalDeclContext(LexicalDC);
|
||||
Importer.Imported(D, ToFunction);
|
||||
LexicalDC->addDecl(ToFunction);
|
||||
|
@ -1876,6 +1902,22 @@ Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
|
|||
return ToFunction;
|
||||
}
|
||||
|
||||
Decl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
|
||||
return VisitFunctionDecl(D);
|
||||
}
|
||||
|
||||
Decl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
|
||||
return VisitCXXMethodDecl(D);
|
||||
}
|
||||
|
||||
Decl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
|
||||
return VisitCXXMethodDecl(D);
|
||||
}
|
||||
|
||||
Decl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
|
||||
return VisitCXXMethodDecl(D);
|
||||
}
|
||||
|
||||
Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
|
||||
// Import the major distinguishing characteristics of a variable.
|
||||
DeclContext *DC, *LexicalDC;
|
||||
|
|
Загрузка…
Ссылка в новой задаче