mirror of https://github.com/mono/CppSharp.git
23 changed files with 3433 additions and 0 deletions
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
namespace CppSharp.Generators.Registrable.Lua.Sol |
||||
{ |
||||
public class LuaSolGenerationContext : RegistrableGeneratorContext |
||||
{ |
||||
public LuaSolGenerationContext() |
||||
: base() |
||||
{ |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,30 @@
@@ -0,0 +1,30 @@
|
||||
using CppSharp.AST; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace CppSharp.Generators.Registrable.Lua.Sol |
||||
{ |
||||
public class LuaSolGenerator : RegistrableGenerator<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources> |
||||
{ |
||||
public const string Id = "Lua::Sol"; |
||||
public static readonly GeneratorKind Kind = new(Id, "lua::sol", typeof(LuaSolGenerator), typeof(LuaSolTypePrinter), new[] { "lua::sol" }); |
||||
|
||||
public LuaSolGenerator(BindingContext context) : base(context) |
||||
{ |
||||
} |
||||
|
||||
protected override LuaSolGeneratorOptions CreateOptions() |
||||
{ |
||||
return new LuaSolGeneratorOptions(this); |
||||
} |
||||
|
||||
protected override LuaSolHeaders CreateHeader(IEnumerable<TranslationUnit> units) |
||||
{ |
||||
return new LuaSolHeaders(this, units); |
||||
} |
||||
|
||||
protected override LuaSolSources CreateSource(IEnumerable<TranslationUnit> units) |
||||
{ |
||||
return new LuaSolSources(this, units); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
namespace CppSharp.Generators.Registrable.Lua.Sol |
||||
{ |
||||
public class LuaSolGeneratorOptions : TRegistrableGeneratorOptions<LuaSolGenerator> |
||||
{ |
||||
public LuaSolNamingStrategy NamingStrategy; |
||||
|
||||
public LuaSolGeneratorOptions(LuaSolGenerator generator) : base(generator) |
||||
{ |
||||
NamingStrategy = new LuaSolNamingStrategy(generator); |
||||
} |
||||
|
||||
public override string DefaultRootContextType => "::sol::state_view&"; |
||||
|
||||
public override string DefaultRootContextName => "state"; |
||||
|
||||
public override string DefaultTemplateContextDefaultType => "::sol::table"; |
||||
|
||||
public override string DefaultTemplateContextDefaultValue => "::sol::nil"; |
||||
|
||||
public override string DefaultCmakeVariableHeader => "LUA_SOL_BINDINGS_HEADER"; |
||||
|
||||
public override string DefaultCmakeVariableSource => "LUA_SOL_BINDINGS_SOURCE"; |
||||
} |
||||
} |
@ -0,0 +1,82 @@
@@ -0,0 +1,82 @@
|
||||
using System.Collections.Generic; |
||||
using CppSharp.AST; |
||||
|
||||
namespace CppSharp.Generators.Registrable.Lua.Sol |
||||
{ |
||||
public class LuaSolHeaders : LuaSolSources |
||||
{ |
||||
public LuaSolHeaders(LuaSolGenerator generator, IEnumerable<TranslationUnit> units) |
||||
: base(generator, units) |
||||
{ |
||||
} |
||||
|
||||
public override string FileExtension => "h"; |
||||
|
||||
protected override bool TemplateAllowed { get { return true; } } |
||||
|
||||
public override void Process() |
||||
{ |
||||
GenerateFilePreamble(CommentKind.BCPL); |
||||
|
||||
PushBlock(); |
||||
WriteLine("#pragma once"); |
||||
PopBlock(NewLineKind.BeforeNextBlock); |
||||
|
||||
TranslationUnit.Visit(this); |
||||
} |
||||
|
||||
#region TranslationUnit
|
||||
|
||||
public virtual void GenerateTranslationUnitRegistrationFunctionDeclaration(TranslationUnit translationUnit) |
||||
{ |
||||
NewLine(); |
||||
GenerateTranslationUnitRegistrationFunctionSignature(translationUnit); |
||||
WriteLine(";"); |
||||
NewLine(); |
||||
} |
||||
|
||||
public override void GenerateTranslationUnit(TranslationUnit translationUnit) |
||||
{ |
||||
GenerateTranslationUnitNamespaceBegin(translationUnit); |
||||
GenerateTranslationUnitRegistrationFunctionBody(translationUnit); |
||||
GenerateTranslationUnitRegistrationFunctionDeclaration(translationUnit); |
||||
GenerateTranslationUnitNamespaceEnd(translationUnit); |
||||
} |
||||
|
||||
public override bool CanGenerateTranslationUnit(TranslationUnit unit) |
||||
{ |
||||
if (AlreadyVisited(unit)) |
||||
{ |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
public override bool VisitTranslationUnit(TranslationUnit unit) |
||||
{ |
||||
if (!CanGenerateTranslationUnit(unit)) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
GenerateTranslationUnit(unit); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
#endregion
|
||||
|
||||
public virtual void GenerateMain() |
||||
{ |
||||
VisitNamespace(TranslationUnit); |
||||
} |
||||
|
||||
public virtual void GenerateIncludes() |
||||
{ |
||||
if (Generator.GeneratorOptions.BaseInclude != null) |
||||
{ |
||||
WriteLineIndent(Generator.GeneratorOptions.BaseInclude.ToString()); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
namespace CppSharp.Generators.Registrable.Lua.Sol |
||||
{ |
||||
public class LuaSolNamingStrategy : RegistrableNamingStrategy<LuaSolGenerator> |
||||
{ |
||||
public LuaSolNamingStrategy(LuaSolGenerator generator) |
||||
: base(generator) |
||||
{ |
||||
} |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
using CppSharp.Generators; |
||||
using CppSharp.Generators.C; |
||||
|
||||
namespace CppSharp.Generators.Registrable.Lua.Sol |
||||
{ |
||||
public class LuaSolTypePrinter : CppTypePrinter |
||||
{ |
||||
public LuaSolTypePrinter(BindingContext context) : base(context) |
||||
{ |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
|
||||
using CppSharp.AST; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public abstract class RegistrableCodeGenerator<TGenerator> : CodeGenerator |
||||
where TGenerator : Generator |
||||
{ |
||||
public TGenerator Generator { get; set; } |
||||
|
||||
public RegistrableCodeGenerator(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator.Context, units) |
||||
{ |
||||
Generator = generator; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,64 @@
@@ -0,0 +1,64 @@
|
||||
using CppSharp.AST; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public abstract class RegistrableGenerator<TOptions, THeader, TSource> : Generator |
||||
where TOptions : RegistrableGeneratorOptions |
||||
where THeader : CodeGenerator |
||||
where TSource : CodeGenerator |
||||
{ |
||||
public TOptions GeneratorOptions { get; } |
||||
|
||||
public TranslationUnit GlobalTranslationUnit { get; private set; } |
||||
|
||||
public TranslationUnit InheritanceTranslationUnit { get; private set; } |
||||
|
||||
// TODO: Implement when Generator interface is cleaner
|
||||
// public CodeGenerator ModuleHeaderCodeGenerator { get; private set; }
|
||||
|
||||
// TODO: Implement when Generator interface is cleaner
|
||||
//public CodeGenerator ModuleSourceCodeGenerator { get; private set; }
|
||||
|
||||
public RegistrableGenerator(BindingContext context) : base(context) |
||||
{ |
||||
GeneratorOptions = CreateOptions(); |
||||
} |
||||
|
||||
protected abstract TOptions CreateOptions(); |
||||
|
||||
protected abstract THeader CreateHeader(IEnumerable<TranslationUnit> units); |
||||
|
||||
protected abstract TSource CreateSource(IEnumerable<TranslationUnit> units); |
||||
|
||||
public override List<CodeGenerator> Generate(IEnumerable<TranslationUnit> units) |
||||
{ |
||||
return new List<CodeGenerator> |
||||
{ |
||||
CreateHeader(units), |
||||
CreateSource(units) |
||||
}; |
||||
} |
||||
|
||||
// TODO: Should be a better method for this maybe Configure.
|
||||
public override bool SetupPasses() |
||||
{ |
||||
{ |
||||
var module = Context.Options.Modules[1]; |
||||
GlobalTranslationUnit = Context.ASTContext.FindOrCreateTranslationUnit( |
||||
Path.Combine(Context.Options.OutputDir, GeneratorOptions.OutputSubDir, "@package", "global.h") |
||||
); |
||||
GlobalTranslationUnit.Module = module; |
||||
} |
||||
{ |
||||
var module = Context.Options.Modules[1]; |
||||
InheritanceTranslationUnit = Context.ASTContext.FindOrCreateTranslationUnit( |
||||
Path.Combine(Context.Options.OutputDir, GeneratorOptions.OutputSubDir, "@package", "inheritance.h") |
||||
); |
||||
InheritanceTranslationUnit.Module = module; |
||||
} |
||||
return true; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,129 @@
@@ -0,0 +1,129 @@
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public class RegistrableGeneratorContext : InfoMapStack<object> |
||||
{ |
||||
public static readonly InfoEntry IndentLevel = new("CppSharp.Generators.Registrable.IndentLevel"); |
||||
public static readonly InfoEntry IsDetach = new("CppSharp.Generators.Registrable.IsDetach"); |
||||
public static readonly InfoEntry RootContextName = new("CppSharp.Generators.Registrable.RootContextName"); |
||||
public static readonly InfoEntry BindingContext = new("CppSharp.Generators.Registrable.BindingContext"); |
||||
public static readonly InfoEntry CppContext = new("CppSharp.Generators.Registrable.CppContext"); |
||||
public static readonly InfoEntry SanitizeType = new("CppSharp.Generators.Registrable.SanitizeType"); |
||||
public static readonly InfoEntry TypeArgumentsPack = new("CppSharp.Generators.Registrable.TypeArgumentsPack"); |
||||
public static readonly InfoEntry Resolvable = new("CppSharp.Generators.Registrable.Resolvable"); |
||||
public static readonly InfoEntry TemplateLevel = new("CppSharp.Generators.Registrable.TemplateLevel"); |
||||
|
||||
public RegistrableGeneratorContext() |
||||
{ |
||||
} |
||||
|
||||
public DetachmentOption PeekIsDetach() |
||||
{ |
||||
return PeekIsDetach(DetachmentOption.Off); |
||||
} |
||||
|
||||
public DetachmentOption PeekIsDetach(DetachmentOption defaultValue) |
||||
{ |
||||
return Peek(IsDetach, defaultValue); |
||||
} |
||||
|
||||
public void PushIsDetach(DetachmentOption item) |
||||
{ |
||||
Push(IsDetach, item); |
||||
} |
||||
|
||||
public DetachmentOption PopIsDetach() |
||||
{ |
||||
return Pop<DetachmentOption>(IsDetach); |
||||
} |
||||
|
||||
public string PeekRootContextName(string defaultValue = default) |
||||
{ |
||||
return Peek(RootContextName, defaultValue); |
||||
} |
||||
|
||||
public void PushRootContextName(string item) |
||||
{ |
||||
Push(RootContextName, item); |
||||
} |
||||
|
||||
public string PopRootContextName() |
||||
{ |
||||
return Pop<string>(RootContextName); |
||||
} |
||||
|
||||
public string PeekBindingContext(string defaultValue = default) |
||||
{ |
||||
return Peek(BindingContext, defaultValue); |
||||
} |
||||
|
||||
public void PushBindingContext(string item) |
||||
{ |
||||
Push(BindingContext, item); |
||||
} |
||||
|
||||
public string PopBindingContext() |
||||
{ |
||||
return Pop<string>(BindingContext); |
||||
} |
||||
|
||||
public CppContext PeekCppContext(CppContext defaultValue = default) |
||||
{ |
||||
return Peek(CppContext, defaultValue); |
||||
} |
||||
|
||||
public void PushCppContext(CppContext item) |
||||
{ |
||||
Push(CppContext, item); |
||||
} |
||||
|
||||
public CppContext PopCppContext() |
||||
{ |
||||
return Pop<CppContext>(CppContext); |
||||
} |
||||
|
||||
public int PeekTemplateLevel(int defaultValue = default) |
||||
{ |
||||
return Peek(TemplateLevel, defaultValue); |
||||
} |
||||
|
||||
public void PushTemplateLevel(int item) |
||||
{ |
||||
Push(TemplateLevel, item); |
||||
} |
||||
|
||||
public int PopTemplateLevel() |
||||
{ |
||||
return Pop<int>(TemplateLevel); |
||||
} |
||||
} |
||||
|
||||
public class CppContext |
||||
{ |
||||
public string FullyQualifiedName { get; set; } |
||||
public FQNOption Option { get; set; } = FQNOption.IgnoreAll; |
||||
|
||||
public string GetFullQualifiedName(FQNOption option) |
||||
{ |
||||
if (!option.IgnoreTemplateTypenameKeyword) |
||||
{ |
||||
if (!Option.IgnoreTemplateTypenameKeyword) |
||||
{ |
||||
return "typename " + FullyQualifiedName; |
||||
} |
||||
} |
||||
return FullyQualifiedName; |
||||
} |
||||
|
||||
public string GetFullQualifiedName() |
||||
{ |
||||
return GetFullQualifiedName(FQNOption.IgnoreNone); |
||||
} |
||||
}; |
||||
|
||||
public enum DetachmentOption |
||||
{ |
||||
On, |
||||
Off, |
||||
Forced |
||||
} |
||||
} |
@ -0,0 +1,98 @@
@@ -0,0 +1,98 @@
|
||||
using CppSharp.Generators.C; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public enum ImportedClassTemplateMode |
||||
{ |
||||
Direct, |
||||
Indirect, |
||||
Import |
||||
} |
||||
|
||||
public abstract class RegistrableGeneratorOptions |
||||
{ |
||||
public delegate string Delegate(string name); |
||||
|
||||
public virtual Generator Generator { get; set; } |
||||
|
||||
public virtual string OutputSubDir { get; } |
||||
public virtual string RootContextType { get; } |
||||
public virtual string RootContextName { get; } |
||||
public virtual string RegisterFunctionName { get; } |
||||
public virtual CInclude? BaseInclude { get; } |
||||
public Delegate BindingIdNamePredicate { get; } |
||||
public Delegate BindingIdValuePredicate { get; } |
||||
public Delegate BindingNamePredicate { get; } |
||||
public string TemplateTypenameState { get; } |
||||
public string TemplateTypenameContext { get; } |
||||
public string TemplateIdentifierState { get; } |
||||
public string TemplateIdentifierContext { get; } |
||||
public string TemplateContextDefaultType { get; } |
||||
public string TemplateContextDefaultValue { get; } |
||||
public ImportedClassTemplateMode ImportedTemplateMode { get; } |
||||
public string CppValidatorFileName { get; } |
||||
public string CmakeVariableHeader { get; } |
||||
public string CmakeVariableSource { get; } |
||||
public string EqualityFunctionTemplateFullyQualifiedName { get; } |
||||
public string StaticCastFunctionTemplateFullyQualifiedName { get; } |
||||
public string DynamicCastFunctionTemplateFullyQualifiedName { get; } |
||||
|
||||
public virtual string DefaultOutputSubdir => ""; |
||||
public abstract string DefaultRootContextType { get; } |
||||
public abstract string DefaultRootContextName { get; } |
||||
public virtual string DefaultRegisterFunctionName => "register_"; |
||||
public virtual CInclude? DefaultBaseInclude => null; |
||||
public virtual Delegate DefaultBindingIdNamePredicate => (string name) => $"_cppbind_id_{name}"; |
||||
public virtual Delegate DefaultBindingIdValuePredicate => (string name) => $"typeid({name}).name()"; |
||||
public virtual Delegate DefaultBindingNamePredicate => (string name) => $"_cppbind_{name}"; |
||||
public virtual string DefaultTemplateTypenameState => "CppBindState"; |
||||
public virtual string DefaultTemplateTypenameContext => "CppBindContext"; |
||||
public virtual string DefaultTemplateIdentifierState => "cpp_bind_state"; |
||||
public virtual string DefaultTemplateIdentifierContext => "cpp_bind_context"; |
||||
public abstract string DefaultTemplateContextDefaultType { get; } |
||||
public abstract string DefaultTemplateContextDefaultValue { get; } |
||||
public virtual ImportedClassTemplateMode DefaultImportedTemplateMode => ImportedClassTemplateMode.Indirect; |
||||
public virtual string DefaulCppValidatorFileName => "_cppbind_validator_"; |
||||
public virtual string DefaultCmakeVariableHeader => "BINDINGS_HEADER"; |
||||
public virtual string DefaultCmakeVariableSource => "BINDINGS_SOURCE"; |
||||
public virtual string DefaultEqualityFunctionTemplateFullyQualifiedName => null; |
||||
public virtual string DefaultStaticCastFunctionTemplateFullyQualifiedName => null; |
||||
public virtual string DefaultDynamicCastFunctionTemplateFullyQualifiedName => null; |
||||
|
||||
public RegistrableGeneratorOptions(Generator generator) |
||||
{ |
||||
Generator = generator; |
||||
OutputSubDir = DefaultOutputSubdir; |
||||
RootContextType = DefaultRootContextType; |
||||
RootContextName = DefaultRootContextName; |
||||
RegisterFunctionName = DefaultRegisterFunctionName; |
||||
BaseInclude = DefaultBaseInclude; |
||||
BindingIdNamePredicate = DefaultBindingIdNamePredicate; |
||||
BindingIdValuePredicate = DefaultBindingIdValuePredicate; |
||||
BindingNamePredicate = DefaultBindingNamePredicate; |
||||
TemplateTypenameState = DefaultTemplateTypenameState; |
||||
TemplateTypenameContext = DefaultTemplateTypenameContext; |
||||
TemplateIdentifierState = DefaultTemplateIdentifierState; |
||||
TemplateIdentifierContext = DefaultTemplateIdentifierContext; |
||||
TemplateContextDefaultType = DefaultTemplateContextDefaultType; |
||||
TemplateContextDefaultValue = DefaultTemplateContextDefaultValue; |
||||
ImportedTemplateMode = DefaultImportedTemplateMode; |
||||
CppValidatorFileName = DefaulCppValidatorFileName; |
||||
CmakeVariableHeader = DefaultCmakeVariableHeader; |
||||
CmakeVariableSource = DefaultCmakeVariableSource; |
||||
EqualityFunctionTemplateFullyQualifiedName = DefaultEqualityFunctionTemplateFullyQualifiedName; |
||||
StaticCastFunctionTemplateFullyQualifiedName = DefaultStaticCastFunctionTemplateFullyQualifiedName; |
||||
DynamicCastFunctionTemplateFullyQualifiedName = DefaultDynamicCastFunctionTemplateFullyQualifiedName; |
||||
} |
||||
} |
||||
|
||||
public abstract class TRegistrableGeneratorOptions<TGenerator> : RegistrableGeneratorOptions |
||||
where TGenerator : Generator |
||||
{ |
||||
public override TGenerator Generator => (TGenerator)base.Generator; |
||||
|
||||
public TRegistrableGeneratorOptions(TGenerator generator) : base(generator) |
||||
{ |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
|
||||
using CppSharp.AST; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public abstract class RegistrableHeaders<TGenerator> : RegistrableCodeGenerator<TGenerator> |
||||
where TGenerator : Generator |
||||
{ |
||||
public RegistrableHeaders(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator, units) |
||||
{ |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public class RegistrableInfoEntries |
||||
{ |
||||
} |
||||
} |
@ -0,0 +1,19 @@
@@ -0,0 +1,19 @@
|
||||
using CppSharp.AST; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public class RegistrableModuleHeader<TGenerator> : RegistrableCodeGenerator<TGenerator> |
||||
where TGenerator : Generator |
||||
{ |
||||
public RegistrableModuleHeader(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator, units) |
||||
{ |
||||
} |
||||
|
||||
public override string FileExtension { get; } = "h"; |
||||
|
||||
public override void Process() |
||||
{ |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,19 @@
@@ -0,0 +1,19 @@
|
||||
using CppSharp.AST; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public class RegistrableModuleSource<TGenerator> : RegistrableCodeGenerator<TGenerator> |
||||
where TGenerator : Generator |
||||
{ |
||||
public RegistrableModuleSource(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator, units) |
||||
{ |
||||
} |
||||
|
||||
public override string FileExtension { get; } = "cpp"; |
||||
|
||||
public override void Process() |
||||
{ |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,460 @@
@@ -0,0 +1,460 @@
|
||||
using CppSharp.AST; |
||||
using CppSharp.Generators.C; |
||||
using CppSharp.Generators.Registrable.Lua.Sol; |
||||
using System.Collections.Generic; |
||||
using System.Text; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public class RegistrableNamingStrategy<T> where T : LuaSolGenerator |
||||
{ |
||||
protected T Generator; |
||||
|
||||
public RegistrableNamingStrategy(T generator) |
||||
{ |
||||
Generator = generator; |
||||
} |
||||
|
||||
public bool IsNestedTemplate(Declaration declaration) |
||||
{ |
||||
var currentDeclaration = declaration; |
||||
while (true) |
||||
{ |
||||
currentDeclaration = currentDeclaration.OriginalNamespace; |
||||
if (currentDeclaration == null || currentDeclaration is TranslationUnit) |
||||
{ |
||||
break; |
||||
} |
||||
if (Utils.FindDescribedTemplate(currentDeclaration) != null) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public virtual string PrintClassTemplateParameter(Declaration declaration, TemplateParameterOption option) |
||||
{ |
||||
var builder = new StringBuilder(); |
||||
if (declaration is TypeTemplateParameter typeTemplateParameter) |
||||
{ |
||||
if (!option.IgnoreKeyword) |
||||
{ |
||||
builder.Append("typename"); |
||||
if (typeTemplateParameter.IsParameterPack) |
||||
{ |
||||
builder.Append("..."); |
||||
} |
||||
} |
||||
if (!string.IsNullOrEmpty(typeTemplateParameter.OriginalName)) |
||||
{ |
||||
if (!option.IgnoreKeyword) |
||||
{ |
||||
builder.Append(' '); |
||||
} |
||||
if (option.CustomPrefix != null) |
||||
{ |
||||
builder.Append(option.CustomPrefix); |
||||
} |
||||
builder.Append(typeTemplateParameter.OriginalName); |
||||
} |
||||
if (!option.IgnoreKeyword) |
||||
{ |
||||
if (!option.IgnoreDefault) |
||||
{ |
||||
if (typeTemplateParameter.DefaultArgument.Type != null) |
||||
{ |
||||
builder.Append(" = "); |
||||
builder.Append(typeTemplateParameter.DefaultArgument.Type.Visit(new CppTypePrinter(Generator.Context))); |
||||
} |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (typeTemplateParameter.IsParameterPack) |
||||
{ |
||||
builder.Append("..."); |
||||
} |
||||
} |
||||
} |
||||
else if (declaration is NonTypeTemplateParameter nonTypeTemplateParameter) |
||||
{ |
||||
if (!option.IgnoreKeyword) |
||||
{ |
||||
builder.Append(nonTypeTemplateParameter.Type.Visit(new CppTypePrinter(Generator.Context))); |
||||
if (nonTypeTemplateParameter.IsParameterPack) |
||||
{ |
||||
builder.Append("..."); |
||||
} |
||||
} |
||||
if (!string.IsNullOrEmpty(nonTypeTemplateParameter.OriginalName)) |
||||
{ |
||||
if (!option.IgnoreKeyword) |
||||
{ |
||||
builder.Append(' '); |
||||
} |
||||
if (option.CustomPrefix != null) |
||||
{ |
||||
builder.Append(option.CustomPrefix); |
||||
} |
||||
builder.Append(nonTypeTemplateParameter.OriginalName); |
||||
} |
||||
if (!option.IgnoreKeyword) |
||||
{ |
||||
if (!option.IgnoreDefault) |
||||
{ |
||||
if (nonTypeTemplateParameter.DefaultArgument != null) |
||||
{ |
||||
builder.Append(" = "); |
||||
builder.Append(nonTypeTemplateParameter.DefaultArgument.ToString()); |
||||
} |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (nonTypeTemplateParameter.IsParameterPack) |
||||
{ |
||||
builder.Append("..."); |
||||
} |
||||
} |
||||
} |
||||
return builder.ToString(); |
||||
} |
||||
|
||||
public virtual string PrintClassTemplateParameters(List<Declaration> parameters, bool includeEnclosingBrackets, TemplateParameterOption option) |
||||
{ |
||||
var builder = new StringBuilder(); |
||||
if (includeEnclosingBrackets) |
||||
{ |
||||
builder.Append('<'); |
||||
} |
||||
for (int i = 0; i < parameters.Count; i++) |
||||
{ |
||||
if (i > 0) |
||||
{ |
||||
builder.Append(", "); |
||||
} |
||||
builder.Append(PrintClassTemplateParameter(parameters[i], option)); |
||||
} |
||||
if (includeEnclosingBrackets) |
||||
{ |
||||
builder.Append('>'); |
||||
} |
||||
return builder.ToString(); |
||||
} |
||||
|
||||
public virtual string PrintClassTemplateSpecializationArgument(TemplateArgument templateArgument) |
||||
{ |
||||
if (templateArgument.Kind == TemplateArgument.ArgumentKind.Integral) |
||||
{ |
||||
return templateArgument.Integral.ToString(); |
||||
} |
||||
return templateArgument.Type.Type.Visit(new CppTypePrinter(Generator.Context)); |
||||
} |
||||
|
||||
public virtual string PrintClassTemplateSpecializationArguments(List<TemplateArgument> arguments, bool includeEnclosingBrackets) |
||||
{ |
||||
var builder = new StringBuilder(); |
||||
if (includeEnclosingBrackets) |
||||
{ |
||||
builder.Append('<'); |
||||
} |
||||
for (int i = 0; i < arguments.Count; i++) |
||||
{ |
||||
if (i > 0) |
||||
{ |
||||
builder.Append(", "); |
||||
} |
||||
builder.Append(PrintClassTemplateSpecializationArgument(arguments[i])); |
||||
} |
||||
if (includeEnclosingBrackets) |
||||
{ |
||||
builder.Append('>'); |
||||
} |
||||
return builder.ToString(); |
||||
} |
||||
|
||||
public virtual string GetQualifiedName(Declaration declaration, FQNOption option) |
||||
{ |
||||
if (declaration is TranslationUnit) |
||||
{ |
||||
return ""; |
||||
} |
||||
|
||||
var name = declaration.OriginalName; |
||||
var currentDeclaration = declaration; |
||||
|
||||
if (currentDeclaration is ClassTemplateSpecialization specialization) |
||||
{ |
||||
if (!option.IgnoreTemplateParameters) |
||||
{ |
||||
name = ($"{name}{PrintClassTemplateSpecializationArguments(specialization.Arguments, true)}"); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
Template template = null; |
||||
if (currentDeclaration is not ClassTemplate) |
||||
{ |
||||
var describedTemplate = Utils.FindDescribedTemplate(currentDeclaration); |
||||
if (describedTemplate is ClassTemplate) |
||||
{ |
||||
template = (ClassTemplate)describedTemplate; |
||||
} |
||||
} |
||||
if (template != null) |
||||
{ |
||||
if (!option.IgnoreTemplateParameters) |
||||
{ |
||||
name = ($"{name}{PrintClassTemplateParameters(template.Parameters, true, TemplateParameterOption.AsArgument)}"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
return name; |
||||
} |
||||
|
||||
public virtual string GetFullyQualifiedName(Declaration declaration, FQNOption option) |
||||
{ |
||||
if (declaration is TranslationUnit) |
||||
{ |
||||
return ""; |
||||
} |
||||
|
||||
var name = new StringBuilder(); |
||||
var currentDeclaration = declaration; |
||||
var needsTypename = false; |
||||
var depth = 0; |
||||
|
||||
while (true) |
||||
{ |
||||
if (currentDeclaration == null || currentDeclaration is TranslationUnit) |
||||
{ |
||||
break; |
||||
} |
||||
depth += 1; |
||||
var currentName = new StringBuilder(); |
||||
currentName.Append(currentDeclaration.OriginalName); |
||||
|
||||
if (currentDeclaration is ClassTemplateSpecialization specialization) |
||||
{ |
||||
if (!option.IgnoreTemplateTemplateKeyword) |
||||
{ |
||||
if (IsNestedTemplate(currentDeclaration)) |
||||
{ |
||||
currentName.Insert(0, "template "); |
||||
} |
||||
} |
||||
if (!option.IgnoreTemplateParameters) |
||||
{ |
||||
if (depth > 1) |
||||
{ |
||||
needsTypename = true; |
||||
} |
||||
currentName.Append(PrintClassTemplateSpecializationArguments(specialization.Arguments, true)); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (currentDeclaration is not ClassTemplate template) |
||||
{ |
||||
template = (ClassTemplate)Utils.FindDescribedTemplate(currentDeclaration); |
||||
} |
||||
if (template != null) |
||||
{ |
||||
if (!option.IgnoreTemplateTemplateKeyword) |
||||
{ |
||||
if (IsNestedTemplate(currentDeclaration)) |
||||
{ |
||||
currentName.Insert(0, "template "); |
||||
} |
||||
} |
||||
if (!option.IgnoreTemplateParameters) |
||||
{ |
||||
if (depth > 1) |
||||
{ |
||||
needsTypename = true; |
||||
} |
||||
currentName.Append($"{name}{PrintClassTemplateParameters(template.Parameters, true, TemplateParameterOption.AsArgument)}"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
if (name.Length != 0) |
||||
{ |
||||
name.Insert(0, "::"); |
||||
} |
||||
name.Insert(0, currentName); |
||||
currentDeclaration = currentDeclaration.OriginalNamespace; |
||||
} |
||||
if (!option.IgnoreGlobalNamespace) |
||||
{ |
||||
name.Insert(0, "::"); |
||||
} |
||||
if (!option.IgnoreTemplateTypenameKeyword) |
||||
{ |
||||
if (needsTypename) |
||||
{ |
||||
name.Insert(0, "typename "); |
||||
} |
||||
} |
||||
|
||||
return name.ToString(); |
||||
} |
||||
|
||||
public virtual string GetContextualName(Declaration declaration, RegistrableGeneratorContext context, FQNOption option) |
||||
{ |
||||
Class @class = null; |
||||
Template template = null; |
||||
if (declaration is Class) |
||||
{ |
||||
@class = declaration as Class; |
||||
template = Utils.FindDescribedTemplate(declaration); |
||||
} |
||||
else if (declaration is ClassTemplate classTemplate) |
||||
{ |
||||
@class = classTemplate.TemplatedClass; |
||||
template = classTemplate; |
||||
} |
||||
if (@class is Class) |
||||
{ |
||||
if (template is ClassTemplate) |
||||
{ |
||||
// TODO: check if ClassTemplate is collapsible
|
||||
} |
||||
|
||||
if (@class.Access == AccessSpecifier.Protected) |
||||
{ |
||||
return GetCppContext(@class, context, FQNOption.IgnoreNone); |
||||
} |
||||
return GetFullyQualifiedName(declaration, option); |
||||
} |
||||
return GetCppContext(declaration, context, new FQNOption(false, true, false, false)) + "::" + GetQualifiedName(declaration, option); |
||||
} |
||||
|
||||
public virtual string GetRegistrationFunctionName(Declaration declaration, bool isRecusrive = false) |
||||
{ |
||||
if (declaration is TranslationUnit translationUnit) |
||||
{ |
||||
return isRecusrive ? "" : $"register_{translationUnit.FileNameWithoutExtension}"; |
||||
} |
||||
|
||||
var name = declaration.OriginalName; |
||||
var currentDeclaration = declaration; |
||||
while (true) |
||||
{ |
||||
currentDeclaration = currentDeclaration.OriginalNamespace; |
||||
if (currentDeclaration == null || currentDeclaration is TranslationUnit) |
||||
{ |
||||
break; |
||||
} |
||||
name = currentDeclaration.OriginalName + "_" + name; |
||||
} |
||||
return name; |
||||
} |
||||
|
||||
public virtual string GetRegistrationNameQuoted(Declaration declaration) |
||||
{ |
||||
return $"\"{declaration.Name}\""; |
||||
} |
||||
|
||||
public virtual string GetBindingIdName(Declaration declaration) |
||||
{ |
||||
return Generator.GeneratorOptions.BindingIdNamePredicate(GetRegistrationFunctionName(declaration)); |
||||
} |
||||
|
||||
public virtual string GetBindingIdValue(Declaration declaration, RegistrableGeneratorContext context) |
||||
{ |
||||
return Generator.GeneratorOptions.BindingIdValuePredicate(GetContextualName(declaration, context, FQNOption.IgnoreNone)); |
||||
} |
||||
|
||||
public virtual string GetBindingName(Declaration declaration) |
||||
{ |
||||
return Generator.GeneratorOptions.BindingNamePredicate(GetRegistrationFunctionName(declaration)); |
||||
} |
||||
|
||||
public virtual string GetRootContextName(RegistrableGeneratorContext context) |
||||
{ |
||||
if (context != null) |
||||
{ |
||||
var rootContextName = context.PeekRootContextName(); |
||||
if (rootContextName != null) |
||||
{ |
||||
return rootContextName; |
||||
} |
||||
} |
||||
return "state"; |
||||
} |
||||
|
||||
public virtual string GetBindingContextNamespacePredicate(string state, string key) |
||||
{ |
||||
return $"get_namespace({state}, \"{key}\")"; |
||||
} |
||||
|
||||
public virtual string GetBindingContext(Declaration declaration, RegistrableGeneratorContext context) |
||||
{ |
||||
if (context != null) |
||||
{ |
||||
var rootContextName = context.PeekRootContextName(); |
||||
if (rootContextName != null) |
||||
{ |
||||
return rootContextName; |
||||
} |
||||
} |
||||
if (declaration.Namespace is TranslationUnit) |
||||
{ |
||||
return GetRootContextName(context); |
||||
} |
||||
else |
||||
{ |
||||
var name = GetRootContextName(context); |
||||
var currentDeclaration = declaration.Namespace; |
||||
var parentList = new List<Declaration>(); |
||||
while (true) |
||||
{ |
||||
if (currentDeclaration == null || currentDeclaration is TranslationUnit) |
||||
{ |
||||
break; |
||||
} |
||||
parentList.Insert(0, currentDeclaration); |
||||
currentDeclaration = currentDeclaration.Namespace; |
||||
} |
||||
foreach (var parent in parentList) |
||||
{ |
||||
name = GetBindingContextNamespacePredicate(name, parent.Name); |
||||
} |
||||
return name; |
||||
} |
||||
} |
||||
|
||||
public virtual string GetCppContext(Declaration entity, RegistrableGeneratorContext context, FQNOption option) |
||||
{ |
||||
if (context != null) |
||||
{ |
||||
var cppContext = context.PeekCppContext(); |
||||
if (cppContext != null) |
||||
{ |
||||
return cppContext.GetFullQualifiedName(option); |
||||
} |
||||
} |
||||
return GetFullyQualifiedName(entity.OriginalNamespace, option); |
||||
} |
||||
|
||||
public virtual string GetMembershipScopeName(Function function, RegistrableGeneratorContext context) |
||||
{ |
||||
if (function is Method method) |
||||
{ |
||||
return GetCppContext(method, context, new FQNOption() |
||||
{ |
||||
IgnoreTemplateTypenameKeyword = true |
||||
}) + "::"; |
||||
} |
||||
return ""; |
||||
} |
||||
|
||||
public virtual string GetClassTemplateName(Declaration declaration) |
||||
{ |
||||
return $"functor_{GetRegistrationFunctionName(declaration)}"; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
|
||||
using CppSharp.AST; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public abstract class RegistrableSources<TGenerator> : RegistrableCodeGenerator<TGenerator> |
||||
where TGenerator : Generator |
||||
{ |
||||
public RegistrableSources(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator, units) |
||||
{ |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,44 @@
@@ -0,0 +1,44 @@
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public class FQNOption |
||||
{ |
||||
public static readonly FQNOption IgnoreNone = new(false, false, false, false); |
||||
public static readonly FQNOption IgnoreAll = new(true, true, true, true); |
||||
|
||||
public bool IgnoreGlobalNamespace { get; set; } |
||||
public bool IgnoreTemplateTypenameKeyword { get; set; } |
||||
public bool IgnoreTemplateTemplateKeyword { get; set; } |
||||
public bool IgnoreTemplateParameters { get; set; } |
||||
|
||||
public FQNOption(bool ignoreGlobalNamespace = false, |
||||
bool ignoreTemplateTypenameKeyword = false, |
||||
bool ignoreTemplateTemplateKeyword = false, |
||||
bool ignoreTemplateParameters = false) |
||||
{ |
||||
IgnoreGlobalNamespace = ignoreGlobalNamespace; |
||||
IgnoreTemplateTypenameKeyword = ignoreTemplateTypenameKeyword; |
||||
IgnoreTemplateTemplateKeyword = ignoreTemplateTemplateKeyword; |
||||
IgnoreTemplateParameters = ignoreTemplateParameters; |
||||
} |
||||
|
||||
public static FQNOption operator |(FQNOption lhs, FQNOption rhs) |
||||
{ |
||||
return new FQNOption( |
||||
lhs.IgnoreGlobalNamespace | rhs.IgnoreGlobalNamespace, |
||||
lhs.IgnoreTemplateTypenameKeyword | rhs.IgnoreTemplateTypenameKeyword, |
||||
lhs.IgnoreTemplateTemplateKeyword | rhs.IgnoreTemplateTemplateKeyword, |
||||
lhs.IgnoreTemplateParameters | rhs.IgnoreTemplateParameters |
||||
); |
||||
} |
||||
|
||||
public static FQNOption operator &(FQNOption lhs, FQNOption rhs) |
||||
{ |
||||
return new FQNOption( |
||||
lhs.IgnoreGlobalNamespace & rhs.IgnoreGlobalNamespace, |
||||
lhs.IgnoreTemplateTypenameKeyword & rhs.IgnoreTemplateTypenameKeyword, |
||||
lhs.IgnoreTemplateTemplateKeyword & rhs.IgnoreTemplateTemplateKeyword, |
||||
lhs.IgnoreTemplateParameters & rhs.IgnoreTemplateParameters |
||||
); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,65 @@
@@ -0,0 +1,65 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public class InfoEntry : IEquatable<InfoEntry> |
||||
{ |
||||
public static readonly HashSet<InfoEntry> Registered = new(); |
||||
|
||||
public string Name { get; } |
||||
|
||||
public InfoEntry(string name) |
||||
{ |
||||
if (Registered.Any(kind => kind.Name == name)) |
||||
{ |
||||
throw new Exception($"InfoEntry has an already registered name: {Name}"); |
||||
} |
||||
Name = name; |
||||
Registered.Add(this); |
||||
} |
||||
|
||||
public static bool operator ==(InfoEntry obj1, InfoEntry obj2) |
||||
{ |
||||
if (ReferenceEquals(obj1, obj2)) |
||||
{ |
||||
return true; |
||||
} |
||||
if (obj1 is null) |
||||
{ |
||||
return false; |
||||
} |
||||
if (obj2 is null) |
||||
{ |
||||
return false; |
||||
} |
||||
return obj1.Equals(obj2); |
||||
} |
||||
|
||||
public static bool operator !=(InfoEntry obj1, InfoEntry obj2) => !(obj1 == obj2); |
||||
|
||||
public bool Equals(InfoEntry other) |
||||
{ |
||||
if (other is null) |
||||
{ |
||||
return false; |
||||
} |
||||
if (ReferenceEquals(this, other)) |
||||
{ |
||||
return true; |
||||
} |
||||
return Name.Equals(other.Name); |
||||
} |
||||
|
||||
public override bool Equals(object obj) => Equals(obj as InfoEntry); |
||||
|
||||
public override int GetHashCode() |
||||
{ |
||||
unchecked |
||||
{ |
||||
return Name.GetHashCode(); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
|
||||
using System.Collections.Generic; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public class InfoMap<T> : Dictionary<InfoEntry, T> |
||||
{ |
||||
public InfoMap() : base() |
||||
{ |
||||
} |
||||
|
||||
public T1 Get<T1>(InfoEntry infoEntry) where T1 : T |
||||
{ |
||||
return (T1)this[infoEntry]; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Diagnostics.CodeAnalysis; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public class InfoMapStack<T> : InfoMap<Stack<T>> |
||||
{ |
||||
public InfoMapStack() : base() |
||||
{ |
||||
} |
||||
|
||||
public T1 Peek<T1>(InfoEntry infoEntry, T1 defaultValue = default) where T1 : T |
||||
{ |
||||
if (TryGetValue(infoEntry, out Stack<T> stack)) |
||||
{ |
||||
if (stack.Count > 0) |
||||
{ |
||||
return (T1)stack.Peek(); |
||||
} |
||||
} |
||||
return defaultValue; |
||||
} |
||||
|
||||
public T1 Pop<T1>(InfoEntry infoEntry) where T1 : T |
||||
{ |
||||
if (TryGetValue(infoEntry, out Stack<T> stack)) |
||||
{ |
||||
return (T1)stack.Pop(); |
||||
} |
||||
throw new InvalidOperationException(); |
||||
} |
||||
|
||||
public void Push<T1>(InfoEntry infoEntry, T1 item) where T1 : T |
||||
{ |
||||
if (!TryGetValue(infoEntry, out Stack<T> stack)) |
||||
{ |
||||
this[infoEntry] = stack = new Stack<T>(); |
||||
} |
||||
stack.Push(item); |
||||
} |
||||
|
||||
public bool TryPeek<T1>(InfoEntry infoEntry, [MaybeNullWhen(false)] out T1 result) where T1 : T |
||||
{ |
||||
if (TryGetValue(infoEntry, out Stack<T> stack)) |
||||
{ |
||||
bool tempReturn = stack.TryPop(out T tempResult); |
||||
result = (T1)tempResult; |
||||
return tempReturn; |
||||
} |
||||
result = default; |
||||
return false; |
||||
} |
||||
|
||||
public bool TryPop<T1>(InfoEntry infoEntry, [MaybeNullWhen(false)] out T1 result) where T1 : T |
||||
{ |
||||
if (TryGetValue(infoEntry, out Stack<T> stack)) |
||||
{ |
||||
bool tempReturn = stack.TryPop(out T tempResult); |
||||
result = (T1)tempResult; |
||||
return tempReturn; |
||||
} |
||||
result = default; |
||||
return false; |
||||
} |
||||
|
||||
public void Scoped(InfoEntry infoEntry, T item, Action action) |
||||
{ |
||||
Push(infoEntry, item); |
||||
action(); |
||||
Pop<T>(infoEntry); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,22 @@
@@ -0,0 +1,22 @@
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public class TemplateParameterOption |
||||
{ |
||||
public static readonly TemplateParameterOption AsParameter = new(false, false); |
||||
public static readonly TemplateParameterOption AsParameterNoDefault = new(false, true); |
||||
public static readonly TemplateParameterOption AsArgument = new(true, true); |
||||
|
||||
public bool IgnoreKeyword { get; set; } |
||||
public bool IgnoreDefault { get; set; } |
||||
public string CustomPrefix { get; set; } |
||||
|
||||
TemplateParameterOption(bool ignoreKeyword = false, |
||||
bool ignoreDefault = false, |
||||
string customPrefix = "") |
||||
{ |
||||
IgnoreKeyword = ignoreKeyword; |
||||
IgnoreDefault = ignoreDefault; |
||||
CustomPrefix = customPrefix; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,139 @@
@@ -0,0 +1,139 @@
|
||||
using CppSharp.AST; |
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
|
||||
namespace CppSharp.Generators.Registrable |
||||
{ |
||||
public static class Utils |
||||
{ |
||||
public static Template FindDescribedTemplate(Declaration declaration) |
||||
{ |
||||
foreach (var template in declaration.Namespace.Templates) |
||||
{ |
||||
if (template.TemplatedDecl == declaration) |
||||
{ |
||||
return template; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public static DetachmentOption FindDetachmentOption(Declaration declaration) |
||||
{ |
||||
return (declaration.Namespace is Class) ? DetachmentOption.Off : DetachmentOption.On; |
||||
} |
||||
|
||||
public static bool HasPossibleOverload(Function function) |
||||
{ |
||||
var parent = function.OriginalNamespace; |
||||
if (parent is Class @class) |
||||
{ |
||||
foreach (var item in @class.Methods) |
||||
{ |
||||
if (item.OriginalFunction == null) |
||||
{ |
||||
if (item != function) |
||||
{ |
||||
if (item.OriginalName == function.Name) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
foreach (var item in @class.Functions) |
||||
{ |
||||
if (item.OriginalFunction == null) |
||||
{ |
||||
if (item != function) |
||||
{ |
||||
if (item.OriginalName == function.Name) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
foreach (var item in @class.Templates.Where(template => template is FunctionTemplate).Cast<FunctionTemplate>()) |
||||
{ |
||||
var templatedFunction = item.TemplatedFunction; |
||||
if (templatedFunction.OriginalFunction == null) |
||||
{ |
||||
if (templatedFunction != function) |
||||
{ |
||||
if (templatedFunction.OriginalName == function.Name) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
public static bool HasPossibleTemplateOverload(Function function) |
||||
{ |
||||
var parent = function.OriginalNamespace; |
||||
if (parent is Class @class) |
||||
{ |
||||
foreach (var item in @class.Templates.Where(template => template is FunctionTemplate).Cast<FunctionTemplate>()) |
||||
{ |
||||
var templatedFunction = item.TemplatedFunction; |
||||
if (templatedFunction.OriginalFunction == null) |
||||
{ |
||||
if (templatedFunction != function) |
||||
{ |
||||
if (templatedFunction.OriginalName == function.Name) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
public static bool HasPossibleTemplateOverload(Method method) |
||||
{ |
||||
if (method.Kind == CXXMethodKind.UsingDirective) |
||||
{ |
||||
return true; |
||||
} |
||||
return HasPossibleTemplateOverload(method as Function); |
||||
} |
||||
|
||||
public static bool IsDefaultTemplateParameter(Declaration parameter) |
||||
{ |
||||
if (parameter is TypeTemplateParameter typeTemplateParameter) |
||||
{ |
||||
return typeTemplateParameter.DefaultArgument.Type != null; |
||||
} |
||||
else if (parameter is NonTypeTemplateParameter nonTypeTemplateParameter) |
||||
{ |
||||
return nonTypeTemplateParameter.DefaultArgument != null; |
||||
} |
||||
else if (parameter is TemplateTemplateParameter templateTemplateParameter) |
||||
{ |
||||
throw new InvalidOperationException(); |
||||
} |
||||
throw new InvalidOperationException(); |
||||
} |
||||
|
||||
public static bool IsDefaultTemplateParameterList(List<Declaration> parameters) |
||||
{ |
||||
foreach (var parameter in parameters) |
||||
{ |
||||
if (!IsDefaultTemplateParameter(parameter)) |
||||
{ |
||||
return false; |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue