Skip to content

Commit a2b8614

Browse files
committed
Improved the support for constructor expressions.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 4d626e1 commit a2b8614

File tree

20 files changed

+895
-398
lines changed

20 files changed

+895
-398
lines changed

src/AST/Expression.cs

+6-9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Collections.Generic;
2+
13
namespace CppSharp.AST
24
{
35
public abstract class Expression : Statement
@@ -40,19 +42,14 @@ public override T Visit<T>(IExpressionVisitor<T> visitor)
4042
}
4143
}
4244

43-
public class CastExpr : Expression
45+
public class CXXConstructExpr : Expression
4446
{
45-
public Expression SubExpression;
46-
47-
public override T Visit<T>(IExpressionVisitor<T> visitor)
47+
public CXXConstructExpr()
4848
{
49-
return visitor.VisitExpression(this);
49+
Arguments = new List<Expression>();
5050
}
51-
}
5251

53-
public class CtorExpr : Expression
54-
{
55-
public Expression SubExpression;
52+
public List<Expression> Arguments { get; private set; }
5653

5754
public override T Visit<T>(IExpressionVisitor<T> visitor)
5855
{

src/Core/Parser/ASTConverter.cs

+8-22
Original file line numberDiff line numberDiff line change
@@ -921,34 +921,20 @@ private AST.Expression VisitStatement(Statement statement)
921921
expression.Class = AST.StatementClass.CXXOperatorCall;
922922
break;
923923
case StatementClass.CXXConstructExprClass:
924+
var constructorExpression = new AST.CXXConstructExpr();
925+
var constructorExpr = CXXConstructExpr.__CreateInstance(statement.__Instance);
926+
for (uint i = 0; i < constructorExpr.ArgumentsCount; i++)
924927
{
925-
var ctorExp = new AST.CtorExpr();
926-
ctorExp.SubExpression = VisitStatement(((Expression) statement).Subexpression);
927-
expression = ctorExp;
928-
expression.Class = AST.StatementClass.ConstructorReference;
929-
break;
930-
}
931-
case StatementClass.ImplicitCastExpr:
932-
{
933-
var castExp = new AST.CastExpr();
934-
castExp.SubExpression = VisitStatement(((Expression) statement).Subexpression);
935-
expression = castExp;
936-
expression.Class = AST.StatementClass.ImplicitCast;
937-
break;
938-
}
939-
case StatementClass.ExplicitCastExpr:
940-
{
941-
var castExp = new AST.CastExpr();
942-
castExp.SubExpression = VisitStatement(((Expression) statement).Subexpression);
943-
expression = castExp;
944-
expression.Class = AST.StatementClass.ExplicitCast;
945-
break;
928+
var argument = VisitStatement(constructorExpr.getArguments(i));
929+
constructorExpression.Arguments.Add(argument);
946930
}
931+
expression = constructorExpression;
932+
break;
947933
default:
948934
expression = new AST.BuiltinTypeExpression();
949935
break;
950936
}
951-
expression.Declaration = this.typeConverter.declConverter.Visit(statement.Decl);
937+
expression.Declaration = typeConverter.declConverter.Visit(statement.Decl);
952938
expression.String = statement.String;
953939
return expression;
954940
}

src/CppParser/AST.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -475,14 +475,19 @@ DEF_STRING(Statement, String)
475475

476476
Statement::Statement(const std::string& str, StatementClass stmtClass, Declaration* decl) : String(str), Class(stmtClass), Decl(decl) {}
477477

478-
Expression::Expression(const std::string& str, StatementClass stmtClass, Declaration* decl, Expression* subexpr)
479-
:Statement(str, stmtClass, decl), Subexpression(subexpr) {}
478+
Expression::Expression(const std::string& str, StatementClass stmtClass, Declaration* decl)
479+
: Statement(str, stmtClass, decl) {}
480480

481481
BinaryOperator::BinaryOperator(const std::string& str, Expression* lhs, Expression* rhs, const std::string& opcodeStr)
482482
: Expression(str, StatementClass::BinaryOperator), LHS(lhs), RHS(rhs), OpcodeStr(opcodeStr) {}
483483

484484
DEF_STRING(BinaryOperator, OpcodeStr)
485485

486+
CXXConstructExpr::CXXConstructExpr(const std::string& str, Declaration* decl)
487+
: Expression(str, StatementClass::CXXConstructExprClass, decl) {}
488+
489+
DEF_VECTOR(CXXConstructExpr, Expression*, Arguments)
490+
486491
Parameter::Parameter() : Declaration(DeclarationKind::Parameter),
487492
IsIndirect(false), HasDefaultValue(false), DefaultArgument(0) {}
488493

src/CppParser/AST.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -497,8 +497,7 @@ class CS_API Statement
497497
class CS_API Expression : public Statement
498498
{
499499
public:
500-
Expression(const std::string& str, StatementClass Class = StatementClass::Any, Declaration* decl = 0, Expression* subexpr = 0);
501-
Expression* Subexpression;
500+
Expression(const std::string& str, StatementClass Class = StatementClass::Any, Declaration* decl = 0);
502501
};
503502

504503
class CS_API BinaryOperator : public Expression
@@ -510,6 +509,13 @@ class CS_API BinaryOperator : public Expression
510509
STRING(OpcodeStr)
511510
};
512511

512+
class CS_API CXXConstructExpr : public Expression
513+
{
514+
public:
515+
CXXConstructExpr(const std::string& str, Declaration* decl = 0);
516+
VECTOR(Expression*, Arguments)
517+
};
518+
513519
class CS_API Parameter : public Declaration
514520
{
515521
public:

src/CppParser/Bindings/CLI/AST.cpp

+44-12
Original file line numberDiff line numberDiff line change
@@ -1836,16 +1836,6 @@ CppSharp::Parser::AST::Expression::Expression(CppSharp::Parser::AST::Expression^
18361836
NativePtr = new ::CppSharp::CppParser::AST::Expression(arg0);
18371837
}
18381838

1839-
CppSharp::Parser::AST::Expression^ CppSharp::Parser::AST::Expression::Subexpression::get()
1840-
{
1841-
return (((::CppSharp::CppParser::AST::Expression*)NativePtr)->Subexpression == nullptr) ? nullptr : gcnew CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)((::CppSharp::CppParser::AST::Expression*)NativePtr)->Subexpression);
1842-
}
1843-
1844-
void CppSharp::Parser::AST::Expression::Subexpression::set(CppSharp::Parser::AST::Expression^ value)
1845-
{
1846-
((::CppSharp::CppParser::AST::Expression*)NativePtr)->Subexpression = (::CppSharp::CppParser::AST::Expression*)value->NativePtr;
1847-
}
1848-
18491839
CppSharp::Parser::AST::BinaryOperator::BinaryOperator(::CppSharp::CppParser::AST::BinaryOperator* native)
18501840
: CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)native)
18511841
{
@@ -1897,6 +1887,47 @@ void CppSharp::Parser::AST::BinaryOperator::RHS::set(CppSharp::Parser::AST::Expr
18971887
((::CppSharp::CppParser::AST::BinaryOperator*)NativePtr)->RHS = (::CppSharp::CppParser::AST::Expression*)value->NativePtr;
18981888
}
18991889

1890+
CppSharp::Parser::AST::CXXConstructExpr::CXXConstructExpr(::CppSharp::CppParser::AST::CXXConstructExpr* native)
1891+
: CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)native)
1892+
{
1893+
}
1894+
1895+
CppSharp::Parser::AST::CXXConstructExpr^ CppSharp::Parser::AST::CXXConstructExpr::__CreateInstance(::System::IntPtr native)
1896+
{
1897+
return gcnew ::CppSharp::Parser::AST::CXXConstructExpr((::CppSharp::CppParser::AST::CXXConstructExpr*) native.ToPointer());
1898+
}
1899+
1900+
CppSharp::Parser::AST::Expression^ CppSharp::Parser::AST::CXXConstructExpr::getArguments(unsigned int i)
1901+
{
1902+
auto __ret = ((::CppSharp::CppParser::AST::CXXConstructExpr*)NativePtr)->getArguments(i);
1903+
if (__ret == nullptr) return nullptr;
1904+
return (__ret == nullptr) ? nullptr : gcnew CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)__ret);
1905+
}
1906+
1907+
void CppSharp::Parser::AST::CXXConstructExpr::addArguments(CppSharp::Parser::AST::Expression^ s)
1908+
{
1909+
auto arg0 = (::CppSharp::CppParser::AST::Expression*)s->NativePtr;
1910+
((::CppSharp::CppParser::AST::CXXConstructExpr*)NativePtr)->addArguments(arg0);
1911+
}
1912+
1913+
void CppSharp::Parser::AST::CXXConstructExpr::clearArguments()
1914+
{
1915+
((::CppSharp::CppParser::AST::CXXConstructExpr*)NativePtr)->clearArguments();
1916+
}
1917+
1918+
CppSharp::Parser::AST::CXXConstructExpr::CXXConstructExpr(CppSharp::Parser::AST::CXXConstructExpr^ _0)
1919+
: CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)nullptr)
1920+
{
1921+
auto &arg0 = *(::CppSharp::CppParser::AST::CXXConstructExpr*)_0->NativePtr;
1922+
NativePtr = new ::CppSharp::CppParser::AST::CXXConstructExpr(arg0);
1923+
}
1924+
1925+
unsigned int CppSharp::Parser::AST::CXXConstructExpr::ArgumentsCount::get()
1926+
{
1927+
auto __ret = ((::CppSharp::CppParser::AST::CXXConstructExpr*)NativePtr)->getArgumentsCount();
1928+
return __ret;
1929+
}
1930+
19001931
CppSharp::Parser::AST::Parameter::Parameter(::CppSharp::CppParser::AST::Parameter* native)
19011932
: CppSharp::Parser::AST::Declaration((::CppSharp::CppParser::AST::Declaration*)native)
19021933
{
@@ -3852,10 +3883,11 @@ unsigned int CppSharp::Parser::AST::TParamCommandComment::getPosition(unsigned i
38523883
return __ret;
38533884
}
38543885

3855-
void CppSharp::Parser::AST::TParamCommandComment::addPosition(unsigned int* s)
3886+
void CppSharp::Parser::AST::TParamCommandComment::addPosition([System::Runtime::InteropServices::In, System::Runtime::InteropServices::Out] unsigned int% s)
38563887
{
3857-
auto arg0 = (unsigned int&)s;
3888+
unsigned int arg0 = s;
38583889
((::CppSharp::CppParser::AST::TParamCommandComment*)NativePtr)->addPosition(arg0);
3890+
s = arg0;
38593891
}
38603892

38613893
void CppSharp::Parser::AST::TParamCommandComment::clearPosition()

src/CppParser/Bindings/CLI/AST.h

+22-7
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ namespace CppSharp
3434
ref class BlockCommandComment;
3535
ref class BlockContentComment;
3636
ref class BuiltinType;
37+
ref class CXXConstructExpr;
3738
ref class Class;
3839
ref class ClassLayout;
3940
ref class ClassTemplate;
@@ -1343,12 +1344,6 @@ namespace CppSharp
13431344
Expression(::CppSharp::CppParser::AST::Expression* native);
13441345
static Expression^ __CreateInstance(::System::IntPtr native);
13451346
Expression(CppSharp::Parser::AST::Expression^ _0);
1346-
1347-
property CppSharp::Parser::AST::Expression^ Subexpression
1348-
{
1349-
CppSharp::Parser::AST::Expression^ get();
1350-
void set(CppSharp::Parser::AST::Expression^);
1351-
}
13521347
};
13531348

13541349
public ref class BinaryOperator : CppSharp::Parser::AST::Expression
@@ -1378,6 +1373,26 @@ namespace CppSharp
13781373
}
13791374
};
13801375

1376+
public ref class CXXConstructExpr : CppSharp::Parser::AST::Expression
1377+
{
1378+
public:
1379+
1380+
CXXConstructExpr(::CppSharp::CppParser::AST::CXXConstructExpr* native);
1381+
static CXXConstructExpr^ __CreateInstance(::System::IntPtr native);
1382+
CXXConstructExpr(CppSharp::Parser::AST::CXXConstructExpr^ _0);
1383+
1384+
property unsigned int ArgumentsCount
1385+
{
1386+
unsigned int get();
1387+
}
1388+
1389+
CppSharp::Parser::AST::Expression^ getArguments(unsigned int i);
1390+
1391+
void addArguments(CppSharp::Parser::AST::Expression^ s);
1392+
1393+
void clearArguments();
1394+
};
1395+
13811396
public ref class Parameter : CppSharp::Parser::AST::Declaration
13821397
{
13831398
public:
@@ -2414,7 +2429,7 @@ namespace CppSharp
24142429

24152430
unsigned int getPosition(unsigned int i);
24162431

2417-
void addPosition(unsigned int* s);
2432+
void addPosition([System::Runtime::InteropServices::In, System::Runtime::InteropServices::Out] unsigned int% s);
24182433

24192434
void clearPosition();
24202435
};

0 commit comments

Comments
 (0)