Skip to content

Commit

Permalink
Fix namespace handling for inline nested namespaces
Browse files Browse the repository at this point in the history
- Fix issue where the correct `usings` would not be included in a namespace context. This was an issue when making a namespace declaration like `namespace UdonSharp.Examples.Utilities` and ommiting the `using UdonSharp` at the top of the file. In this case only the `UdonSharp.Examples.Utilities` namespace would be included in the current using context. But the namespaces `UdonSharp` and `UdonSharp.Examples` should also have been included.
  • Loading branch information
MerlinVR committed Mar 30, 2020
1 parent 71ed575 commit 726ae77
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 10 deletions.
19 changes: 14 additions & 5 deletions Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -183,15 +183,19 @@ public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
{
UpdateSyntaxNode(node);

namespaceStack.Push(node.Name.ToFullString().TrimEnd('\r', '\n', ' '));
string[] namespaces = node.Name.ToFullString().TrimEnd('\r', '\n', ' ').Split('.');

foreach (string currentNamespace in namespaces)
namespaceStack.Push(currentNamespace);

foreach (UsingDirectiveSyntax usingDirective in node.Usings)
Visit(usingDirective);

foreach (MemberDeclarationSyntax memberDeclaration in node.Members)
Visit(memberDeclaration);

namespaceStack.Pop();
for (int i = 0; i < namespaces.Length; ++i)
namespaceStack.Pop();
}

public override void VisitSimpleBaseType(SimpleBaseTypeSyntax node)
Expand Down Expand Up @@ -232,14 +236,17 @@ public override void VisitClassDeclaration(ClassDeclarationSyntax node)

if (node.BaseList == null)
throw new System.NotSupportedException("UdonSharp only supports classes that from 'UdonSharpBehaviour' at the moment");

Visit(node.BaseList);


using (ExpressionCaptureScope selfTypeCaptureScope = new ExpressionCaptureScope(visitorContext, null))
{
foreach (string namespaceToken in namespaceStack.Reverse())
{
selfTypeCaptureScope.ResolveAccessToken(namespaceToken);

if (selfTypeCaptureScope.IsNamespace())
visitorContext.resolverContext.AddNamespace(selfTypeCaptureScope.captureNamespace);
}

selfTypeCaptureScope.ResolveAccessToken(node.Identifier.ValueText);

if (!selfTypeCaptureScope.IsType())
Expand All @@ -248,6 +255,8 @@ public override void VisitClassDeclaration(ClassDeclarationSyntax node)
visitorContext.behaviourUserType = selfTypeCaptureScope.captureType;
}

Visit(node.BaseList);

visitorContext.topTable.CreateReflectionSymbol("udonTypeID", typeof(long), Internal.UdonSharpInternalUtility.GetTypeID(visitorContext.behaviourUserType));
visitorContext.topTable.CreateReflectionSymbol("udonTypeName", typeof(string), Internal.UdonSharpInternalUtility.GetTypeName(visitorContext.behaviourUserType));

Expand Down
13 changes: 10 additions & 3 deletions Assets/UdonSharp/Editor/UdonSharpClassVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,15 @@ public override void VisitCompilationUnit(CompilationUnitSyntax node)

public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
{
namespaceStack.Push(node.Name.ToFullString().TrimEnd('\r', '\n', ' '));
string[] namespaces = node.Name.ToFullString().TrimEnd('\r', '\n', ' ').Split('.');

foreach (string currentNamespace in namespaces)
namespaceStack.Push(currentNamespace);

base.VisitNamespaceDeclaration(node);

namespaceStack.Pop();
for (int i = 0; i < namespaces.Length; ++i)
namespaceStack.Pop();
}

public override void VisitClassDeclaration(ClassDeclarationSyntax node)
Expand All @@ -53,9 +57,12 @@ public override void VisitClassDeclaration(ClassDeclarationSyntax node)
using (ExpressionCaptureScope classTypeCapture = new ExpressionCaptureScope(visitorContext, null))
{
foreach (string namespaceToken in namespaceStack.Reverse())
{
classTypeCapture.ResolveAccessToken(namespaceToken);

visitorContext.resolverContext.AddNamespace(classTypeCapture.captureNamespace);
if (classTypeCapture.IsNamespace())
visitorContext.resolverContext.AddNamespace(classTypeCapture.captureNamespace);
}

classTypeCapture.ResolveAccessToken(node.Identifier.ValueText);

Expand Down
13 changes: 11 additions & 2 deletions Assets/UdonSharp/Editor/UdonSharpMethodVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,29 @@ public override void VisitUsingDirective(UsingDirectiveSyntax node)

public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
{
namespaceStack.Push(node.Name.ToFullString().TrimEnd('\r', '\n', ' '));
string[] namespaces = node.Name.ToFullString().TrimEnd('\r', '\n', ' ').Split('.');

foreach (string currentNamespace in namespaces)
namespaceStack.Push(currentNamespace);

base.VisitNamespaceDeclaration(node);

namespaceStack.Pop();
for (int i = 0; i < namespaces.Length; ++i)
namespaceStack.Pop();
}

public override void VisitClassDeclaration(ClassDeclarationSyntax node)
{
using (ExpressionCaptureScope classTypeCapture = new ExpressionCaptureScope(visitorContext, null))
{
foreach (string namespaceToken in namespaceStack.Reverse())
{
classTypeCapture.ResolveAccessToken(namespaceToken);

if (classTypeCapture.IsNamespace())
visitorContext.resolverContext.AddNamespace(classTypeCapture.captureNamespace);
}

visitorContext.resolverContext.AddNamespace(classTypeCapture.captureNamespace);

classTypeCapture.ResolveAccessToken(node.Identifier.ValueText);
Expand Down

0 comments on commit 726ae77

Please sign in to comment.