From: Daniel Grumberg Date: Wed, 14 Dec 2022 12:12:26 +0000 (+0000) Subject: [clang][ExtractAPI] Fix naming of typedef'd anonymous enums X-Git-Tag: upstream/17.0.6~23581 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8dcb629aa4ccfdd18fb700cabb45fd74fcd291c8;p=platform%2Fupstream%2Fllvm.git [clang][ExtractAPI] Fix naming of typedef'd anonymous enums Anonymous enums that are typedef'd should take on the name of the typedef. Differential Revision: https://reviews.llvm.org/D140010 --- diff --git a/clang/lib/ExtractAPI/ExtractAPIVisitor.cpp b/clang/lib/ExtractAPI/ExtractAPIVisitor.cpp index 38d95aa..24260cf 100644 --- a/clang/lib/ExtractAPI/ExtractAPIVisitor.cpp +++ b/clang/lib/ExtractAPI/ExtractAPIVisitor.cpp @@ -29,6 +29,7 @@ #include "clang/ExtractAPI/DeclarationFragments.h" #include "clang/Frontend/ASTConsumers.h" #include "clang/Frontend/FrontendOptions.h" +#include "llvm/Support/raw_ostream.h" using namespace clang; using namespace extractapi; @@ -167,11 +168,16 @@ bool ExtractAPIVisitor::VisitEnumDecl(const EnumDecl *Decl) { if (!LocationChecker(Decl->getLocation())) return true; + SmallString<128> QualifiedNameBuffer; // Collect symbol information. - std::string NameString = Decl->getQualifiedNameAsString(); - StringRef Name(NameString); + StringRef Name = Decl->getName(); if (Name.empty()) Name = getTypedefName(Decl); + if (Name.empty()) { + llvm::raw_svector_ostream OS(QualifiedNameBuffer); + Decl->printQualifiedName(OS); + Name = QualifiedNameBuffer.str(); + } StringRef USR = API.recordUSR(Decl); PresumedLoc Loc = diff --git a/clang/test/ExtractAPI/typedef_anonymous_record.c b/clang/test/ExtractAPI/typedef_anonymous_record.c index e3e3476..1bd93b9 100644 --- a/clang/test/ExtractAPI/typedef_anonymous_record.c +++ b/clang/test/ExtractAPI/typedef_anonymous_record.c @@ -2,21 +2,22 @@ // RUN: split-file %s %t // RUN: sed -e "s@INPUT_DIR@%{/t:regex_replacement}@g" \ // RUN: %t/reference.output.json.in >> %t/reference.output.json -// RUN: %clang -extract-api --product-name=TypedefChain -target arm64-apple-macosx \ -// RUN: -x objective-c-header %t/input.h -o %t/output.json | FileCheck -allow-empty %s +// RUN: %clang_cc1 -extract-api --product-name=TypedefChain -triple arm64-apple-macosx \ +// RUN: -x c-header %t/input.h -o %t/output.json -verify // Generator version is not consistent across test runs, normalize it. // RUN: sed -e "s@\"generator\": \".*\"@\"generator\": \"?\"@g" \ // RUN: %t/output.json >> %t/output-normalized.json // RUN: diff %t/reference.output.json %t/output-normalized.json -// CHECK-NOT: error: -// CHECK-NOT: warning: - //--- input.h typedef struct { } MyStruct; typedef MyStruct MyStructStruct; typedef MyStructStruct MyStructStructStruct; +typedef enum { Case } MyEnum; +typedef MyEnum MyEnumEnum; +typedef MyEnumEnum MyEnumEnumEnum; +// expected-no-diagnostics //--- reference.output.json.in { @@ -43,7 +44,14 @@ typedef MyStructStruct MyStructStructStruct; "vendor": "apple" } }, - "relationships": [], + "relationships": [ + { + "kind": "memberOf", + "source": "c:@EA@MyEnum@Case", + "target": "c:@EA@MyEnum", + "targetFallback": "MyEnum" + } + ], "symbols": [ { "accessLevel": "public", @@ -58,6 +66,101 @@ typedef MyStructStruct MyStructStructStruct; }, { "kind": "keyword", + "spelling": "enum" + }, + { + "kind": "text", + "spelling": " " + }, + { + "kind": "identifier", + "spelling": "MyEnum" + } + ], + "identifier": { + "interfaceLanguage": "c", + "precise": "c:@EA@MyEnum" + }, + "kind": { + "displayName": "Enumeration", + "identifier": "c.enum" + }, + "location": { + "position": { + "character": 9, + "line": 4 + }, + "uri": "file://INPUT_DIR/input.h" + }, + "names": { + "navigator": [ + { + "kind": "identifier", + "spelling": "MyEnum" + } + ], + "title": "MyEnum" + }, + "pathComponents": [ + "MyEnum" + ] + }, + { + "accessLevel": "public", + "declarationFragments": [ + { + "kind": "identifier", + "spelling": "Case" + } + ], + "identifier": { + "interfaceLanguage": "c", + "precise": "c:@EA@MyEnum@Case" + }, + "kind": { + "displayName": "Enumeration Case", + "identifier": "c.enum.case" + }, + "location": { + "position": { + "character": 16, + "line": 4 + }, + "uri": "file://INPUT_DIR/input.h" + }, + "names": { + "navigator": [ + { + "kind": "identifier", + "spelling": "Case" + } + ], + "subHeading": [ + { + "kind": "identifier", + "spelling": "Case" + } + ], + "title": "Case" + }, + "pathComponents": [ + "MyEnum", + "Case" + ] + }, + { + "accessLevel": "public", + "declarationFragments": [ + { + "kind": "keyword", + "spelling": "typedef" + }, + { + "kind": "text", + "spelling": " " + }, + { + "kind": "keyword", "spelling": "struct" }, { @@ -70,12 +173,12 @@ typedef MyStructStruct MyStructStructStruct; } ], "identifier": { - "interfaceLanguage": "objective-c", + "interfaceLanguage": "c", "precise": "c:@SA@MyStruct" }, "kind": { "displayName": "Structure", - "identifier": "objective-c.struct" + "identifier": "c.struct" }, "location": { "position": { @@ -123,12 +226,12 @@ typedef MyStructStruct MyStructStructStruct; } ], "identifier": { - "interfaceLanguage": "objective-c", + "interfaceLanguage": "c", "precise": "c:input.h@T@MyStructStruct" }, "kind": { "displayName": "Type Alias", - "identifier": "objective-c.typealias" + "identifier": "c.typealias" }, "location": { "position": { @@ -183,12 +286,12 @@ typedef MyStructStruct MyStructStructStruct; } ], "identifier": { - "interfaceLanguage": "objective-c", + "interfaceLanguage": "c", "precise": "c:input.h@T@MyStructStructStruct" }, "kind": { "displayName": "Type Alias", - "identifier": "objective-c.typealias" + "identifier": "c.typealias" }, "location": { "position": { @@ -216,6 +319,126 @@ typedef MyStructStruct MyStructStructStruct; "MyStructStructStruct" ], "type": "c:input.h@T@MyStructStruct" + }, + { + "accessLevel": "public", + "declarationFragments": [ + { + "kind": "keyword", + "spelling": "typedef" + }, + { + "kind": "text", + "spelling": " " + }, + { + "kind": "typeIdentifier", + "preciseIdentifier": "c:@EA@MyEnum", + "spelling": "MyEnum" + }, + { + "kind": "text", + "spelling": " " + }, + { + "kind": "identifier", + "spelling": "MyEnumEnum" + } + ], + "identifier": { + "interfaceLanguage": "c", + "precise": "c:input.h@T@MyEnumEnum" + }, + "kind": { + "displayName": "Type Alias", + "identifier": "c.typealias" + }, + "location": { + "position": { + "character": 16, + "line": 5 + }, + "uri": "file://INPUT_DIR/input.h" + }, + "names": { + "navigator": [ + { + "kind": "identifier", + "spelling": "MyEnumEnum" + } + ], + "subHeading": [ + { + "kind": "identifier", + "spelling": "MyEnumEnum" + } + ], + "title": "MyEnumEnum" + }, + "pathComponents": [ + "MyEnumEnum" + ], + "type": "c:@EA@MyEnum" + }, + { + "accessLevel": "public", + "declarationFragments": [ + { + "kind": "keyword", + "spelling": "typedef" + }, + { + "kind": "text", + "spelling": " " + }, + { + "kind": "typeIdentifier", + "preciseIdentifier": "c:input.h@T@MyEnumEnum", + "spelling": "MyEnumEnum" + }, + { + "kind": "text", + "spelling": " " + }, + { + "kind": "identifier", + "spelling": "MyEnumEnumEnum" + } + ], + "identifier": { + "interfaceLanguage": "c", + "precise": "c:input.h@T@MyEnumEnumEnum" + }, + "kind": { + "displayName": "Type Alias", + "identifier": "c.typealias" + }, + "location": { + "position": { + "character": 20, + "line": 6 + }, + "uri": "file://INPUT_DIR/input.h" + }, + "names": { + "navigator": [ + { + "kind": "identifier", + "spelling": "MyEnumEnumEnum" + } + ], + "subHeading": [ + { + "kind": "identifier", + "spelling": "MyEnumEnumEnum" + } + ], + "title": "MyEnumEnumEnum" + }, + "pathComponents": [ + "MyEnumEnumEnum" + ], + "type": "c:input.h@T@MyEnumEnum" } ] }