Skip to content

Commit

Permalink
make TypedefDeclaration inherit from TypeDeclaration (and refactor Ta…
Browse files Browse the repository at this point in the history
…g/TypeDeclaration inheritance)
  • Loading branch information
ltcmelo committed Apr 6, 2024
1 parent 73dfd64 commit c90062c
Show file tree
Hide file tree
Showing 14 changed files with 79 additions and 58 deletions.
2 changes: 1 addition & 1 deletion C/Fwds.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ class TrivialSpecifierSyntax;
class StorageClassSyntax;
class BuiltinTypeSpecifierSyntax;
class TagTypeSpecifierSyntax;
class TypeDeclarationAsSpecifierSyntax;
class TagDeclarationAsSpecifierSyntax;
class AtomicTypeSpecifierSyntax;
class TypeQualifierSyntax;
class FunctionSpecifierSyntax;
Expand Down
10 changes: 10 additions & 0 deletions C/binder/Binder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 5 additions & 1 deletion C/binder/Binder.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <class DeclT> Action visitDeclaration_AtSpecifiers_COMMON(
const DeclT* node,
Action (Binder::*visit_AtDeclarators)(const DeclT*));
Expand Down Expand Up @@ -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*);
Expand Down
19 changes: 12 additions & 7 deletions C/binder/Binder_Specifiers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<NamedTypeSymbol>(node,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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;
}
10 changes: 5 additions & 5 deletions C/parser/Parser_Declarations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,25 +190,25 @@ bool Parser::parseDeclaration(

if (peek().kind() == SemicolonToken) {
if (decl) {
auto tyDecl = static_cast<TypeDeclarationSyntax*>(decl);
tyDecl->semicolonTkIdx_ = consume();
auto tagDecl = static_cast<TagDeclarationSyntax*>(decl);
tagDecl->semicolonTkIdx_ = consume();
}
else
parseIncompleteDeclaration_AtFirst(decl, specList);
return true;
}

if (decl) {
auto tyDeclSpec = makeNode<TypeDeclarationAsSpecifierSyntax>();
tyDeclSpec->typeDecl_ = static_cast<TypeDeclarationSyntax*>(decl);
auto tyDeclSpec = makeNode<TagDeclarationAsSpecifierSyntax>();
tyDeclSpec->tagDecl_ = static_cast<TagDeclarationSyntax*>(decl);
decl = nullptr;

if (!specList)
specList = makeNode<SpecifierListSyntax>(tyDeclSpec);
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;
}
Expand Down
6 changes: 3 additions & 3 deletions C/syntax/SyntaxDumper.h
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand All @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion C/syntax/SyntaxKind.h
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ enum PSY_C_API SyntaxKind : std::uint16_t
EnumTypeSpecifier,
AtomicTypeSpecifier,
TypedefName,
TypeDeclarationAsSpecifier,
TagDeclarationAsSpecifier,
ExtGNU_Typeof,
ExtPSY_QuantifiedTypeSpecifier,
InlineSpecifier,
Expand Down
4 changes: 2 additions & 2 deletions C/syntax/SyntaxNode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
4 changes: 2 additions & 2 deletions C/syntax/SyntaxNode.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
57 changes: 29 additions & 28 deletions C/syntax/SyntaxNodes_Declarations.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_)
};

/**
Expand All @@ -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_)
};

/**
Expand Down Expand Up @@ -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;
Expand All @@ -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.
*
Expand Down Expand Up @@ -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
*
Expand Down
2 changes: 1 addition & 1 deletion C/syntax/SyntaxVisitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
1 change: 1 addition & 0 deletions C/tests/BinderTester.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ class BinderTester final : public Tester
Types
+ 3000-0049 -> structures and unions
+ 3050-0099 -> enumerations (and enumerators)
+ 3100-3149 ->
*/

void case0001();
Expand Down
6 changes: 3 additions & 3 deletions C/tests/ParserTester_0000_0999.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3059,7 +3059,7 @@ void ParserTester::case0404()
parse("struct { int x ; } y ;",
Expectation().AST({ TranslationUnit,
VariableAndOrFunctionDeclaration,
TypeDeclarationAsSpecifier,
TagDeclarationAsSpecifier,
StructTypeSpecifier,
FieldDeclaration,
BuiltinTypeSpecifier,
Expand All @@ -3072,7 +3072,7 @@ void ParserTester::case0405()
parse("struct { x y ; } z;",
Expectation().AST({ TranslationUnit,
VariableAndOrFunctionDeclaration,
TypeDeclarationAsSpecifier,
TagDeclarationAsSpecifier,
StructTypeSpecifier,
FieldDeclaration,
TypedefName,
Expand Down Expand Up @@ -3398,7 +3398,7 @@ void ParserTester::case0445()
StructDeclaration,
StructTypeSpecifier,
FieldDeclaration,
TypeDeclarationAsSpecifier,
TagDeclarationAsSpecifier,
StructTypeSpecifier,
FieldDeclaration,
BuiltinTypeSpecifier,
Expand Down
8 changes: 4 additions & 4 deletions C/tests/SemanticModelTester.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit c90062c

Please sign in to comment.