diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-07-10 10:58:47 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-07-10 10:58:47 -0700 |
| commit | 3c92fedbb73f76f3418630069c880bdc8aedccb4 (patch) | |
| tree | e220ec5f54e5a5970a2307a87891a301d35f1546 /source/slang/emit.cpp | |
| parent | 8abdf2dddd10feb9794c86cdf6b2159a2b6383e4 (diff) | |
| parent | d6d49eac224a0d03c8f941deb59ee1520ff0ab5e (diff) | |
Merge pull request #66 from tfoleyNV/falcor-work
Falcor work
Diffstat (limited to 'source/slang/emit.cpp')
| -rw-r--r-- | source/slang/emit.cpp | 61 |
1 files changed, 54 insertions, 7 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index 155e1e39a..2791a436e 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -776,6 +776,7 @@ struct EmitVisitor case TextureType::Shape2D: Emit("2D"); break; case TextureType::Shape3D: Emit("3D"); break; case TextureType::ShapeCube: Emit("Cube"); break; + case TextureType::ShapeBuffer: Emit("Buffer"); break; default: assert(!"unreachable"); break; @@ -1084,18 +1085,56 @@ struct EmitVisitor emitTypeImpl(type, nullptr); } + void emitTypeBasedOnExpr(ExpressionSyntaxNode* expr, EDeclarator* declarator) + { + if (auto subscriptExpr = dynamic_cast<IndexExpressionSyntaxNode*>(expr)) + { + // Looks like an array + emitTypeBasedOnExpr(subscriptExpr->BaseExpression, declarator); + Emit("["); + if (auto indexExpr = subscriptExpr->IndexExpression) + { + EmitExpr(indexExpr); + } + Emit("]"); + } + else + { + // Default case + EmitExpr(expr); + EmitDeclarator(declarator); + } + } + + void EmitType(TypeExp const& typeExp, String const& name, CodePosition const& nameLoc) + { + if (!typeExp.type || typeExp.type->As<ErrorType>()) + { + assert(typeExp.exp); + + EDeclarator nameDeclarator; + nameDeclarator.flavor = EDeclarator::Flavor::Name; + nameDeclarator.name = name; + nameDeclarator.loc = nameLoc; + + emitTypeBasedOnExpr(typeExp.exp, &nameDeclarator); + } + else + { + EmitType(typeExp.type, + typeExp.exp ? typeExp.exp->Position : CodePosition(), + name, nameLoc); + } + } + void EmitType(TypeExp const& typeExp, Token const& nameToken) { - EmitType(typeExp.type, - typeExp.exp ? typeExp.exp->Position : CodePosition(), - nameToken.Content, nameToken.Position); + EmitType(typeExp, nameToken.Content, nameToken.Position); } void EmitType(TypeExp const& typeExp, String const& name) { - EmitType(typeExp.type, - typeExp.exp ? typeExp.exp->Position : CodePosition(), - name, CodePosition()); + EmitType(typeExp, name, CodePosition()); } void emitTypeExp(TypeExp const& typeExp) @@ -2758,7 +2797,15 @@ struct EmitVisitor { EmitModifiers(declRef.getDecl()); - EmitType(GetType(declRef), declRef.getDecl()->getNameToken()); + auto type = GetType(declRef); + if (!type || type->As<ErrorType>()) + { + EmitType(declRef.getDecl()->Type, declRef.getDecl()->getNameToken()); + } + else + { + EmitType(GetType(declRef), declRef.getDecl()->getNameToken()); + } EmitSemantics(declRef.getDecl()); |
