GenFile ProcessFilePass1(ulong id, string name, Pass1State state, bool isGenerated) { var file = _typeDefMgr.CreateFile(id, isGenerated); var node = IdToNode(id); state.parent = null; file.Namespace = GetNamespaceAnnotation(node); file.Name = name; return(ProcessNodePass1(id, name, state) as GenFile); }
GenFile ProcessFilePass1(ulong id, string name, Pass1State state, bool isGenerated) { var file = _typeDefMgr.CreateFile(id, isGenerated); var node = IdToNode(id); state.parent = null; file.Namespace = GetNamespaceAnnotation(node); file.Name = name; file.NullableEnable = GetNullableEnable(node); file.EmitNullableDirective = GetEmitNullableDirective(node) ?? false; file.EmitDomainClassesAndInterfaces = GetEmitDomainClassesAndInterfaces(node) ?? true; file.TypeVisibility = GetTypeVisibility(node) ?? TypeVisibility.Public; if (_id2sourceInfo.TryGetValue(node.Id, out var sourceInfo)) { file.HeaderText = GetHeaderText(sourceInfo); } return(ProcessNodePass1(id, name, state) as GenFile); }
void BuildPass1(Dictionary <ulong, Schema.CodeGeneratorRequest.RequestedFile.Reader> requestedFiles) { Pass1State state = new Pass1State() { unprocessedNodes = new HashSet <ulong>(_id2node.Keys) }; foreach (var node in _id2node.Values.Where(n => n.IsFile)) { GenFile file; bool isGenerated = requestedFiles.TryGetValue(node.Id, out var req); var filename = isGenerated ? req.Filename : node.DisplayName; file = ProcessFilePass1(node.Id, filename, state, isGenerated); if (isGenerated) { _generatedFiles.Add(file); } } if (state.unprocessedNodes.Count != 0) { throw new InvalidSchemaException("Unreferenced nodes were present in the schema."); } }
IDefinition ProcessNodePass1(ulong id, string name, Pass1State state) { bool mustExist = state.parent == null || (state.parent as IDefinition).IsGenerated; if (!(IdToNode(id, mustExist) is Schema.Node.Reader node)) { return(null); } if (!state.unprocessedNodes.Remove(id)) { return(null); } IDefinition def = null; bool processNestedNodes = false; bool processFields = false; bool processInterfaceMethods = false; switch (node.GetKind()) { case NodeKind.Annotation: return(_typeDefMgr.CreateAnnotation(id, state.parent)); case NodeKind.Const: return(_typeDefMgr.CreateConstant(id, state.parent)); case NodeKind.File: if (state.parent != null) { throw new InvalidSchemaException($"Did not expect a file node {node.StrId()} to be a nested node."); } var file = _typeDefMgr.GetExistingFile(id); file.Namespace = GetNamespaceAnnotation(node); file.Name = name; state.parent = file; def = file; processNestedNodes = true; break; case NodeKind.Enum: break; case NodeKind.Interface: processNestedNodes = true; processFields = true; processInterfaceMethods = true; break; case NodeKind.Struct: case NodeKind.Group: processNestedNodes = true; processFields = true; break; default: throw new InvalidSchemaException($"Don't know how to process node {node.StrId()} \"{node.DisplayName}\""); } if (def == null) { Trace.Assert(state.parent != null, $"The {node.GetTypeTag().ToString()} node {node.StrId()} was expected to have a parent."); var typeDef = _typeDefMgr.CreateTypeDef(id, node.GetTypeTag(), state.parent); typeDef.Name = name; state.parent = typeDef; def = typeDef; } if (processNestedNodes && node.NestedNodes != null) { foreach (var nested in node.NestedNodes) { ProcessNodePass1(nested.Id, nested.Name, state); } } if (processFields && node.Fields != null) { foreach (var field in node.Fields.Where(f => f.IsGroup)) { var group = IdToNode(field.Group_TypeId); if (!group.IsStruct || !group.Struct_IsGroup) { throw new InvalidSchemaException($"Expected node with id {group.StrId()} to be a struct definition"); } ProcessNodePass1(field.Group_TypeId, field.Name, state); } } if (processInterfaceMethods && node.Interface_Methods != null) { foreach (var method in node.Interface_Methods) { var pnode = IdToNode(method.ParamStructType); if (pnode.ScopeId == 0) { ProcessNodePass1(pnode.Id, null, state); // Anonymous generated type } pnode = IdToNode(method.ResultStructType); if (pnode.ScopeId == 0) { ProcessNodePass1(pnode.Id, null, state); // Anonymous generated type } } } return(def); }