mirror of
https://github.com/Ryubing/Ryujinx.git
synced 2025-11-27 03:12:22 -05:00
Move solution and projects to src
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class ArraySubscriptingExpression : BaseNode
|
||||
{
|
||||
private BaseNode _leftNode;
|
||||
private BaseNode _subscript;
|
||||
|
||||
public ArraySubscriptingExpression(BaseNode leftNode, BaseNode subscript) : base(NodeType.ArraySubscriptingExpression)
|
||||
{
|
||||
_leftNode = leftNode;
|
||||
_subscript = subscript;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("(");
|
||||
_leftNode.Print(writer);
|
||||
writer.Write(")[");
|
||||
_subscript.Print(writer);
|
||||
writer.Write("]");
|
||||
}
|
||||
}
|
||||
}
|
||||
59
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/ArrayType.cs
Normal file
59
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/ArrayType.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class ArrayType : BaseNode
|
||||
{
|
||||
private BaseNode _base;
|
||||
private BaseNode _dimensionExpression;
|
||||
private string _dimensionString;
|
||||
|
||||
public ArrayType(BaseNode Base, BaseNode dimensionExpression = null) : base(NodeType.ArrayType)
|
||||
{
|
||||
_base = Base;
|
||||
_dimensionExpression = dimensionExpression;
|
||||
}
|
||||
|
||||
public ArrayType(BaseNode Base, string dimensionString) : base(NodeType.ArrayType)
|
||||
{
|
||||
_base = Base;
|
||||
_dimensionString = dimensionString;
|
||||
}
|
||||
|
||||
public override bool HasRightPart()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool IsArray()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
_base.PrintLeft(writer);
|
||||
}
|
||||
|
||||
public override void PrintRight(TextWriter writer)
|
||||
{
|
||||
// FIXME: detect if previous char was a ].
|
||||
writer.Write(" ");
|
||||
|
||||
writer.Write("[");
|
||||
|
||||
if (_dimensionString != null)
|
||||
{
|
||||
writer.Write(_dimensionString);
|
||||
}
|
||||
else if (_dimensionExpression != null)
|
||||
{
|
||||
_dimensionExpression.Print(writer);
|
||||
}
|
||||
|
||||
writer.Write("]");
|
||||
|
||||
_base.PrintRight(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
113
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/BaseNode.cs
Normal file
113
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/BaseNode.cs
Normal file
@@ -0,0 +1,113 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public enum NodeType
|
||||
{
|
||||
CvQualifierType,
|
||||
SimpleReferenceType,
|
||||
NameType,
|
||||
EncodedFunction,
|
||||
NestedName,
|
||||
SpecialName,
|
||||
LiteralOperator,
|
||||
NodeArray,
|
||||
ElaboratedType,
|
||||
PostfixQualifiedType,
|
||||
SpecialSubstitution,
|
||||
ExpandedSpecialSubstitution,
|
||||
CtorDtorNameType,
|
||||
EnclosedExpression,
|
||||
ForwardTemplateReference,
|
||||
NameTypeWithTemplateArguments,
|
||||
PackedTemplateArgument,
|
||||
TemplateArguments,
|
||||
BooleanExpression,
|
||||
CastExpression,
|
||||
CallExpression,
|
||||
IntegerCastExpression,
|
||||
PackedTemplateParameter,
|
||||
PackedTemplateParameterExpansion,
|
||||
IntegerLiteral,
|
||||
DeleteExpression,
|
||||
MemberExpression,
|
||||
ArraySubscriptingExpression,
|
||||
InitListExpression,
|
||||
PostfixExpression,
|
||||
ConditionalExpression,
|
||||
ThrowExpression,
|
||||
FunctionParameter,
|
||||
ConversionExpression,
|
||||
BinaryExpression,
|
||||
PrefixExpression,
|
||||
BracedExpression,
|
||||
BracedRangeExpression,
|
||||
NewExpression,
|
||||
QualifiedName,
|
||||
StdQualifiedName,
|
||||
DtOrName,
|
||||
GlobalQualifiedName,
|
||||
NoexceptSpec,
|
||||
DynamicExceptionSpec,
|
||||
FunctionType,
|
||||
PointerType,
|
||||
ReferenceType,
|
||||
ConversionOperatorType,
|
||||
LocalName,
|
||||
CtorVtableSpecialName,
|
||||
ArrayType
|
||||
}
|
||||
|
||||
public abstract class BaseNode
|
||||
{
|
||||
public NodeType Type { get; protected set; }
|
||||
|
||||
public BaseNode(NodeType type)
|
||||
{
|
||||
Type = type;
|
||||
}
|
||||
|
||||
public virtual void Print(TextWriter writer)
|
||||
{
|
||||
PrintLeft(writer);
|
||||
|
||||
if (HasRightPart())
|
||||
{
|
||||
PrintRight(writer);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void PrintLeft(TextWriter writer);
|
||||
|
||||
public virtual bool HasRightPart()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public virtual bool IsArray()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public virtual bool HasFunctions()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public virtual string GetName()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public virtual void PrintRight(TextWriter writer) {}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
StringWriter writer = new StringWriter();
|
||||
|
||||
Print(writer);
|
||||
|
||||
return writer.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class BinaryExpression : BaseNode
|
||||
{
|
||||
private BaseNode _leftPart;
|
||||
private string _name;
|
||||
private BaseNode _rightPart;
|
||||
|
||||
public BinaryExpression(BaseNode leftPart, string name, BaseNode rightPart) : base(NodeType.BinaryExpression)
|
||||
{
|
||||
_leftPart = leftPart;
|
||||
_name = name;
|
||||
_rightPart = rightPart;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (_name.Equals(">"))
|
||||
{
|
||||
writer.Write("(");
|
||||
}
|
||||
|
||||
writer.Write("(");
|
||||
_leftPart.Print(writer);
|
||||
writer.Write(") ");
|
||||
|
||||
writer.Write(_name);
|
||||
|
||||
writer.Write(" (");
|
||||
_rightPart.Print(writer);
|
||||
writer.Write(")");
|
||||
|
||||
if (_name.Equals(">"))
|
||||
{
|
||||
writer.Write(")");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class BracedExpression : BaseNode
|
||||
{
|
||||
private BaseNode _element;
|
||||
private BaseNode _expression;
|
||||
private bool _isArrayExpression;
|
||||
|
||||
public BracedExpression(BaseNode element, BaseNode expression, bool isArrayExpression) : base(NodeType.BracedExpression)
|
||||
{
|
||||
_element = element;
|
||||
_expression = expression;
|
||||
_isArrayExpression = isArrayExpression;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (_isArrayExpression)
|
||||
{
|
||||
writer.Write("[");
|
||||
_element.Print(writer);
|
||||
writer.Write("]");
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write(".");
|
||||
_element.Print(writer);
|
||||
}
|
||||
|
||||
if (!_expression.GetType().Equals(NodeType.BracedExpression) || !_expression.GetType().Equals(NodeType.BracedRangeExpression))
|
||||
{
|
||||
writer.Write(" = ");
|
||||
}
|
||||
|
||||
_expression.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class BracedRangeExpression : BaseNode
|
||||
{
|
||||
private BaseNode _firstNode;
|
||||
private BaseNode _lastNode;
|
||||
private BaseNode _expression;
|
||||
|
||||
public BracedRangeExpression(BaseNode firstNode, BaseNode lastNode, BaseNode expression) : base(NodeType.BracedRangeExpression)
|
||||
{
|
||||
_firstNode = firstNode;
|
||||
_lastNode = lastNode;
|
||||
_expression = expression;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("[");
|
||||
_firstNode.Print(writer);
|
||||
writer.Write(" ... ");
|
||||
_lastNode.Print(writer);
|
||||
writer.Write("]");
|
||||
|
||||
if (!_expression.GetType().Equals(NodeType.BracedExpression) || !_expression.GetType().Equals(NodeType.BracedRangeExpression))
|
||||
{
|
||||
writer.Write(" = ");
|
||||
}
|
||||
|
||||
_expression.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class CallExpression : NodeArray
|
||||
{
|
||||
private BaseNode _callee;
|
||||
|
||||
public CallExpression(BaseNode callee, List<BaseNode> nodes) : base(nodes, NodeType.CallExpression)
|
||||
{
|
||||
_callee = callee;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
_callee.Print(writer);
|
||||
|
||||
writer.Write("(");
|
||||
writer.Write(string.Join<BaseNode>(", ", Nodes.ToArray()));
|
||||
writer.Write(")");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class CastExpression : BaseNode
|
||||
{
|
||||
private string _kind;
|
||||
private BaseNode _to;
|
||||
private BaseNode _from;
|
||||
|
||||
public CastExpression(string kind, BaseNode to, BaseNode from) : base(NodeType.CastExpression)
|
||||
{
|
||||
_kind = kind;
|
||||
_to = to;
|
||||
_from = from;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write(_kind);
|
||||
writer.Write("<");
|
||||
_to.PrintLeft(writer);
|
||||
writer.Write(">(");
|
||||
_from.PrintLeft(writer);
|
||||
writer.Write(")");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class ConditionalExpression : BaseNode
|
||||
{
|
||||
private BaseNode _thenNode;
|
||||
private BaseNode _elseNode;
|
||||
private BaseNode _conditionNode;
|
||||
|
||||
public ConditionalExpression(BaseNode conditionNode, BaseNode thenNode, BaseNode elseNode) : base(NodeType.ConditionalExpression)
|
||||
{
|
||||
_thenNode = thenNode;
|
||||
_conditionNode = conditionNode;
|
||||
_elseNode = elseNode;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("(");
|
||||
_conditionNode.Print(writer);
|
||||
writer.Write(") ? (");
|
||||
_thenNode.Print(writer);
|
||||
writer.Write(") : (");
|
||||
_elseNode.Print(writer);
|
||||
writer.Write(")");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class ConversionExpression : BaseNode
|
||||
{
|
||||
private BaseNode _typeNode;
|
||||
private BaseNode _expressions;
|
||||
|
||||
public ConversionExpression(BaseNode typeNode, BaseNode expressions) : base(NodeType.ConversionExpression)
|
||||
{
|
||||
_typeNode = typeNode;
|
||||
_expressions = expressions;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("(");
|
||||
_typeNode.Print(writer);
|
||||
writer.Write(")(");
|
||||
_expressions.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class ConversionOperatorType : ParentNode
|
||||
{
|
||||
public ConversionOperatorType(BaseNode child) : base(NodeType.ConversionOperatorType, child) { }
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("operator ");
|
||||
Child.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class CtorDtorNameType : ParentNode
|
||||
{
|
||||
private bool _isDestructor;
|
||||
|
||||
public CtorDtorNameType(BaseNode name, bool isDestructor) : base(NodeType.CtorDtorNameType, name)
|
||||
{
|
||||
_isDestructor = isDestructor;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (_isDestructor)
|
||||
{
|
||||
writer.Write("~");
|
||||
}
|
||||
|
||||
writer.Write(Child.GetName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class CtorVtableSpecialName : BaseNode
|
||||
{
|
||||
private BaseNode _firstType;
|
||||
private BaseNode _secondType;
|
||||
|
||||
public CtorVtableSpecialName(BaseNode firstType, BaseNode secondType) : base(NodeType.CtorVtableSpecialName)
|
||||
{
|
||||
_firstType = firstType;
|
||||
_secondType = secondType;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("construction vtable for ");
|
||||
_firstType.Print(writer);
|
||||
writer.Write("-in-");
|
||||
_secondType.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class DeleteExpression : ParentNode
|
||||
{
|
||||
private bool _isGlobal;
|
||||
private bool _isArrayExpression;
|
||||
|
||||
public DeleteExpression(BaseNode child, bool isGlobal, bool isArrayExpression) : base(NodeType.DeleteExpression, child)
|
||||
{
|
||||
_isGlobal = isGlobal;
|
||||
_isArrayExpression = isArrayExpression;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (_isGlobal)
|
||||
{
|
||||
writer.Write("::");
|
||||
}
|
||||
|
||||
writer.Write("delete");
|
||||
|
||||
if (_isArrayExpression)
|
||||
{
|
||||
writer.Write("[] ");
|
||||
}
|
||||
|
||||
Child.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
15
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/DtorName.cs
Normal file
15
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/DtorName.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class DtorName : ParentNode
|
||||
{
|
||||
public DtorName(BaseNode name) : base(NodeType.DtOrName, name) { }
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("~");
|
||||
Child.PrintLeft(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class DynamicExceptionSpec : ParentNode
|
||||
{
|
||||
public DynamicExceptionSpec(BaseNode child) : base(NodeType.DynamicExceptionSpec, child) { }
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("throw(");
|
||||
Child.Print(writer);
|
||||
writer.Write(")");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class ElaboratedType : ParentNode
|
||||
{
|
||||
private string _elaborated;
|
||||
|
||||
public ElaboratedType(string elaborated, BaseNode type) : base(NodeType.ElaboratedType, type)
|
||||
{
|
||||
_elaborated = elaborated;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write(_elaborated);
|
||||
writer.Write(" ");
|
||||
Child.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class EnclosedExpression : BaseNode
|
||||
{
|
||||
private string _prefix;
|
||||
private BaseNode _expression;
|
||||
private string _postfix;
|
||||
|
||||
public EnclosedExpression(string prefix, BaseNode expression, string postfix) : base(NodeType.EnclosedExpression)
|
||||
{
|
||||
_prefix = prefix;
|
||||
_expression = expression;
|
||||
_postfix = postfix;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write(_prefix);
|
||||
_expression.Print(writer);
|
||||
writer.Write(_postfix);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class EncodedFunction : BaseNode
|
||||
{
|
||||
private BaseNode _name;
|
||||
private BaseNode _params;
|
||||
private BaseNode _cv;
|
||||
private BaseNode _ref;
|
||||
private BaseNode _attrs;
|
||||
private BaseNode _ret;
|
||||
|
||||
public EncodedFunction(BaseNode name, BaseNode Params, BaseNode cv, BaseNode Ref, BaseNode attrs, BaseNode ret) : base(NodeType.NameType)
|
||||
{
|
||||
_name = name;
|
||||
_params = Params;
|
||||
_cv = cv;
|
||||
_ref = Ref;
|
||||
_attrs = attrs;
|
||||
_ret = ret;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (_ret != null)
|
||||
{
|
||||
_ret.PrintLeft(writer);
|
||||
|
||||
if (!_ret.HasRightPart())
|
||||
{
|
||||
writer.Write(" ");
|
||||
}
|
||||
}
|
||||
|
||||
_name.Print(writer);
|
||||
|
||||
}
|
||||
|
||||
public override bool HasRightPart()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void PrintRight(TextWriter writer)
|
||||
{
|
||||
writer.Write("(");
|
||||
|
||||
if (_params != null)
|
||||
{
|
||||
_params.Print(writer);
|
||||
}
|
||||
|
||||
writer.Write(")");
|
||||
|
||||
if (_ret != null)
|
||||
{
|
||||
_ret.PrintRight(writer);
|
||||
}
|
||||
|
||||
if (_cv != null)
|
||||
{
|
||||
_cv.Print(writer);
|
||||
}
|
||||
|
||||
if (_ref != null)
|
||||
{
|
||||
_ref.Print(writer);
|
||||
}
|
||||
|
||||
if (_attrs != null)
|
||||
{
|
||||
_attrs.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class FoldExpression : BaseNode
|
||||
{
|
||||
private bool _isLeftFold;
|
||||
private string _operatorName;
|
||||
private BaseNode _expression;
|
||||
private BaseNode _initializer;
|
||||
|
||||
public FoldExpression(bool isLeftFold, string operatorName, BaseNode expression, BaseNode initializer) : base(NodeType.FunctionParameter)
|
||||
{
|
||||
_isLeftFold = isLeftFold;
|
||||
_operatorName = operatorName;
|
||||
_expression = expression;
|
||||
_initializer = initializer;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("(");
|
||||
|
||||
if (_isLeftFold && _initializer != null)
|
||||
{
|
||||
_initializer.Print(writer);
|
||||
writer.Write(" ");
|
||||
writer.Write(_operatorName);
|
||||
writer.Write(" ");
|
||||
}
|
||||
|
||||
writer.Write(_isLeftFold ? "... " : " ");
|
||||
writer.Write(_operatorName);
|
||||
writer.Write(!_isLeftFold ? " ..." : " ");
|
||||
_expression.Print(writer);
|
||||
|
||||
if (!_isLeftFold && _initializer != null)
|
||||
{
|
||||
_initializer.Print(writer);
|
||||
writer.Write(" ");
|
||||
writer.Write(_operatorName);
|
||||
writer.Write(" ");
|
||||
}
|
||||
|
||||
writer.Write(")");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class ForwardTemplateReference : BaseNode
|
||||
{
|
||||
// TODO: Compute inside the Demangler
|
||||
public BaseNode Reference;
|
||||
private int _index;
|
||||
|
||||
public ForwardTemplateReference(int index) : base(NodeType.ForwardTemplateReference)
|
||||
{
|
||||
_index = index;
|
||||
}
|
||||
|
||||
public override string GetName()
|
||||
{
|
||||
return Reference.GetName();
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
Reference.PrintLeft(writer);
|
||||
}
|
||||
|
||||
public override void PrintRight(TextWriter writer)
|
||||
{
|
||||
Reference.PrintRight(writer);
|
||||
}
|
||||
|
||||
public override bool HasRightPart()
|
||||
{
|
||||
return Reference.HasRightPart();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class FunctionParameter : BaseNode
|
||||
{
|
||||
private string _number;
|
||||
|
||||
public FunctionParameter(string number) : base(NodeType.FunctionParameter)
|
||||
{
|
||||
_number = number;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("fp ");
|
||||
|
||||
if (_number != null)
|
||||
{
|
||||
writer.Write(_number);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class FunctionType : BaseNode
|
||||
{
|
||||
private BaseNode _returnType;
|
||||
private BaseNode _params;
|
||||
private BaseNode _cvQualifier;
|
||||
private SimpleReferenceType _referenceQualifier;
|
||||
private BaseNode _exceptionSpec;
|
||||
|
||||
public FunctionType(BaseNode returnType, BaseNode Params, BaseNode cvQualifier, SimpleReferenceType referenceQualifier, BaseNode exceptionSpec) : base(NodeType.FunctionType)
|
||||
{
|
||||
_returnType = returnType;
|
||||
_params = Params;
|
||||
_cvQualifier = cvQualifier;
|
||||
_referenceQualifier = referenceQualifier;
|
||||
_exceptionSpec = exceptionSpec;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
_returnType.PrintLeft(writer);
|
||||
writer.Write(" ");
|
||||
}
|
||||
|
||||
public override void PrintRight(TextWriter writer)
|
||||
{
|
||||
writer.Write("(");
|
||||
_params.Print(writer);
|
||||
writer.Write(")");
|
||||
|
||||
_returnType.PrintRight(writer);
|
||||
|
||||
_cvQualifier.Print(writer);
|
||||
|
||||
if (_referenceQualifier.Qualifier != Reference.None)
|
||||
{
|
||||
writer.Write(" ");
|
||||
_referenceQualifier.PrintQualifier(writer);
|
||||
}
|
||||
|
||||
if (_exceptionSpec != null)
|
||||
{
|
||||
writer.Write(" ");
|
||||
_exceptionSpec.Print(writer);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool HasRightPart()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool HasFunctions()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class GlobalQualifiedName : ParentNode
|
||||
{
|
||||
public GlobalQualifiedName(BaseNode child) : base(NodeType.GlobalQualifiedName, child) { }
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("::");
|
||||
Child.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class InitListExpression : BaseNode
|
||||
{
|
||||
private BaseNode _typeNode;
|
||||
private List<BaseNode> _nodes;
|
||||
|
||||
public InitListExpression(BaseNode typeNode, List<BaseNode> nodes) : base(NodeType.InitListExpression)
|
||||
{
|
||||
_typeNode = typeNode;
|
||||
_nodes = nodes;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (_typeNode != null)
|
||||
{
|
||||
_typeNode.Print(writer);
|
||||
}
|
||||
|
||||
writer.Write("{");
|
||||
writer.Write(string.Join<BaseNode>(", ", _nodes.ToArray()));
|
||||
writer.Write("}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class IntegerCastExpression : ParentNode
|
||||
{
|
||||
private string _number;
|
||||
|
||||
public IntegerCastExpression(BaseNode type, string number) : base(NodeType.IntegerCastExpression, type)
|
||||
{
|
||||
_number = number;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("(");
|
||||
Child.Print(writer);
|
||||
writer.Write(")");
|
||||
writer.Write(_number);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class IntegerLiteral : BaseNode
|
||||
{
|
||||
private string _literalName;
|
||||
private string _literalValue;
|
||||
|
||||
public IntegerLiteral(string literalName, string literalValue) : base(NodeType.IntegerLiteral)
|
||||
{
|
||||
_literalValue = literalValue;
|
||||
_literalName = literalName;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (_literalName.Length > 3)
|
||||
{
|
||||
writer.Write("(");
|
||||
writer.Write(_literalName);
|
||||
writer.Write(")");
|
||||
}
|
||||
|
||||
if (_literalValue[0] == 'n')
|
||||
{
|
||||
writer.Write("-");
|
||||
writer.Write(_literalValue.AsSpan(1));
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write(_literalValue);
|
||||
}
|
||||
|
||||
if (_literalName.Length <= 3)
|
||||
{
|
||||
writer.Write(_literalName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class LiteralOperator : ParentNode
|
||||
{
|
||||
public LiteralOperator(BaseNode child) : base(NodeType.LiteralOperator, child) { }
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("operator \"");
|
||||
Child.PrintLeft(writer);
|
||||
writer.Write("\"");
|
||||
}
|
||||
}
|
||||
}
|
||||
23
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/LocalName.cs
Normal file
23
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/LocalName.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class LocalName : BaseNode
|
||||
{
|
||||
private BaseNode _encoding;
|
||||
private BaseNode _entity;
|
||||
|
||||
public LocalName(BaseNode encoding, BaseNode entity) : base(NodeType.LocalName)
|
||||
{
|
||||
_encoding = encoding;
|
||||
_entity = entity;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
_encoding.Print(writer);
|
||||
writer.Write("::");
|
||||
_entity.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class MemberExpression : BaseNode
|
||||
{
|
||||
private BaseNode _leftNode;
|
||||
private string _kind;
|
||||
private BaseNode _rightNode;
|
||||
|
||||
public MemberExpression(BaseNode leftNode, string kind, BaseNode rightNode) : base(NodeType.MemberExpression)
|
||||
{
|
||||
_leftNode = leftNode;
|
||||
_kind = kind;
|
||||
_rightNode = rightNode;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
_leftNode.Print(writer);
|
||||
writer.Write(_kind);
|
||||
_rightNode.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
29
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/NameType.cs
Normal file
29
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/NameType.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class NameType : BaseNode
|
||||
{
|
||||
private string _nameValue;
|
||||
|
||||
public NameType(string nameValue, NodeType type) : base(type)
|
||||
{
|
||||
_nameValue = nameValue;
|
||||
}
|
||||
|
||||
public NameType(string nameValue) : base(NodeType.NameType)
|
||||
{
|
||||
_nameValue = nameValue;
|
||||
}
|
||||
|
||||
public override string GetName()
|
||||
{
|
||||
return _nameValue;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write(_nameValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class NameTypeWithTemplateArguments : BaseNode
|
||||
{
|
||||
private BaseNode _prev;
|
||||
private BaseNode _templateArgument;
|
||||
|
||||
public NameTypeWithTemplateArguments(BaseNode prev, BaseNode templateArgument) : base(NodeType.NameTypeWithTemplateArguments)
|
||||
{
|
||||
_prev = prev;
|
||||
_templateArgument = templateArgument;
|
||||
}
|
||||
|
||||
public override string GetName()
|
||||
{
|
||||
return _prev.GetName();
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
_prev.Print(writer);
|
||||
_templateArgument.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
26
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/NestedName.cs
Normal file
26
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/NestedName.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class NestedName : ParentNode
|
||||
{
|
||||
private BaseNode _name;
|
||||
|
||||
public NestedName(BaseNode name, BaseNode type) : base(NodeType.NestedName, type)
|
||||
{
|
||||
_name = name;
|
||||
}
|
||||
|
||||
public override string GetName()
|
||||
{
|
||||
return _name.GetName();
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
Child.Print(writer);
|
||||
writer.Write("::");
|
||||
_name.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class NewExpression : BaseNode
|
||||
{
|
||||
private NodeArray _expressions;
|
||||
private BaseNode _typeNode;
|
||||
private NodeArray _initializers;
|
||||
|
||||
private bool _isGlobal;
|
||||
private bool _isArrayExpression;
|
||||
|
||||
public NewExpression(NodeArray expressions, BaseNode typeNode, NodeArray initializers, bool isGlobal, bool isArrayExpression) : base(NodeType.NewExpression)
|
||||
{
|
||||
_expressions = expressions;
|
||||
_typeNode = typeNode;
|
||||
_initializers = initializers;
|
||||
|
||||
_isGlobal = isGlobal;
|
||||
_isArrayExpression = isArrayExpression;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (_isGlobal)
|
||||
{
|
||||
writer.Write("::operator ");
|
||||
}
|
||||
|
||||
writer.Write("new ");
|
||||
|
||||
if (_isArrayExpression)
|
||||
{
|
||||
writer.Write("[] ");
|
||||
}
|
||||
|
||||
if (_expressions.Nodes.Count != 0)
|
||||
{
|
||||
writer.Write("(");
|
||||
_expressions.Print(writer);
|
||||
writer.Write(")");
|
||||
}
|
||||
|
||||
_typeNode.Print(writer);
|
||||
|
||||
if (_initializers.Nodes.Count != 0)
|
||||
{
|
||||
writer.Write("(");
|
||||
_initializers.Print(writer);
|
||||
writer.Write(")");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
30
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/NodeArray.cs
Normal file
30
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/NodeArray.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class NodeArray : BaseNode
|
||||
{
|
||||
public List<BaseNode> Nodes { get; protected set; }
|
||||
|
||||
public NodeArray(List<BaseNode> nodes) : base(NodeType.NodeArray)
|
||||
{
|
||||
Nodes = nodes;
|
||||
}
|
||||
|
||||
public NodeArray(List<BaseNode> nodes, NodeType type) : base(type)
|
||||
{
|
||||
Nodes = nodes;
|
||||
}
|
||||
|
||||
public override bool IsArray()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write(string.Join<BaseNode>(", ", Nodes.ToArray()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class NoexceptSpec : ParentNode
|
||||
{
|
||||
public NoexceptSpec(BaseNode child) : base(NodeType.NoexceptSpec, child) { }
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("noexcept(");
|
||||
Child.Print(writer);
|
||||
writer.Write(")");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class PackedTemplateParameter : NodeArray
|
||||
{
|
||||
public PackedTemplateParameter(List<BaseNode> nodes) : base(nodes, NodeType.PackedTemplateParameter) { }
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
foreach (BaseNode node in Nodes)
|
||||
{
|
||||
node.PrintLeft(writer);
|
||||
}
|
||||
}
|
||||
|
||||
public override void PrintRight(TextWriter writer)
|
||||
{
|
||||
foreach (BaseNode node in Nodes)
|
||||
{
|
||||
node.PrintLeft(writer);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool HasRightPart()
|
||||
{
|
||||
foreach (BaseNode node in Nodes)
|
||||
{
|
||||
if (node.HasRightPart())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class PackedTemplateParameterExpansion : ParentNode
|
||||
{
|
||||
public PackedTemplateParameterExpansion(BaseNode child) : base(NodeType.PackedTemplateParameterExpansion, child) {}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (Child is PackedTemplateParameter)
|
||||
{
|
||||
if (((PackedTemplateParameter)Child).Nodes.Count != 0)
|
||||
{
|
||||
Child.Print(writer);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write("...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
17
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/ParentNode.cs
Normal file
17
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/ParentNode.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public abstract class ParentNode : BaseNode
|
||||
{
|
||||
public BaseNode Child { get; private set; }
|
||||
|
||||
public ParentNode(NodeType type, BaseNode child) : base(type)
|
||||
{
|
||||
Child = child;
|
||||
}
|
||||
|
||||
public override string GetName()
|
||||
{
|
||||
return Child.GetName();
|
||||
}
|
||||
}
|
||||
}
|
||||
45
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/PointerType.cs
Normal file
45
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/PointerType.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class PointerType : BaseNode
|
||||
{
|
||||
private BaseNode _child;
|
||||
|
||||
public PointerType(BaseNode child) : base(NodeType.PointerType)
|
||||
{
|
||||
_child = child;
|
||||
}
|
||||
|
||||
public override bool HasRightPart()
|
||||
{
|
||||
return _child.HasRightPart();
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
_child.PrintLeft(writer);
|
||||
if (_child.IsArray())
|
||||
{
|
||||
writer.Write(" ");
|
||||
}
|
||||
|
||||
if (_child.IsArray() || _child.HasFunctions())
|
||||
{
|
||||
writer.Write("(");
|
||||
}
|
||||
|
||||
writer.Write("*");
|
||||
}
|
||||
|
||||
public override void PrintRight(TextWriter writer)
|
||||
{
|
||||
if (_child.IsArray() || _child.HasFunctions())
|
||||
{
|
||||
writer.Write(")");
|
||||
}
|
||||
|
||||
_child.PrintRight(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class PostfixExpression : ParentNode
|
||||
{
|
||||
private string _operator;
|
||||
|
||||
public PostfixExpression(BaseNode type, string Operator) : base(NodeType.PostfixExpression, type)
|
||||
{
|
||||
_operator = Operator;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("(");
|
||||
Child.Print(writer);
|
||||
writer.Write(")");
|
||||
writer.Write(_operator);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class PostfixQualifiedType : ParentNode
|
||||
{
|
||||
private string _postfixQualifier;
|
||||
|
||||
public PostfixQualifiedType(string postfixQualifier, BaseNode type) : base(NodeType.PostfixQualifiedType, type)
|
||||
{
|
||||
_postfixQualifier = postfixQualifier;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
Child.Print(writer);
|
||||
writer.Write(_postfixQualifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class PrefixExpression : ParentNode
|
||||
{
|
||||
private string _prefix;
|
||||
|
||||
public PrefixExpression(string prefix, BaseNode child) : base(NodeType.PrefixExpression, child)
|
||||
{
|
||||
_prefix = prefix;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write(_prefix);
|
||||
writer.Write("(");
|
||||
Child.Print(writer);
|
||||
writer.Write(")");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class QualifiedName : BaseNode
|
||||
{
|
||||
private BaseNode _qualifier;
|
||||
private BaseNode _name;
|
||||
|
||||
public QualifiedName(BaseNode qualifier, BaseNode name) : base(NodeType.QualifiedName)
|
||||
{
|
||||
_qualifier = qualifier;
|
||||
_name = name;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
_qualifier.Print(writer);
|
||||
writer.Write("::");
|
||||
_name.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
120
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/Qualifier.cs
Normal file
120
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/Qualifier.cs
Normal file
@@ -0,0 +1,120 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public enum Cv
|
||||
{
|
||||
None,
|
||||
Const,
|
||||
Volatile,
|
||||
Restricted = 4
|
||||
}
|
||||
|
||||
public enum Reference
|
||||
{
|
||||
None,
|
||||
RValue,
|
||||
LValue
|
||||
}
|
||||
|
||||
public class CvType : ParentNode
|
||||
{
|
||||
public Cv Qualifier;
|
||||
|
||||
public CvType(Cv qualifier, BaseNode child) : base(NodeType.CvQualifierType, child)
|
||||
{
|
||||
Qualifier = qualifier;
|
||||
}
|
||||
|
||||
public void PrintQualifier(TextWriter writer)
|
||||
{
|
||||
if ((Qualifier & Cv.Const) != 0)
|
||||
{
|
||||
writer.Write(" const");
|
||||
}
|
||||
|
||||
if ((Qualifier & Cv.Volatile) != 0)
|
||||
{
|
||||
writer.Write(" volatile");
|
||||
}
|
||||
|
||||
if ((Qualifier & Cv.Restricted) != 0)
|
||||
{
|
||||
writer.Write(" restrict");
|
||||
}
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (Child != null)
|
||||
{
|
||||
Child.PrintLeft(writer);
|
||||
}
|
||||
|
||||
PrintQualifier(writer);
|
||||
}
|
||||
|
||||
public override bool HasRightPart()
|
||||
{
|
||||
return Child != null && Child.HasRightPart();
|
||||
}
|
||||
|
||||
public override void PrintRight(TextWriter writer)
|
||||
{
|
||||
if (Child != null)
|
||||
{
|
||||
Child.PrintRight(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class SimpleReferenceType : ParentNode
|
||||
{
|
||||
public Reference Qualifier;
|
||||
|
||||
public SimpleReferenceType(Reference qualifier, BaseNode child) : base(NodeType.SimpleReferenceType, child)
|
||||
{
|
||||
Qualifier = qualifier;
|
||||
}
|
||||
|
||||
public void PrintQualifier(TextWriter writer)
|
||||
{
|
||||
if ((Qualifier & Reference.LValue) != 0)
|
||||
{
|
||||
writer.Write("&");
|
||||
}
|
||||
|
||||
if ((Qualifier & Reference.RValue) != 0)
|
||||
{
|
||||
writer.Write("&&");
|
||||
}
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (Child != null)
|
||||
{
|
||||
Child.PrintLeft(writer);
|
||||
}
|
||||
else if (Qualifier != Reference.None)
|
||||
{
|
||||
writer.Write(" ");
|
||||
}
|
||||
|
||||
PrintQualifier(writer);
|
||||
}
|
||||
|
||||
public override bool HasRightPart()
|
||||
{
|
||||
return Child != null && Child.HasRightPart();
|
||||
}
|
||||
|
||||
public override void PrintRight(TextWriter writer)
|
||||
{
|
||||
if (Child != null)
|
||||
{
|
||||
Child.PrintRight(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class ReferenceType : BaseNode
|
||||
{
|
||||
private string _reference;
|
||||
private BaseNode _child;
|
||||
|
||||
public ReferenceType(string reference, BaseNode child) : base(NodeType.ReferenceType)
|
||||
{
|
||||
_reference = reference;
|
||||
_child = child;
|
||||
}
|
||||
|
||||
public override bool HasRightPart()
|
||||
{
|
||||
return _child.HasRightPart();
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
_child.PrintLeft(writer);
|
||||
|
||||
if (_child.IsArray())
|
||||
{
|
||||
writer.Write(" ");
|
||||
}
|
||||
|
||||
if (_child.IsArray() || _child.HasFunctions())
|
||||
{
|
||||
writer.Write("(");
|
||||
}
|
||||
|
||||
writer.Write(_reference);
|
||||
}
|
||||
public override void PrintRight(TextWriter writer)
|
||||
{
|
||||
if (_child.IsArray() || _child.HasFunctions())
|
||||
{
|
||||
writer.Write(")");
|
||||
}
|
||||
|
||||
_child.PrintRight(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
20
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/SpecialName.cs
Normal file
20
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Ast/SpecialName.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class SpecialName : ParentNode
|
||||
{
|
||||
private string _specialValue;
|
||||
|
||||
public SpecialName(string specialValue, BaseNode type) : base(NodeType.SpecialName, type)
|
||||
{
|
||||
_specialValue = specialValue;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write(_specialValue);
|
||||
Child.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class SpecialSubstitution : BaseNode
|
||||
{
|
||||
public enum SpecialType
|
||||
{
|
||||
Allocator,
|
||||
BasicString,
|
||||
String,
|
||||
IStream,
|
||||
OStream,
|
||||
IOStream
|
||||
}
|
||||
|
||||
private SpecialType _specialSubstitutionKey;
|
||||
|
||||
public SpecialSubstitution(SpecialType specialSubstitutionKey) : base(NodeType.SpecialSubstitution)
|
||||
{
|
||||
_specialSubstitutionKey = specialSubstitutionKey;
|
||||
}
|
||||
|
||||
public void SetExtended()
|
||||
{
|
||||
Type = NodeType.ExpandedSpecialSubstitution;
|
||||
}
|
||||
|
||||
public override string GetName()
|
||||
{
|
||||
switch (_specialSubstitutionKey)
|
||||
{
|
||||
case SpecialType.Allocator:
|
||||
return "allocator";
|
||||
case SpecialType.BasicString:
|
||||
return "basic_string";
|
||||
case SpecialType.String:
|
||||
if (Type == NodeType.ExpandedSpecialSubstitution)
|
||||
{
|
||||
return "basic_string";
|
||||
}
|
||||
|
||||
return "string";
|
||||
case SpecialType.IStream:
|
||||
return "istream";
|
||||
case SpecialType.OStream:
|
||||
return "ostream";
|
||||
case SpecialType.IOStream:
|
||||
return "iostream";
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private string GetExtendedName()
|
||||
{
|
||||
switch (_specialSubstitutionKey)
|
||||
{
|
||||
case SpecialType.Allocator:
|
||||
return "std::allocator";
|
||||
case SpecialType.BasicString:
|
||||
return "std::basic_string";
|
||||
case SpecialType.String:
|
||||
return "std::basic_string<char, std::char_traits<char>, std::allocator<char> >";
|
||||
case SpecialType.IStream:
|
||||
return "std::basic_istream<char, std::char_traits<char> >";
|
||||
case SpecialType.OStream:
|
||||
return "std::basic_ostream<char, std::char_traits<char> >";
|
||||
case SpecialType.IOStream:
|
||||
return "std::basic_iostream<char, std::char_traits<char> >";
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
if (Type == NodeType.ExpandedSpecialSubstitution)
|
||||
{
|
||||
writer.Write(GetExtendedName());
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write("std::");
|
||||
writer.Write(GetName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class StdQualifiedName : ParentNode
|
||||
{
|
||||
public StdQualifiedName(BaseNode child) : base(NodeType.StdQualifiedName, child) { }
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("std::");
|
||||
Child.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class TemplateArguments : NodeArray
|
||||
{
|
||||
public TemplateArguments(List<BaseNode> nodes) : base(nodes, NodeType.TemplateArguments) { }
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
string Params = string.Join<BaseNode>(", ", Nodes.ToArray());
|
||||
|
||||
writer.Write("<");
|
||||
|
||||
writer.Write(Params);
|
||||
|
||||
if (Params.EndsWith(">"))
|
||||
{
|
||||
writer.Write(" ");
|
||||
}
|
||||
|
||||
writer.Write(">");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
|
||||
{
|
||||
public class ThrowExpression : BaseNode
|
||||
{
|
||||
private BaseNode _expression;
|
||||
|
||||
public ThrowExpression(BaseNode expression) : base(NodeType.ThrowExpression)
|
||||
{
|
||||
_expression = expression;
|
||||
}
|
||||
|
||||
public override void PrintLeft(TextWriter writer)
|
||||
{
|
||||
writer.Write("throw ");
|
||||
_expression.Print(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
3367
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Demangler.cs
Normal file
3367
src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Demangler.cs
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user