コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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.");
            }
        }
コード例 #4
0
        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);
        }