Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ IMarshallingGenerator CreateGenerator(TypePositionInfo p)
public BlockSyntax GenerateJSExportBody()
{
StatementSyntax invoke = InvokeSyntax();
JSGeneratedStatements statements = JSGeneratedStatements.Create(_marshallers, _context, invoke);
GeneratedStatements statements = GeneratedStatements.Create(_marshallers, _context);
bool shouldInitializeVariables = !statements.GuaranteedUnmarshal.IsEmpty || !statements.Cleanup.IsEmpty;
VariableDeclarations declarations = VariableDeclarations.GenerateDeclarationsForManagedToNative(_marshallers, _context, shouldInitializeVariables);

Expand All @@ -88,7 +88,7 @@ public BlockSyntax GenerateJSExportBody()
var tryStatements = new List<StatementSyntax>();
tryStatements.AddRange(statements.Unmarshal);

tryStatements.AddRange(statements.InvokeStatements);
tryStatements.Add(invoke);

if (!statements.GuaranteedUnmarshal.IsEmpty)
{
Expand All @@ -98,6 +98,7 @@ public BlockSyntax GenerateJSExportBody()
}

tryStatements.AddRange(statements.NotifyForSuccessfulInvoke);
tryStatements.AddRange(statements.PinnedMarshal);
tryStatements.AddRange(statements.Marshal);

List<StatementSyntax> allStatements = setupStatements;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,28 +131,10 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
context.RegisterConcatenatedSyntaxOutputs(generateSingleStub.Select((data, ct) => data.Item1), "JSExports.g.cs");
}

private static SyntaxTokenList StripTriviaFromModifiers(SyntaxTokenList tokenList)
{
SyntaxToken[] strippedTokens = new SyntaxToken[tokenList.Count];
for (int i = 0; i < tokenList.Count; i++)
{
strippedTokens[i] = tokenList[i].WithoutTrivia();
}
return new SyntaxTokenList(strippedTokens);
}

private static TypeDeclarationSyntax CreateTypeDeclarationWithoutTrivia(TypeDeclarationSyntax typeDeclaration)
{
return TypeDeclaration(
typeDeclaration.Kind(),
typeDeclaration.Identifier)
.WithTypeParameterList(typeDeclaration.TypeParameterList)
.WithModifiers(StripTriviaFromModifiers(typeDeclaration.Modifiers));
}

private static MemberDeclarationSyntax PrintGeneratedSource(
ContainingSyntax userDeclaredMethod,
JSSignatureContext stub,
ContainingSyntaxContext containingSyntaxContext,
BlockSyntax wrapperStatements, BlockSyntax registerStatements)
{
var WrapperName = "__Wrapper_" + userDeclaredMethod.Identifier + "_" + stub.TypesHash;
Expand All @@ -176,35 +158,7 @@ private static MemberDeclarationSyntax PrintGeneratedSource(
.WithBody(registerStatements);


MemberDeclarationSyntax toPrint = WrapMethodInContainingScopes(stub, wrappperMethod, registerMethod);

return toPrint;
}

private static MemberDeclarationSyntax WrapMethodInContainingScopes(JSSignatureContext stub, MemberDeclarationSyntax stubMethod, MemberDeclarationSyntax sigField)
{
// Stub should have at least one containing type
Debug.Assert(stub.StubContainingTypes.Any());

// Add stub function and JSExport declaration to the first (innermost) containing
MemberDeclarationSyntax containingType = CreateTypeDeclarationWithoutTrivia(stub.StubContainingTypes.First())
.AddMembers(stubMethod, sigField);

// Add type to the remaining containing types (skipping the first which was handled above)
foreach (TypeDeclarationSyntax typeDecl in stub.StubContainingTypes.Skip(1))
{
containingType = CreateTypeDeclarationWithoutTrivia(typeDecl)
.WithMembers(SingletonList(containingType));
}

MemberDeclarationSyntax toPrint = containingType;

// Add type to the containing namespace
if (stub.StubTypeNamespace is not null)
{
toPrint = NamespaceDeclaration(IdentifierName(stub.StubTypeNamespace))
.AddMembers(toPrint);
}
MemberDeclarationSyntax toPrint = containingSyntaxContext.WrapMembersInContainingSyntaxWithUnsafeModifier(wrappperMethod, registerMethod);

return toPrint;
}
Expand Down Expand Up @@ -286,7 +240,7 @@ private static (MemberDeclarationSyntax, ImmutableArray<Diagnostic>) GenerateSou
// Generate stub code
var stubGenerator = new JSExportCodeGenerator(
incrementalContext.Environment,
incrementalContext.SignatureContext.ElementTypeInformation,
incrementalContext.SignatureContext.SignatureContext.ElementTypeInformation,
incrementalContext.JSExportData,
incrementalContext.SignatureContext,
(elementInfo, ex) =>
Expand All @@ -298,7 +252,7 @@ private static (MemberDeclarationSyntax, ImmutableArray<Diagnostic>) GenerateSou
BlockSyntax wrapper = stubGenerator.GenerateJSExportBody();
BlockSyntax registration = stubGenerator.GenerateJSExportRegistration();

return (PrintGeneratedSource(incrementalContext.StubMethodSyntaxTemplate, incrementalContext.SignatureContext, wrapper, registration), incrementalContext.Diagnostics.AddRange(diagnostics.Diagnostics));
return (PrintGeneratedSource(incrementalContext.StubMethodSyntaxTemplate, incrementalContext.SignatureContext, incrementalContext.ContainingSyntaxContext, wrapper, registration), incrementalContext.Diagnostics.AddRange(diagnostics.Diagnostics));
}

private static bool ShouldVisitNode(SyntaxNode syntaxNode)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ IMarshallingGenerator CreateGenerator(TypePositionInfo p)
public BlockSyntax GenerateJSImportBody()
{
StatementSyntax invoke = InvokeSyntax();
JSGeneratedStatements statements = JSGeneratedStatements.Create(_marshallers, _context, invoke);
GeneratedStatements statements = GeneratedStatements.Create(_marshallers, _context);
bool shouldInitializeVariables = !statements.GuaranteedUnmarshal.IsEmpty || !statements.Cleanup.IsEmpty;
VariableDeclarations declarations = VariableDeclarations.GenerateDeclarationsForManagedToNative(_marshallers, _context, shouldInitializeVariables);

Expand All @@ -96,8 +96,9 @@ public BlockSyntax GenerateJSImportBody()

var tryStatements = new List<StatementSyntax>();
tryStatements.AddRange(statements.Marshal);
tryStatements.AddRange(statements.PinnedMarshal);

tryStatements.AddRange(statements.InvokeStatements);
tryStatements.Add(invoke);
if (!statements.GuaranteedUnmarshal.IsEmpty)
{
tryStatements.Add(ExpressionStatement(AssignmentExpression(SyntaxKind.SimpleAssignmentExpression,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,25 +146,17 @@ private static SyntaxTokenList StripTriviaFromModifiers(SyntaxTokenList tokenLis
return new SyntaxTokenList(strippedTokens);
}

private static TypeDeclarationSyntax CreateTypeDeclarationWithoutTrivia(TypeDeclarationSyntax typeDeclaration)
{
return TypeDeclaration(
typeDeclaration.Kind(),
typeDeclaration.Identifier)
.WithTypeParameterList(typeDeclaration.TypeParameterList)
.WithModifiers(StripTriviaFromModifiers(typeDeclaration.Modifiers));
}

private static MemberDeclarationSyntax PrintGeneratedSource(
ContainingSyntax userDeclaredMethod,
JSSignatureContext stub,
ContainingSyntaxContext containingSyntaxContext,
BlockSyntax stubCode)
{
// Create stub function
MethodDeclarationSyntax stubMethod = MethodDeclaration(stub.StubReturnType, userDeclaredMethod.Identifier)
.AddAttributeLists(stub.AdditionalAttributes.ToArray())
MethodDeclarationSyntax stubMethod = MethodDeclaration(stub.SignatureContext.StubReturnType, userDeclaredMethod.Identifier)
.AddAttributeLists(stub.SignatureContext.AdditionalAttributes.ToArray())
.WithModifiers(StripTriviaFromModifiers(userDeclaredMethod.Modifiers))
.WithParameterList(ParameterList(SeparatedList(stub.StubParameters)))
.WithParameterList(ParameterList(SeparatedList(stub.SignatureContext.StubParameters)))
.WithBody(stubCode);

FieldDeclarationSyntax sigField = FieldDeclaration(VariableDeclaration(IdentifierName(Constants.JSFunctionSignatureGlobal))
Expand All @@ -173,35 +165,7 @@ private static MemberDeclarationSyntax PrintGeneratedSource(
.WithAttributeLists(SingletonList(AttributeList(SingletonSeparatedList(
Attribute(IdentifierName(Constants.ThreadStaticGlobal))))));

MemberDeclarationSyntax toPrint = WrapMethodInContainingScopes(stub, stubMethod, sigField);
return toPrint;
}

private static MemberDeclarationSyntax WrapMethodInContainingScopes(JSSignatureContext stub, MemberDeclarationSyntax stubMethod, MemberDeclarationSyntax sigField)
{
// Stub should have at least one containing type
Debug.Assert(stub.StubContainingTypes.Any());

// Add stub function and JSImport declaration to the first (innermost) containing
MemberDeclarationSyntax containingType = CreateTypeDeclarationWithoutTrivia(stub.StubContainingTypes.First())
.AddMembers(stubMethod, sigField);

// Add type to the remaining containing types (skipping the first which was handled above)
foreach (TypeDeclarationSyntax typeDecl in stub.StubContainingTypes.Skip(1))
{
containingType = CreateTypeDeclarationWithoutTrivia(typeDecl)
.WithMembers(SingletonList(containingType));
}

MemberDeclarationSyntax toPrint = containingType;

// Add type to the containing namespace
if (stub.StubTypeNamespace is not null)
{
toPrint = NamespaceDeclaration(IdentifierName(stub.StubTypeNamespace))
.AddMembers(toPrint);
}

MemberDeclarationSyntax toPrint = containingSyntaxContext.WrapMembersInContainingSyntaxWithUnsafeModifier(stubMethod, sigField);
return toPrint;
}

Expand Down Expand Up @@ -290,7 +254,7 @@ private static (MemberDeclarationSyntax, ImmutableArray<Diagnostic>) GenerateSou
// Generate stub code
var stubGenerator = new JSImportCodeGenerator(
incrementalContext.Environment,
incrementalContext.SignatureContext.ElementTypeInformation,
incrementalContext.SignatureContext.SignatureContext.ElementTypeInformation,
incrementalContext.JSImportData,
incrementalContext.SignatureContext,
(elementInfo, ex) =>
Expand All @@ -301,7 +265,7 @@ private static (MemberDeclarationSyntax, ImmutableArray<Diagnostic>) GenerateSou

BlockSyntax code = stubGenerator.GenerateJSImportBody();

return (PrintGeneratedSource(incrementalContext.StubMethodSyntaxTemplate, incrementalContext.SignatureContext, code), incrementalContext.Diagnostics.AddRange(diagnostics.Diagnostics));
return (PrintGeneratedSource(incrementalContext.StubMethodSyntaxTemplate, incrementalContext.SignatureContext, incrementalContext.ContainingSyntaxContext, code), incrementalContext.Diagnostics.AddRange(diagnostics.Diagnostics));
}

private static bool ShouldVisitNode(SyntaxNode syntaxNode)
Expand Down
Loading