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); } }
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(); }
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(); }
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; } } }
void ProcessNestedNodes(IEnumerable <Schema.Node.NestedNode.Reader> nestedNodes, Pass2State state, bool mustExist) { foreach (var nestedNode in nestedNodes) { ProcessNode(nestedNode.Id, state, mustExist); } }