Exemple #1
0
        public void SetUp()
        {
            _mutableTypeBatchCodeGenerator = MockRepository.GenerateStrictMock <IMutableTypeBatchCodeGenerator>();
            _generatedCodeFlusher          = MockRepository.GenerateStrictMock <IGeneratedCodeFlusher>();

            _assemblyContext = new AssemblyContext(_mutableTypeBatchCodeGenerator, _generatedCodeFlusher);
        }
        public AssemblyContext(IMutableTypeBatchCodeGenerator mutableTypeBatchCodeGenerator, IGeneratedCodeFlusher generatedCodeFlusher)
        {
            ArgumentUtility.CheckNotNull("mutableTypeBatchCodeGenerator", mutableTypeBatchCodeGenerator);
            ArgumentUtility.CheckNotNull("generatedCodeFlusher", generatedCodeFlusher);

            _mutableTypeBatchCodeGenerator = mutableTypeBatchCodeGenerator;
            _generatedCodeFlusher          = generatedCodeFlusher;
            ResetParticipantState();
        }
Exemple #3
0
 private GeneratedTypesContext GenerateTypesWithDiagnostics(
     IMutableTypeBatchCodeGenerator codeGenerator, IEnumerable <MutableType> mutableTypes, string generationSubjectName)
 {
     try
     {
         var generatedTypes = codeGenerator.GenerateTypes(mutableTypes);
         return(new GeneratedTypesContext(generatedTypes));
     }
     catch (InvalidOperationException ex)
     {
         throw new InvalidOperationException(BuildExceptionMessage(generationSubjectName, ex), ex);
     }
     catch (NotSupportedException ex)
     {
         throw new NotSupportedException(BuildExceptionMessage(generationSubjectName, ex), ex);
     }
 }
Exemple #4
0
        public TypeAssemblyResult AssembleAdditionalType(
            object additionalTypeID,
            IParticipantState participantState,
            IMutableTypeBatchCodeGenerator codeGenerator)
        {
            ArgumentUtility.CheckNotNull("additionalTypeID", additionalTypeID);
            ArgumentUtility.CheckNotNull("participantState", participantState);
            ArgumentUtility.CheckNotNull("codeGenerator", codeGenerator);

            var context        = new AdditionalTypeAssemblyContext(_mutableTypeFactory, _participantConfigurationID, participantState);
            var additionalType = _participants.Select(p => p.GetOrCreateAdditionalType(additionalTypeID, context)).FirstOrDefault(t => t != null);

            if (additionalType == null)
            {
                throw new NotSupportedException("No participant provided an additional type for the given identifier.");
            }

            var generatedTypesContext = GenerateTypesWithDiagnostics(codeGenerator, context.AdditionalTypes.Values, additionalTypeID.ToString());

            context.OnGenerationCompleted(generatedTypesContext);

            Type resultType;

            if (additionalType is MutableType)
            {
                resultType = generatedTypesContext.GetGeneratedType((MutableType)additionalType);
            }
            else
            {
                resultType = additionalType;
            }

            return(new TypeAssemblyResult(
                       resultType,
                       context.AdditionalTypes.ToDictionary(kvp => kvp.Key, kvp => generatedTypesContext.GetGeneratedType(kvp.Value))));
        }
Exemple #5
0
        private GeneratedTypesContext GenerateTypes(AssembledTypeID typeID, ProxyTypeAssemblyContext context, IMutableTypeBatchCodeGenerator codeGenerator)
        {
            // Add [AssembledType] attribute.
            var attribute = new CustomAttributeDeclaration(s_assembledTypeAttributeCtor, new object[0]);

            context.ProxyType.AddCustomAttribute(attribute);

            // Add '__typeID' and initialization code.
            _assembledTypeIdentifierProvider.AddTypeID(context.ProxyType, typeID);

            // Enable complex serialization.
            _complexSerializationEnabler.MakeSerializable(context.ProxyType, _participantConfigurationID, _assembledTypeIdentifierProvider, typeID);

            var mutableTypes = context.AdditionalTypes.Values.Concat(new[] { context.ProxyType });

            return(GenerateTypesWithDiagnostics(codeGenerator, mutableTypes, context.RequestedType.Name));
        }
Exemple #6
0
        public TypeAssemblyResult AssembleType(AssembledTypeID typeID, IParticipantState participantState, IMutableTypeBatchCodeGenerator codeGenerator)
        {
            ArgumentUtility.CheckNotNull("typeID", typeID);
            ArgumentUtility.CheckNotNull("participantState", participantState);
            ArgumentUtility.CheckNotNull("codeGenerator", codeGenerator);

            var requestedType = typeID.RequestedType;

            CheckRequestedType(requestedType);

            if (ShortCircuitTypeAssembly(requestedType))
            {
                return(new TypeAssemblyResult(requestedType));
            }

            var typeModificationTracker = _mutableTypeFactory.CreateProxy(requestedType, ProxyKind.AssembledType);
            var context = new ProxyTypeAssemblyContext(
                _mutableTypeFactory, _participantConfigurationID, participantState, requestedType, typeModificationTracker.Type);

            foreach (var participant in _participants)
            {
                var idPart = _assembledTypeIdentifierProvider.GetPart(typeID, participant);
                participant.Participate(idPart, context);
            }

            if (!typeModificationTracker.IsModified())
            {
                return(new TypeAssemblyResult(requestedType));
            }

            var generatedTypesContext = GenerateTypes(typeID, context, codeGenerator);

            context.OnGenerationCompleted(generatedTypesContext);

            return(new TypeAssemblyResult(
                       generatedTypesContext.GetGeneratedType(context.ProxyType),
                       context.AdditionalTypes.ToDictionary(kvp => kvp.Key, kvp => generatedTypesContext.GetGeneratedType(kvp.Value))));
        }