Update libClangSharp to 10.0.2-beta and improve some codegen handling (#162)

* Exposing additional information about types

* Don't pack as tool for local builds

* Handle Enum as the backing bitfield type

* Handle CXXUuidofExpr

* Handle arrays with a size of 0

* Adding support for alignof UnaryExprOrTypeTraitExpr

* Adding support for GotoStmt and LabelStmt

* Ensure the number of template arguments is correctly returned

* Escape string literals

* Cleaning up how semicolons are emitted and statement bodies are visited

* Upgrading libClangSharp to 10.0.2-beta2

* Adding Microsoft.SourceLink.GitHub

* Fixing the handling of while statement bodies
This commit is contained in:
Tanner Gooding 2020-07-23 11:19:06 -07:00 коммит произвёл GitHub
Родитель 7a873c847c
Коммит 28dd07399a
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
78 изменённых файлов: 2720 добавлений и 481 удалений

Просмотреть файл

@ -65,4 +65,12 @@
<UseSharedCompilation>true</UseSharedCompilation>
</PropertyGroup>
<PropertyGroup Condition="'$(TF_BUILD)' == 'true'">
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" IsImplicitlyDefined="true" PrivateAssets="all" />
</ItemGroup>
</Project>

Просмотреть файл

@ -28,9 +28,10 @@
<!-- Package versions for package references across all projects -->
<ItemGroup>
<PackageReference Update="libClang" Version="10.0.0" />
<PackageReference Update="libClangSharp" Version="10.0.1-beta2" />
<PackageReference Update="libClangSharp" Version="10.0.2-beta2" />
<PackageReference Update="Microsoft.Bcl.HashCode" Version="1.1.0" />
<PackageReference Update="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Update="Microsoft.SourceLink.GitHub" Version="1.0.0" />
<PackageReference Update="System.CommandLine" Version="2.0.0-beta1.20253.1" />
<PackageReference Update="System.Memory" Version="4.5.4" />
<PackageReference Update="xunit" Version="2.4.1" />

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.freebsd.11-x64</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.freebsd.11-x86</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.linux-arm</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.linux-arm64</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.osx-x64</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.sles-x64</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.ubuntu.16.04-x64</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.ubuntu.18.04-x64</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.ubuntu.20.04-x64</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.win-x64</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp.runtime.win-x86</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>libClangSharp</id>
<version>10.0.1-beta2</version>
<version>10.0.2-beta2</version>
<authors>Microsoft and Contributors</authors>
<owners>Microsoft and Contributors</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>

Просмотреть файл

@ -2,57 +2,57 @@
"runtimes": {
"freebsd.11-x64": {
"libClangSharp": {
"libClangSharp.runtime.freebsd.11-x64": "10.0.1-beta2"
"libClangSharp.runtime.freebsd.11-x64": "10.0.2-beta2"
}
},
"freebsd.11-x86": {
"libClangSharp": {
"libClangSharp.runtime.freebsd.11-x86": "10.0.1-beta2"
"libClangSharp.runtime.freebsd.11-x86": "10.0.2-beta2"
}
},
"linux-arm": {
"libClangSharp": {
"libClangSharp.runtime.linux-arm": "10.0.1-beta2"
"libClangSharp.runtime.linux-arm": "10.0.2-beta2"
}
},
"linux-arm64": {
"libClangSharp": {
"libClangSharp.runtime.linux-arm64": "10.0.1-beta2"
"libClangSharp.runtime.linux-arm64": "10.0.2-beta2"
}
},
"osx-x64": {
"libClangSharp": {
"libClangSharp.runtime.osx-x64": "10.0.1-beta2"
"libClangSharp.runtime.osx-x64": "10.0.2-beta2"
}
},
"sles-x64": {
"libClangSharp": {
"libClangSharp.runtime.sles-x64": "10.0.1-beta2"
"libClangSharp.runtime.sles-x64": "10.0.2-beta2"
}
},
"ubuntu.16.04-x64": {
"libClangSharp": {
"libClangSharp.runtime.ubuntu.16.04-x64": "10.0.1-beta2"
"libClangSharp.runtime.ubuntu.16.04-x64": "10.0.2-beta2"
}
},
"ubuntu.18.04-x64": {
"libClangSharp": {
"libClangSharp.runtime.ubuntu.18.04-x64": "10.0.1-beta2"
"libClangSharp.runtime.ubuntu.18.04-x64": "10.0.2-beta2"
}
},
"ubuntu.20.04-x64": {
"libClangSharp": {
"libClangSharp.runtime.ubuntu.20.04-x64": "10.0.1-beta2"
"libClangSharp.runtime.ubuntu.20.04-x64": "10.0.2-beta2"
}
},
"win-x64": {
"libClangSharp": {
"libClangSharp.runtime.win-x64": "10.0.1-beta2"
"libClangSharp.runtime.win-x64": "10.0.2-beta2"
}
},
"win-x86": {
"libClangSharp": {
"libClangSharp.runtime.win-x86": "10.0.1-beta2"
"libClangSharp.runtime.win-x86": "10.0.2-beta2"
}
}
}

Просмотреть файл

@ -119,34 +119,40 @@ namespace ClangSharp
WriteLine(value);
}
public void WriteLine()
{
_contents.Add(_currentLine.ToString());
_currentLine.Clear();
}
public void WriteLine<T>(T value)
{
Write(value);
WriteLine();
WriteNewline();
}
public void WriteNewline()
{
_contents.Add(_currentLine.ToString());
_currentLine.Clear();
NeedsNewline = false;
}
public void WriteNewlineIfNeeded()
{
if (NeedsNewline)
{
WriteLine();
WriteNewline();
}
NeedsNewline = false;
}
public void WriteSemicolon()
{
Write(';');
NeedsSemicolon = false;
NeedsNewline = true;
}
public void WriteSemicolonIfNeeded()
{
if (NeedsSemicolon)
{
WriteLine(';');
WriteSemicolon();
}
NeedsSemicolon = true;
}
}
}

Просмотреть файл

@ -351,7 +351,7 @@ namespace ClangSharp
_outputBuilder.Write(' ');
_outputBuilder.Write(escapedName);
_outputBuilder.Write('[');
_outputBuilder.Write(constantArrayType.Size);
_outputBuilder.Write(Math.Max(constantArrayType.Size, 1));
var elementType = constantArrayType.ElementType;
@ -381,7 +381,8 @@ namespace ClangSharp
_outputBuilder.Write(escapedName);
}
_outputBuilder.WriteLine(';');
_outputBuilder.WriteSemicolon();
_outputBuilder.WriteNewline();
}
private void VisitFunctionDecl(FunctionDecl functionDecl)
@ -605,7 +606,8 @@ namespace ClangSharp
if ((body is null) || isVirtual)
{
_outputBuilder.WriteLine(';');
_outputBuilder.WriteSemicolon();
_outputBuilder.WriteNewline();
}
else
{
@ -614,35 +616,26 @@ namespace ClangSharp
int firstCtorInitializer = functionDecl.Parameters.Any() ? (functionDecl.CursorChildren.IndexOf(functionDecl.Parameters.Last()) + 1) : 0;
int lastCtorInitializer = (functionDecl.Body != null) ? functionDecl.CursorChildren.IndexOf(functionDecl.Body) : functionDecl.CursorChildren.Count;
_outputBuilder.WriteBlockStart();
if (functionDecl is CXXConstructorDecl cxxConstructorDecl)
{
VisitCtorInitializers(this, cxxConstructorDecl, firstCtorInitializer, lastCtorInitializer);
}
if (body is CompoundStmt compoundStmt)
{
_outputBuilder.WriteBlockStart();
_outputBuilder.NeedsSemicolon = true;
if (functionDecl is CXXConstructorDecl cxxConstructorDecl)
{
VisitCtorInitializers(this, cxxConstructorDecl, firstCtorInitializer, lastCtorInitializer);
}
VisitStmts(compoundStmt.Body);
_outputBuilder.WriteBlockEnd();
}
else
{
_outputBuilder.WriteBlockStart();
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
if (functionDecl is CXXConstructorDecl cxxConstructorDecl)
{
VisitCtorInitializers(this, cxxConstructorDecl, firstCtorInitializer, lastCtorInitializer);
}
Visit(body);
_outputBuilder.WriteSemicolonIfNeeded();
_outputBuilder.WriteBlockEnd();
}
_outputBuilder.WriteSemicolonIfNeeded();
_outputBuilder.WriteNewlineIfNeeded();
_outputBuilder.WriteBlockEnd();
}
_outputBuilder.NeedsNewline = true;
@ -657,47 +650,43 @@ namespace ClangSharp
{
var outputBuilder = pinvokeGenerator._outputBuilder;
if (firstCtorInitializer < lastCtorInitializer)
for (int i = firstCtorInitializer; i < lastCtorInitializer; i++)
{
for (int i = firstCtorInitializer; i < lastCtorInitializer; i++)
if (cxxConstructorDecl.CursorChildren[i] is Attr)
{
if (cxxConstructorDecl.CursorChildren[i] is Attr)
{
continue;
}
var memberRef = (Ref)cxxConstructorDecl.CursorChildren[i];
var memberInit = (Stmt)cxxConstructorDecl.CursorChildren[++i];
if (memberInit is ImplicitValueInitExpr)
{
continue;
}
var memberRefName = pinvokeGenerator.GetRemappedCursorName(memberRef.Referenced);
var memberInitName = memberInit.Spelling;
if ((memberInit is ImplicitCastExpr implicitCastExpr) && (implicitCastExpr.SubExpr is DeclRefExpr declRefExpr))
{
memberInitName = pinvokeGenerator.GetRemappedCursorName(declRefExpr.Decl);
}
outputBuilder.WriteIndentation();
if (memberRefName.Equals(memberInitName))
{
outputBuilder.Write("this");
outputBuilder.Write('.');
}
pinvokeGenerator.Visit(memberRef);
outputBuilder.Write(' ');
outputBuilder.Write('=');
outputBuilder.Write(' ');
pinvokeGenerator.Visit(memberInit);
outputBuilder.WriteSemicolonIfNeeded();
continue;
}
outputBuilder.NeedsSemicolon = false;
var memberRef = (Ref)cxxConstructorDecl.CursorChildren[i];
var memberInit = (Stmt)cxxConstructorDecl.CursorChildren[++i];
if (memberInit is ImplicitValueInitExpr)
{
continue;
}
var memberRefName = pinvokeGenerator.GetRemappedCursorName(memberRef.Referenced);
var memberInitName = memberInit.Spelling;
if ((memberInit is ImplicitCastExpr implicitCastExpr) && (implicitCastExpr.SubExpr is DeclRefExpr declRefExpr))
{
memberInitName = pinvokeGenerator.GetRemappedCursorName(declRefExpr.Decl);
}
outputBuilder.WriteIndentation();
if (memberRefName.Equals(memberInitName))
{
outputBuilder.Write("this");
outputBuilder.Write('.');
}
pinvokeGenerator.Visit(memberRef);
outputBuilder.Write(' ');
outputBuilder.Write('=');
outputBuilder.Write(' ');
pinvokeGenerator.Visit(memberInit);
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
}
}
}
@ -918,11 +907,26 @@ namespace ClangSharp
{
if (_config.GenerateExplicitVtbls)
{
_outputBuilder.WriteIndentedLine("public Vtbl* lpVtbl;");
_outputBuilder.WriteIndented("public");
_outputBuilder.Write(' ');
_outputBuilder.Write("Vtbl");
_outputBuilder.Write('*');
_outputBuilder.Write(' ');
_outputBuilder.Write("lpVtbl");
_outputBuilder.WriteSemicolon();
_outputBuilder.WriteNewline();
}
else
{
_outputBuilder.WriteIndentedLine("public void** lpVtbl;");
_outputBuilder.WriteIndented("public");
_outputBuilder.Write(' ');
_outputBuilder.Write("void");
_outputBuilder.Write('*');
_outputBuilder.Write('*');
_outputBuilder.Write(' ');
_outputBuilder.Write("lpVtbl");
_outputBuilder.WriteSemicolon();
_outputBuilder.WriteNewline();
}
_outputBuilder.NeedsNewline = true;
@ -982,7 +986,8 @@ namespace ClangSharp
}
_testOutputBuilder.Write(')');
_testOutputBuilder.WriteLine(';');
_testOutputBuilder.WriteSemicolon();
_testOutputBuilder.WriteNewline();
_testOutputBuilder.WriteBlockEnd();
_testOutputBuilder.NeedsNewline = true;
}
@ -1001,7 +1006,8 @@ namespace ClangSharp
_outputBuilder.Write(GetRemappedCursorName(baseCxxRecordDecl));
_outputBuilder.Write(' ');
_outputBuilder.Write(GetRemappedAnonymousName(cxxBaseSpecifier, "Base"));
_outputBuilder.WriteLine(';');
_outputBuilder.WriteSemicolon();
_outputBuilder.WriteNewline();
_outputBuilder.NeedsNewline = true;
}
@ -1355,7 +1361,8 @@ namespace ClangSharp
outputBuilder.Write(escapedName);
outputBuilder.WriteLine(';');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
}
static void OutputVtblHelperMethod(PInvokeGenerator pinvokeGenerator, OutputBuilder outputBuilder, CXXRecordDecl cxxRecordDecl, CXXMethodDecl cxxMethodDecl, ref int vtblIndex, Dictionary<string, int> hitsPerName)
@ -1432,7 +1439,8 @@ namespace ClangSharp
outputBuilder.Write(returnTypeName);
outputBuilder.Write(' ');
outputBuilder.Write("result");
outputBuilder.WriteLine(';');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
outputBuilder.WriteIndentation();
}
@ -1537,7 +1545,8 @@ namespace ClangSharp
outputBuilder.Write('0');
}
outputBuilder.WriteLine(';');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
if (pinvokeGenerator._config.GenerateCompatibleCode)
{
@ -1630,7 +1639,8 @@ namespace ClangSharp
outputBuilder.Write(nestedRecordDeclName);
outputBuilder.Write(' ');
outputBuilder.Write(nestedRecordDeclFieldName);
outputBuilder.WriteLine(';');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
outputBuilder.NeedsNewline = true;
if (!recordDecl.IsAnonymousStructOrUnion)
@ -1739,7 +1749,8 @@ namespace ClangSharp
outputBuilder.Write('-');
outputBuilder.Write('>');
outputBuilder.Write(fieldName);
outputBuilder.WriteLine(';');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
outputBuilder.WriteBlockEnd();
outputBuilder.WriteBlockEnd();
outputBuilder.WriteBlockEnd();
@ -1753,7 +1764,13 @@ namespace ClangSharp
outputBuilder.Write(contextName);
outputBuilder.Write('.');
outputBuilder.Write(fieldName);
outputBuilder.WriteLine(", 1));");
outputBuilder.Write(',');
outputBuilder.Write(' ');
outputBuilder.Write('1');
outputBuilder.Write(')');
outputBuilder.Write(')');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
}
}
@ -1835,7 +1852,8 @@ namespace ClangSharp
outputBuilder.Write(typeName);
outputBuilder.Write(' ');
outputBuilder.Write(bitfieldName);
outputBuilder.WriteLine(';');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
outputBuilder.NeedsNewline = true;
}
}
@ -1863,6 +1881,12 @@ namespace ClangSharp
var bitwidthHexStringBacking = ((1 << fieldDecl.BitWidthValue) - 1).ToString("X");
var typeBacking = (index > 0) ? types[index - 1] : types[0];
var canonicalTypeBacking = typeBacking.CanonicalType;
if (canonicalTypeBacking.Kind == CXTypeKind.CXType_Enum)
{
canonicalTypeBacking = ((EnumType)canonicalTypeBacking).Decl.IntegerType.CanonicalType;
}
var typeNameBacking = pinvokeGenerator.GetRemappedTypeName(fieldDecl, context: null, typeBacking, out _);
switch (canonicalTypeBacking.Kind)
@ -1924,6 +1948,11 @@ namespace ClangSharp
var bitwidthHexString = ((1 << fieldDecl.BitWidthValue) - 1).ToString("X");
var canonicalType = fieldDecl.Type.CanonicalType;
if (canonicalType.Kind == CXTypeKind.CXType_Enum)
{
canonicalType = ((EnumType)canonicalType).Decl.IntegerType.CanonicalType;
}
switch (canonicalType.Kind)
{
case CXTypeKind.CXType_Char_U:
@ -2034,7 +2063,8 @@ namespace ClangSharp
outputBuilder.Write(')');
}
outputBuilder.WriteLine(';');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
outputBuilder.WriteBlockEnd();
outputBuilder.NeedsNewline = true;
@ -2135,7 +2165,8 @@ namespace ClangSharp
outputBuilder.Write(')');
}
outputBuilder.WriteLine(';');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
outputBuilder.WriteBlockEnd();
outputBuilder.WriteBlockEnd();
}
@ -2237,7 +2268,17 @@ namespace ClangSharp
sizePerDimension[d] = dimension;
}
outputBuilder.WriteLine(';');
if (outputBuilder.NeedsNewline)
{
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
outputBuilder.NeedsNewline = true;
}
else
{
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
}
}
outputBuilder.NeedsNewline = true;
@ -2266,11 +2307,30 @@ namespace ClangSharp
outputBuilder.WriteBlockStart();
outputBuilder.WriteIndentedLine("get");
outputBuilder.WriteBlockStart();
outputBuilder.WriteIndented("fixed (");
outputBuilder.WriteIndented("fixed");
outputBuilder.Write(' ');
outputBuilder.Write('(');
outputBuilder.Write(typeName);
outputBuilder.WriteLine("* pThis = &e0)");
outputBuilder.Write('*');
outputBuilder.Write(' ');
outputBuilder.Write("pThis");
outputBuilder.Write(' ');
outputBuilder.Write('=');
outputBuilder.Write(' ');
outputBuilder.Write('&');
outputBuilder.Write("e0");
outputBuilder.WriteLine(')');
outputBuilder.WriteBlockStart();
outputBuilder.WriteIndentedLine("return ref pThis[index];");
outputBuilder.WriteIndented("return");
outputBuilder.Write(' ');
outputBuilder.Write("ref");
outputBuilder.Write(' ');
outputBuilder.Write("pThis");
outputBuilder.Write('[');
outputBuilder.Write("index");
outputBuilder.Write(']');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
outputBuilder.WriteBlockEnd();
outputBuilder.WriteBlockEnd();
outputBuilder.WriteBlockEnd();
@ -2284,7 +2344,12 @@ namespace ClangSharp
outputBuilder.Write("int.MaxValue");
}
outputBuilder.WriteLine(")[index];");
outputBuilder.Write(')');
outputBuilder.Write('[');
outputBuilder.Write("index");
outputBuilder.Write(']');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
outputBuilder.NeedsNewline = true;
outputBuilder.WriteIndented("public");
outputBuilder.Write(' ');
@ -2314,7 +2379,8 @@ namespace ClangSharp
}
outputBuilder.Write(')');
outputBuilder.WriteLine(';');
outputBuilder.WriteSemicolon();
outputBuilder.WriteNewline();
}
outputBuilder.WriteBlockEnd();
@ -2381,7 +2447,8 @@ namespace ClangSharp
Visit(typedefDecl.CursorChildren.OfType<ParmVarDecl>());
_outputBuilder.Write(')');
_outputBuilder.WriteLine(";");
_outputBuilder.WriteSemicolon();
_outputBuilder.WriteNewline();
}
StopUsingOutputBuilder();
}
@ -2561,7 +2628,7 @@ namespace ClangSharp
}
}
}
else if (type.IsLocalConstQualified && CanBeConstant(type))
else if (type.IsLocalConstQualified && CanBeConstant(type, varDecl.Init))
{
_outputBuilder.Write("const");
_outputBuilder.Write(' ');
@ -2605,7 +2672,8 @@ namespace ClangSharp
Visit(varDecl.Init);
}
_outputBuilder.WriteLine(";");
_outputBuilder.WriteSemicolon();
_outputBuilder.WriteNewline();
if (openedOutputBuilder)
{
@ -2653,15 +2721,15 @@ namespace ClangSharp
}
}
bool CanBeConstant(Type type)
bool CanBeConstant(Type type, Expr initExpr)
{
if (type is AttributedType attributedType)
{
return CanBeConstant(attributedType.ModifiedType);
return CanBeConstant(attributedType.ModifiedType, initExpr);
}
else if (type is AutoType autoType)
{
return CanBeConstant(autoType.CanonicalType);
return CanBeConstant(autoType.CanonicalType, initExpr);
}
else if (type is BuiltinType builtinType)
{
@ -2685,25 +2753,263 @@ namespace ClangSharp
case CXTypeKind.CXType_Float:
case CXTypeKind.CXType_Double:
{
return true;
return IsConstant(initExpr);
}
}
}
else if (type is ElaboratedType elaboratedType)
{
return CanBeConstant(elaboratedType.NamedType);
return CanBeConstant(elaboratedType.NamedType, initExpr);
}
else if (type is EnumType enumType)
{
return CanBeConstant(enumType.Decl.IntegerType);
return CanBeConstant(enumType.Decl.IntegerType, initExpr);
}
else if (type is TypedefType typedefType)
{
return CanBeConstant(typedefType.Decl.UnderlyingType);
return CanBeConstant(typedefType.Decl.UnderlyingType, initExpr);
}
return false;
}
}
bool IsConstant(Expr initExpr)
{
switch (initExpr.StmtClass)
{
// case CX_StmtClass.CX_StmtClass_BinaryConditionalOperator:
// case CX_StmtClass.CX_StmtClass_ConditionalOperator:
// case CX_StmtClass.CX_StmtClass_AddrLabelExpr:
// case CX_StmtClass.CX_StmtClass_ArrayInitIndexExpr:
// case CX_StmtClass.CX_StmtClass_ArrayInitLoopExpr:
// case CX_StmtClass.CX_StmtClass_ArraySubscriptExpr:
// case CX_StmtClass.CX_StmtClass_ArrayTypeTraitExpr:
// case CX_StmtClass.CX_StmtClass_AsTypeExpr:
// case CX_StmtClass.CX_StmtClass_AtomicExpr:
case CX_StmtClass.CX_StmtClass_BinaryOperator:
{
var binaryOperator = (BinaryOperator)initExpr;
return IsConstant(binaryOperator.LHS) && IsConstant(binaryOperator.RHS);
}
// case CX_StmtClass.CX_StmtClass_CompoundAssignOperator:
// case CX_StmtClass.CX_StmtClass_BlockExpr:
// case CX_StmtClass.CX_StmtClass_CXXBindTemporaryExpr:
case CX_StmtClass.CX_StmtClass_CXXBoolLiteralExpr:
{
return true;
}
// case CX_StmtClass.CX_StmtClass_CXXConstructExpr:
// case CX_StmtClass.CX_StmtClass_CXXTemporaryObjectExpr:
// case CX_StmtClass.CX_StmtClass_CXXDefaultArgExpr:
// case CX_StmtClass.CX_StmtClass_CXXDefaultInitExpr:
// case CX_StmtClass.CX_StmtClass_CXXDeleteExpr:
// case CX_StmtClass.CX_StmtClass_CXXDependentScopeMemberExpr:
// case CX_StmtClass.CX_StmtClass_CXXFoldExpr:
// case CX_StmtClass.CX_StmtClass_CXXInheritedCtorInitExpr:
// case CX_StmtClass.CX_StmtClass_CXXNewExpr:
// case CX_StmtClass.CX_StmtClass_CXXNoexceptExpr:
case CX_StmtClass.CX_StmtClass_CXXNullPtrLiteralExpr:
{
return true;
}
// case CX_StmtClass.CX_StmtClass_CXXPseudoDestructorExpr:
// case CX_StmtClass.CX_StmtClass_CXXRewrittenBinaryOperator:
// case CX_StmtClass.CX_StmtClass_CXXScalarValueInitExpr:
// case CX_StmtClass.CX_StmtClass_CXXStdInitializerListExpr:
// case CX_StmtClass.CX_StmtClass_CXXThisExpr:
// case CX_StmtClass.CX_StmtClass_CXXThrowExpr:
// case CX_StmtClass.CX_StmtClass_CXXTypeidExpr:
// case CX_StmtClass.CX_StmtClass_CXXUnresolvedConstructExpr:
// case CX_StmtClass.CX_StmtClass_CXXUuidofExpr:
case CX_StmtClass.CX_StmtClass_CallExpr:
{
return false;
}
// case CX_StmtClass.CX_StmtClass_CUDAKernelCallExpr:
// case CX_StmtClass.CX_StmtClass_CXXMemberCallExpr:
// case CX_StmtClass.CX_StmtClass_CXXOperatorCallExpr:
// case CX_StmtClass.CX_StmtClass_UserDefinedLiteral:
// case CX_StmtClass.CX_StmtClass_BuiltinBitCastExpr:
case CX_StmtClass.CX_StmtClass_CStyleCastExpr:
{
var cStyleCastExpr = (CStyleCastExpr)initExpr;
return IsConstant(cStyleCastExpr.SubExpr);
}
// case CX_StmtClass.CX_StmtClass_CXXFunctionalCastExpr:
// case CX_StmtClass.CX_StmtClass_CXXConstCastExpr:
// case CX_StmtClass.CX_StmtClass_CXXDynamicCastExpr:
// case CX_StmtClass.CX_StmtClass_CXXReinterpretCastExpr:
// case CX_StmtClass.CX_StmtClass_CXXStaticCastExpr:
// case CX_StmtClass.CX_StmtClass_ObjCBridgedCastExpr:
case CX_StmtClass.CX_StmtClass_ImplicitCastExpr:
{
var implicitCastExpr = (ImplicitCastExpr)initExpr;
return IsConstant(implicitCastExpr.SubExpr);
}
case CX_StmtClass.CX_StmtClass_CharacterLiteral:
{
return true;
}
// case CX_StmtClass.CX_StmtClass_ChooseExpr:
// case CX_StmtClass.CX_StmtClass_CompoundLiteralExpr:
// case CX_StmtClass.CX_StmtClass_ConceptSpecializationExpr:
// case CX_StmtClass.CX_StmtClass_ConvertVectorExpr:
// case CX_StmtClass.CX_StmtClass_CoawaitExpr:
// case CX_StmtClass.CX_StmtClass_CoyieldExpr:
case CX_StmtClass.CX_StmtClass_DeclRefExpr:
{
var declRefExpr = (DeclRefExpr)initExpr;
return (declRefExpr.Decl is EnumConstantDecl) ||
((declRefExpr.Decl is VarDecl varDecl) && IsConstant(varDecl.Init));
}
// case CX_StmtClass.CX_StmtClass_DependentCoawaitExpr:
// case CX_StmtClass.CX_StmtClass_DependentScopeDeclRefExpr:
// case CX_StmtClass.CX_StmtClass_DesignatedInitExpr:
// case CX_StmtClass.CX_StmtClass_DesignatedInitUpdateExpr:
// case CX_StmtClass.CX_StmtClass_ExpressionTraitExpr:
// case CX_StmtClass.CX_StmtClass_ExtVectorElementExpr:
// case CX_StmtClass.CX_StmtClass_FixedPointLiteral:
case CX_StmtClass.CX_StmtClass_FloatingLiteral:
{
return true;
}
// case CX_StmtClass.CX_StmtClass_ConstantExpr:
// case CX_StmtClass.CX_StmtClass_ExprWithCleanups:
// case CX_StmtClass.CX_StmtClass_FunctionParmPackExpr:
// case CX_StmtClass.CX_StmtClass_GNUNullExpr:
// case CX_StmtClass.CX_StmtClass_GenericSelectionExpr:
// case CX_StmtClass.CX_StmtClass_ImaginaryLiteral:
// case CX_StmtClass.CX_StmtClass_ImplicitValueInitExpr:
// case CX_StmtClass.CX_StmtClass_InitListExpr:
case CX_StmtClass.CX_StmtClass_IntegerLiteral:
{
return true;
}
// case CX_StmtClass.CX_StmtClass_LambdaExpr:
// case CX_StmtClass.CX_StmtClass_MSPropertyRefExpr:
// case CX_StmtClass.CX_StmtClass_MSPropertySubscriptExpr:
// case CX_StmtClass.CX_StmtClass_MaterializeTemporaryExpr:
case CX_StmtClass.CX_StmtClass_MemberExpr:
{
return false;
}
// case CX_StmtClass.CX_StmtClass_NoInitExpr:
// case CX_StmtClass.CX_StmtClass_OMPArraySectionExpr:
// case CX_StmtClass.CX_StmtClass_ObjCArrayLiteral:
// case CX_StmtClass.CX_StmtClass_ObjCAvailabilityCheckExpr:
// case CX_StmtClass.CX_StmtClass_ObjCBoolLiteralExpr:
// case CX_StmtClass.CX_StmtClass_ObjCBoxedExpr:
// case CX_StmtClass.CX_StmtClass_ObjCDictionaryLiteral:
// case CX_StmtClass.CX_StmtClass_ObjCEncodeExpr:
// case CX_StmtClass.CX_StmtClass_ObjCIndirectCopyRestoreExpr:
// case CX_StmtClass.CX_StmtClass_ObjCIsaExpr:
// case CX_StmtClass.CX_StmtClass_ObjCIvarRefExpr:
// case CX_StmtClass.CX_StmtClass_ObjCMessageExpr:
// case CX_StmtClass.CX_StmtClass_ObjCPropertyRefExpr:
// case CX_StmtClass.CX_StmtClass_ObjCProtocolExpr:
// case CX_StmtClass.CX_StmtClass_ObjCSelectorExpr:
// case CX_StmtClass.CX_StmtClass_ObjCStringLiteral:
// case CX_StmtClass.CX_StmtClass_ObjCSubscriptRefExpr:
// case CX_StmtClass.CX_StmtClass_OffsetOfExpr:
// case CX_StmtClass.CX_StmtClass_OpaqueValueExpr:
// case CX_StmtClass.CX_StmtClass_UnresolvedLookupExpr:
// case CX_StmtClass.CX_StmtClass_UnresolvedMemberExpr:
// case CX_StmtClass.CX_StmtClass_PackExpansionExpr:
case CX_StmtClass.CX_StmtClass_ParenExpr:
{
var parenExpr = (ParenExpr)initExpr;
return IsConstant(parenExpr.SubExpr);
}
// case CX_StmtClass.CX_StmtClass_ParenListExpr:
// case CX_StmtClass.CX_StmtClass_PredefinedExpr:
// case CX_StmtClass.CX_StmtClass_PseudoObjectExpr:
// case CX_StmtClass.CX_StmtClass_RequiresExpr:
// case CX_StmtClass.CX_StmtClass_ShuffleVectorExpr:
// case CX_StmtClass.CX_StmtClass_SizeOfPackExpr:
// case CX_StmtClass.CX_StmtClass_SourceLocExpr:
// case CX_StmtClass.CX_StmtClass_StmtExpr:
case CX_StmtClass.CX_StmtClass_StringLiteral:
{
return true;
}
// case CX_StmtClass.CX_StmtClass_SubstNonTypeTemplateParmExpr:
// case CX_StmtClass.CX_StmtClass_SubstNonTypeTemplateParmPackExpr:
// case CX_StmtClass.CX_StmtClass_TypeTraitExpr:
// case CX_StmtClass.CX_StmtClass_TypoExpr:
case CX_StmtClass.CX_StmtClass_UnaryExprOrTypeTraitExpr:
{
var unaryExprOrTypeTraitExpr = (UnaryExprOrTypeTraitExpr)initExpr;
var argumentType = unaryExprOrTypeTraitExpr.TypeOfArgument;
long size32;
long size64;
long alignment32 = -1;
long alignment64 = -1;
GetTypeSize(unaryExprOrTypeTraitExpr, argumentType, ref alignment32, ref alignment64, out size32, out size64);
switch (unaryExprOrTypeTraitExpr.Kind)
{
case CX_UnaryExprOrTypeTrait.CX_UETT_SizeOf:
{
return (size32 == size64);
}
case CX_UnaryExprOrTypeTrait.CX_UETT_AlignOf:
case CX_UnaryExprOrTypeTrait.CX_UETT_PreferredAlignOf:
{
return (alignment32 == alignment64);
}
default:
{
return false;
}
}
}
case CX_StmtClass.CX_StmtClass_UnaryOperator:
{
var unaryOperator = (UnaryOperator)initExpr;
return IsConstant(unaryOperator.SubExpr);
}
// case CX_StmtClass.CX_StmtClass_VAArgExpr:
default:
{
AddDiagnostic(DiagnosticLevel.Warning, $"Unsupported VarDecl.InitExpr: '{initExpr.StmtClassName}'. Generated bindings may not be constant.", initExpr);
return false;
}
}
}
}
}

Просмотреть файл

@ -32,6 +32,27 @@ namespace ClangSharp
_outputBuilder.Write("break");
}
private void VisitBody(Stmt stmt)
{
if (stmt is CompoundStmt)
{
Visit(stmt);
}
else
{
_outputBuilder.WriteBlockStart();
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
_outputBuilder.NeedsNewline = true;
Visit(stmt);
_outputBuilder.WriteSemicolonIfNeeded();
_outputBuilder.WriteNewlineIfNeeded();
_outputBuilder.WriteBlockEnd();
}
}
private void VisitCallExpr(CallExpr callExpr)
{
var calleeDecl = callExpr.CalleeDecl;
@ -87,42 +108,95 @@ namespace ClangSharp
Visit(caseStmt.LHS);
_outputBuilder.WriteLine(':');
if (caseStmt.SubStmt is CompoundStmt)
{
Visit(caseStmt.SubStmt);
}
else if (caseStmt.SubStmt is SwitchCase)
if (caseStmt.SubStmt is SwitchCase)
{
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
Visit(caseStmt.SubStmt);
}
else
{
_outputBuilder.IncreaseIndentation();
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
Visit(caseStmt.SubStmt);
_outputBuilder.DecreaseIndentation();
VisitBody(caseStmt.SubStmt);
}
_outputBuilder.NeedsNewline = true;
}
private void VisitCharacterLiteral(CharacterLiteral characterLiteral)
{
_outputBuilder.Write(characterLiteral.ValueString);
switch (characterLiteral.Kind)
{
case CX_CharacterKind.CX_CLK_Ascii:
case CX_CharacterKind.CX_CLK_UTF8:
{
if (characterLiteral.Value > ushort.MaxValue)
{
_outputBuilder.Write("0x");
_outputBuilder.Write(characterLiteral.Value.ToString("X8"));
}
else if (characterLiteral.Value > byte.MaxValue)
{
_outputBuilder.Write("0x");
_outputBuilder.Write(characterLiteral.Value.ToString("X4"));
}
else
{
_outputBuilder.Write('(');
_outputBuilder.Write("byte");
_outputBuilder.Write(')');
_outputBuilder.Write('\'');
_outputBuilder.Write(EscapeCharacter((char)characterLiteral.Value));
_outputBuilder.Write('\'');
}
break;
}
case CX_CharacterKind.CX_CLK_Wide:
{
if (_config.GenerateUnixTypes)
{
goto default;
}
goto case CX_CharacterKind.CX_CLK_UTF16;
}
case CX_CharacterKind.CX_CLK_UTF16:
{
if (characterLiteral.Value > ushort.MaxValue)
{
_outputBuilder.Write("0x");
_outputBuilder.Write(characterLiteral.Value.ToString("X8"));
}
else
{
_outputBuilder.Write('\'');
_outputBuilder.Write(EscapeCharacter((char)characterLiteral.Value));
_outputBuilder.Write('\'');
}
break;
}
case CX_CharacterKind.CX_CLK_UTF32:
{
_outputBuilder.Write("0x");
_outputBuilder.Write(characterLiteral.Value.ToString("X8"));
break;
}
default:
{
AddDiagnostic(DiagnosticLevel.Error, $"Unsupported character literal kind: '{characterLiteral.Kind}'. Generated bindings may be incomplete.", characterLiteral);
break;
}
}
}
private void VisitCompoundStmt(CompoundStmt compoundStmt)
{
_outputBuilder.WriteBlockStart();
_outputBuilder.NeedsSemicolon = true;
VisitStmts(compoundStmt.Body);
_outputBuilder.WriteSemicolonIfNeeded();
_outputBuilder.WriteNewlineIfNeeded();
_outputBuilder.WriteBlockEnd();
}
@ -159,6 +233,19 @@ namespace ClangSharp
private void VisitCXXConstructExpr(CXXConstructExpr cxxConstructExpr)
{
var isCopyConstructor = cxxConstructExpr.Constructor.IsCopyConstructor;
if (!isCopyConstructor)
{
_outputBuilder.Write("new");
_outputBuilder.Write(' ');
var constructorName = GetRemappedCursorName(cxxConstructExpr.Constructor);
_outputBuilder.Write(constructorName);
_outputBuilder.Write('(');
}
var args = cxxConstructExpr.Args;
if (args.Count != 0)
@ -172,22 +259,18 @@ namespace ClangSharp
Visit(args[i]);
}
}
if (!isCopyConstructor)
{
_outputBuilder.Write(')');
}
}
private void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr cxxFunctionalCastExpr)
{
if (cxxFunctionalCastExpr.SubExpr is CXXConstructExpr)
{
_outputBuilder.Write("new");
_outputBuilder.Write(' ');
var type = cxxFunctionalCastExpr.Type;
var typeName = GetRemappedTypeName(cxxFunctionalCastExpr, context: null, type, out var nativeTypeName);
_outputBuilder.Write(typeName);
_outputBuilder.Write('(');
Visit(cxxFunctionalCastExpr.SubExpr);
_outputBuilder.Write(')');
}
else
{
@ -245,8 +328,28 @@ namespace ClangSharp
_outputBuilder.Write("this");
}
private void VisitCXXUuidofExpr(CXXUuidofExpr cxxUuidofExpr)
{
_outputBuilder.Write("typeof");
_outputBuilder.Write('(');
var type = cxxUuidofExpr.IsTypeOperand ? cxxUuidofExpr.TypeOperand : cxxUuidofExpr.ExprOperand.Type;
var typeName = GetRemappedTypeName(cxxUuidofExpr, context: null, type, out _);
_outputBuilder.Write(typeName);
_outputBuilder.Write(')');
_outputBuilder.Write('.');
_outputBuilder.Write("GUID");
}
private void VisitDeclRefExpr(DeclRefExpr declRefExpr)
{
if ((declRefExpr.Decl is EnumConstantDecl enumConstantDecl) && (declRefExpr.DeclContext != enumConstantDecl.DeclContext) && (enumConstantDecl.DeclContext is NamedDecl namedDecl))
{
var enumName = GetRemappedCursorName(namedDecl);
_outputBuilder.AddUsingDirective($"static {_config.Namespace}.{enumName}");
}
var name = GetRemappedCursorName(declRefExpr.Decl);
_outputBuilder.Write(EscapeAndStripName(name));
}
@ -268,8 +371,6 @@ namespace ClangSharp
Visit(decl);
}
}
_outputBuilder.NeedsNewline = true;
}
private void VisitDefaultStmt(DefaultStmt defaultStmt)
@ -277,31 +378,14 @@ namespace ClangSharp
_outputBuilder.Write("default");
_outputBuilder.WriteLine(':');
if (defaultStmt.SubStmt != null)
if (defaultStmt.SubStmt is SwitchCase)
{
if (defaultStmt.SubStmt is CompoundStmt)
{
Visit(defaultStmt.SubStmt);
}
else if (defaultStmt.SubStmt is SwitchCase)
{
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
Visit(defaultStmt.SubStmt);
}
else
{
_outputBuilder.IncreaseIndentation();
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
Visit(defaultStmt.SubStmt);
_outputBuilder.DecreaseIndentation();
}
_outputBuilder.NeedsNewline = true;
_outputBuilder.WriteIndentation();
Visit(defaultStmt.SubStmt);
}
else
{
VisitBody(defaultStmt.SubStmt);
}
}
@ -309,30 +393,18 @@ namespace ClangSharp
{
_outputBuilder.WriteLine("do");
if (doStmt.Body is CompoundStmt)
{
Visit(doStmt.Body);
}
else
{
_outputBuilder.IncreaseIndentation();
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
Visit(doStmt.Body);
_outputBuilder.WriteSemicolonIfNeeded();
_outputBuilder.DecreaseIndentation();
}
VisitBody(doStmt.Body);
_outputBuilder.WriteIndented("while");
_outputBuilder.Write(' ');
_outputBuilder.Write('(');
Visit(doStmt.Cond);
_outputBuilder.Write(')');
_outputBuilder.NeedsSemicolon = true;
_outputBuilder.Write(')');
_outputBuilder.WriteSemicolon();
_outputBuilder.WriteNewline();
_outputBuilder.NeedsNewline = true;
}
@ -406,39 +478,30 @@ namespace ClangSharp
{
Visit(forStmt.Init);
}
_outputBuilder.Write(';');
_outputBuilder.WriteSemicolon();
if (forStmt.Cond != null)
{
_outputBuilder.Write(' ');
Visit(forStmt.Cond);
}
_outputBuilder.Write(';');
_outputBuilder.WriteSemicolon();
if (forStmt.Inc != null)
{
_outputBuilder.Write(' ');
Visit(forStmt.Inc);
}
_outputBuilder.Write(')');
_outputBuilder.NeedsNewline = true;
_outputBuilder.WriteLine(')');
if (forStmt.Body is CompoundStmt)
{
Visit(forStmt.Body);
}
else
{
_outputBuilder.IncreaseIndentation();
_outputBuilder.WriteIndentation();
VisitBody(forStmt.Body);
}
_outputBuilder.NeedsSemicolon = true;
Visit(forStmt.Body);
_outputBuilder.DecreaseIndentation();
}
_outputBuilder.NeedsNewline = true;
private void VisitGotoStmt(GotoStmt gotoStmt)
{
_outputBuilder.Write("goto");
_outputBuilder.Write(' ');
_outputBuilder.Write(gotoStmt.Label.Name);
}
private void VisitIfStmt(IfStmt ifStmt)
@ -451,58 +514,36 @@ namespace ClangSharp
_outputBuilder.WriteLine(')');
if (ifStmt.Then is CompoundStmt)
{
Visit(ifStmt.Then);
}
else
{
_outputBuilder.IncreaseIndentation();
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
Visit(ifStmt.Then);
if (ifStmt.Else != null)
{
_outputBuilder.WriteSemicolonIfNeeded();
}
_outputBuilder.DecreaseIndentation();
}
VisitBody(ifStmt.Then);
if (ifStmt.Else != null)
{
_outputBuilder.WriteIndented("else");
_outputBuilder.NeedsNewline = true;
if (ifStmt.Else is CompoundStmt)
{
Visit(ifStmt.Else);
}
else if (ifStmt.Else is IfStmt)
if (ifStmt.Else is IfStmt)
{
_outputBuilder.Write(' ');
_outputBuilder.NeedsNewline = false;
Visit(ifStmt.Else);
}
else
{
_outputBuilder.IncreaseIndentation();
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
Visit(ifStmt.Else);
_outputBuilder.DecreaseIndentation();
_outputBuilder.WriteNewline();
VisitBody(ifStmt.Else);
}
}
_outputBuilder.NeedsNewline = true;
}
private void VisitImplicitCastExpr(ImplicitCastExpr implicitCastExpr)
{
if (implicitCastExpr.SubExpr is IntegerLiteral integerLiteral)
if (implicitCastExpr.CastKind == CX_CastKind.CX_CK_NullToPointer)
{
_outputBuilder.Write("null");
}
else if ((implicitCastExpr.SubExpr is DeclRefExpr declRefExpr) && (declRefExpr.Decl is EnumConstantDecl enumConstantDecl))
{
ForEnumConstantDecl(implicitCastExpr, enumConstantDecl);
}
else if (implicitCastExpr.SubExpr is IntegerLiteral integerLiteral)
{
ForIntegerLiteral(implicitCastExpr, integerLiteral);
}
@ -511,48 +552,57 @@ namespace ClangSharp
Visit(implicitCastExpr.SubExpr);
}
void ForIntegerLiteral(ImplicitCastExpr implicitCastExpr, IntegerLiteral integerLiteral)
void ForEnumConstantDecl(ImplicitCastExpr implicitCastExpr, EnumConstantDecl enumConstantDecl)
{
if ((implicitCastExpr.Type is PointerType) && integerLiteral.ValueString.Equals("0"))
if ((implicitCastExpr.DeclContext is EnumDecl enumDecl) || (PreviousContext is BinaryOperator binaryOperator))
{
// C# doesn't have implicit conversion from zero to a pointer
// so we will manually check and handle the most common case
_outputBuilder.Write("null");
Visit(implicitCastExpr.SubExpr);
}
else
{
var type = implicitCastExpr.Type;
var typeName = GetRemappedTypeName(implicitCastExpr, context: null, type, out var nativeTypeName);
if (implicitCastExpr.DeclContext is EnumDecl enumDecl)
{
var enumDeclName = GetRemappedCursorName(enumDecl);
var enumDeclIntegerTypeName = GetRemappedTypeName(enumDecl, context: null, enumDecl.IntegerType, out var enumDeclNativeTypeName);
WithType("*", ref enumDeclIntegerTypeName, ref enumDeclNativeTypeName);
WithType(enumDeclName, ref enumDeclIntegerTypeName, ref enumDeclNativeTypeName);
typeName = enumDeclIntegerTypeName;
}
var isUncheckedCast = GetIsUncheckedCastNeeded(typeName, implicitCastExpr.SubExpr);
if (isUncheckedCast)
{
_outputBuilder.Write("unchecked");
_outputBuilder.Write('(');
_outputBuilder.Write('(');
_outputBuilder.Write(typeName);
_outputBuilder.Write(')');
}
_outputBuilder.Write('(');
_outputBuilder.Write(typeName);
_outputBuilder.Write(')');
Visit(implicitCastExpr.SubExpr);
}
}
if (isUncheckedCast)
{
_outputBuilder.Write(')');
}
void ForIntegerLiteral(ImplicitCastExpr implicitCastExpr, IntegerLiteral integerLiteral)
{
var type = implicitCastExpr.Type;
var typeName = GetRemappedTypeName(implicitCastExpr, context: null, type, out var nativeTypeName);
if (implicitCastExpr.DeclContext is EnumDecl enumDecl)
{
var enumDeclName = GetRemappedCursorName(enumDecl);
var enumDeclIntegerTypeName = GetRemappedTypeName(enumDecl, context: null, enumDecl.IntegerType, out var enumDeclNativeTypeName);
WithType("*", ref enumDeclIntegerTypeName, ref enumDeclNativeTypeName);
WithType(enumDeclName, ref enumDeclIntegerTypeName, ref enumDeclNativeTypeName);
typeName = enumDeclIntegerTypeName;
}
var isUncheckedCast = GetIsUncheckedCastNeeded(typeName, implicitCastExpr.SubExpr);
if (isUncheckedCast)
{
_outputBuilder.Write("unchecked");
_outputBuilder.Write('(');
_outputBuilder.Write('(');
_outputBuilder.Write(typeName);
_outputBuilder.Write(')');
}
Visit(implicitCastExpr.SubExpr);
if (isUncheckedCast)
{
_outputBuilder.Write(')');
}
}
}
@ -609,11 +659,9 @@ namespace ClangSharp
_outputBuilder.WriteLine(',');
}
_outputBuilder.NeedsNewline = false;
_outputBuilder.NeedsSemicolon = false;
_outputBuilder.DecreaseIndentation();
_outputBuilder.WriteIndented('}');
_outputBuilder.WriteLine(';');
_outputBuilder.NeedsSemicolon = true;
}
void ForRecordType(InitListExpr initListExpr, RecordType recordType)
@ -655,7 +703,7 @@ namespace ClangSharp
}
else
{
_outputBuilder.WriteLine();
_outputBuilder.WriteNewline();
_outputBuilder.WriteBlockStart();
var decl = recordType.Decl;
@ -679,11 +727,9 @@ namespace ClangSharp
_outputBuilder.WriteLine(',');
}
_outputBuilder.NeedsNewline = false;
_outputBuilder.NeedsSemicolon = false;
_outputBuilder.DecreaseIndentation();
_outputBuilder.WriteIndented('}');
_outputBuilder.WriteLine(';');
_outputBuilder.NeedsSemicolon = true;
}
}
@ -716,7 +762,7 @@ namespace ClangSharp
{
var valueString = integerLiteral.ValueString;
if (valueString.EndsWith("L", StringComparison.OrdinalIgnoreCase))
if (valueString.EndsWith("l", StringComparison.OrdinalIgnoreCase))
{
valueString = valueString.Substring(0, valueString.Length - 1);
}
@ -742,12 +788,34 @@ namespace ClangSharp
}
else if (valueString.EndsWith("i64", StringComparison.OrdinalIgnoreCase))
{
valueString = valueString.Substring(0, valueString.Length - 3);
valueString = valueString.Substring(0, valueString.Length - 3) + "L";
}
if (valueString.EndsWith("ul", StringComparison.OrdinalIgnoreCase))
{
valueString = valueString.Substring(0, valueString.Length - 2) + "UL";
}
else if (valueString.EndsWith("l", StringComparison.OrdinalIgnoreCase))
{
valueString = valueString.Substring(0, valueString.Length - 1) + "L";
}
else if (valueString.EndsWith("u", StringComparison.OrdinalIgnoreCase))
{
valueString = valueString.Substring(0, valueString.Length - 1) + "U";
}
_outputBuilder.Write(valueString);
}
private void VisitLabelStmt(LabelStmt labelStmt)
{
_outputBuilder.Write(labelStmt.Decl.Name);
_outputBuilder.WriteLine(':');
_outputBuilder.WriteIndentation();
Visit(labelStmt.SubStmt);
}
private void VisitMemberExpr(MemberExpr memberExpr)
{
if (!memberExpr.IsImplicitAccess)
@ -791,20 +859,11 @@ namespace ClangSharp
private void VisitReturnStmt(ReturnStmt returnStmt)
{
var retValue = returnStmt.RetValue;
_outputBuilder.Write("return");
if ((retValue is null) || (retValue.Type.Kind != CXTypeKind.CXType_Void))
{
_outputBuilder.Write("return");
if (retValue != null)
{
_outputBuilder.Write(' ');
}
}
if (retValue != null)
if (returnStmt.RetValue != null)
{
_outputBuilder.Write(' ');
Visit(returnStmt.RetValue);
}
}
@ -860,7 +919,11 @@ namespace ClangSharp
break;
}
// case CX_StmtClass.CX_StmtClass_GotoStmt:
case CX_StmtClass.CX_StmtClass_GotoStmt:
{
VisitGotoStmt((GotoStmt)stmt);
break;
}
case CX_StmtClass.CX_StmtClass_IfStmt:
{
@ -1029,7 +1092,12 @@ namespace ClangSharp
// case CX_StmtClass.CX_StmtClass_CXXThrowExpr:
// case CX_StmtClass.CX_StmtClass_CXXTypeidExpr:
// case CX_StmtClass.CX_StmtClass_CXXUnresolvedConstructExpr:
// case CX_StmtClass.CX_StmtClass_CXXUuidofExpr:
case CX_StmtClass.CX_StmtClass_CXXUuidofExpr:
{
VisitCXXUuidofExpr((CXXUuidofExpr)stmt);
break;
}
case CX_StmtClass.CX_StmtClass_CallExpr:
case CX_StmtClass.CX_StmtClass_CXXMemberCallExpr:
@ -1207,7 +1275,12 @@ namespace ClangSharp
}
// case CX_StmtClass.CX_StmtClass_VAArgExpr:
// case CX_StmtClass.CX_StmtClass_LabelStmt:
case CX_StmtClass.CX_StmtClass_LabelStmt:
{
VisitLabelStmt((LabelStmt)stmt);
break;
}
case CX_StmtClass.CX_StmtClass_WhileStmt:
{
@ -1230,23 +1303,50 @@ namespace ClangSharp
}
}
private void VisitStmts(IEnumerable<Stmt> stmts)
private void VisitStmts(IReadOnlyList<Stmt> stmts)
{
Stmt previousStmt = null;
var lastIndex = stmts.Count - 1;
var previousStmt = null as Stmt;
foreach (var stmt in stmts)
for (int i = 0; i < lastIndex; i++)
{
if ((previousStmt is DeclStmt declStmt) && (stmt is DeclStmt))
var stmt = stmts[i];
if ((previousStmt is DeclStmt) && !(stmt is DeclStmt))
{
_outputBuilder.NeedsNewline = false;
_outputBuilder.NeedsNewline = true;
}
_outputBuilder.WriteIndentation();
Visit(stmt);
_outputBuilder.NeedsSemicolon = true;
_outputBuilder.NeedsNewline = true;
Visit(stmts[i]);
_outputBuilder.WriteSemicolonIfNeeded();
_outputBuilder.WriteNewline();
previousStmt = stmt;
}
if (lastIndex != -1)
{
var stmt = stmts[lastIndex];
if ((previousStmt is DeclStmt) && !(stmt is DeclStmt))
{
_outputBuilder.NeedsNewline = true;
}
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
_outputBuilder.NeedsNewline = true;
Visit(stmt);
_outputBuilder.WriteSemicolonIfNeeded();
_outputBuilder.WriteNewlineIfNeeded();
}
}
private void VisitStringLiteral(StringLiteral stringLiteral)
@ -1294,7 +1394,7 @@ namespace ClangSharp
case CX_CharacterKind.CX_CLK_UTF16:
{
_outputBuilder.Write('"');
_outputBuilder.Write(stringLiteral.String);
_outputBuilder.Write(EscapeString(stringLiteral.String));
_outputBuilder.Write('"');
break;
}
@ -1317,40 +1417,64 @@ namespace ClangSharp
_outputBuilder.WriteLine(')');
if (switchStmt.Body is CompoundStmt)
{
Visit(switchStmt.Body);
}
else
{
_outputBuilder.WriteBlockStart();
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
Visit(switchStmt.Body);
_outputBuilder.WriteSemicolonIfNeeded();
_outputBuilder.WriteBlockEnd();
}
_outputBuilder.NeedsNewline = true;
VisitBody(switchStmt.Body);
}
private void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr unaryExprOrTypeTraitExpr)
{
var argumentType = unaryExprOrTypeTraitExpr.TypeOfArgument;
long size32;
long size64;
long alignment32 = -1;
long alignment64 = -1;
GetTypeSize(unaryExprOrTypeTraitExpr, argumentType, ref alignment32, ref alignment64, out size32, out size64);
switch (unaryExprOrTypeTraitExpr.Kind)
{
case CX_UnaryExprOrTypeTrait.CX_UETT_SizeOf:
{
_outputBuilder.Write("sizeof");
_outputBuilder.Write('(');
if ((size32 == size64) && (unaryExprOrTypeTraitExpr.DeclContext is VarDecl))
{
_outputBuilder.Write(size32);
}
else
{
_outputBuilder.Write("sizeof");
_outputBuilder.Write('(');
var typeName = GetRemappedTypeName(unaryExprOrTypeTraitExpr, context: null, argumentType, out _);
_outputBuilder.Write(typeName);
var typeName = GetRemappedTypeName(unaryExprOrTypeTraitExpr, context: null, argumentType, out _);
_outputBuilder.Write(typeName);
_outputBuilder.Write(')');
}
break;
}
case CX_UnaryExprOrTypeTrait.CX_UETT_AlignOf:
case CX_UnaryExprOrTypeTrait.CX_UETT_PreferredAlignOf:
{
if (alignment32 == alignment64)
{
_outputBuilder.Write(alignment32);
}
else
{
_outputBuilder.Write("Environment");
_outputBuilder.Write('.');
_outputBuilder.Write("Is64BitProcess");
_outputBuilder.Write(' ');
_outputBuilder.Write('?');
_outputBuilder.Write(' ');
_outputBuilder.Write(alignment64);
_outputBuilder.Write(' ');
_outputBuilder.Write(':');
_outputBuilder.Write(' ');
_outputBuilder.Write(alignment32);
}
_outputBuilder.Write(')');
break;
}
@ -1419,22 +1543,7 @@ namespace ClangSharp
_outputBuilder.WriteLine(')');
if (whileStmt.Body is CompoundStmt)
{
Visit(whileStmt.Body);
}
else
{
_outputBuilder.IncreaseIndentation();
_outputBuilder.WriteIndentation();
_outputBuilder.NeedsSemicolon = true;
Visit(whileStmt.Body);
_outputBuilder.DecreaseIndentation();
}
_outputBuilder.NeedsNewline = true;
VisitBody(whileStmt.Body);
}
}
}

Просмотреть файл

@ -286,12 +286,7 @@ namespace ClangSharp
_outputBuilder.Write("NativeTypeName(");
_outputBuilder.Write('"');
_outputBuilder.Write(nativeTypeName.Replace("\\", "\\\\")
.Replace("\r", "\\r")
.Replace("\n", "\\n")
.Replace("\t", "\\t")
.Replace("\"", "\\\"")
.Replace("\'", "\\\'"));
_outputBuilder.Write(EscapeString(nativeTypeName));
_outputBuilder.Write('"');
_outputBuilder.Write(")]");
@ -531,6 +526,15 @@ namespace ClangSharp
return EscapeName(name);
}
private string EscapeCharacter(char value) => EscapeString(value.ToString());
private string EscapeString(string value) => value.Replace("\\", "\\\\")
.Replace("\r", "\\r")
.Replace("\n", "\\n")
.Replace("\t", "\\t")
.Replace("\"", "\\\"")
.Replace("\'", "\\\'");
private string GetAccessSpecifierName(NamedDecl namedDecl)
{
string name;
@ -1344,8 +1348,8 @@ namespace ClangSharp
{
GetTypeSize(cursor, arrayType.ElementType, ref alignment32, ref alignment64, out var elementSize32, out var elementSize64);
size32 = elementSize32 * constantArrayType.Size;
size64 = elementSize64 * constantArrayType.Size;
size32 = elementSize32 * Math.Max(constantArrayType.Size, 1);
size64 = elementSize64 * Math.Max(constantArrayType.Size, 1);
if (alignment32 == -1)
{
@ -1987,9 +1991,13 @@ namespace ClangSharp
private bool IsUnsafe(RecordDecl recordDecl)
{
foreach (var fieldDecl in recordDecl.Fields)
foreach (var decl in recordDecl.Decls)
{
if (IsUnsafe(fieldDecl))
if ((decl is FieldDecl fieldDecl) && IsUnsafe(fieldDecl))
{
return true;
}
else if ((decl is RecordDecl nestedRecordDecl) && nestedRecordDecl.IsAnonymousStructOrUnion && IsUnsafe(nestedRecordDecl))
{
return true;
}
@ -2429,7 +2437,8 @@ namespace ClangSharp
_testOutputBuilder.Write(expected);
_testOutputBuilder.Write(')');
_testOutputBuilder.Write(')');
_testOutputBuilder.WriteLine(';');
_testOutputBuilder.WriteSemicolon();
_testOutputBuilder.WriteNewline();
}
else if (_config.GenerateTestsXUnit)
{
@ -2440,7 +2449,8 @@ namespace ClangSharp
_testOutputBuilder.Write(' ');
_testOutputBuilder.Write(actual);
_testOutputBuilder.Write(')');
_testOutputBuilder.WriteLine(';');
_testOutputBuilder.WriteSemicolon();
_testOutputBuilder.WriteNewline();
}
}
@ -2455,7 +2465,8 @@ namespace ClangSharp
_testOutputBuilder.Write(' ');
_testOutputBuilder.Write("Is.True");
_testOutputBuilder.Write(')');
_testOutputBuilder.WriteLine(';');
_testOutputBuilder.WriteSemicolon();
_testOutputBuilder.WriteNewline();
}
else if (_config.GenerateTestsXUnit)
{
@ -2463,7 +2474,8 @@ namespace ClangSharp
_testOutputBuilder.Write('(');
_testOutputBuilder.Write(actual);
_testOutputBuilder.Write(')');
_testOutputBuilder.WriteLine(';');
_testOutputBuilder.WriteSemicolon();
_testOutputBuilder.WriteNewline();
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class CXXUuidofExpr : Expr
{
private readonly Lazy<Expr> _exprOperand;
private readonly Lazy<Type> _typeOperand;
internal CXXUuidofExpr(CXCursor handle) : base(handle, CXCursorKind.CXCursor_UnexposedExpr, CX_StmtClass.CX_StmtClass_CXXUuidofExpr)
{
_exprOperand = new Lazy<Expr>(() => TranslationUnit.GetOrCreate<Expr>(handle.SubExpr));
_typeOperand = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(handle.TypeOperand));
}
public Expr ExprOperand => _exprOperand.Value;
public bool IsTypeOperand => Handle.IsTypeOperand;
public Type TypeOperand => _typeOperand.Value;
}
}

Просмотреть файл

@ -12,33 +12,15 @@ namespace ClangSharp
internal UnaryExprOrTypeTraitExpr(CXCursor handle) : base(handle, CXCursorKind.CXCursor_UnaryExpr, CX_StmtClass.CX_StmtClass_UnaryExprOrTypeTraitExpr)
{
_argumentExpr = new Lazy<Expr>(() => {
try
{
return TranslationUnit.GetOrCreate<Expr>(Handle.SubExpr);
}
catch
{
return null;
}
});
_argumentType = new Lazy<Type>(() => {
try
{
return TranslationUnit.GetOrCreate<Type>(Handle.ArgumentType);
}
catch
{
return null;
}
});
_argumentExpr = new Lazy<Expr>(() => TranslationUnit.GetOrCreate<Expr>(Handle.SubExpr));
_argumentType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.ArgumentType));
}
public Expr ArgumentExpr => _argumentExpr.Value;
public Type ArgumentType => _argumentType.Value;
public bool IsArgumentType => ArgumentExpr is null;
public bool IsArgumentType => Handle.IsArgumentType;
public CX_UnaryExprOrTypeTrait Kind => Handle.UnaryExprOrTypeTraitKind;

Просмотреть файл

@ -13,5 +13,7 @@ namespace ClangSharp
{
_label = new Lazy<LabelDecl>(() => TranslationUnit.GetOrCreate<LabelDecl>(Handle.Referenced));
}
public LabelDecl Label => _label.Value;
}
}

Просмотреть файл

@ -753,6 +753,8 @@ namespace ClangSharp.Interop
public bool IsAnonymousStructOrUnion => clangsharp.Cursor_getIsAnonymousStructOrUnion(this) != 0;
public bool IsArgumentType => clangsharp.Cursor_getIsArgumentType(this) != 0;
public bool IsAttribute => clang.isAttribute(Kind) != 0;
public bool IsBitField => clang.Cursor_isBitField(this) != 0;
@ -843,6 +845,8 @@ namespace ClangSharp.Interop
public bool IsTypeConcept => clangsharp.Cursor_getIsTypeConcept(this) != 0;
public bool IsTypeOperand => clangsharp.Cursor_getIsTypeOperand(this) != 0;
public bool IsUnavailable => clangsharp.Cursor_getIsUnavailable(this) != 0;
public bool IsUnexposed => clang.isUnexposed(Kind) != 0;
@ -1264,6 +1268,8 @@ namespace ClangSharp.Interop
public CXType Type => clang.getCursorType(this);
public CXType TypeOperand => clangsharp.Cursor_getTypeOperand(this);
public CXType TypedefDeclUnderlyingType => clang.getTypedefDeclUnderlyingType(this);
public CXCursor TypedefNameForAnonDecl => clangsharp.Cursor_getTypedefNameForAnonDecl(this);
@ -1419,7 +1425,17 @@ namespace ClangSharp.Interop
public CXCursor GetTemplateArgument(uint index) => clangsharp.Cursor_getTemplateArgument(this, index);
public CXTemplateArgumentKind GetTemplateArgumentKind(uint i) => clang.Cursor_getTemplateArgumentKind(this, i);
public CXCursor GetTemplateArgumentAsDecl(uint i) => clangsharp.Cursor_getTemplateArgumentAsDecl(this, i);
public CXCursor GetTemplateArgumentAsExpr(uint i) => clangsharp.Cursor_getTemplateArgumentAsExpr(this, i);
public long GetTemplateArgumentAsIntegral(uint i) => clangsharp.Cursor_getTemplateArgumentAsIntegral(this, i);
public CXType GetTemplateArgumentAsType(uint i) => clangsharp.Cursor_getTemplateArgumentAsType(this, i);
public CXType GetTemplateArgumentIntegralType(uint i) => clangsharp.Cursor_getTemplateArgumentIntegralType(this, i);
public CXTemplateArgumentKind GetTemplateArgumentKind(uint i) => clangsharp.Cursor_getTemplateArgumentKind(this, i);
public CXSourceLocation GetTemplateArgumentLocLocation(uint i) => clangsharp.Cursor_getTemplateArgumentLocLocation(this, i);
@ -1431,6 +1447,8 @@ namespace ClangSharp.Interop
public CXCursor GetTemplateArgumentLocSourceNullPtrExpression(uint i) => clangsharp.Cursor_getTemplateArgumentLocSourceNullPtrExpression(this, i);
public CXType GetTemplateArgumentNullPtrType(uint i) => clangsharp.Cursor_getTemplateArgumentNullPtrType(this, i);
public CXType GetTemplateArgumentType(uint i) => clang.Cursor_getTemplateArgumentType(this, i);
public ulong GetTemplateArgumentUnsignedValue(uint i) => clang.Cursor_getTemplateArgumentUnsignedValue(this, i);

Просмотреть файл

@ -11,26 +11,48 @@ namespace ClangSharp.Interop
{
public uint AddressSpace => (kind != CXTypeKind.CXType_Invalid) ? clang.getAddressSpace(this) : default;
public CXCursor AddrSpaceExpr => clangsharp.Type_getAddrSpaceExpr(this);
public CXType AdjustedType => clangsharp.Type_getAdjustedType(this);
public long AlignOf => clang.Type_getAlignOf(this);
public CXType ArrayElementType => clang.getArrayElementType(this);
public long ArraySize => clang.getArraySize(this);
public CX_AttrKind AttrKind => clangsharp.Type_getAttrKind(this);
public CXType BaseType => clangsharp.Type_getBaseType(this);
public CXType CanonicalType => clang.getCanonicalType(this);
public CXType ClassType => clang.Type_getClassType(this);
public CXRefQualifierKind CXXRefQualifier => clang.Type_getCXXRefQualifier(this);
public CXCursor Declaration => clang.getTypeDeclaration(this);
public CXType DecayedType => clangsharp.Type_getDecayedType(this);
public CXType ElementType => clang.getElementType(this);
public CXCursor Declaration => clangsharp.Type_getDeclaration(this);
public CXType DeducedType => clangsharp.Type_getDeducedType(this);
public int Depth => clangsharp.Type_getDepth(this);
public CXType ElementType => clangsharp.Type_getElementType(this);
public CXType EquivalentType => clangsharp.Type_getEquivalentType(this);
public CXCursor_ExceptionSpecificationKind ExceptionSpecificationType => (CXCursor_ExceptionSpecificationKind)clang.getExceptionSpecificationType(this);
public CXCallingConv FunctionTypeCallingConv => clang.getFunctionTypeCallingConv(this);
public int Index => clangsharp.Type_getIndex(this);
public CXType InjectedSpecializationType => clangsharp.Type_getInjectedSpecializationType(this);
public CXType InjectedTST => clangsharp.Type_getInjectedTST(this);
public bool IsCanonical => Equals(CanonicalType);
public bool IsConstQualified => clang.isConstQualifiedType(this) != 0;
@ -41,13 +63,17 @@ namespace ClangSharp.Interop
public bool IsRestrictQualified => clang.isRestrictQualifiedType(this) != 0;
public bool IsSugared => clangsharp.Type_getIsSugared(this) != 0;
public bool IsTransparentTagTypedef => clang.Type_isTransparentTagTypedef(this) != 0;
public bool IsTypeAlias => clangsharp.Type_getIsTypeAlias(this) != 0;
public bool IsVolatileQualified => clang.isVolatileQualifiedType(this) != 0;
public CXString KindSpelling => clang.getTypeKindSpelling(kind);
public CXType ModifiedType => clang.Type_getModifiedType(this);
public CXType ModifiedType => clangsharp.Type_getModifiedType(this);
public CXType NamedType => clang.Type_getNamedType(this);
@ -65,10 +91,16 @@ namespace ClangSharp.Interop
public CXType ObjCObjectBaseType => clang.Type_getObjCObjectBaseType(this);
public CXType PointeeType => clang.getPointeeType(this);
public CXType OriginalType => clangsharp.Type_getOriginalType(this);
public CXCursor OwnedTagDecl => clangsharp.Type_getOwnedTagDecl(this);
public CXType PointeeType => clangsharp.Type_getPointeeType(this);
public CXType ResultType => clang.getResultType(this);
public CXCursor SizeExpr => clangsharp.Type_getSizeExpr(this);
public long SizeOf => clang.Type_getSizeOf(this);
public CXString Spelling => clang.getTypeSpelling(this);
@ -141,6 +173,12 @@ namespace ClangSharp.Interop
public CXString TypedefName => clang.getTypedefName(this);
public CXCursor UnderlyingExpr => clangsharp.Type_getUnderlyingExpr(this);
public CXType UnderlyingType => clangsharp.Type_getUnderlyingType(this);
public CXType ValueType => clangsharp.Type_getValueType(this);
internal string DebuggerDisplayString
{
get
@ -153,6 +191,8 @@ namespace ClangSharp.Interop
public static bool operator !=(CXType left, CXType right) => clang.equalTypes(left, right) == 0;
public CXType Desugar() => clangsharp.Type_desugar(this);
public override bool Equals(object obj) => (obj is CXType other) && Equals(other);
public bool Equals(CXType other) => this == other;
@ -173,7 +213,19 @@ namespace ClangSharp.Interop
return clang.Type_getOffsetOf(this, marshaledS);
}
public CXType GetTemplateArgumentAsType(uint i) => clang.Type_getTemplateArgumentAsType(this, i);
public CXCursor GetTemplateArgumentAsDecl(uint i) => clangsharp.Type_getTemplateArgumentAsDecl(this, i);
public CXCursor GetTemplateArgumentAsExpr(uint i) => clangsharp.Type_getTemplateArgumentAsExpr(this, i);
public long GetTemplateArgumentAsIntegral(uint i) => clangsharp.Type_getTemplateArgumentAsIntegral(this, i);
public CXType GetTemplateArgumentAsType(uint i) => clangsharp.Type_getTemplateArgumentAsType(this, i);
public CXType GetTemplateArgumentIntegralType(uint i) => clangsharp.Type_getTemplateArgumentIntegralType(this, i);
public CXTemplateArgumentKind GetTemplateArgumentKind(uint i) => clangsharp.Type_getTemplateArgumentKind(this, i);
public CXType GetTemplateArgumentNullPtrType(uint i) => clangsharp.Type_getTemplateArgumentNullPtrType(this, i);
public override string ToString() => Spelling.ToString();

Просмотреть файл

@ -279,6 +279,10 @@ namespace ClangSharp.Interop
[return: NativeTypeName("unsigned int")]
public static extern uint Cursor_getIsAnonymousStructOrUnion(CXCursor C);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getIsArgumentType", ExactSpelling = true)]
[return: NativeTypeName("unsigned int")]
public static extern uint Cursor_getIsArgumentType(CXCursor C);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getIsConversionFromLambda", ExactSpelling = true)]
[return: NativeTypeName("unsigned int")]
public static extern uint Cursor_getIsConversionFromLambda(CXCursor C);
@ -383,6 +387,10 @@ namespace ClangSharp.Interop
[return: NativeTypeName("unsigned int")]
public static extern uint Cursor_getIsTypeConcept(CXCursor C);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getIsTypeOperand", ExactSpelling = true)]
[return: NativeTypeName("unsigned int")]
public static extern uint Cursor_getIsTypeOperand(CXCursor C);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getIsUnavailable", ExactSpelling = true)]
[return: NativeTypeName("unsigned int")]
public static extern uint Cursor_getIsUnavailable(CXCursor C);
@ -512,6 +520,24 @@ namespace ClangSharp.Interop
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplateArgument", ExactSpelling = true)]
public static extern CXCursor Cursor_getTemplateArgument(CXCursor C, [NativeTypeName("unsigned int")] uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplateArgumentAsDecl", ExactSpelling = true)]
public static extern CXCursor Cursor_getTemplateArgumentAsDecl(CXCursor C, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplateArgumentAsExpr", ExactSpelling = true)]
public static extern CXCursor Cursor_getTemplateArgumentAsExpr(CXCursor C, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplateArgumentAsIntegral", ExactSpelling = true)]
public static extern long Cursor_getTemplateArgumentAsIntegral(CXCursor C, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplateArgumentAsType", ExactSpelling = true)]
public static extern CXType Cursor_getTemplateArgumentAsType(CXCursor C, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplateArgumentIntegralType", ExactSpelling = true)]
public static extern CXType Cursor_getTemplateArgumentIntegralType(CXCursor C, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplateArgumentKind", ExactSpelling = true)]
public static extern CXTemplateArgumentKind Cursor_getTemplateArgumentKind(CXCursor C, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplateArgumentLocLocation", ExactSpelling = true)]
public static extern CXSourceLocation Cursor_getTemplateArgumentLocLocation(CXCursor C, [NativeTypeName("unsigned int")] uint i);
@ -527,6 +553,9 @@ namespace ClangSharp.Interop
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplateArgumentLocSourceNullPtrExpression", ExactSpelling = true)]
public static extern CXCursor Cursor_getTemplateArgumentLocSourceNullPtrExpression(CXCursor C, [NativeTypeName("unsigned int")] uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplateArgumentNullPtrType", ExactSpelling = true)]
public static extern CXType Cursor_getTemplateArgumentNullPtrType(CXCursor C, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTemplatedDecl", ExactSpelling = true)]
public static extern CXCursor Cursor_getTemplatedDecl(CXCursor C);
@ -557,6 +586,9 @@ namespace ClangSharp.Interop
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTypedefNameForAnonDecl", ExactSpelling = true)]
public static extern CXCursor Cursor_getTypedefNameForAnonDecl(CXCursor C);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getTypeOperand", ExactSpelling = true)]
public static extern CXType Cursor_getTypeOperand(CXCursor C);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getUnaryExprOrTypeTraitKind", ExactSpelling = true)]
public static extern CX_UnaryExprOrTypeTrait Cursor_getUnaryExprOrTypeTraitKind(CXCursor C);
@ -575,7 +607,100 @@ namespace ClangSharp.Interop
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Cursor_getUsedContext", ExactSpelling = true)]
public static extern CXCursor Cursor_getUsedContext(CXCursor C);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_desugar", ExactSpelling = true)]
public static extern CXType Type_desugar(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getAddrSpaceExpr", ExactSpelling = true)]
public static extern CXCursor Type_getAddrSpaceExpr(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getAdjustedType", ExactSpelling = true)]
public static extern CXType Type_getAdjustedType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getAdjustedType", ExactSpelling = true)]
public static extern CX_AttrKind Type_getAttrKind(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getBaseType", ExactSpelling = true)]
public static extern CXType Type_getBaseType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getDecayedType", ExactSpelling = true)]
public static extern CXType Type_getDecayedType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getDeclaration", ExactSpelling = true)]
public static extern CXCursor Type_getDeclaration(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getDeducedType", ExactSpelling = true)]
public static extern CXType Type_getDeducedType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getDepth", ExactSpelling = true)]
public static extern int Type_getDepth(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getElementType", ExactSpelling = true)]
public static extern CXType Type_getElementType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getEquivalentType", ExactSpelling = true)]
public static extern CXType Type_getEquivalentType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getIndex", ExactSpelling = true)]
public static extern int Type_getIndex(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getInjectedSpecializationType", ExactSpelling = true)]
public static extern CXType Type_getInjectedSpecializationType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getInjectedTST", ExactSpelling = true)]
public static extern CXType Type_getInjectedTST(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getIsSugared", ExactSpelling = true)]
public static extern uint Type_getIsSugared(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getIsTypeAlias", ExactSpelling = true)]
public static extern uint Type_getIsTypeAlias(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getModifiedType", ExactSpelling = true)]
public static extern CXType Type_getModifiedType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getOriginalType", ExactSpelling = true)]
public static extern CXType Type_getOriginalType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getOwnedTagDecl", ExactSpelling = true)]
public static extern CXCursor Type_getOwnedTagDecl(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getPointeeType", ExactSpelling = true)]
public static extern CXType Type_getPointeeType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getSizeExpr", ExactSpelling = true)]
public static extern CXCursor Type_getSizeExpr(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getTemplateArgumentAsDecl", ExactSpelling = true)]
public static extern CXCursor Type_getTemplateArgumentAsDecl(CXType CT, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getTemplateArgumentAsExpr", ExactSpelling = true)]
public static extern CXCursor Type_getTemplateArgumentAsExpr(CXType CT, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getTemplateArgumentAsIntegral", ExactSpelling = true)]
public static extern long Type_getTemplateArgumentAsIntegral(CXType CT, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getTemplateArgumentAsType", ExactSpelling = true)]
public static extern CXType Type_getTemplateArgumentAsType(CXType CT, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getTemplateArgumentIntegralType", ExactSpelling = true)]
public static extern CXType Type_getTemplateArgumentIntegralType(CXType CT, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getTemplateArgumentKind", ExactSpelling = true)]
public static extern CXTemplateArgumentKind Type_getTemplateArgumentKind(CXType CT, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getTemplateArgumentNullPtrType", ExactSpelling = true)]
public static extern CXType Type_getTemplateArgumentNullPtrType(CXType CT, uint i);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getTypeClass", ExactSpelling = true)]
public static extern CX_TypeClass Type_getTypeClass(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getUnderlyingExpr", ExactSpelling = true)]
public static extern CXCursor Type_getUnderlyingExpr(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getUnderlyingType", ExactSpelling = true)]
public static extern CXType Type_getUnderlyingType(CXType CT);
[DllImport("libClangSharp", CallingConvention = CallingConvention.Cdecl, EntryPoint = "clangsharp_Type_getValueType", ExactSpelling = true)]
public static extern CXType Type_getValueType(CXType CT);
}
}

Просмотреть файл

@ -8,22 +8,50 @@ namespace ClangSharp
public sealed class TemplateArgument
{
private readonly Decl _parentDecl;
private readonly Type _parentType;
private readonly uint _index;
private readonly Lazy<ValueDecl> _asDecl;
private readonly Lazy<Expr> _asExpr;
private readonly Lazy<Type> _asType;
private readonly Lazy<Type> _integralType;
private readonly Lazy<Type> _nullPtrType;
internal TemplateArgument(Decl parentDecl, uint index)
{
_parentDecl = parentDecl;
_index = index;
_asType = new Lazy<Type>(() => _parentDecl.TranslationUnit.GetOrCreate<Type>(_parentDecl.Handle.GetTemplateArgumentType(_index)));
_asDecl = new Lazy<ValueDecl>(() => _parentDecl.TranslationUnit.GetOrCreate<ValueDecl>(_parentDecl.Handle.GetTemplateArgumentAsDecl(_index)));
_asExpr = new Lazy<Expr>(() => _parentDecl.TranslationUnit.GetOrCreate<Expr>(_parentDecl.Handle.GetTemplateArgumentAsExpr(_index)));
_asType = new Lazy<Type>(() => _parentDecl.TranslationUnit.GetOrCreate<Type>(_parentDecl.Handle.GetTemplateArgumentAsType(_index)));
_integralType = new Lazy<Type>(() => _parentDecl.TranslationUnit.GetOrCreate<Type>(_parentDecl.Handle.GetTemplateArgumentIntegralType(_index)));
_nullPtrType = new Lazy<Type>(() => _parentDecl.TranslationUnit.GetOrCreate<Type>(_parentDecl.Handle.GetTemplateArgumentNullPtrType(_index)));
}
public long AsIntegral => _parentDecl.Handle.GetTemplateArgumentValue(_index);
internal TemplateArgument(Type parentType, uint index)
{
_parentType = parentType;
_index = index;
_asDecl = new Lazy<ValueDecl>(() => _parentDecl.TranslationUnit.GetOrCreate<ValueDecl>(_parentType.Handle.GetTemplateArgumentAsDecl(_index)));
_asExpr = new Lazy<Expr>(() => _parentDecl.TranslationUnit.GetOrCreate<Expr>(_parentType.Handle.GetTemplateArgumentAsExpr(_index)));
_asType = new Lazy<Type>(() => _parentDecl.TranslationUnit.GetOrCreate<Type>(_parentType.Handle.GetTemplateArgumentAsType(_index)));
_integralType = new Lazy<Type>(() => _parentDecl.TranslationUnit.GetOrCreate<Type>(_parentType.Handle.GetTemplateArgumentIntegralType(_index)));
_nullPtrType = new Lazy<Type>(() => _parentDecl.TranslationUnit.GetOrCreate<Type>(_parentType.Handle.GetTemplateArgumentNullPtrType(_index)));
}
public ValueDecl AsDecl => _asDecl.Value;
public Expr AsExpr => _asExpr.Value;
public long AsIntegral => (_parentDecl != null) ? _parentDecl.Handle.GetTemplateArgumentAsIntegral(_index) : _parentType.Handle.GetTemplateArgumentAsIntegral(_index);
public Type AsType => _asType.Value;
public Type IntegralType => _integralType.Value;
public bool IsNull => Kind == CXTemplateArgumentKind.CXTemplateArgumentKind_Null;
public CXTemplateArgumentKind Kind => _parentDecl.Handle.GetTemplateArgumentKind(_index);
public CXTemplateArgumentKind Kind => (_parentDecl != null) ? _parentDecl.Handle.GetTemplateArgumentKind(_index) : _parentType.Handle.GetTemplateArgumentKind(_index);
public Type NullPtrType => _nullPtrType.Value;
}
}

Просмотреть файл

@ -1,17 +1,33 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public class AdjustedType : Type
{
private readonly Lazy<Type> _adjustedType;
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _originalType;
internal AdjustedType(CXType handle) : this(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_Adjusted)
{
}
private protected AdjustedType(CXType handle, CXTypeKind expectedTypeKind, CX_TypeClass expectedTypeClass) : base(handle, expectedTypeKind, expectedTypeClass)
{
_adjustedType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.AdjustedType));
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_originalType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.OriginalType));
}
public Type GetAdjustedType => _adjustedType.Value;
public bool IsSugared => Handle.IsSugared;
public Type OriginalType => _originalType.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class AtomicType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _valueType;
internal AtomicType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_Atomic)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_valueType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.ValueType));
}
public bool IsSugared => Handle.IsSugared;
public Type ValueType => _valueType.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -7,13 +7,25 @@ namespace ClangSharp
{
public sealed class AttributedType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _equivalentType;
private readonly Lazy<Type> _modifiedType;
internal AttributedType(CXType handle) : base(handle, CXTypeKind.CXType_Attributed, CX_TypeClass.CX_TypeClass_Attributed)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_equivalentType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.EquivalentType));
_modifiedType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.ModifiedType));
}
public CX_AttrKind AttrKind => Handle.AttrKind;
public Type EquivalentType => _equivalentType.Value;
public Type ModifiedType => _modifiedType.Value;
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,31 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using System.Collections.Generic;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class AutoType : DeducedType
{
private readonly Lazy<IReadOnlyList<TemplateArgument>> _templateArgs;
internal AutoType(CXType handle) : base(handle, CXTypeKind.CXType_Auto, CX_TypeClass.CX_TypeClass_Auto)
{
_templateArgs = new Lazy<IReadOnlyList<TemplateArgument>>(() => {
var templateArgCount = Handle.NumTemplateArguments;
var templateArgs = new List<TemplateArgument>(templateArgCount);
for (int i = 0; i < templateArgCount; i++)
{
var templateArg = new TemplateArgument(this, unchecked((uint)i));
templateArgs.Add(templateArg);
}
return templateArgs;
});
}
public IReadOnlyList<TemplateArgument> Args => _templateArgs.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class BlockPointerType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _pointeeType;
internal BlockPointerType(CXType handle) : base(handle, CXTypeKind.CXType_BlockPointer, CX_TypeClass.CX_TypeClass_BlockPointer)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_pointeeType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.PointeeType));
}
public bool IsSugared => Handle.IsSugared;
public Type PointeeType => _pointeeType.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,21 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class BuiltinType : Type
{
private readonly Lazy<Type> _desugaredType;
internal BuiltinType(CXType handle) : base(handle, handle.kind, CX_TypeClass.CX_TypeClass_Builtin)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class ComplexType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _elementType;
internal ComplexType(CXType handle) : base(handle, CXTypeKind.CXType_Complex, CX_TypeClass.CX_TypeClass_Complex)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_elementType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.ElementType));
}
public Type ElementType => _elementType.Value;
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,15 +1,27 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class ConstantArrayType : ArrayType
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Expr> _sizeExpr;
internal ConstantArrayType(CXType handle) : base(handle, CXTypeKind.CXType_ConstantArray, CX_TypeClass.CX_TypeClass_ConstantArray)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_sizeExpr = new Lazy<Expr>(() => TranslationUnit.GetOrCreate<Expr>(Handle.SizeExpr));
}
public bool IsSugared => Handle.IsSugared;
public long Size => Handle.ArraySize;
public Expr SizeExpr => _sizeExpr.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,23 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class DecayedType : AdjustedType
{
private readonly Lazy<Type> _decayedType;
private readonly Lazy<Type> _pointeeType;
internal DecayedType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_Decayed)
{
_decayedType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.DecayedType));
_pointeeType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.PointeeType));
}
public Type GetDecayedType => _decayedType.Value;
public Type PointeeType => _pointeeType.Value;
}
}

Просмотреть файл

@ -1,13 +1,29 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class DecltypeType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Expr> _underlyingExpr;
private readonly Lazy<Type> _underlyingType;
internal DecltypeType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_Decltype)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_underlyingExpr = new Lazy<Expr>(() => TranslationUnit.GetOrCreate<Expr>(Handle.UnderlyingExpr));
_underlyingType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.UnderlyingType));
}
public bool IsSugared => Handle.IsSugared;
public Expr UnderlyingExpr => _underlyingExpr.Value;
public Type UnderlyingType => _underlyingType.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public class DeducedType : Type
{
private readonly Lazy<Type> _deducedType;
private readonly Lazy<Type> _desugaredType;
private protected DeducedType(CXType handle, CXTypeKind expectedTypeKind, CX_TypeClass expectedTypeClass) : base(handle, expectedTypeKind, expectedTypeClass)
{
_deducedType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.DeducedType));
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public Type GetDeducedType => _deducedType.Value;
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,29 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class DependentAddressSpaceType : Type
{
private readonly Lazy<Expr> _addrSpaceExpr;
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _pointeeType;
internal DependentAddressSpaceType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_DependentAddressSpace)
{
_addrSpaceExpr = new Lazy<Expr>(() => TranslationUnit.GetOrCreate<Expr>(Handle.AddrSpaceExpr));
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_pointeeType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.PointeeType));
}
public Expr AddrSpaceExpr => _addrSpaceExpr.Value;
public bool IsSugared => Handle.IsSugared;
public Type PointeeType => _pointeeType.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,21 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class DependentNameType : TypeWithKeyword
{
private readonly Lazy<Type> _desugaredType;
internal DependentNameType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_DependentName)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class DependentSizedArrayType : ArrayType
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Expr> _sizeExpr;
internal DependentSizedArrayType(CXType handle) : base(handle, CXTypeKind.CXType_DependentSizedArray, CX_TypeClass.CX_TypeClass_DependentSizedArray)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_sizeExpr = new Lazy<Expr>(() => TranslationUnit.GetOrCreate<Expr>(Handle.SizeExpr));
}
public bool IsSugared => Handle.IsSugared;
public Expr SizeExpr => _sizeExpr.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,31 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class DependentSizedExtVectorType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _elementType;
private readonly Lazy<Expr> _sizeExpr;
internal DependentSizedExtVectorType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_DependentSizedExtVector)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_elementType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.ElementType));
_sizeExpr = new Lazy<Expr>(() => TranslationUnit.GetOrCreate<Expr>(Handle.SizeExpr));
}
public Type ElementType => _elementType.Value;
public bool IsSugared => Handle.IsSugared;
public long Size => Handle.ArraySize;
public Expr SizeExpr => _sizeExpr.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,37 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using System.Collections.Generic;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class DependentTemplateSpecializationType : TypeWithKeyword
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<IReadOnlyList<TemplateArgument>> _templateArgs;
internal DependentTemplateSpecializationType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_DependentTemplateSpecialization)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_templateArgs = new Lazy<IReadOnlyList<TemplateArgument>>(() => {
var templateArgCount = Handle.NumTemplateArguments;
var templateArgs = new List<TemplateArgument>(templateArgCount);
for (int i = 0; i < templateArgCount; i++)
{
var templateArg = new TemplateArgument(this, unchecked((uint)i));
templateArgs.Add(templateArg);
}
return templateArgs;
});
}
public IReadOnlyList<TemplateArgument> Args => _templateArgs.Value;
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,31 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class DependentVectorType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _elementType;
private readonly Lazy<Expr> _sizeExpr;
internal DependentVectorType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_DependentVector)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_elementType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.ElementType));
_sizeExpr = new Lazy<Expr>(() => TranslationUnit.GetOrCreate<Expr>(Handle.SizeExpr));
}
public Type ElementType => _elementType.Value;
public bool IsSugared => Handle.IsSugared;
public long Size => Handle.ArraySize;
public Expr SizeExpr => _sizeExpr.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -7,13 +7,23 @@ namespace ClangSharp
{
public sealed class ElaboratedType : TypeWithKeyword
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _namedType;
private readonly Lazy<TagDecl> _ownedTagDecl;
internal ElaboratedType(CXType handle) : base(handle, CXTypeKind.CXType_Elaborated, CX_TypeClass.CX_TypeClass_Elaborated)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_namedType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.NamedType));
_ownedTagDecl = new Lazy<TagDecl>(() => TranslationUnit.GetOrCreate<TagDecl>(Handle.OwnedTagDecl));
}
public bool IsSugared => Handle.IsSugared;
public Type NamedType => _namedType.Value;
public TagDecl OwnedTagDecl => _ownedTagDecl.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,15 +1,23 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class EnumType : TagType
{
private readonly Lazy<Type> _desugaredType;
internal EnumType(CXType handle) : base(handle, CXTypeKind.CXType_Enum, CX_TypeClass.CX_TypeClass_Enum)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public new EnumDecl Decl => (EnumDecl)base.Decl;
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,21 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class ExtVectorType : Type
{
private readonly Lazy<Type> _desugaredType;
internal ExtVectorType(CXType handle) : base(handle, CXTypeKind.CXType_ExtVector, CX_TypeClass.CX_TypeClass_ExtVector)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,21 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class FunctionNoProtoType : FunctionType
{
private readonly Lazy<Type> _desugaredType;
internal FunctionNoProtoType(CXType handle) : base(handle, CXTypeKind.CXType_FunctionNoProto, CX_TypeClass.CX_TypeClass_FunctionNoProto)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,5 +1,6 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using System.Collections.Generic;
using ClangSharp.Interop;
@ -7,37 +8,38 @@ namespace ClangSharp
{
public sealed class FunctionProtoType : FunctionType
{
private Type[] _paramTypes;
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<IReadOnlyList<Type>> _paramTypes;
internal FunctionProtoType(CXType handle) : base(handle, CXTypeKind.CXType_FunctionProto, CX_TypeClass.CX_TypeClass_FunctionProto)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_paramTypes = new Lazy<IReadOnlyList<Type>>(() => {
var paramTypeCount = Handle.NumArgTypes;
var paramTypes = new List<Type>(paramTypeCount);
for (int i = 0; i < paramTypeCount; i++)
{
var paramType = TranslationUnit.GetOrCreate<Type>(Handle.GetArgType(unchecked((uint)i)));
paramTypes.Add(paramType);
}
return paramTypes;
});
}
public CXCursor_ExceptionSpecificationKind ExceptionSpecType => Handle.ExceptionSpecificationType;
public bool IsSugared => Handle.IsSugared;
public bool IsVariadic => Handle.IsFunctionTypeVariadic;
public uint NumParams => (uint)Handle.NumArgTypes;
public IReadOnlyList<Type> ParamTypes
{
get
{
if (_paramTypes is null)
{
uint numParams = NumParams;
_paramTypes = new Type[numParams];
for (var index = 0u; index < numParams; index++)
{
var paramType = Handle.GetArgType(index);
_paramTypes[index] = TranslationUnit.GetOrCreate<Type>(paramType);
}
}
return _paramTypes;
}
}
public IReadOnlyList<Type> ParamTypes => _paramTypes.Value;
public CXRefQualifierKind RefQualifier => Handle.CXXRefQualifier;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,21 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class IncompleteArrayType : ArrayType
{
private readonly Lazy<Type> _desugaredType;
internal IncompleteArrayType(CXType handle) : base(handle, CXTypeKind.CXType_IncompleteArray, CX_TypeClass.CX_TypeClass_IncompleteArray)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,33 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class InjectedClassNameType : Type
{
private readonly Lazy<CXXRecordDecl> _decl;
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _injectedSpecializationType;
private readonly Lazy<TemplateSpecializationType> _injectedTST;
internal InjectedClassNameType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_InjectedClassName)
{
_decl = new Lazy<CXXRecordDecl>(() => TranslationUnit.GetOrCreate<CXXRecordDecl>(handle.Declaration));
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_injectedSpecializationType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.InjectedSpecializationType));
_injectedTST = new Lazy<TemplateSpecializationType>(() => TranslationUnit.GetOrCreate<TemplateSpecializationType>(Handle.InjectedTST));
}
public CXXRecordDecl Decl => _decl.Value;
public Type InjectedSpecializationType => _injectedSpecializationType.Value;
public TemplateSpecializationType InjectedTST => _injectedTST.Value;
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,21 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class LValueReferenceType : ReferenceType
{
private readonly Lazy<Type> _desugaredType;
internal LValueReferenceType(CXType handle) : base(handle, CXTypeKind.CXType_LValueReference, CX_TypeClass.CX_TypeClass_LValueReference)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,29 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class MacroQualifiedType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _modifiedType;
private readonly Lazy<Type> _underlyingType;
internal MacroQualifiedType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_MacroQualified)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_modifiedType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.ModifiedType));
_underlyingType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.UnderlyingType));
}
public bool IsSugared => Handle.IsSugared;
public Type ModifiedType => _modifiedType.Value;
public Type UnderlyingType => _underlyingType.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class MemberPointerType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _pointeeType;
internal MemberPointerType(CXType handle) : base(handle, CXTypeKind.CXType_MemberPointer, CX_TypeClass.CX_TypeClass_MemberPointer)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_pointeeType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(handle.PointeeType));
}
public bool IsSugared => Handle.IsSugared;
public Type PointeeType => _pointeeType.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,21 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class PackExpansionType : Type
{
private readonly Lazy<Type> _desugaredType;
internal PackExpansionType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_PackExpansion)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,23 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class ParenType : Type
{
private readonly Lazy<Type> _desugaredType;
internal ParenType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_Paren)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public Type InnerType => _desugaredType.Value;
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class PipeType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _elementType;
internal PipeType(CXType handle) : base(handle, CXTypeKind.CXType_Pipe, CX_TypeClass.CX_TypeClass_Pipe)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_elementType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.ElementType));
}
public Type ElementType => _elementType.Value;
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -7,13 +7,19 @@ namespace ClangSharp
{
public sealed class PointerType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _pointeeType;
internal PointerType(CXType handle) : base(handle, CXTypeKind.CXType_Pointer, CX_TypeClass.CX_TypeClass_Pointer)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_pointeeType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.PointeeType));
}
public bool IsSugared => Handle.IsSugared;
public Type PointeeType => _pointeeType.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,20 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class RValueReferenceType : ReferenceType
{
private readonly Lazy<Type> _desugaredType;
internal RValueReferenceType(CXType handle) : base(handle, CXTypeKind.CXType_RValueReference, CX_TypeClass.CX_TypeClass_RValueReference)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,15 +1,23 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class RecordType : TagType
{
private readonly Lazy<Type> _desugaredType;
internal RecordType(CXType handle) : base(handle, CXTypeKind.CXType_Record, CX_TypeClass.CX_TypeClass_Record)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public new RecordDecl Decl => (RecordDecl)base.Decl;
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,20 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class SubstTemplateTypeParmPackType : Type
{
private readonly Lazy<Type> _desugaredType;
internal SubstTemplateTypeParmPackType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_SubstTemplateTypeParmPack)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,23 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class SubstTemplateTypeParmType : Type
{
private readonly Lazy<Type> _desugaredType;
internal SubstTemplateTypeParmType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_SubstTemplateTypeParm)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type ReplacementType => _desugaredType.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,41 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using System.Collections.Generic;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class TemplateSpecializationType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<IReadOnlyList<TemplateArgument>> _templateArgs;
internal TemplateSpecializationType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_TemplateSpecialization)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_templateArgs = new Lazy<IReadOnlyList<TemplateArgument>>(() => {
var templateArgCount = Handle.NumTemplateArguments;
var templateArgs = new List<TemplateArgument>(templateArgCount);
for (int i = 0; i < templateArgCount; i++)
{
var templateArg = new TemplateArgument(this, unchecked((uint)i));
templateArgs.Add(templateArg);
}
return templateArgs;
});
}
public Type AliasedType => IsTypeAlias ? _desugaredType.Value : null;
public IReadOnlyList<TemplateArgument> Args => _templateArgs.Value;
public bool IsSugared => Handle.IsSugared;
public bool IsTypeAlias => Handle.IsTypeAlias;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,29 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class TemplateTypeParmType : Type
{
private readonly Lazy<TemplateTypeParmDecl> _decl;
private readonly Lazy<Type> _desugaredType;
internal TemplateTypeParmType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_TemplateTypeParm)
{
_decl = new Lazy<TemplateTypeParmDecl>(() => TranslationUnit.GetOrCreate<TemplateTypeParmDecl>(Handle.Declaration));
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public TemplateTypeParmDecl Decl => _decl.Value;
public uint Depth => unchecked((uint)Handle.Depth);
public uint Index => unchecked((uint)Handle.Index);
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class TypeOfExprType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Expr> _underlyingExpr;
internal TypeOfExprType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_TypeOfExpr)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_underlyingExpr = new Lazy<Expr>(() => TranslationUnit.GetOrCreate<Expr>(handle.UnderlyingExpr));
}
public bool IsSugared => Handle.IsSugared;
public Expr UnderlyingExpr => _underlyingExpr.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class TypeOfType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _underlyingType;
internal TypeOfType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_TypeOf)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_underlyingType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.UnderlyingType));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
public Type UnderlyingType => _underlyingType.Value;
}
}

Просмотреть файл

@ -8,12 +8,18 @@ namespace ClangSharp
public sealed class TypedefType : Type
{
private readonly Lazy<TypedefNameDecl> _decl;
private readonly Lazy<Type> _desugaredType;
internal TypedefType(CXType handle) : base(handle, CXTypeKind.CXType_Typedef, CX_TypeClass.CX_TypeClass_Typedef)
{
_decl = new Lazy<TypedefNameDecl>(() => TranslationUnit.GetOrCreate<TypedefNameDecl>(Handle.Declaration));
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
public TypedefNameDecl Decl => _decl.Value;
}
}

Просмотреть файл

@ -1,17 +1,33 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public class UnaryTransformType : Type
{
private readonly Lazy<Type> _baseType;
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _underlyingType;
internal UnaryTransformType(CXType handle) : this(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_UnaryTransform)
{
}
private protected UnaryTransformType(CXType handle, CXTypeKind expectedTypeKind, CX_TypeClass expectedTypeClass) : base(handle, expectedTypeKind, expectedTypeClass)
{
_baseType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.BaseType));
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_underlyingType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.UnderlyingType));
}
public Type BaseType => _baseType.Value;
public bool IsSugared => Handle.IsSugared;
public Type UnderlyingType => _underlyingType.Value;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class UnresolvedUsingType : Type
{
private readonly Lazy<UnresolvedUsingTypenameDecl> _decl;
private readonly Lazy<Type> _desugaredType;
internal UnresolvedUsingType(CXType handle) : base(handle, CXTypeKind.CXType_Unexposed, CX_TypeClass.CX_TypeClass_UnresolvedUsing)
{
_decl = new Lazy<UnresolvedUsingTypenameDecl>(() => TranslationUnit.GetOrCreate<UnresolvedUsingTypenameDecl>(Handle.Declaration));
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
}
public UnresolvedUsingTypenameDecl Decl => _decl.Value;
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -1,13 +1,25 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public sealed class VariableArrayType : ArrayType
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Expr> _sizeExpr;
internal VariableArrayType(CXType handle) : base(handle, CXTypeKind.CXType_VariableArray, CX_TypeClass.CX_TypeClass_VariableArray)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_sizeExpr = new Lazy<Expr>(() => TranslationUnit.GetOrCreate<Expr>(handle.SizeExpr));
}
public bool IsSugared => Handle.IsSugared;
public Type Desugar() => _desugaredType.Value;
public Expr SizeExpr => _sizeExpr.Value;
}
}

Просмотреть файл

@ -1,17 +1,31 @@
// Copyright (c) Microsoft and Contributors. All rights reserved. Licensed under the University of Illinois/NCSA Open Source License. See LICENSE.txt in the project root for license information.
using System;
using ClangSharp.Interop;
namespace ClangSharp
{
public class VectorType : Type
{
private readonly Lazy<Type> _desugaredType;
private readonly Lazy<Type> _elementType;
internal VectorType(CXType handle) : base(handle, CXTypeKind.CXType_Vector, CX_TypeClass.CX_TypeClass_Vector)
{
}
private protected VectorType(CXType handle, CXTypeKind expectedTypeKind, CX_TypeClass expectedTypeClass) : base(handle, expectedTypeKind, expectedTypeClass)
{
_desugaredType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.Desugar()));
_elementType = new Lazy<Type>(() => TranslationUnit.GetOrCreate<Type>(Handle.ElementType));
}
public Type ElementType => _elementType.Value;
public bool IsSugared => Handle.IsSugared;
public long NumElements => Handle.NumElements;
public Type Desugar() => _desugaredType.Value;
}
}

Просмотреть файл

@ -3,9 +3,12 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.1;netcoreapp2.1</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition="'$(ContinuousIntegrationBuild)' == 'true'">
<PackAsTool>true</PackAsTool>
<RuntimeIdentifier></RuntimeIdentifier>
<TargetFrameworks>netcoreapp3.1;netcoreapp2.1</TargetFrameworks>
</PropertyGroup>
<ItemGroup>

Просмотреть файл

@ -12,6 +12,11 @@
"GenerateLLVM": {
"commandName": "Project",
"commandLineArgs": "\"@$(MSBuildProjectDirectory)/Properties/GenerateLLVM.rsp\" --file-directory \"$(LLVMIncludePath)\" --include-directory \"$(LLVMIncludePath)\" --libraryPath $(LibLLVMName)"
},
"GenerateTerraFX": {
"commandName": "Project",
"commandLineArgs": "@generate.rsp",
"workingDirectory": "C:\\Repos\\terrafx.interop.windows\\generation\\shared\\dxgi"
}
}
}

Просмотреть файл

@ -13,6 +13,10 @@ QualType GetQualType(CXType CT) {
return QualType::getFromOpaquePtr(CT.data[0]);
}
CXTranslationUnit GetTypeTU(CXType CT) {
return static_cast<CXTranslationUnit>(CT.data[1]);
}
namespace clang::cxtype {
static CXTypeKind GetBuiltinTypeKind(const BuiltinType* BT) {
#define BTCASE(K) case BuiltinType::K: return CXType_##K

Просмотреть файл

@ -10,6 +10,7 @@
#include <clang/AST/Type.h>
clang::QualType GetQualType(CXType CT);
CXTranslationUnit GetTypeTU(CXType CT);
namespace clang::cxtype {
CXType MakeCXType(QualType T, CXTranslationUnit TU);

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -275,6 +275,8 @@ CLANGSHARP_LINKAGE int64_t clangsharp_Cursor_getIntegerLiteralValue(CXCursor C);
CLANGSHARP_LINKAGE unsigned clangsharp_Cursor_getIsAnonymousStructOrUnion(CXCursor C);
CLANGSHARP_LINKAGE unsigned clangsharp_Cursor_getIsArgumentType(CXCursor C);
CLANGSHARP_LINKAGE unsigned clangsharp_Cursor_getIsConversionFromLambda(CXCursor C);
CLANGSHARP_LINKAGE unsigned clangsharp_Cursor_getIsDefined(CXCursor C);
@ -327,6 +329,8 @@ CLANGSHARP_LINKAGE unsigned clangsharp_Cursor_getIsTransparentTag(CXCursor C);
CLANGSHARP_LINKAGE unsigned clangsharp_Cursor_getIsTypeConcept(CXCursor C);
CLANGSHARP_LINKAGE unsigned clangsharp_Cursor_getIsTypeOperand(CXCursor C);
CLANGSHARP_LINKAGE unsigned clangsharp_Cursor_getIsUnavailable(CXCursor C);
CLANGSHARP_LINKAGE unsigned clangsharp_Cursor_getIsUnnamedBitfield(CXCursor C);
@ -409,6 +413,16 @@ CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTargetUnionField(CXCursor C);
CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTemplateArgument(CXCursor C, unsigned i);
CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTemplateArgumentAsDecl(CXCursor C, unsigned i);
CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTemplateArgumentAsExpr(CXCursor C, unsigned i);
CLANGSHARP_LINKAGE CXType clangsharp_Cursor_getTemplateArgumentAsType(CXCursor C, unsigned i);
CLANGSHARP_LINKAGE CXType clangsharp_Cursor_getTemplateArgumentIntegralType(CXCursor C, unsigned i);
CLANGSHARP_LINKAGE CXTemplateArgumentKind clangsharp_Cursor_getTemplateArgumentKind(CXCursor C, unsigned i);
CLANGSHARP_LINKAGE CXSourceLocation clangsharp_Cursor_getTemplateArgumentLocLocation(CXCursor C, unsigned i);
CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTemplateArgumentLocSourceDeclExpression(CXCursor C, unsigned i);
@ -419,6 +433,8 @@ CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTemplateArgumentLocSourceIntegr
CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTemplateArgumentLocSourceNullPtrExpression(CXCursor C, unsigned i);
CLANGSHARP_LINKAGE CXType clangsharp_Cursor_getTemplateArgumentNullPtrType(CXCursor C, unsigned i);
CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTemplatedDecl(CXCursor C);
CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTemplateInstantiationPattern(CXCursor C);
@ -439,6 +455,8 @@ CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTrueExpr(CXCursor C);
CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getTypedefNameForAnonDecl(CXCursor C);
CLANGSHARP_LINKAGE CXType clangsharp_Cursor_getTypeOperand(CXCursor C);
CLANGSHARP_LINKAGE CX_UnaryExprOrTypeTrait clangsharp_Cursor_getUnaryExprOrTypeTraitKind(CXCursor C);
CLANGSHARP_LINKAGE CX_UnaryOperatorKind clangsharp_Cursor_getUnaryOpcode(CXCursor C);
@ -451,6 +469,66 @@ CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getUninstantiatedDefaultArg(CXCurs
CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getUsedContext(CXCursor C);
CLANGSHARP_LINKAGE CXType clangsharp_Type_desugar(CXType CT);
CLANGSHARP_LINKAGE CXCursor clangsharp_Type_getAddrSpaceExpr(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getAdjustedType(CXType CT);
CLANGSHARP_LINKAGE CX_AttrKind clangsharp_Type_getAttrKind(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getBaseType(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getDecayedType(CXType CT);
CLANGSHARP_LINKAGE CXCursor clangsharp_Type_getDeclaration(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getDeducedType(CXType CT);
CLANGSHARP_LINKAGE int clangsharp_Type_getDepth(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getElementType(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getEquivalentType(CXType CT);
CLANGSHARP_LINKAGE int clangsharp_Type_getIndex(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getInjectedSpecializationType(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getInjectedTST(CXType CT);
CLANGSHARP_LINKAGE unsigned clangsharp_Type_getIsSugared(CXType CT);
CLANGSHARP_LINKAGE unsigned clangsharp_Type_getIsTypeAlias(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getModifiedType(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getOriginalType(CXType CT);
CLANGSHARP_LINKAGE CXCursor clangsharp_Type_getOwnedTagDecl(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getPointeeType(CXType CT);
CLANGSHARP_LINKAGE CXCursor clangsharp_Type_getSizeExpr(CXType CT);
CLANGSHARP_LINKAGE CXCursor clangsharp_Type_getTemplateArgumentAsDecl(CXType CT, unsigned i);
CLANGSHARP_LINKAGE CXCursor clangsharp_Type_getTemplateArgumentAsExpr(CXType CT, unsigned i);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getTemplateArgumentAsType(CXType CT, unsigned i);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getTemplateArgumentIntegralType(CXType CT, unsigned i);
CLANGSHARP_LINKAGE CXTemplateArgumentKind clangsharp_Type_getTemplateArgumentKind(CXType CT, unsigned i);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getTemplateArgumentNullPtrType(CXType CT, unsigned i);
CLANGSHARP_LINKAGE CX_TypeClass clangsharp_Type_getTypeClass(CXType CT);
CLANGSHARP_LINKAGE CXCursor clangsharp_Type_getUnderlyingExpr(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getUnderlyingType(CXType CT);
CLANGSHARP_LINKAGE CXType clangsharp_Type_getValueType(CXType CT);
#endif

Просмотреть файл

@ -334,11 +334,15 @@ void MyFunction()
switch (value)
{
case 0:
{
return 0;
}
case 2:
case 3:
{
return 5;
}
}
return -1;
@ -368,7 +372,9 @@ static inline int MyFunction(MyEnum x)
}
";
var expectedOutputContents = @"namespace ClangSharp.Test
var expectedOutputContents = @"using static ClangSharp.Test.MyEnum;
namespace ClangSharp.Test
{
public enum MyEnum
{
@ -733,7 +739,9 @@ int MyFunction()
int i = 0;
while (i < count)
{
i++;
}
return i;
}
@ -949,41 +957,63 @@ int MyFunction()
public static int MyFunction(int count)
{
for (int i = 0; i < count; i--)
{
i += 2;
}
int x;
for (x = 0; x < count; x--)
{
x += 2;
}
x = 0;
for (; x < count; x--)
{
x += 2;
}
for (int i = 0;; i--)
{
i += 2;
}
for (x = 0;; x--)
{
x += 2;
}
for (int i = 0; i < count;)
{
i++;
}
for (x = 0; x < count;)
{
x++;
}
x = 0;
for (; x < count;)
{
x++;
}
for (int i = 0;;)
{
i++;
}
for (x = 0;;)
{
x++;
}
for (;;)
{
return -1;
}
}
}
}
@ -1125,9 +1155,13 @@ int MyFunction()
public static int MyFunction(bool condition, int lhs, int rhs)
{
if (condition)
{
return lhs;
}
else
{
return rhs;
}
}
}
}
@ -1543,7 +1577,9 @@ bool MyFunction(const MyStruct& lhs, const MyStruct& rhs)
switch (value)
{
default:
{
return 0;
}
}
}
}
@ -1742,7 +1778,9 @@ bool MyFunction(const MyStruct& lhs, const MyStruct& rhs)
int i = 0;
while (i < count)
{
i++;
}
return i;
}

Просмотреть файл

@ -148,7 +148,7 @@ namespace ClangSharp.Test
[InlineData("unsigned short value = 7", @"[NativeTypeName(""unsigned short"")] ushort value = 7")]
[InlineData("unsigned int value = 8", @"[NativeTypeName(""unsigned int"")] uint value = 8")]
[InlineData("unsigned long long value = 9", @"[NativeTypeName(""unsigned long long"")] ulong value = 9")]
[InlineData("unsigned short value = 'A'", @"[NativeTypeName(""unsigned short"")] ushort value = 'A'")]
[InlineData("unsigned short value = 'A'", @"[NativeTypeName(""unsigned short"")] ushort value = (byte)'A'")]
public async Task OptionalParameterTest(string nativeParameters, string expectedManagedParameters)
{
var inputContents = $@"void MyFunction({nativeParameters});";