Browse Source

Merge pull request #168 from InitialForce/feature_ast_add_field_value

Add support for a expression type in the AST and make it possible to specify expression/value for a field.
pull/186/head
João Matos 12 years ago
parent
commit
babdfd4c5e
  1. 49
      src/AST/Expression.cs
  2. 2
      src/AST/Field.cs
  3. 41
      src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs
  4. 4
      src/Generator/Generators/CSharp/CSharpGenerator.cs
  5. 24
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  6. 13
      src/Generator/Types/IExpressionPrinter.cs

49
src/AST/Expression.cs

@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
using System;
namespace CppSharp.AST
{
public abstract class Expression
{
public string DebugText;
public abstract TV Visit<TV>(IExpressionVisitor<TV> visitor);
}
public class BuiltinTypeExpression : Expression
{
public long Value { get; set; }
public BuiltinType Type { get; set; }
public bool IsHexadecimal
{
get
{
if (DebugText == null)
{
return false;
}
return DebugText.Contains("0x") || DebugText.Contains("0X");
}
}
public override string ToString()
{
var printAsHex = IsHexadecimal && Type.IsUnsigned;
var format = printAsHex ? "x" : string.Empty;
var value = Type.IsUnsigned ? Value.ToString(format) :
((long)Value).ToString(format);
return printAsHex ? "0x" + value : value;
}
public override T Visit<T>(IExpressionVisitor<T> visitor)
{
return visitor.VisitBuiltinExpression(this);
}
}
public interface IExpressionVisitor<out T>
{
T VisitBuiltinExpression(BuiltinTypeExpression builtinType);
}
}

2
src/AST/Field.cs

@ -16,6 +16,8 @@ namespace CppSharp.AST @@ -16,6 +16,8 @@ namespace CppSharp.AST
get { return Offset / (sizeof (byte) * 8); }
}
public Expression Expression { get; set; }
public Field()
{
Offset = 0;

41
src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs

@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
using CppSharp.AST;
using CppSharp.Types;
namespace CppSharp.Generators.CSharp
{
public class CSharpExpressionPrinterResult
{
public string Value;
public override string ToString()
{
return Value;
}
}
public static class CSharpExpressionPrinterExtensions
{
public static CSharpExpressionPrinterResult CSharpValue(this Expression value,
CSharpExpressionPrinter printer)
{
return value.Visit(printer);
}
}
public class CSharpExpressionPrinter : IExpressionPrinter<CSharpExpressionPrinterResult>,
IExpressionVisitor<CSharpExpressionPrinterResult>
{
public CSharpExpressionPrinterResult VisitBuiltinExpression(BuiltinTypeExpression builtinType)
{
return new CSharpExpressionPrinterResult()
{
Value = builtinType.ToString(),
};
}
public string ToString(Type type)
{
throw new System.NotImplementedException();
}
}
}

4
src/Generator/Generators/CSharp/CSharpGenerator.cs

@ -7,10 +7,12 @@ namespace CppSharp.Generators.CSharp @@ -7,10 +7,12 @@ namespace CppSharp.Generators.CSharp
public class CSharpGenerator : Generator
{
private readonly CSharpTypePrinter typePrinter;
private readonly CSharpExpressionPrinter expressionPrinter;
public CSharpGenerator(Driver driver) : base(driver)
{
typePrinter = new CSharpTypePrinter(driver.TypeDatabase, driver.ASTContext);
expressionPrinter = new CSharpExpressionPrinter();
CppSharp.AST.Type.TypePrinterDelegate += type => type.Visit(typePrinter).Type;
}
@ -18,7 +20,7 @@ namespace CppSharp.Generators.CSharp @@ -18,7 +20,7 @@ namespace CppSharp.Generators.CSharp
{
var outputs = new List<Template>();
var template = new CSharpTextTemplate(Driver, unit, typePrinter);
var template = new CSharpTextTemplate(Driver, unit, typePrinter, expressionPrinter);
outputs.Add(template);
return outputs;

24
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -106,17 +106,18 @@ namespace CppSharp.Generators.CSharp @@ -106,17 +106,18 @@ namespace CppSharp.Generators.CSharp
public class CSharpTextTemplate : Template
{
public CSharpTypePrinter TypePrinter { get; private set; }
public CSharpExpressionPrinter ExpressionPrinter { get; private set; }
public override string FileExtension
{
get { return "cs"; }
}
public CSharpTextTemplate(Driver driver, TranslationUnit unit,
CSharpTypePrinter typePrinter)
public CSharpTextTemplate(Driver driver, TranslationUnit unit, CSharpTypePrinter typePrinter, CSharpExpressionPrinter expressionPrinter)
: base(driver, unit)
{
TypePrinter = typePrinter;
ExpressionPrinter = expressionPrinter;
}
#region Identifiers
@ -801,17 +802,26 @@ namespace CppSharp.Generators.CSharp @@ -801,17 +802,26 @@ namespace CppSharp.Generators.CSharp
private void GenerateClassInternalsField(Field field)
{
var safeIdentifier = SafeIdentifier(field.OriginalName);
PushBlock(CSharpBlockKind.Field);
WriteLine("[FieldOffset({0})]", field.OffsetInBytes);
var result = field.QualifiedType.CSharpType(TypePrinter);
Write("public {0} {1}", result.Type, SafeIdentifier(field.OriginalName));
var fieldTypePrinted = field.QualifiedType.CSharpType(TypePrinter);
if (!string.IsNullOrWhiteSpace(result.NameSuffix))
Write(result.NameSuffix);
if (!string.IsNullOrWhiteSpace(fieldTypePrinted.NameSuffix))
safeIdentifier += fieldTypePrinted.NameSuffix;
WriteLine(";");
if (field.Expression != null)
{
var fieldValuePrinted = field.Expression.CSharpValue(ExpressionPrinter);
Write("public {0} {1} = {2};", fieldTypePrinted.Type, safeIdentifier, fieldValuePrinted);
}
else
{
Write("public {0} {1};", fieldTypePrinted.Type, safeIdentifier);
}
PopBlock(NewLineKind.BeforeNextBlock);
}

13
src/Generator/Types/IExpressionPrinter.cs

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
using CppSharp.AST;
namespace CppSharp.Types
{
public interface IExpressionPrinter
{
string ToString(Type type);
}
public interface IExpressionPrinter<out T> : IExpressionPrinter, IExpressionVisitor<T>
{
}
}
Loading…
Cancel
Save