| <?xml version="1.0" encoding="utf-8"?> |
| <!-- |
| /// Copyright 2021 The Tint Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| --> |
| |
| <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> |
| <Type Name="tint::Symbol"> |
| <!-- Requires TINT_SYMBOL_STORE_DEBUG_NAME defined to 1 --> |
| <DisplayString Optional="true">{debug_name_,sb}</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::AssignmentStatement"> |
| <DisplayString>{*lhs} = {*rhs};</DisplayString> |
| <Expand> |
| <Item Name="lhs">*lhs</Item> |
| <Item Name="rhs">*rhs</Item> |
| </Expand> |
| </Type> |
| |
| <Type Name="tint::ast::IfStatement"> |
| <DisplayString Condition="else_statements.size() == 0">if ({*condition}) {*body}</DisplayString> |
| <DisplayString Condition="else_statements.size() == 1">if ({*condition}) {*body} {*else_statements[0]} </DisplayString> |
| <DisplayString Condition="else_statements.size() == 2">if ({*condition}) {*body} {*else_statements[0]} {*else_statements[1]} </DisplayString> |
| <DisplayString Condition="else_statements.size() == 3">if ({*condition}) {*body} {*else_statements[0]} {*else_statements[1]} {*else_statements[2]}</DisplayString> |
| <DisplayString Condition="else_statements.size() > 3">if ({*condition}) {*body} {*else_statements[0]} {*else_statements[1]} {*else_statements[2]} else {else_statements.size()-3} more...</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::ElseStatement"> |
| <DisplayString Condition="!condition">else {*body}</DisplayString> |
| <DisplayString Condition="!!condition">else if ({*condition}) {*body}</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::BlockStatement"> |
| <DisplayString Condition="statements.size() == 1">{{ {*statements[0]} }} </DisplayString> |
| <DisplayString Condition="statements.size() == 2">{{ {*statements[0]} {*statements[1]} }} </DisplayString> |
| <DisplayString Condition="statements.size() == 3">{{ {*statements[0]} {*statements[1]} {*statements[2]} }} </DisplayString> |
| <DisplayString Condition="statements.size() > 3">{{ {*statements[0]} {*statements[1]} {*statements[2]} {statements.size()-3} more... }} </DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::ReturnStatement"> |
| <DisplayString Condition="!value">return;</DisplayString> |
| <DisplayString Condition="!!value">return {*value};</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::Function"> |
| <DisplayString Condition="params.size() == 0">fn {symbol}() -> {*return_type} {*body}</DisplayString> |
| <DisplayString Condition="params.size() == 1">fn {symbol}({*params[0]}) -> {*return_type} {*body}</DisplayString> |
| <DisplayString Condition="params.size() == 2">fn {symbol}({*params[0]} {*params[1]}) -> {*return_type} {*body}</DisplayString> |
| <DisplayString Condition="params.size() == 3">fn {symbol}({*params[0]} {*params[1]} {*params[2]}) -> {*return_type} {*body}</DisplayString> |
| <DisplayString Condition="params.size() > 3">fn {symbol}({*params[0]} {*params[1]} {*params[2]} {params.size()-3} more...) -> {*return_type} {*body}</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::IdentifierExpression"> |
| <!--the ",sb" specifier removes the double quotes on the displayed string --> |
| <DisplayString>{symbol}</DisplayString> |
| <Expand> |
| <Item Name="symbol">symbol</Item> |
| </Expand> |
| </Type> |
| |
| <Type Name="tint::ast::IndexAccessorExpression"> |
| <DisplayString>{*object}[{*index}]</DisplayString> |
| <Expand> |
| <Item Name="object">*object</Item> |
| <Item Name="index">*index</Item> |
| </Expand> |
| </Type> |
| |
| <Type Name="tint::ast::MemberAccessorExpression"> |
| <DisplayString>{*structure}.{*member}</DisplayString> |
| <Expand> |
| <Item Name="structure">*structure</Item> |
| <Item Name="member">*member</Item> |
| </Expand> |
| </Type> |
| |
| <Type Name="tint::ast::Variable"> |
| <!-- Hack: we can deduce that this variable is a parameter if it's const with a type but no constructor, which is illegal for a let --> |
| <DisplayString Condition=" is_const & !!type & !constructor">{symbol} : {*type}</DisplayString> |
| |
| <DisplayString Condition=" is_const & !!type & !!constructor">let {symbol} : {*type} = {*constructor}</DisplayString> |
| <DisplayString Condition=" is_const & !type & !constructor">let {symbol} = {*constructor}</DisplayString> |
| <DisplayString Condition="!is_const & !!type & !!constructor">var {symbol} : {*type} = {*constructor}</DisplayString> |
| <DisplayString Condition="!is_const & !type & !!constructor">var {symbol} = {*constructor}</DisplayString> |
| <DisplayString Condition="!is_const & !!type & !constructor">var {symbol}</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::VariableDeclStatement"> |
| <DisplayString>{*variable};</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::IntLiteralExpression"> |
| <DisplayString>{value}</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::BoolLiteralExpression"> |
| <DisplayString>{value}</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::Void"> |
| <DisplayString>void</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::UnaryOpExpression"> |
| <DisplayString Condition="op==tint::ast::UnaryOp::kAddressOf">&({expr})</DisplayString> |
| <DisplayString Condition="op==tint::ast::UnaryOp::kComplement">~({expr})</DisplayString> |
| <DisplayString Condition="op==tint::ast::UnaryOp::kIndirection">*({expr})</DisplayString> |
| <DisplayString Condition="op==tint::ast::UnaryOp::kNegation">-({expr})</DisplayString> |
| <DisplayString Condition="op==tint::ast::UnaryOp::kNot">!({expr})</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::BinaryExpression"> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kNone">({*lhs} NONE {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kAnd">({*lhs} & {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kOr">({*lhs} | {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kXor">({*lhs} ^ {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kLogicalAnd">({*lhs} && {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kLogicalOr">({*lhs} || {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kEqual">({*lhs} == {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kNotEqual">({*lhs} != {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kLessThan">({*lhs} < {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kGreaterThan">({*lhs} > {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kLessThanEqual">({*lhs} <= {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kGreaterThanEqual">({*lhs} >= {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kShiftLeft">({*lhs} << {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kShiftRight">({*lhs} >> {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kAdd">({*lhs} + {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kSubtract">({*lhs} - {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kMultiply">({*lhs} * {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kDivide">({*lhs} / {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::ast::BinaryOp::kModulo">({*lhs} % {*rhs})</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::CallExpression"> |
| <DisplayString Condition="args.size() == 0">{target}()</DisplayString> |
| <DisplayString Condition="args.size() == 1">{target}({*args[0]})</DisplayString> |
| <DisplayString Condition="args.size() == 2">{target}({*args[0]}, {*args[1]})</DisplayString> |
| <DisplayString Condition="args.size() == 3">{target}({*args[0]}, {*args[1]}, {*args[2]})</DisplayString> |
| <DisplayString Condition="args.size() > 3">{target}({*args[0]}, {*args[1]}, {*args[2]}, {args.size()-3} more...)</DisplayString> |
| <!-- TODO: add more overloads --> |
| </Type> |
| |
| <Type Name="tint::ast::CallExpression::Target"> |
| <DisplayString Condition ="name != nullptr">{*name}</DisplayString> |
| <DisplayString Condition ="name == nullptr">{*type}</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::Array"> |
| <DisplayString Condition="count != nullptr">array<{*type},{*count}></DisplayString> |
| <DisplayString Condition="count == nullptr">array<{*type}></DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::TypeName"> |
| <DisplayString>{name}</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::Bool"> |
| <DisplayString>bool</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::I32"> |
| <DisplayString>i32</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::U32"> |
| <DisplayString>u32</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::F32"> |
| <DisplayString>f32</DisplayString> |
| </Type> |
| |
| </AutoVisualizer> |