diff options
| author | Yong He <yonghe@google.com> | 2019-01-29 11:41:54 -0800 |
|---|---|---|
| committer | Yong He <yonghe@google.com> | 2019-01-29 11:41:54 -0800 |
| commit | b7f8f7abcc3cc1dfa820ebba47a772b78d6a4cfb (patch) | |
| tree | 26d81dec1162ee9d26b811f0b7621e74ade9e06f /tools | |
| parent | f8b8ea0055ad877551198e1e295d33860b504672 (diff) | |
Add support for user defined attributes.
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/slang-reflection-test/slang-reflection-test-main.cpp | 96 |
1 files changed, 92 insertions, 4 deletions
diff --git a/tools/slang-reflection-test/slang-reflection-test-main.cpp b/tools/slang-reflection-test/slang-reflection-test-main.cpp index 209528927..636b16a1b 100644 --- a/tools/slang-reflection-test/slang-reflection-test-main.cpp +++ b/tools/slang-reflection-test/slang-reflection-test-main.cpp @@ -55,7 +55,7 @@ static void dedent(PrettyWriter& writer) writer.indent--; } -static void write(PrettyWriter& writer, char const* text) +static void write(PrettyWriter& writer, char const* text, size_t length = 0) { // TODO: can do this more efficiently... char const* cursor = text; @@ -63,7 +63,7 @@ static void write(PrettyWriter& writer, char const* text) { char c = *cursor++; if (!c) break; - + if (length && cursor - text == length) break; if (c == '\n') { writer.startOfLine = true; @@ -83,6 +83,18 @@ static void write(PrettyWriter& writer, SlangUInt val) Slang::StdWriters::getOut().print("%llu", (unsigned long long)val); } +static void write(PrettyWriter& writer, int val) +{ + adjust(writer); + Slang::StdWriters::getOut().print("%d", val); +} + +static void write(PrettyWriter& writer, float val) +{ + adjust(writer); + Slang::StdWriters::getOut().print("%f", val); +} + static void emitReflectionVarInfoJSON(PrettyWriter& writer, slang::VariableReflection* var); static void emitReflectionTypeLayoutJSON(PrettyWriter& writer, slang::TypeLayoutReflection* type); static void emitReflectionTypeJSON(PrettyWriter& writer, slang::TypeReflection* type); @@ -261,6 +273,76 @@ static void emitReflectionModifierInfoJSON( } } +static void emitUserAttributeJSON(PrettyWriter& writer, slang::UserAttribute* userAttribute) +{ + write(writer, "{\n"); + indent(writer); + write(writer, "\"name\": \""); + write(writer, userAttribute->getName()); + write(writer, "\",\n"); + write(writer, "\"arguments\": [\n"); + indent(writer); + for (unsigned int i = 0; i < userAttribute->getArgumentCount(); i++) + { + int intVal; + float floatVal; + size_t bufSize = 0; + if (i > 0) + write(writer, ",\n"); + if (SLANG_SUCCEEDED(userAttribute->getArgumentValueInt(i, &intVal))) + { + write(writer, intVal); + } + else if (SLANG_SUCCEEDED(userAttribute->getArgumentValueFloat(i, &floatVal))) + { + write(writer, floatVal); + } + else if (auto str = userAttribute->getArgumentValueString(i, &bufSize)) + { + write(writer, str, bufSize); + } + else + write(writer, "\"invalid value\""); + } + dedent(writer); + write(writer, "\n]\n"); + dedent(writer); + write(writer, "}\n"); +} + +static void emitUserAttributes(PrettyWriter& writer, slang::TypeReflection* type) +{ + auto attribCount = type->getUserAttributeCount(); + if (attribCount) + { + write(writer, ",\n\"userAttribs\": ["); + for (unsigned int i = 0; i < attribCount; i++) + { + if (i > 0) + write(writer, ",\n"); + auto attrib = type->getUserAttributeByIndex(i); + emitUserAttributeJSON(writer, attrib); + } + write(writer, "]"); + } +} +static void emitUserAttributes(PrettyWriter& writer, slang::VariableReflection* var) +{ + auto attribCount = var->getUserAttributeCount(); + if (attribCount) + { + write(writer, ",\n\"userAttribs\": ["); + for (unsigned int i = 0; i < attribCount; i++) + { + if (i > 0) + write(writer, ",\n"); + auto attrib = var->getUserAttributeByIndex(i); + emitUserAttributeJSON(writer, attrib); + } + write(writer, "]"); + } +} + static void emitReflectionVarLayoutJSON( PrettyWriter& writer, slang::VariableLayoutReflection* var) @@ -278,6 +360,7 @@ static void emitReflectionVarLayoutJSON( emitReflectionVarBindingInfoJSON(writer, var); + emitUserAttributes(writer, var->getVariable()); dedent(writer); write(writer, "\n}"); } @@ -368,6 +451,7 @@ static void emitReflectionResourceTypeBaseInfoJSON( } } + static void emitReflectionTypeInfoJSON( PrettyWriter& writer, slang::TypeReflection* type) @@ -467,10 +551,10 @@ static void emitReflectionTypeInfoJSON( write(writer, "\"kind\": \"matrix\""); write(writer, ",\n"); write(writer, "\"rowCount\": "); - write(writer, type->getRowCount()); + write(writer, (SlangUInt)type->getRowCount()); write(writer, ",\n"); write(writer, "\"columnCount\": "); - write(writer, type->getColumnCount()); + write(writer, (SlangUInt)type->getColumnCount()); write(writer, ",\n"); write(writer, "\"elementType\": "); emitReflectionTypeJSON( @@ -523,8 +607,10 @@ static void emitReflectionTypeInfoJSON( assert(!"unhandled case"); break; } + emitUserAttributes(writer, type); } + static void emitReflectionTypeLayoutInfoJSON( PrettyWriter& writer, slang::TypeLayoutReflection* typeLayout) @@ -580,6 +666,8 @@ static void emitReflectionTypeLayoutInfoJSON( } dedent(writer); write(writer, "\n]"); + emitUserAttributes(writer, structTypeLayout->getType()); + } break; |
