From c90062cc76adee2f35ca0f8e395aa625b726de89 Mon Sep 17 00:00:00 2001 From: "Leandro T. C. Melo" Date: Sat, 6 Apr 2024 16:35:50 -0300 Subject: [PATCH] make TypedefDeclaration inherit from TypeDeclaration (and refactor Tag/TypeDeclaration inheritance) --- C/Fwds.h | 2 +- C/binder/Binder.cpp | 10 +++++ C/binder/Binder.h | 6 ++- C/binder/Binder_Specifiers.cpp | 19 ++++++---- C/parser/Parser_Declarations.cpp | 10 ++--- C/syntax/SyntaxDumper.h | 6 +-- C/syntax/SyntaxKind.h | 2 +- C/syntax/SyntaxNode.cpp | 4 +- C/syntax/SyntaxNode.h | 4 +- C/syntax/SyntaxNodes_Declarations.h | 57 +++++++++++++++-------------- C/syntax/SyntaxVisitor.h | 2 +- C/tests/BinderTester.h | 1 + C/tests/ParserTester_0000_0999.cpp | 6 +-- C/tests/SemanticModelTester.cpp | 8 ++-- 14 files changed, 79 insertions(+), 58 deletions(-) diff --git a/C/Fwds.h b/C/Fwds.h index 9a3c4774..4049bc7a 100644 --- a/C/Fwds.h +++ b/C/Fwds.h @@ -82,7 +82,7 @@ class TrivialSpecifierSyntax; class StorageClassSyntax; class BuiltinTypeSpecifierSyntax; class TagTypeSpecifierSyntax; -class TypeDeclarationAsSpecifierSyntax; +class TagDeclarationAsSpecifierSyntax; class AtomicTypeSpecifierSyntax; class TypeQualifierSyntax; class FunctionSpecifierSyntax; diff --git a/C/binder/Binder.cpp b/C/binder/Binder.cpp index 52c01a8b..d378c052 100644 --- a/C/binder/Binder.cpp +++ b/C/binder/Binder.cpp @@ -169,6 +169,16 @@ SyntaxVisitor::Action Binder::visitStructOrUnionDeclaration_DONE(const StructOrU return Action::Skip; } +SyntaxVisitor::Action Binder::visitTypedefDeclaration(const TypedefDeclarationSyntax* node) +{ + return visitTypedefDeclaration_AtSpecifier(node); +} + +SyntaxVisitor::Action Binder::visitTypedefDeclaration_DONE(const TypedefDeclarationSyntax* node) +{ + return Action::Skip; +} + SyntaxVisitor::Action Binder::visitEnumDeclaration(const EnumDeclarationSyntax* node) { return visitEnumDeclaration_AtSpecifier(node); diff --git a/C/binder/Binder.h b/C/binder/Binder.h index 2fe1113b..f5792026 100644 --- a/C/binder/Binder.h +++ b/C/binder/Binder.h @@ -122,6 +122,10 @@ class PSY_C_NON_API Binder final : protected SyntaxVisitor Action visitEnumDeclaration_AtSpecifier(const EnumDeclarationSyntax*); Action visitEnumDeclaration_DONE(const EnumDeclarationSyntax*); + virtual Action visitTypedefDeclaration(const TypedefDeclarationSyntax*) override; + Action visitTypedefDeclaration_AtSpecifier(const TypedefDeclarationSyntax*); + Action visitTypedefDeclaration_DONE(const TypedefDeclarationSyntax*); + template Action visitDeclaration_AtSpecifiers_COMMON( const DeclT* node, Action (Binder::*visit_AtDeclarators)(const DeclT*)); @@ -157,7 +161,7 @@ class PSY_C_NON_API Binder final : protected SyntaxVisitor /* Specifiers */ virtual Action visitBuiltinTypeSpecifier(const BuiltinTypeSpecifierSyntax*) override; virtual Action visitTagTypeSpecifier(const TagTypeSpecifierSyntax*) override; - virtual Action visitTypeDeclarationAsSpecifier(const TypeDeclarationAsSpecifierSyntax*) override; + virtual Action visitTagDeclarationAsSpecifier(const TagDeclarationAsSpecifierSyntax*) override; virtual Action visitTypedefName(const TypedefNameSyntax*) override; virtual Action visitTypeQualifier(const TypeQualifierSyntax*) override; Action visitIfNotTypeQualifier(const SpecifierSyntax*); diff --git a/C/binder/Binder_Specifiers.cpp b/C/binder/Binder_Specifiers.cpp index 2a8ad498..ba31575a 100644 --- a/C/binder/Binder_Specifiers.cpp +++ b/C/binder/Binder_Specifiers.cpp @@ -79,6 +79,11 @@ SyntaxVisitor::Action Binder::visitStructOrUnionDeclaration_AtSpecifier( &Binder::visitStructOrUnionDeclaration_DONE); } +SyntaxVisitor::Action Binder::visitTypedefDeclaration_AtSpecifier(const TypedefDeclarationSyntax* node) +{ + return Action::Quit; +} + SyntaxVisitor::Action Binder::visitEnumDeclaration_AtSpecifier(const EnumDeclarationSyntax* node) { makeSymAndPushIt(node, @@ -212,8 +217,8 @@ SyntaxVisitor::Action Binder::visitBuiltinTypeSpecifier(const BuiltinTypeSpecifi else { NamedTypeSymbol* namedTySym = tySyms_.top()->asNamedType(); ConstraintsInTypeSpecifiers::specify(node->specifierToken(), - namedTySym, - &diagReporter_); + namedTySym, + &diagReporter_); } return Action::Skip; @@ -262,11 +267,11 @@ SyntaxVisitor::Action Binder::visitTagTypeSpecifier(const TagTypeSpecifierSyntax return Action::Skip; } -SyntaxVisitor::Action Binder::visitTypeDeclarationAsSpecifier(const TypeDeclarationAsSpecifierSyntax* node) +SyntaxVisitor::Action Binder::visitTagDeclarationAsSpecifier(const TagDeclarationAsSpecifierSyntax* node) { - visit(node->typeDeclaration()); + visit(node->tagDeclaration()); - const TagTypeSpecifierSyntax* tySpec = node->typeDeclaration()->typeSpecifier(); + const TagTypeSpecifierSyntax* tySpec = node->tagDeclaration()->typeSpecifier(); TagSymbolName::TagChoice tagChoice; switch (tySpec->kind()) { case StructTypeSpecifier: @@ -303,8 +308,8 @@ SyntaxVisitor::Action Binder::visitTypeQualifier(const TypeQualifierSyntax* node PSY_ASSERT(!tySyms_.empty(), return Action::Quit); SemanticsOfTypeQualifiers::qualify(node->qualifierKeyword(), - tySyms_.top(), - &diagReporter_); + tySyms_.top(), + &diagReporter_); return Action::Skip; } diff --git a/C/parser/Parser_Declarations.cpp b/C/parser/Parser_Declarations.cpp index 92a913b3..1cc37c01 100644 --- a/C/parser/Parser_Declarations.cpp +++ b/C/parser/Parser_Declarations.cpp @@ -190,8 +190,8 @@ bool Parser::parseDeclaration( if (peek().kind() == SemicolonToken) { if (decl) { - auto tyDecl = static_cast(decl); - tyDecl->semicolonTkIdx_ = consume(); + auto tagDecl = static_cast(decl); + tagDecl->semicolonTkIdx_ = consume(); } else parseIncompleteDeclaration_AtFirst(decl, specList); @@ -199,8 +199,8 @@ bool Parser::parseDeclaration( } if (decl) { - auto tyDeclSpec = makeNode(); - tyDeclSpec->typeDecl_ = static_cast(decl); + auto tyDeclSpec = makeNode(); + tyDeclSpec->tagDecl_ = static_cast(decl); decl = nullptr; if (!specList) @@ -208,7 +208,7 @@ bool Parser::parseDeclaration( else { for (auto iter = specList; iter; iter = iter->next) { if (iter->value->asTagTypeSpecifier() - && iter->value == tyDeclSpec->typeDecl_->typeSpec_) { + && iter->value == tyDeclSpec->tagDecl_->typeSpec_) { iter->value = tyDeclSpec; break; } diff --git a/C/syntax/SyntaxDumper.h b/C/syntax/SyntaxDumper.h index 185a1cd2..69b75b2c 100644 --- a/C/syntax/SyntaxDumper.h +++ b/C/syntax/SyntaxDumper.h @@ -87,7 +87,7 @@ class PSY_C_NON_API SyntaxDumper : protected SyntaxVisitor return Action::Skip; } - void traverseTypeDeclaration(const TypeDeclarationSyntax* node) + void traverseTagDeclaration(const TagDeclarationSyntax* node) { traverseDeclaration(node); nonterminal(node->typeSpecifier()); @@ -96,13 +96,13 @@ class PSY_C_NON_API SyntaxDumper : protected SyntaxVisitor virtual Action visitStructOrUnionDeclaration(const StructOrUnionDeclarationSyntax* node) override { - traverseTypeDeclaration(node); + traverseTagDeclaration(node); return Action::Skip; } virtual Action visitEnumDeclaration(const EnumDeclarationSyntax* node) override { - traverseTypeDeclaration(node); + traverseTagDeclaration(node); return Action::Skip; } diff --git a/C/syntax/SyntaxKind.h b/C/syntax/SyntaxKind.h index 6e504bd3..344b22b2 100644 --- a/C/syntax/SyntaxKind.h +++ b/C/syntax/SyntaxKind.h @@ -344,7 +344,7 @@ enum PSY_C_API SyntaxKind : std::uint16_t EnumTypeSpecifier, AtomicTypeSpecifier, TypedefName, - TypeDeclarationAsSpecifier, + TagDeclarationAsSpecifier, ExtGNU_Typeof, ExtPSY_QuantifiedTypeSpecifier, InlineSpecifier, diff --git a/C/syntax/SyntaxNode.cpp b/C/syntax/SyntaxNode.cpp index e035c227..24df3827 100644 --- a/C/syntax/SyntaxNode.cpp +++ b/C/syntax/SyntaxNode.cpp @@ -207,8 +207,8 @@ std::string PSY_C_API to_string(SyntaxKind kind) return "EnumTypeSpecifier"; case AtomicTypeSpecifier: return "AtomicTypeSpecifier"; - case TypeDeclarationAsSpecifier: - return "TypeDeclarationAsSpecifier"; + case TagDeclarationAsSpecifier: + return "TagDeclarationAsSpecifier"; case InlineSpecifier: return "InlineSpecifier"; case NoReturnSpecifier: diff --git a/C/syntax/SyntaxNode.h b/C/syntax/SyntaxNode.h index 40ce6f6a..5712833f 100644 --- a/C/syntax/SyntaxNode.h +++ b/C/syntax/SyntaxNode.h @@ -162,10 +162,10 @@ class PSY_C_API SyntaxNode : public Managed virtual const BuiltinTypeSpecifierSyntax* asBuiltinTypeSpecifier() const { return nullptr; } virtual TagTypeSpecifierSyntax* asTagTypeSpecifier() { return nullptr; } virtual const TagTypeSpecifierSyntax* asTagTypeSpecifier() const { return nullptr; } - virtual TypeDeclarationAsSpecifierSyntax* asTypeDeclarationAsSpecifier() { return nullptr; } + virtual TagDeclarationAsSpecifierSyntax* asTagDeclarationAsSpecifier() { return nullptr; } virtual AtomicTypeSpecifierSyntax* asAtomicTypeSpecifier() { return nullptr; } virtual const AtomicTypeSpecifierSyntax* asAtomicTypeSpecifier() const { return nullptr; } - virtual const TypeDeclarationAsSpecifierSyntax* asTypeDeclarationAsSpecifier() const { return nullptr; } + virtual const TagDeclarationAsSpecifierSyntax* asTagDeclarationAsSpecifier() const { return nullptr; } virtual TypeQualifierSyntax* asTypeQualifier() { return nullptr; } virtual const TypeQualifierSyntax* asTypeQualifier() const { return nullptr; } virtual FunctionSpecifierSyntax* asFunctionSpecifier() { return nullptr; } diff --git a/C/syntax/SyntaxNodes_Declarations.h b/C/syntax/SyntaxNodes_Declarations.h index 52edfdc9..a3e4cf08 100644 --- a/C/syntax/SyntaxNodes_Declarations.h +++ b/C/syntax/SyntaxNodes_Declarations.h @@ -652,14 +652,25 @@ class PSY_C_API NamedDeclarationSyntax : public DeclarationSyntax class PSY_C_API TypeDeclarationSyntax : public NamedDeclarationSyntax { AST_NODE(TypeDeclaration, NamedDeclaration) +}; - const TagTypeSpecifierSyntax* typeSpecifier() const { return typeSpec_; } +/** + * \brief The TypedefDeclarationSyntax class. + */ +class PSY_C_API TypedefDeclarationSyntax final : public TypeDeclarationSyntax +{ + AST_NODE_1K(TypedefDeclaration, TypeDeclaration) + +public: + const SpecifierListSyntax* specifiers() const { return specs_; } + const DeclaratorListSyntax* declarators() const { return decltors_; } SyntaxToken semicolonToken() const { return tokenAtIndex(semicolonTkIdx_); } private: - TagTypeSpecifierSyntax* typeSpec_ = nullptr; + SpecifierListSyntax* specs_ = nullptr; + DeclaratorListSyntax* decltors_ = nullptr; LexedTokens::IndexType semicolonTkIdx_ = LexedTokens::invalidIndex(); - AST_CHILD_LST2(typeSpec_, semicolonTkIdx_) + AST_CHILD_LST3(specs_, decltors_, semicolonTkIdx_) }; /** @@ -676,6 +687,14 @@ class PSY_C_API TypeDeclarationSyntax : public NamedDeclarationSyntax class PSY_C_API TagDeclarationSyntax : public TypeDeclarationSyntax { AST_NODE(TagDeclaration, TypeDeclaration) + + const TagTypeSpecifierSyntax* typeSpecifier() const { return typeSpec_; } + SyntaxToken semicolonToken() const { return tokenAtIndex(semicolonTkIdx_); } + +private: + TagTypeSpecifierSyntax* typeSpec_ = nullptr; + LexedTokens::IndexType semicolonTkIdx_ = LexedTokens::invalidIndex(); + AST_CHILD_LST2(typeSpec_, semicolonTkIdx_) }; /** @@ -710,10 +729,9 @@ class PSY_C_API EnumDeclarationSyntax final : public TagDeclarationSyntax }; /** - * \brief The TypeDeclarationAsSpecifierSyntax class. + * \brief The TagDeclarationAsSpecifierSyntax class. * - * A \a type-specifier that consists of a \a declaration. Consider the - * snippet below: + * A \a type-specifier that declares a \a tag, as in the snippet below. * * \code * struct x { int y; } z; @@ -727,19 +745,18 @@ class PSY_C_API EnumDeclarationSyntax final : public TagDeclarationSyntax * * \remark 6.7.2.1-8 */ -class PSY_C_API TypeDeclarationAsSpecifierSyntax final : public SpecifierSyntax +class PSY_C_API TagDeclarationAsSpecifierSyntax final : public SpecifierSyntax { - AST_NODE_1K(TypeDeclarationAsSpecifier, Specifier) + AST_NODE_1K(TagDeclarationAsSpecifier, Specifier) public: - const TypeDeclarationSyntax* typeDeclaration() const { return typeDecl_; } + const TagDeclarationSyntax* tagDeclaration() const { return tagDecl_; } private: - TypeDeclarationSyntax* typeDecl_ = nullptr; - AST_CHILD_LST1(typeDecl_); + TagDeclarationSyntax* tagDecl_ = nullptr; + AST_CHILD_LST1(tagDecl_); }; - /** * \brief The ValueDeclarationSyntax class. * @@ -908,22 +925,6 @@ class PSY_C_API ParameterDeclarationSyntax final : public DeclaratorDeclarationS mutable ParameterSymbol* sym_ = nullptr; }; -class PSY_C_API TypedefDeclarationSyntax final : public DeclaratorDeclarationSyntax -{ - AST_NODE_1K(TypedefDeclaration, DeclaratorDeclaration) - -public: - const SpecifierListSyntax* specifiers() const { return specs_; } - const DeclaratorListSyntax* declarators() const { return decltors_; } - SyntaxToken semicolonToken() const { return tokenAtIndex(semicolonTkIdx_); } - -private: - SpecifierListSyntax* specs_ = nullptr; - DeclaratorListSyntax* decltors_ = nullptr; - LexedTokens::IndexType semicolonTkIdx_ = LexedTokens::invalidIndex(); - AST_CHILD_LST3(specs_, decltors_, semicolonTkIdx_) -}; - /** * \brief The StaticAssertDeclarationSyntax class * diff --git a/C/syntax/SyntaxVisitor.h b/C/syntax/SyntaxVisitor.h index f747c461..42643ad5 100644 --- a/C/syntax/SyntaxVisitor.h +++ b/C/syntax/SyntaxVisitor.h @@ -90,7 +90,7 @@ class PSY_C_API SyntaxVisitor virtual Action visitBuiltinTypeSpecifier(const BuiltinTypeSpecifierSyntax*) { return Action::Visit; } virtual Action visitTagTypeSpecifier(const TagTypeSpecifierSyntax*) { return Action::Visit; } virtual Action visitAtomicTypeSpecifier(const AtomicTypeSpecifierSyntax*) { return Action::Visit; } - virtual Action visitTypeDeclarationAsSpecifier(const TypeDeclarationAsSpecifierSyntax*) { return Action::Visit; } + virtual Action visitTagDeclarationAsSpecifier(const TagDeclarationAsSpecifierSyntax*) { return Action::Visit; } virtual Action visitTypedefName(const TypedefNameSyntax*) { return Action::Visit; } virtual Action visitTypeQualifier(const TypeQualifierSyntax*) { return Action::Visit; } virtual Action visitFunctionSpecifier(const FunctionSpecifierSyntax*) { return Action::Visit; } diff --git a/C/tests/BinderTester.h b/C/tests/BinderTester.h index d7ffbf5f..c93732f2 100644 --- a/C/tests/BinderTester.h +++ b/C/tests/BinderTester.h @@ -88,6 +88,7 @@ class BinderTester final : public Tester Types + 3000-0049 -> structures and unions + 3050-0099 -> enumerations (and enumerators) + + 3100-3149 -> */ void case0001(); diff --git a/C/tests/ParserTester_0000_0999.cpp b/C/tests/ParserTester_0000_0999.cpp index fa272ba6..0e5aaaab 100644 --- a/C/tests/ParserTester_0000_0999.cpp +++ b/C/tests/ParserTester_0000_0999.cpp @@ -3059,7 +3059,7 @@ void ParserTester::case0404() parse("struct { int x ; } y ;", Expectation().AST({ TranslationUnit, VariableAndOrFunctionDeclaration, - TypeDeclarationAsSpecifier, + TagDeclarationAsSpecifier, StructTypeSpecifier, FieldDeclaration, BuiltinTypeSpecifier, @@ -3072,7 +3072,7 @@ void ParserTester::case0405() parse("struct { x y ; } z;", Expectation().AST({ TranslationUnit, VariableAndOrFunctionDeclaration, - TypeDeclarationAsSpecifier, + TagDeclarationAsSpecifier, StructTypeSpecifier, FieldDeclaration, TypedefName, @@ -3398,7 +3398,7 @@ void ParserTester::case0445() StructDeclaration, StructTypeSpecifier, FieldDeclaration, - TypeDeclarationAsSpecifier, + TagDeclarationAsSpecifier, StructTypeSpecifier, FieldDeclaration, BuiltinTypeSpecifier, diff --git a/C/tests/SemanticModelTester.cpp b/C/tests/SemanticModelTester.cpp index 63f7d920..31ae6af1 100644 --- a/C/tests/SemanticModelTester.cpp +++ b/C/tests/SemanticModelTester.cpp @@ -437,7 +437,7 @@ void SemanticModelTester::case0302() PSY_EXPECT_EQ_INT(syms.size(), 1); auto spec = varAndOrFunDecl->specifiers()->value->asSpecifier(); - auto tyDecl = spec->asTypeDeclarationAsSpecifier()->typeDeclaration(); + auto tyDecl = spec->asTagDeclarationAsSpecifier()->tagDeclaration(); const NamedTypeSymbol* namedTySym = semaModel->declaredSymbol(tyDecl); PSY_EXPECT_TRUE(namedTySym); @@ -451,7 +451,7 @@ void SemanticModelTester::case0303() auto tySpec = tyDecl->typeSpecifier(); auto fldDecl0 = tySpec->declarations()->value->asFieldDeclaration(); - auto nestedTyDecl = fldDecl0->specifiers()->value->asTypeDeclarationAsSpecifier()->typeDeclaration(); + auto nestedTyDecl = fldDecl0->specifiers()->value->asTagDeclarationAsSpecifier()->tagDeclaration(); const NamedTypeSymbol* namedTySym = semaModel->declaredSymbol(nestedTyDecl); PSY_EXPECT_TRUE(namedTySym); @@ -473,11 +473,11 @@ struct x auto tySpec = tyDecl->typeSpecifier(); auto fldDecl0 = tySpec->declarations()->value->asFieldDeclaration(); - auto nestedTyDecl = fldDecl0->specifiers()->value->asTypeDeclarationAsSpecifier()->typeDeclaration(); + auto nestedTyDecl = fldDecl0->specifiers()->value->asTagDeclarationAsSpecifier()->tagDeclaration(); auto nestedTySpec = nestedTyDecl->typeSpecifier(); auto nestedFldDecl0 = nestedTySpec->declarations()->value->asFieldDeclaration(); - auto nestedNestedTyDecl = nestedFldDecl0->specifiers()->value->asTypeDeclarationAsSpecifier()->typeDeclaration(); + auto nestedNestedTyDecl = nestedFldDecl0->specifiers()->value->asTagDeclarationAsSpecifier()->tagDeclaration(); const NamedTypeSymbol* namedTySym = semaModel->declaredSymbol(nestedNestedTyDecl); PSY_EXPECT_TRUE(namedTySym);