Пример #1
0
        void BuildPass2(Dictionary <ulong, Schema.CodeGeneratorRequest.RequestedFile.Reader> requestedFiles)
        {
            var state = new Pass2State()
            {
                processedNodes = new HashSet <ulong>()
            };

            foreach (var file in _typeDefMgr.Files)
            {
                var node = IdToNode(file.Id);
                ProcessNestedNodes(node.NestedNodes, state, file.IsGenerated);
            }
        }
Пример #2
0
        Type ProcessType(Schema.Type.Reader typeReader, Pass2State state)
        {
            Type result;

            switch (0)
            {
            case 0 when typeReader.IsAnyPointer:
                switch (0)
                {
                case 0 when typeReader.AnyPointer_IsParameter:
                    return(Types.FromParameter(
                               new GenericParameter()
                    {
                        DeclaringEntity = ProcessTypeDef(typeReader.AnyPointer_Parameter_ScopeId, state),
                        Index = typeReader.AnyPointer_Parameter_ParameterIndex
                    }));

                case 0 when typeReader.AnyPointer_IsImplicitMethodParameter:
                    return(Types.FromParameter(
                               new GenericParameter()
                    {
                        DeclaringEntity = state.currentMethod ?? throw new InvalidOperationException("current method not set"),
                        Index = typeReader.AnyPointer_ImplicitMethodParameter_ParameterIndex
                    }));

                case 0 when typeReader.AnyPointer_IsUnconstrained:

                    switch (0)
                    {
                    case 0 when typeReader.AnyPointer_Unconstrained_IsAnyKind:
                        return(Types.AnyPointer);

                    case 0 when typeReader.AnyPointer_Unconstrained_IsCapability:
                        return(Types.CapabilityPointer);

                    case 0 when typeReader.AnyPointer_Unconstrained_IsList:
                        return(Types.ListPointer);

                    case 0 when typeReader.AnyPointer_Unconstrained_IsStruct:
                        return(Types.StructPointer);

                    default:
                        throw new NotImplementedException();
                    }

                default:
                    throw new NotImplementedException();
                }
Пример #3
0
        Type ProcessType(Schema.Type.READER typeReader, Pass2State state)
        {
            Type result;

            switch (typeReader.which)
            {
            case Schema.Type.WHICH.AnyPointer:
                switch (typeReader.AnyPointer.which)
                {
                case Schema.Type.anyPointer.WHICH.Parameter:
                    return(Types.FromParameter(
                               new GenericParameter()
                    {
                        DeclaringEntity = ProcessTypeDef(typeReader.AnyPointer.Parameter.ScopeId, state),
                        Index = typeReader.AnyPointer.Parameter.ParameterIndex
                    }));

                case Schema.Type.anyPointer.WHICH.ImplicitMethodParameter:
                    return(Types.FromParameter(
                               new GenericParameter()
                    {
                        DeclaringEntity = state.currentMethod ?? throw new InvalidOperationException("current method not set"),
                        Index = typeReader.AnyPointer.ImplicitMethodParameter.ParameterIndex
                    }));

                case Schema.Type.anyPointer.WHICH.Unconstrained:
                    switch (typeReader.AnyPointer.Unconstrained.which)
                    {
                    case Schema.Type.anyPointer.unconstrained.WHICH.AnyKind:
                        return(Types.AnyPointer);

                    case Schema.Type.anyPointer.unconstrained.WHICH.Capability:
                        return(Types.CapabilityPointer);

                    case Schema.Type.anyPointer.unconstrained.WHICH.List:
                        return(Types.ListPointer);

                    case Schema.Type.anyPointer.unconstrained.WHICH.Struct:
                        return(Types.StructPointer);

                    default:
                        throw new NotImplementedException();
                    }

                default:
                    throw new NotImplementedException();
                }
Пример #4
0
        void ProcessBrand(Schema.Brand.Reader brandReader, Type type, Pass2State state)
        {
            foreach (var scopeReader in brandReader.Scopes)
            {
                var whatToBind = ProcessTypeDef(scopeReader.ScopeId, state);
                int index      = 0;

                switch (0)
                {
                case 0 when scopeReader.IsBind:
                    foreach (var bindingReader in scopeReader.Bind)
                    {
                        var typeParameter = new GenericParameter()
                        {
                            DeclaringEntity = whatToBind,
                            Index           = index++
                        };

                        switch (0)
                        {
                        case 0 when bindingReader.IsType:
                            type.BindGenericParameter(typeParameter, ProcessType(bindingReader.Type, state));
                            break;

                        case 0 when bindingReader.IsUnbound:
                            type.BindGenericParameter(typeParameter, Types.FromParameter(typeParameter));
                            break;
                        }
                    }
                    break;

                case 0 when scopeReader.IsInherit:
                    for (index = 0; index < type.DeclaringType.Definition.GenericParameters.Count; index++)
                    {
                        var typeParameter = new GenericParameter()
                        {
                            DeclaringEntity = whatToBind,
                            Index           = index
                        };

                        type.BindGenericParameter(typeParameter, Types.FromParameter(typeParameter));
                    }
                    break;
                }
            }
        }
Пример #5
0
 void ProcessNestedNodes(IEnumerable <Schema.Node.NestedNode.Reader> nestedNodes, Pass2State state, bool mustExist)
 {
     foreach (var nestedNode in nestedNodes)
     {
         ProcessNode(nestedNode.Id, state, mustExist);
     }
 }