mirror of
https://github.com/godotengine/godot.git
synced 2025-10-31 21:51:22 +00:00
C#: Fix ScriptPathAttribute generator with none or nested namespaces
The following two bugs were fixed:
- For classes without namespace we were still generating `namespace {`
without a namespace identifier, causing a syntax error.
- For classes with nested namespaces we were generating only the innermost
part of the namespace was being generated, e.g.: for `Foo.Bar` we were
generating `namespace Bar {` instead of `namespace Foo.Bar {`.
This wasn't causing any build error, but because of the wrong namespace
Godot wasn't able to find the class associated with the script.
This commit is contained in:
parent
bf309b8a13
commit
ee8e5146a4
4 changed files with 54 additions and 24 deletions
|
|
@ -69,7 +69,7 @@ namespace Godot.SourceGenerators
|
|||
IEnumerable<ClassDeclarationSyntax> classDeclarations
|
||||
)
|
||||
{
|
||||
var attributesBuilder = new StringBuilder();
|
||||
var attributes = new StringBuilder();
|
||||
|
||||
// Remember syntax trees for which we already added an attribute, to prevent unnecessary duplicates.
|
||||
var attributedTrees = new List<SyntaxTree>();
|
||||
|
|
@ -81,28 +81,54 @@ namespace Godot.SourceGenerators
|
|||
|
||||
attributedTrees.Add(cds.SyntaxTree);
|
||||
|
||||
if (attributesBuilder.Length != 0)
|
||||
attributesBuilder.Append("\n ");
|
||||
if (attributes.Length != 0)
|
||||
attributes.Append("\n");
|
||||
|
||||
attributesBuilder.Append(@"[ScriptPathAttribute(""res://");
|
||||
attributesBuilder.Append(RelativeToDir(cds.SyntaxTree.FilePath, godotProjectDir));
|
||||
attributesBuilder.Append(@""")]");
|
||||
attributes.Append(@"[ScriptPathAttribute(""res://");
|
||||
attributes.Append(RelativeToDir(cds.SyntaxTree.FilePath, godotProjectDir));
|
||||
attributes.Append(@""")]");
|
||||
}
|
||||
|
||||
string classNs = symbol.ContainingNamespace.Name;
|
||||
string className = symbol.Name;
|
||||
|
||||
var source = $@"using Godot;
|
||||
namespace {classNs}
|
||||
{{
|
||||
{attributesBuilder}
|
||||
partial class {className}
|
||||
{{
|
||||
}}
|
||||
}}
|
||||
";
|
||||
context.AddSource(classNs + "." + className + "_ScriptPath_Generated",
|
||||
SourceText.From(source, Encoding.UTF8));
|
||||
INamespaceSymbol namespaceSymbol = symbol.ContainingNamespace;
|
||||
string classNs = namespaceSymbol != null && !namespaceSymbol.IsGlobalNamespace ?
|
||||
namespaceSymbol.FullQualifiedName() :
|
||||
string.Empty;
|
||||
bool hasNamespace = classNs.Length != 0;
|
||||
|
||||
string uniqueName = hasNamespace ?
|
||||
classNs + "." + className + "_ScriptPath_Generated" :
|
||||
className + "_ScriptPath_Generated";
|
||||
|
||||
var source = new StringBuilder();
|
||||
|
||||
// using Godot;
|
||||
// namespace {classNs} {
|
||||
// {attributesBuilder}
|
||||
// partial class {className} { }
|
||||
// }
|
||||
|
||||
source.Append("using Godot;\n");
|
||||
|
||||
if (hasNamespace)
|
||||
{
|
||||
source.Append("namespace ");
|
||||
source.Append(classNs);
|
||||
source.Append(" {\n\n");
|
||||
}
|
||||
|
||||
source.Append(attributes);
|
||||
source.Append("\n partial class ");
|
||||
source.Append(className);
|
||||
source.Append("\n{\n}\n");
|
||||
|
||||
if (hasNamespace)
|
||||
{
|
||||
source.Append("\n}\n");
|
||||
}
|
||||
|
||||
context.AddSource(uniqueName, SourceText.From(source.ToString(), Encoding.UTF8));
|
||||
}
|
||||
|
||||
private static void AddScriptTypesAssemblyAttr(GeneratorExecutionContext context,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue