diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2021-03-02 15:46:28 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-02 15:46:28 -0800 |
| commit | d6ae67160c33460bf952c9959077dc481a16eca2 (patch) | |
| tree | 526a5b21eb2cd0d873fc0fd94cfd0d52ed9911ec /source/slang/slang-emit-c-like.cpp | |
| parent | c2653ba1ec8f06453f0653d141bcd348eff5d4a5 (diff) | |
Clean up declarator handling during source emit (#1732)
This change tidies up some code related to the handling of declarators for the purpose of "unparsing" types into C-like declarations. The big change is that the `EDeclarator` type is changed to `DeclaratorInfo` and now has a bit of a subtype hierarchy under it rather than just using a `union`. The declarations have been moved to the header for CLikeSourceEmitter` so that they can be used by subclasses.
I also removed the `IRDeclaratorInfo` type that was being declared but never actually used, and moved the case for pointers from that type into the main `EDeclarator`/`DeclaratorInfo`.
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
| -rw-r--r-- | source/slang/slang-emit-c-like.cpp | 132 |
1 files changed, 40 insertions, 92 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index 8e106fe55..522e5ef12 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -31,45 +31,6 @@ namespace Slang { -// represents a declarator for use in emitting types -struct CLikeSourceEmitter::EDeclarator -{ - enum class Flavor - { - Name, - Array, - UnsizedArray, - }; - Flavor flavor; - EDeclarator* next = nullptr; - - // Used for `Flavor::name` - const StringSliceLoc* nameAndLoc; - - // Used for `Flavor::Array` - IRInst* elementCount; -}; - -struct CLikeSourceEmitter::IRDeclaratorInfo -{ - enum class Flavor - { - Simple, - Ptr, - Array, - }; - - Flavor flavor; - IRDeclaratorInfo* next; - union - { - String const* name; - IRInst* elementCount; - }; -}; - - - struct CLikeSourceEmitter::ComputeEmitActionsContext { IRInst* moduleInst; @@ -148,7 +109,7 @@ SlangResult CLikeSourceEmitter::init() // Types // -void CLikeSourceEmitter::emitDeclarator(EDeclarator* declarator) +void CLikeSourceEmitter::emitDeclarator(DeclaratorInfo* declarator) { if (!declarator) return; @@ -156,23 +117,45 @@ void CLikeSourceEmitter::emitDeclarator(EDeclarator* declarator) switch (declarator->flavor) { - case EDeclarator::Flavor::Name: - m_writer->emitName(*declarator->nameAndLoc); + case DeclaratorInfo::Flavor::Name: + { + auto nameDeclarator = (NameDeclaratorInfo*)declarator; + m_writer->emitName(*nameDeclarator->nameAndLoc); + } break; - case EDeclarator::Flavor::Array: - emitDeclarator(declarator->next); - m_writer->emit("["); - if(auto elementCount = declarator->elementCount) + case DeclaratorInfo::Flavor::SizedArray: { - emitVal(elementCount, getInfo(EmitOp::General)); + auto arrayDeclarator = (SizedArrayDeclaratorInfo*)declarator; + emitDeclarator(arrayDeclarator->next); + m_writer->emit("["); + if(auto elementCount = arrayDeclarator->elementCount) + { + emitVal(elementCount, getInfo(EmitOp::General)); + } + m_writer->emit("]"); + } + break; + + case DeclaratorInfo::Flavor::UnsizedArray: + { + auto arrayDeclarator = (UnsizedArrayDeclaratorInfo*)declarator; + emitDeclarator(arrayDeclarator->next); + m_writer->emit("[]"); } - m_writer->emit("]"); break; - case EDeclarator::Flavor::UnsizedArray: - emitDeclarator(declarator->next); - m_writer->emit("[]"); + case DeclaratorInfo::Flavor::Ptr: + { + // TODO: When there are both pointer and array declarators + // as part of a type, paranetheses may be needed in order + // to disambiguate between a pointer-to-array and an + // array-of-poiners. + // + auto ptrDeclarator = (PtrDeclaratorInfo*)declarator; + m_writer->emit("*"); + emitDeclarator(ptrDeclarator->next); + } break; default: @@ -253,26 +236,19 @@ List<IRWitnessTableEntry*> CLikeSourceEmitter::getSortedWitnessTableEntries(IRWi return sortedWitnessTableEntries; } -void CLikeSourceEmitter::_emitArrayType(IRArrayType* arrayType, EDeclarator* declarator) +void CLikeSourceEmitter::_emitArrayType(IRArrayType* arrayType, DeclaratorInfo* declarator) { - EDeclarator arrayDeclarator; - arrayDeclarator.flavor = EDeclarator::Flavor::Array; - arrayDeclarator.next = declarator; - arrayDeclarator.elementCount = arrayType->getElementCount(); - + SizedArrayDeclaratorInfo arrayDeclarator(declarator, arrayType->getElementCount()); _emitType(arrayType->getElementType(), &arrayDeclarator); } -void CLikeSourceEmitter::_emitUnsizedArrayType(IRUnsizedArrayType* arrayType, EDeclarator* declarator) +void CLikeSourceEmitter::_emitUnsizedArrayType(IRUnsizedArrayType* arrayType, DeclaratorInfo* declarator) { - EDeclarator arrayDeclarator; - arrayDeclarator.flavor = EDeclarator::Flavor::UnsizedArray; - arrayDeclarator.next = declarator; - + UnsizedArrayDeclaratorInfo arrayDeclarator(declarator); _emitType(arrayType->getElementType(), &arrayDeclarator); } -void CLikeSourceEmitter::_emitType(IRType* type, EDeclarator* declarator) +void CLikeSourceEmitter::_emitType(IRType* type, DeclaratorInfo* declarator) { switch (type->getOp()) { @@ -327,9 +303,7 @@ void CLikeSourceEmitter::emitTypeImpl(IRType* type, const StringSliceLoc* nameAn // be done so before the type name appears. m_writer->advanceToSourceLocationIfValid(nameAndLoc->loc); - EDeclarator nameDeclarator; - nameDeclarator.flavor = EDeclarator::Flavor::Name; - nameDeclarator.nameAndLoc = nameAndLoc; + NameDeclaratorInfo nameDeclarator(nameAndLoc); _emitType(type, &nameDeclarator); } else @@ -777,32 +751,6 @@ String CLikeSourceEmitter::getName(IRInst* inst) return name; } -void CLikeSourceEmitter::emitDeclarator(IRDeclaratorInfo* declarator) -{ - if(!declarator) - return; - - switch( declarator->flavor ) - { - case IRDeclaratorInfo::Flavor::Simple: - m_writer->emit(" "); - m_writer->emit(*declarator->name); - break; - - case IRDeclaratorInfo::Flavor::Ptr: - m_writer->emit("*"); - emitDeclarator(declarator->next); - break; - - case IRDeclaratorInfo::Flavor::Array: - emitDeclarator(declarator->next); - m_writer->emit("["); - emitOperand(declarator->elementCount, getInfo(EmitOp::General)); - m_writer->emit("]"); - break; - } -} - void CLikeSourceEmitter::emitSimpleValueImpl(IRInst* inst) { switch(inst->getOp()) |
