mirror of https://github.com/mono/CppSharp.git
c-sharpdotnetmonobindingsbridgecclangcpluspluscppsharpglueinteropparserparsingpinvokeswigsyntax-treevisitorsxamarinxamarin-bindings
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1357 lines
40 KiB
1357 lines
40 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Text; |
|
using System.Text.RegularExpressions; |
|
using System.Web.Util; |
|
using CppSharp.AST; |
|
using CppSharp.AST.Extensions; |
|
using CppSharp.Generators.CSharp; |
|
|
|
namespace CppSharp.Generators |
|
{ |
|
public abstract class CodeGenerator : BlockGenerator, IAstVisitor<bool> |
|
{ |
|
public BindingContext Context { get; } |
|
|
|
public DriverOptions Options => Context.Options; |
|
|
|
public List<TranslationUnit> TranslationUnits { get; } |
|
|
|
public TranslationUnit TranslationUnit => TranslationUnits[0]; |
|
|
|
public abstract string FileExtension { get; } |
|
|
|
public virtual string FilePath => |
|
$"{TranslationUnit.FileNameWithoutExtension}.{FileExtension}"; |
|
|
|
/// <summary> |
|
/// Gets the comment style kind for regular comments. |
|
/// </summary> |
|
public virtual CommentKind CommentKind |
|
{ |
|
get |
|
{ |
|
if (!Options.CommentKind.HasValue) |
|
return CommentKind.BCPL; |
|
|
|
return Options.CommentKind.Value; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// Gets the comment style kind for documentation comments. |
|
/// </summary> |
|
public virtual CommentKind DocumentationCommentKind => CommentKind.BCPLSlash; |
|
|
|
public ISet<object> Visited { get; } = new HashSet<object>(); |
|
public AstVisitorOptions VisitOptions { get; } |
|
= new AstVisitorOptions(VisitFlags.Any & ~VisitFlags.PropertyAccessors); |
|
|
|
protected CodeGenerator(BindingContext context) |
|
{ |
|
Context = context; |
|
} |
|
|
|
protected CodeGenerator(BindingContext context, TranslationUnit unit) |
|
: this(context, new List<TranslationUnit> { unit }) |
|
{ |
|
} |
|
|
|
protected CodeGenerator(BindingContext context, IEnumerable<TranslationUnit> units) |
|
{ |
|
Context = context; |
|
if (units != null) |
|
TranslationUnits = new List<TranslationUnit>(units); |
|
} |
|
|
|
public abstract void Process(); |
|
|
|
public virtual void GenerateFilePreamble(CommentKind kind, string generatorName = "CppSharp") |
|
{ |
|
var lines = new List<string> |
|
{ |
|
"----------------------------------------------------------------------------", |
|
"<auto-generated>", |
|
$"This is autogenerated code by {generatorName}.", |
|
"Do not edit this file or all your changes will be lost after re-generation.", |
|
"</auto-generated>", |
|
"----------------------------------------------------------------------------" |
|
}; |
|
|
|
PushBlock(BlockKind.Header); |
|
GenerateMultiLineComment(lines, kind); |
|
PopBlock(); |
|
} |
|
|
|
#region Declaration generation |
|
|
|
public virtual void GenerateDeclarationCommon(Declaration decl) |
|
{ |
|
if (decl.Comment != null) |
|
GenerateComment(decl.Comment); |
|
|
|
GenerateDebug(decl); |
|
} |
|
|
|
public virtual void GenerateDebug(Declaration decl) |
|
{ |
|
if (Options.GenerateDebugOutput && !string.IsNullOrWhiteSpace(decl.DebugText)) |
|
foreach (var line in Regex.Split(decl.DebugText.Trim(), "\r?\n")) |
|
WriteLine($"// DEBUG: {line}"); |
|
} |
|
|
|
#endregion |
|
|
|
#region Comment generation |
|
|
|
public virtual void GenerateSummary(string comment) |
|
{ |
|
if (string.IsNullOrWhiteSpace(comment)) |
|
return; |
|
|
|
var lines = new List<string> |
|
{ |
|
"<summary>", |
|
$"{comment}", |
|
"</summary>" |
|
}; |
|
|
|
GenerateMultiLineComment(lines, DocumentationCommentKind); |
|
} |
|
|
|
public virtual void GenerateInlineSummary(RawComment comment) |
|
{ |
|
GenerateComment(comment); |
|
} |
|
|
|
public virtual void GenerateComment(RawComment comment) |
|
{ |
|
if (comment.FullComment != null) |
|
{ |
|
PushBlock(BlockKind.BlockComment); |
|
ActiveBlock.Text.Print(comment.FullComment, DocumentationCommentKind); |
|
PopBlock(); |
|
return; |
|
} |
|
|
|
if (string.IsNullOrWhiteSpace(comment.BriefText)) |
|
return; |
|
|
|
var lines = new List<string>(); |
|
|
|
if (comment.BriefText.Contains("\n")) |
|
{ |
|
lines.Add("<summary>"); |
|
foreach (string line in HtmlEncoder.HtmlEncode(comment.BriefText).Split( |
|
Environment.NewLine.ToCharArray())) |
|
{ |
|
if (string.IsNullOrWhiteSpace(line)) |
|
continue; |
|
|
|
lines.Add($"<para>{line}</para>"); |
|
} |
|
lines.Add("</summary>"); |
|
} |
|
else |
|
{ |
|
lines.Add($"<summary>{comment.BriefText}</summary>"); |
|
} |
|
|
|
GenerateMultiLineComment(lines, CommentKind); |
|
} |
|
|
|
public virtual void GenerateMultiLineComment(List<string> lines, CommentKind kind) |
|
{ |
|
PushBlock(BlockKind.BlockComment); |
|
|
|
var lineCommentPrologue = Comment.GetLineCommentPrologue(kind); |
|
if (!string.IsNullOrWhiteSpace(lineCommentPrologue)) |
|
WriteLine("{0}", lineCommentPrologue); |
|
|
|
var multiLineCommentPrologue = Comment.GetMultiLineCommentPrologue(kind); |
|
foreach (var line in lines) |
|
WriteLine("{0} {1}", multiLineCommentPrologue, line); |
|
|
|
var lineCommentEpilogue = Comment.GetLineCommentEpilogue(kind); |
|
if (!string.IsNullOrWhiteSpace(lineCommentEpilogue)) |
|
WriteLine("{0}", lineCommentEpilogue); |
|
|
|
PopBlock(); |
|
} |
|
|
|
#endregion |
|
|
|
#region Enum generation |
|
|
|
public virtual void GenerateEnumItems(Enumeration @enum) |
|
{ |
|
for (int i = 0; i < @enum.Items.Count; i++) |
|
{ |
|
var item = @enum.Items[i]; |
|
if (!item.IsGenerated) |
|
continue; |
|
|
|
item.Visit(this); |
|
WriteLine(i == @enum.Items.Count - 1 ? string.Empty : ","); |
|
} |
|
} |
|
|
|
public virtual bool VisitEnumItemDecl(Enumeration.Item item) |
|
{ |
|
if (item.Comment != null) |
|
GenerateInlineSummary(item.Comment); |
|
|
|
Write(item.Name); |
|
|
|
var @enum = item.Namespace as Enumeration; |
|
if (item.ExplicitValue) |
|
Write(" = {0}", @enum.GetItemValueAsString(item)); |
|
|
|
return true; |
|
} |
|
|
|
#endregion |
|
|
|
#region Class generation |
|
|
|
public virtual void GenerateClassSpecifier(Class @class) |
|
{ |
|
} |
|
|
|
#endregion |
|
|
|
#region Method generation |
|
|
|
public enum MethodSpecifierKind |
|
{ |
|
Declaration, |
|
Definition |
|
} |
|
|
|
public virtual void GenerateMethodSpecifier(Method method, |
|
MethodSpecifierKind? kind = null) |
|
{ |
|
} |
|
|
|
#endregion |
|
|
|
#region Visitor methods |
|
|
|
public virtual bool AlreadyVisited(CppSharp.AST.Type type) |
|
{ |
|
return !Visited.Add(type); |
|
} |
|
|
|
public virtual bool AlreadyVisited(Declaration decl) |
|
{ |
|
return !Visited.Add(decl); |
|
} |
|
|
|
public virtual bool VisitDeclaration(Declaration decl) |
|
{ |
|
return !AlreadyVisited(decl); |
|
} |
|
|
|
public virtual bool VisitTranslationUnit(TranslationUnit unit) |
|
{ |
|
return VisitNamespace(unit); |
|
} |
|
|
|
public virtual bool VisitDeclContext(DeclarationContext context) |
|
{ |
|
foreach (var decl in context.Declarations) |
|
{ |
|
if (decl is Function) |
|
continue; |
|
|
|
if (decl is Class && !VisitOptions.VisitNamespaceClasses) |
|
continue; |
|
|
|
if (decl is Enumeration && !VisitOptions.VisitNamespaceEnums) |
|
continue; |
|
|
|
if (decl is Event && !VisitOptions.VisitNamespaceEvents) |
|
continue; |
|
|
|
if (decl is Variable && !VisitOptions.VisitNamespaceVariables) |
|
continue; |
|
|
|
if (decl.IsGenerated) |
|
decl.Visit(this); |
|
} |
|
|
|
if (VisitOptions.VisitNamespaceFunctions) |
|
VisitDeclContextFunctions(context); |
|
|
|
return true; |
|
} |
|
|
|
public virtual void VisitDeclContextFunctions(DeclarationContext context) |
|
{ |
|
foreach (var decl in context.Functions) |
|
decl.Visit(this); |
|
} |
|
|
|
public virtual bool VisitClassDecl(Class @class) |
|
{ |
|
if (@class.IsIncomplete) |
|
return false; |
|
|
|
return VisitClassDeclContext(@class); |
|
} |
|
|
|
public virtual bool VisitClassDeclContext(Class @class) |
|
{ |
|
if (!VisitDeclContext(@class)) |
|
return false; |
|
|
|
foreach (var field in @class.Fields.Where(f => !ASTUtils.CheckIgnoreField(f))) |
|
{ |
|
field.Visit(this); |
|
} |
|
|
|
foreach (var property in @class.Properties.Where(p => !ASTUtils.CheckIgnoreProperty(p))) |
|
{ |
|
property.Visit(this); |
|
} |
|
|
|
VisitClassConstructors(@class); |
|
VisitClassMethods(@class); |
|
|
|
return true; |
|
} |
|
|
|
public virtual void VisitClassMethods(Class @class) |
|
{ |
|
foreach (var method in @class.Methods.Where(c => !ASTUtils.CheckIgnoreMethod(c))) |
|
{ |
|
if (method.IsConstructor) |
|
continue; |
|
|
|
method.Visit(this); |
|
} |
|
} |
|
|
|
public virtual void VisitClassConstructors(Class @class) |
|
{ |
|
foreach (var ctor in @class.Constructors.Where(c => !ASTUtils.CheckIgnoreMethod(c))) |
|
{ |
|
ctor.Visit(this); |
|
} |
|
} |
|
|
|
public virtual bool VisitFieldDecl(Field field) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitFunctionDecl(Function function) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitMethodDecl(Method method) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitParameterDecl(Parameter parameter) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitTypedefNameDecl(TypedefNameDecl typedef) |
|
{ |
|
return typedef.Type.Visit(this, typedef.QualifiedType.Qualifiers); |
|
} |
|
|
|
public virtual bool VisitTypedefDecl(TypedefDecl typedef) |
|
{ |
|
return VisitTypedefNameDecl(typedef); |
|
} |
|
|
|
public virtual bool VisitTypeAliasDecl(TypeAlias typeAlias) |
|
{ |
|
return VisitTypedefNameDecl(typeAlias); |
|
} |
|
|
|
public virtual bool VisitEnumDecl(Enumeration @enum) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitVariableDecl(Variable variable) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitMacroDefinition(MacroDefinition macro) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitNamespace(Namespace @namespace) |
|
{ |
|
return VisitDeclContext(@namespace); |
|
} |
|
|
|
public virtual bool VisitEvent(Event @event) |
|
{ |
|
return true; |
|
} |
|
|
|
public virtual bool VisitProperty(Property property) |
|
{ |
|
if (!VisitDeclaration(property)) |
|
return false; |
|
|
|
if (VisitOptions.VisitPropertyAccessors) |
|
{ |
|
if (property.GetMethod != null) |
|
property.GetMethod.Visit(this); |
|
|
|
if (property.SetMethod != null) |
|
property.SetMethod.Visit(this); |
|
} |
|
|
|
return true; |
|
} |
|
|
|
public virtual bool VisitFriend(Friend friend) |
|
{ |
|
return true; |
|
} |
|
|
|
public virtual bool VisitClassTemplateDecl(ClassTemplate template) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization) |
|
{ |
|
return VisitClassDecl(specialization); |
|
} |
|
|
|
public virtual bool VisitFunctionTemplateDecl(FunctionTemplate template) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitFunctionTemplateSpecializationDecl(FunctionTemplateSpecialization specialization) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitVarTemplateDecl(VarTemplate template) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitVarTemplateSpecializationDecl(VarTemplateSpecialization template) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitTemplateTemplateParameterDecl(TemplateTemplateParameter templateTemplateParameter) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitTemplateParameterDecl(TypeTemplateParameter templateParameter) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitNonTypeTemplateParameterDecl(NonTypeTemplateParameter nonTypeTemplateParameter) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitTypeAliasTemplateDecl(TypeAliasTemplate typeAliasTemplate) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitTagType(TagType tag, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitUnresolvedUsingDecl(UnresolvedUsingTypename unresolvedUsingTypename) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitArrayType(ArrayType array, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitFunctionType(FunctionType function, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitPointerType(PointerType pointer, TypeQualifiers quals) |
|
{ |
|
if (pointer.Pointee == null) |
|
return false; |
|
|
|
return pointer.QualifiedPointee.Visit(this); |
|
} |
|
|
|
public virtual bool VisitMemberPointerType(MemberPointerType member, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitBuiltinType(BuiltinType builtin, TypeQualifiers quals) |
|
{ |
|
return VisitPrimitiveType(builtin.Type, quals); |
|
} |
|
|
|
public virtual bool VisitTypedefType(TypedefType typedef, TypeQualifiers quals) |
|
{ |
|
return typedef.Declaration.Visit(this); |
|
} |
|
|
|
public virtual bool VisitAttributedType(AttributedType attributed, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDecayedType(DecayedType decayed, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitTemplateSpecializationType(TemplateSpecializationType template, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDependentTemplateSpecializationType(DependentTemplateSpecializationType template, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitPrimitiveType(PrimitiveType type, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDeclaration(Declaration decl, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitTemplateParameterType(TemplateParameterType param, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitTemplateParameterSubstitutionType(TemplateParameterSubstitutionType param, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitInjectedClassNameType(InjectedClassNameType injected, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDependentNameType(DependentNameType dependent, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitPackExpansionType(PackExpansionType packExpansionType, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitUnaryTransformType(UnaryTransformType unaryTransformType, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitUnresolvedUsingType(UnresolvedUsingType unresolvedUsingType, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitVectorType(VectorType vectorType, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCILType(CILType type, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitUnsupportedType(UnsupportedType type, TypeQualifiers quals) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitQualifiedType(QualifiedType type) |
|
{ |
|
return type.Type.Visit(this, type.Qualifiers); |
|
} |
|
|
|
public virtual bool VisitStmt(Stmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDeclStmt(DeclStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitNullStmt(NullStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCompoundStmt(CompoundStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitSwitchCase(SwitchCase stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCaseStmt(CaseStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDefaultStmt(DefaultStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitLabelStmt(LabelStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitAttributedStmt(AttributedStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitIfStmt(IfStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitSwitchStmt(SwitchStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitWhileStmt(WhileStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDoStmt(DoStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitForStmt(ForStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitGotoStmt(GotoStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitIndirectGotoStmt(IndirectGotoStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitContinueStmt(ContinueStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitBreakStmt(BreakStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitReturnStmt(ReturnStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitAsmStmt(AsmStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitGCCAsmStmt(GCCAsmStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitMSAsmStmt(MSAsmStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitSEHExceptStmt(SEHExceptStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitSEHFinallyStmt(SEHFinallyStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitSEHTryStmt(SEHTryStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitSEHLeaveStmt(SEHLeaveStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCapturedStmt(CapturedStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXCatchStmt(CXXCatchStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXTryStmt(CXXTryStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXForRangeStmt(CXXForRangeStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitMSDependentExistsStmt(MSDependentExistsStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCoroutineBodyStmt(CoroutineBodyStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCoreturnStmt(CoreturnStmt stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitExpr(Expr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitFullExpr(FullExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitConstantExpr(ConstantExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitOpaqueValueExpr(OpaqueValueExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDeclRefExpr(DeclRefExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitIntegerLiteral(IntegerLiteral stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitFixedPointLiteral(FixedPointLiteral stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCharacterLiteral(CharacterLiteral stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitFloatingLiteral(FloatingLiteral stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitImaginaryLiteral(ImaginaryLiteral stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitStringLiteral(StringLiteral stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitPredefinedExpr(PredefinedExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitParenExpr(ParenExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitUnaryOperator(UnaryOperator stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitOffsetOfExpr(OffsetOfExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitArraySubscriptExpr(ArraySubscriptExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCallExpr(CallExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitMemberExpr(MemberExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCompoundLiteralExpr(CompoundLiteralExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCastExpr(CastExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitImplicitCastExpr(ImplicitCastExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitExplicitCastExpr(ExplicitCastExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCStyleCastExpr(CStyleCastExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitBinaryOperator(BinaryOperator stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCompoundAssignOperator(CompoundAssignOperator stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitAbstractConditionalOperator(AbstractConditionalOperator stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitConditionalOperator(ConditionalOperator stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitBinaryConditionalOperator(BinaryConditionalOperator stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitAddrLabelExpr(AddrLabelExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitStmtExpr(StmtExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitShuffleVectorExpr(ShuffleVectorExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitConvertVectorExpr(ConvertVectorExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitChooseExpr(ChooseExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitGNUNullExpr(GNUNullExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitVAArgExpr(VAArgExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitInitListExpr(InitListExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDesignatedInitExpr(DesignatedInitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitNoInitExpr(NoInitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitArrayInitLoopExpr(ArrayInitLoopExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitArrayInitIndexExpr(ArrayInitIndexExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitImplicitValueInitExpr(ImplicitValueInitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitParenListExpr(ParenListExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitGenericSelectionExpr(GenericSelectionExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitExtVectorElementExpr(ExtVectorElementExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitBlockExpr(BlockExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitAsTypeExpr(AsTypeExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitPseudoObjectExpr(PseudoObjectExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitAtomicExpr(AtomicExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitTypoExpr(TypoExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXOperatorCallExpr(CXXOperatorCallExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXMemberCallExpr(CXXMemberCallExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCUDAKernelCallExpr(CUDAKernelCallExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXNamedCastExpr(CXXNamedCastExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXStaticCastExpr(CXXStaticCastExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXDynamicCastExpr(CXXDynamicCastExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXConstCastExpr(CXXConstCastExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitUserDefinedLiteral(UserDefinedLiteral stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXTypeidExpr(CXXTypeidExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitMSPropertyRefExpr(MSPropertyRefExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXUuidofExpr(CXXUuidofExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXThisExpr(CXXThisExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXThrowExpr(CXXThrowExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXDefaultArgExpr(CXXDefaultArgExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXDefaultInitExpr(CXXDefaultInitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXConstructExpr(CXXConstructExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitLambdaExpr(LambdaExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXNewExpr(CXXNewExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXDeleteExpr(CXXDeleteExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitTypeTraitExpr(TypeTraitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitArrayTypeTraitExpr(ArrayTypeTraitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitExpressionTraitExpr(ExpressionTraitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitOverloadExpr(OverloadExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitUnresolvedLookupExpr(UnresolvedLookupExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitExprWithCleanups(ExprWithCleanups stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitUnresolvedMemberExpr(UnresolvedMemberExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXNoexceptExpr(CXXNoexceptExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitPackExpansionExpr(PackExpansionExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitSizeOfPackExpr(SizeOfPackExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitFunctionParmPackExpr(FunctionParmPackExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCXXFoldExpr(CXXFoldExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCoroutineSuspendExpr(CoroutineSuspendExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCoawaitExpr(CoawaitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitDependentCoawaitExpr(DependentCoawaitExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
public virtual bool VisitCoyieldExpr(CoyieldExpr stmt) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
#endregion |
|
} |
|
|
|
public static class Helpers |
|
{ |
|
public static Regex RegexTag = new Regex(@"^(<|</)[a-zA-Z][\w\-]*?>?$"); |
|
public static Regex RegexCommentCommandLeftover = new Regex(@"^\S*"); |
|
public static readonly string InternalStruct = Generator.GeneratedIdentifier("Internal"); |
|
public static readonly string InstanceField = Generator.GeneratedIdentifier("instance"); |
|
public static readonly string InstanceIdentifier = Generator.GeneratedIdentifier("Instance"); |
|
public static readonly string PrimaryBaseOffsetIdentifier = Generator.GeneratedIdentifier("PrimaryBaseOffset"); |
|
public static readonly string ReturnIdentifier = Generator.GeneratedIdentifier("ret"); |
|
public static readonly string DummyIdentifier = Generator.GeneratedIdentifier("dummy"); |
|
public static readonly string TargetIdentifier = Generator.GeneratedIdentifier("target"); |
|
public static readonly string SlotIdentifier = Generator.GeneratedIdentifier("slot"); |
|
public static readonly string PtrIdentifier = Generator.GeneratedIdentifier("ptr"); |
|
|
|
public static readonly string OwnsNativeInstanceIdentifier = Generator.GeneratedIdentifier("ownsNativeInstance"); |
|
|
|
public static readonly string CreateInstanceIdentifier = Generator.GeneratedIdentifier("CreateInstance"); |
|
public static readonly string GetOrCreateInstanceIdentifier = Generator.GeneratedIdentifier("GetOrCreateInstance"); |
|
public static readonly string RecordNativeToManagedMappingIdentifier = Generator.GeneratedIdentifier("RecordNativeToManagedMapping"); |
|
public static readonly string TryGetNativeToManagedMappingIdentifier = Generator.GeneratedIdentifier("TryGetNativeToManagedMapping"); |
|
|
|
public static string GetSuffixForInternal(Class @class) |
|
{ |
|
var specialization = @class as ClassTemplateSpecialization ?? |
|
@class.Namespace as ClassTemplateSpecialization; |
|
|
|
if (specialization == null) |
|
return string.Empty; |
|
|
|
Class template = specialization.TemplatedDecl.TemplatedClass; |
|
if (@class != specialization) |
|
template = template.Classes.FirstOrDefault(c => c.Name == @class.Name); |
|
|
|
if (template.HasDependentValueFieldInLayout()) |
|
{ |
|
if (specialization.Arguments.All( |
|
a => a.Type.Type?.IsAddress() == true)) |
|
return "_Ptr"; |
|
return GetSuffixFor(specialization); |
|
} |
|
return string.Empty; |
|
} |
|
|
|
public static string GetSuffixFor(Declaration decl) |
|
{ |
|
var suffixBuilder = new StringBuilder(decl.USR); |
|
for (int i = 0; i < suffixBuilder.Length; i++) |
|
if (!char.IsLetterOrDigit(suffixBuilder[i])) |
|
suffixBuilder[i] = '_'; |
|
const int maxCSharpIdentifierLength = 480; |
|
if (suffixBuilder.Length > maxCSharpIdentifierLength) |
|
return suffixBuilder.Remove(maxCSharpIdentifierLength, |
|
suffixBuilder.Length - maxCSharpIdentifierLength).ToString(); |
|
return suffixBuilder.ToString(); |
|
} |
|
|
|
public static string GetAccess(AccessSpecifier accessSpecifier) |
|
{ |
|
switch (accessSpecifier) |
|
{ |
|
case AccessSpecifier.Private: |
|
case AccessSpecifier.Internal: |
|
return "internal "; |
|
case AccessSpecifier.Protected: |
|
return "protected "; |
|
default: |
|
return "public "; |
|
} |
|
} |
|
} |
|
}
|
|
|