Fix namespace generation in imported types.

This commit is contained in:
Kuba Ober 2019-08-29 11:38:43 -04:00
parent dd83132b5d
commit 884040bd66
4 changed files with 41 additions and 42 deletions

View File

@ -147,18 +147,9 @@
internal string Transform(GenFile file) internal string Transform(GenFile file)
{ {
if (file.Namespace != null) NameSyntax topNamespace = GenNames.NamespaceName(file.Namespace) ?? _names.TopNamespace;
{
_names.TopNamespace = IdentifierName(MakeCamel(file.Namespace[0]));
foreach (string name in file.Namespace.Skip(1)) var ns = NamespaceDeclaration(topNamespace);
{
var temp = IdentifierName(MakeCamel(name));
_names.TopNamespace = QualifiedName(_names.TopNamespace, temp);
}
}
var ns = NamespaceDeclaration(_names.TopNamespace);
foreach (var def in file.NestedTypes) foreach (var def in file.NestedTypes)
{ {

View File

@ -213,28 +213,23 @@ namespace CapnpC.Generator
} }
} }
NameSyntax GetQName(TypeDefinition def) public static NameSyntax NamespaceName(string[] @namespace)
{ {
var stack = new Stack<SimpleNameSyntax>(); NameSyntax ident = null;
if (@namespace != null)
stack.Push(MakeGenericTypeName(def, NameUsage.Default));
while (def.DeclaringElement is TypeDefinition pdef)
{ {
stack.Push(MakeGenericTypeName(pdef, NameUsage.Namespace)); ident = IdentifierName(SyntaxHelpers.MakeCamel(@namespace[0]));
def = pdef; foreach (string name in @namespace.Skip(1))
{
var temp = IdentifierName(SyntaxHelpers.MakeCamel(name));
ident = QualifiedName(ident, temp);
}
} }
return ident;
var qtype = TopNamespace;
foreach (var name in stack)
{
qtype = QualifiedName(qtype, name);
}
return qtype;
} }
NameSyntax GetNamespaceFor(TypeDefinition def) => NamespaceName(def?.File?.Namespace);
internal NameSyntax GetQName(Model.Type type, TypeDefinition scope) internal NameSyntax GetQName(Model.Type type, TypeDefinition scope)
{ {
// FIXME: With the help of the 'scope' parameter we will be able to generate abbreviated // FIXME: With the help of the 'scope' parameter we will be able to generate abbreviated
@ -262,7 +257,10 @@ namespace CapnpC.Generator
def = pdef; def = pdef;
} }
var qtype = TopNamespace; var qtype =
GetNamespaceFor(type.Definition)
?? GetNamespaceFor(scope)
?? TopNamespace;
foreach (var name in stack) foreach (var name in stack)
{ {

View File

@ -132,7 +132,7 @@ namespace CapnpC.Model
if (state.parent != null) if (state.parent != null)
throw new InvalidSchemaException("Did not expect file nodes to appear as nested nodes"); throw new InvalidSchemaException("Did not expect file nodes to appear as nested nodes");
file = new GenFile(); file = new GenFile();
file.Namespace = null; // TODO file.Namespace = GetNamespaceAnnotation(node);
processNestedNodes = true; processNestedNodes = true;
break; break;
case NodeKind.Enum: case NodeKind.Enum:
@ -189,6 +189,18 @@ namespace CapnpC.Model
return state.parent; return state.parent;
} }
string[] GetNamespaceAnnotation(Schema.Node.Reader fileNode)
{
foreach (var annotation in fileNode.Annotations)
{
if (annotation.Id == 0xb9c6f99ebf805f2c) // Cxx namespace
{
return annotation.Value.Text.Split(new string[1] { "::" }, default);
}
}
return null;
}
// 2nd pass: Generate types based on definitions // 2nd pass: Generate types based on definitions
struct Pass2State struct Pass2State
@ -206,7 +218,6 @@ namespace CapnpC.Model
{ {
var node = IdToNode(file.Id); var node = IdToNode(file.Id);
state.isGenerated = _request.RequestedFiles.Where(req => req.Id == file.Id).Any(); state.isGenerated = _request.RequestedFiles.Where(req => req.Id == file.Id).Any();
ProcessFileAnnotations(node, file.File);
ProcessNestedNodes(node.NestedNodes, state); ProcessNestedNodes(node.NestedNodes, state);
} }
} }
@ -219,17 +230,6 @@ namespace CapnpC.Model
} }
} }
void ProcessFileAnnotations(Schema.Node.Reader fileNode, GenFile fileElement)
{
foreach (var annotation in fileNode.Annotations)
{
if (annotation.Id == 0xb9c6f99ebf805f2c) // Cxx namespace
{
fileElement.Namespace = annotation.Value.Text.Split(new string[1] { "::" }, default);
}
}
}
void ProcessBrand(Schema.Brand.Reader brandReader, Type type, Pass2State state) void ProcessBrand(Schema.Brand.Reader brandReader, Type type, Pass2State state)
{ {
foreach (var scopeReader in brandReader.Scopes) foreach (var scopeReader in brandReader.Scopes)

View File

@ -54,6 +54,16 @@ namespace CapnpC.Model
} }
} }
public GenFile File
{
get
{
IHasNestedDefinitions cur = this;
while (cur is TypeDefinition def) cur = def.DeclaringElement;
return cur as GenFile;
}
}
public IEnumerable<GenericParameter> AllTypeParameters public IEnumerable<GenericParameter> AllTypeParameters
{ {
get get