| <?xml version="1.0" encoding="utf-8"?> |
| <!-- |
| /// Copyright 2021 The Dawn & Tint Authors |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are met: |
| // |
| // 1. Redistributions of source code must retain the above copyright notice, this |
| // list of conditions and the following disclaimer. |
| // |
| // 2. Redistributions in binary form must reproduce the above copyright notice, |
| // this list of conditions and the following disclaimer in the documentation |
| // and/or other materials provided with the distribution. |
| // |
| // 3. Neither the name of the copyright holder nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
| // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| --> |
| |
| <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> |
| |
| <!--=================================================================--> |
| <!-- utils --> |
| <!--=================================================================--> |
| |
| <Type Name="tint::Slice<*>"> |
| <DisplayString>{{ length={len}, capacity={cap} }}</DisplayString> |
| <Expand> |
| <!--<Item Name="[length]">len</Item> |
| <Item Name="[capacity]">cap</Item>--> |
| <ArrayItems> |
| <Size>len</Size> |
| <ValuePointer>data</ValuePointer> |
| </ArrayItems> |
| </Expand> |
| </Type> |
| |
| <Type Name="tint::Vector<*,*>"> |
| <Intrinsic Name="Length" Expression="(size_t)(impl_.slice.len)" /> |
| <Expand> |
| <Item Name="[heap]">impl_.slice.cap > (int)$T2</Item> |
| <!--<ExpandedItem>impl_.slice</ExpandedItem>--> |
| <!--<Item Name="[slice]">impl_.slice</Item>--> |
| <ArrayItems> |
| <Size>Length()</Size> |
| <ValuePointer>impl_.slice.data</ValuePointer> |
| </ArrayItems> |
| </Expand> |
| </Type> |
| |
| <Type Name="tint::VectorRef<*>"> |
| <Expand> |
| <Item Name="[can move]">can_move_</Item> |
| <ExpandedItem>slice_</ExpandedItem> |
| <!--<Item Name="[slice]">slice_</Item>--> |
| </Expand> |
| </Type> |
| |
| <Type Name="tint::Symbol"> |
| <DisplayString Optional="true">{name_,sb}</DisplayString> |
| </Type> |
| |
| <!--=================================================================--> |
| <!-- ast --> |
| <!--=================================================================--> |
| |
| <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_statement">if ({*condition}) {*body}</DisplayString> |
| <DisplayString Condition="else_statement">if ({*condition}) {*body} else { *else_statement }</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.Length() == 1">{{ {*statements[0]} }} </DisplayString> |
| <DisplayString Condition="statements.Length() == 2">{{ {*statements[0]} {*statements[1]} }} </DisplayString> |
| <DisplayString Condition="statements.Length() == 3">{{ {*statements[0]} {*statements[1]} {*statements[2]} }} </DisplayString> |
| <DisplayString Condition="statements.Length() > 3">{{ {*statements[0]} {*statements[1]} {*statements[2]} {statements.Length()-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::Identifier"> |
| <DisplayString>{symbol}</DisplayString> |
| <Expand> |
| <Item Name="symbol">symbol</Item> |
| </Expand> |
| </Type> |
| |
| <Type Name="tint::ast::IdentifierExpression"> |
| <DisplayString>{*identifier}</DisplayString> |
| <Expand> |
| <Item Name="identifier">identifier</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>{*member}</DisplayString> |
| <Expand> |
| <Item Name="member">*member</Item> |
| </Expand> |
| </Type> |
| |
| <Type Name="tint::ast::Let"> |
| <DisplayString Condition="!!type">let {symbol} : {*type} = {*initializer}</DisplayString> |
| <DisplayString Condition=" !type">let {symbol} = {*initializer}</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::Variable"> |
| <DisplayString Condition="!!type & !!initializer">var {symbol} : {*type} = {*initializer}</DisplayString> |
| <DisplayString Condition="!!type & !initializer">var {symbol} : {*type}</DisplayString> |
| <DisplayString Condition=" !type & !!initializer">var {symbol} = {*initializer}</DisplayString> |
| <DisplayString Condition=" !type & !initializer">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::UnaryOpExpression"> |
| <DisplayString Condition="op==tint::core::UnaryOp::kAddressOf">&({*expr})</DisplayString> |
| <DisplayString Condition="op==tint::core::UnaryOp::kComplement">~({*expr})</DisplayString> |
| <DisplayString Condition="op==tint::core::UnaryOp::kIndirection">*({*expr})</DisplayString> |
| <DisplayString Condition="op==tint::core::UnaryOp::kNegation">-({*expr})</DisplayString> |
| <DisplayString Condition="op==tint::core::UnaryOp::kNot">!({*expr})</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::BinaryExpression"> |
| <DisplayString Condition="op==tint::core::BinaryOp::kNone">({*lhs} NONE {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kAnd">({*lhs} & {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kOr">({*lhs} | {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kXor">({*lhs} ^ {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kLogicalAnd">({*lhs} && {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kLogicalOr">({*lhs} || {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kEqual">({*lhs} == {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kNotEqual">({*lhs} != {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kLessThan">({*lhs} < {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kGreaterThan">({*lhs} > {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kLessThanEqual">({*lhs} <= {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kGreaterThanEqual">({*lhs} >= {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kShiftLeft">({*lhs} << {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kShiftRight">({*lhs} >> {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kAdd">({*lhs} + {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kSubtract">({*lhs} - {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kMultiply">({*lhs} * {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kDivide">({*lhs} / {*rhs})</DisplayString> |
| <DisplayString Condition="op==tint::core::BinaryOp::kModulo">({*lhs} % {*rhs})</DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::CallExpression"> |
| <DisplayString Condition="args.Length() == 0">{*target}()</DisplayString> |
| <DisplayString Condition="args.Length() == 1">{*target}({*args[0]})</DisplayString> |
| <DisplayString Condition="args.Length() == 2">{*target}({*args[0]}, {*args[1]})</DisplayString> |
| <DisplayString Condition="args.Length() == 3">{*target}({*args[0]}, {*args[1]}, {*args[2]})</DisplayString> |
| <DisplayString Condition="args.Length() == 4">{*target}({*args[0]}, {*args[1]}, {*args[2]}, {*args[3]})</DisplayString> |
| <DisplayString Condition="args.Length() > 4">{*target}({*args[0]}, {*args[1]}, {*args[2]}, {args.Length()-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::Vector"> |
| <DisplayString Condition="width==2 & !type">vec2</DisplayString> |
| <DisplayString Condition="width==3 & !type">vec3</DisplayString> |
| <DisplayString Condition="width==4 & !type">vec4</DisplayString> |
| <DisplayString Condition="width==2 & !!type">vec2<{*type}></DisplayString> |
| <DisplayString Condition="width==3 & !!type">vec3<{*type}></DisplayString> |
| <DisplayString Condition="width==4 & !!type">vec4<{*type}></DisplayString> |
| </Type> |
| |
| <Type Name="tint::ast::TypeName"> |
| <DisplayString>{name}</DisplayString> |
| </Type> |
| |
| <!--=================================================================--> |
| <!-- sem --> |
| <!--=================================================================--> |
| |
| <Type Name="tint::core::type::AbstractInt"> |
| <DisplayString>AbstractInt</DisplayString> |
| </Type> |
| |
| <Type Name="tint::core::type::AbstractFloat"> |
| <DisplayString>AbstractFloat</DisplayString> |
| </Type> |
| |
| <Type Name="tint::core::type::Bool"> |
| <DisplayString>bool</DisplayString> |
| </Type> |
| |
| <Type Name="tint::core::type::F32"> |
| <DisplayString>f32</DisplayString> |
| </Type> |
| |
| <Type Name="tint::core::type::I32"> |
| <DisplayString>i32</DisplayString> |
| </Type> |
| |
| <Type Name="tint::core::type::U32"> |
| <DisplayString>u32</DisplayString> |
| </Type> |
| |
| <Type Name="tint::core::type::Vector"> |
| <DisplayString>vec{width_}<{*subtype_}></DisplayString> |
| </Type> |
| |
| <Type Name="tint::core::constant::Value"> |
| <DisplayString>Type={*Type()} Value={InternalValue()}</DisplayString> |
| </Type> |
| |
| <Type Name="tint::sem::ValueExpression"> |
| <DisplayString>Decl={*declaration_}</DisplayString> |
| </Type> |
| |
| </AutoVisualizer> |