protected PEModuleBuilder(
            TCompilation compilation,
            TSourceModuleSymbol sourceModule,
            Cci.ModulePropertiesForSerialization serializationProperties,
            IEnumerable <ResourceDescription> manifestResources,
            OutputKind outputKind,
            EmitOptions emitOptions,
            TModuleCompilationState compilationState)
        {
            Debug.Assert(sourceModule != null);
            Debug.Assert(serializationProperties != null);

            _compilation             = compilation;
            _sourceModule            = sourceModule;
            _serializationProperties = serializationProperties;
            this.ManifestResources   = manifestResources;
            _outputKind           = outputKind;
            _emitOptions          = emitOptions;
            this.CompilationState = compilationState;

            if (compilation.IsCaseSensitive)
            {
                _debugDocuments = new ConcurrentDictionary <string, Cci.DebugSourceDocument>(StringComparer.Ordinal);
            }
            else
            {
                _debugDocuments = new ConcurrentDictionary <string, Cci.DebugSourceDocument>(StringComparer.OrdinalIgnoreCase);
            }
        }
示例#2
0
        public EEAssemblyBuilder(
            SourceAssemblySymbol sourceAssembly,
            EmitOptions emitOptions,
            Cci.ModulePropertiesForSerialization serializationProperties,
            ImmutableArray <NamedTypeSymbol> additionalTypes,
            Func <NamedTypeSymbol, NamedTypeSymbol> getDynamicOperationContextType,
            CompilationTestData?testData
            )
            : base(
                sourceAssembly,
                emitOptions,
                outputKind: OutputKind.DynamicallyLinkedLibrary,
                serializationProperties: serializationProperties,
                manifestResources: SpecializedCollections.EmptyEnumerable <ResourceDescription>(),
                additionalTypes: additionalTypes
                )
        {
            _getDynamicOperationContextType = getDynamicOperationContextType;

            if (testData != null)
            {
                this.SetMethodTestData(testData.Methods);
                testData.Module = this;
            }
        }
示例#3
0
        public PEAssemblyBuilderBase(
            SourceAssemblySymbol sourceAssembly,
            EmitOptions emitOptions,
            OutputKind outputKind,
            Cci.ModulePropertiesForSerialization serializationProperties,
            IEnumerable <ResourceDescription> manifestResources,
            ImmutableArray <NamedTypeSymbol> additionalTypes
            )
            : base(
                (SourceModuleSymbol)sourceAssembly.Modules[0],
                emitOptions,
                outputKind,
                serializationProperties,
                manifestResources
                )
        {
            Debug.Assert(sourceAssembly is object);

            _sourceAssembly  = sourceAssembly;
            _additionalTypes = additionalTypes.NullToEmpty();
            _metadataName    =
                (emitOptions.OutputNameOverride == null)
                    ? sourceAssembly.MetadataName
                    : FileNameUtilities.ChangeExtension(
                    emitOptions.OutputNameOverride,
                    extension: null
                    );

            AssemblyOrModuleSymbolToModuleRefMap.Add(sourceAssembly, this);
        }
        public PEDeltaAssemblyBuilder(
            SourceAssemblySymbol sourceAssembly,
            EmitOptions emitOptions,
            OutputKind outputKind,
            Cci.ModulePropertiesForSerialization serializationProperties,
            IEnumerable <ResourceDescription> manifestResources,
            EmitBaseline previousGeneration,
            IEnumerable <SemanticEdit> edits,
            Func <ISymbol, bool> isAddedSymbol)
            : base(sourceAssembly, emitOptions, outputKind, serializationProperties, manifestResources, additionalTypes: ImmutableArray <NamedTypeSymbol> .Empty)
        {
            var initialBaseline = previousGeneration.InitialBaseline;
            var context         = new EmitContext(this, null, new DiagnosticBag(), metadataOnly: false, includePrivateMembers: true);

            // Hydrate symbols from initial metadata. Once we do so it is important to reuse these symbols across all generations,
            // in order for the symbol matcher to be able to use reference equality once it maps symbols to initial metadata.
            var metadataSymbols  = GetOrCreateMetadataSymbols(initialBaseline, sourceAssembly.DeclaringCompilation);
            var metadataDecoder  = (MetadataDecoder)metadataSymbols.MetadataDecoder;
            var metadataAssembly = (PEAssemblySymbol)metadataDecoder.ModuleSymbol.ContainingAssembly;

            var matchToMetadata = new CSharpSymbolMatcher(metadataSymbols.AnonymousTypes, metadataSymbols.SynthesizedDelegates, sourceAssembly, context, metadataAssembly);

            CSharpSymbolMatcher?matchToPrevious = null;

            if (previousGeneration.Ordinal > 0)
            {
                RoslynDebug.AssertNotNull(previousGeneration.Compilation);
                RoslynDebug.AssertNotNull(previousGeneration.PEModuleBuilder);

                var previousAssembly = ((CSharpCompilation)previousGeneration.Compilation).SourceAssembly;
                var previousContext  = new EmitContext((PEModuleBuilder)previousGeneration.PEModuleBuilder, null, new DiagnosticBag(), metadataOnly: false, includePrivateMembers: true);

                matchToPrevious = new CSharpSymbolMatcher(
                    previousGeneration.AnonymousTypeMap,
                    previousGeneration.SynthesizedDelegates,
                    sourceAssembly: sourceAssembly,
                    sourceContext: context,
                    otherAssembly: previousAssembly,
                    otherContext: previousContext,
                    otherSynthesizedMembersOpt: previousGeneration.SynthesizedMembers);
            }

            _previousDefinitions = new CSharpDefinitionMap(edits, metadataDecoder, matchToMetadata, matchToPrevious);
            _previousGeneration  = previousGeneration;
            _changes             = new CSharpSymbolChanges(_previousDefinitions, edits, isAddedSymbol);

            // Workaround for https://github.com/dotnet/roslyn/issues/3192.
            // When compiling state machine we stash types of awaiters and state-machine hoisted variables,
            // so that next generation can look variables up and reuse their slots if possible.
            //
            // When we are about to allocate a slot for a lifted variable while compiling the next generation
            // we map its type to the previous generation and then check the slot types that we stashed earlier.
            // If the variable type matches we reuse it. In order to compare the previous variable type with the current one
            // both need to be completely lowered (translated). Standard translation only goes one level deep.
            // Generic arguments are not translated until they are needed by metadata writer.
            //
            // In order to get the fully lowered form we run the type symbols of stashed variables through a deep translator
            // that translates the symbol recursively.
            _deepTranslator = new CSharpSymbolMatcher.DeepTranslator(sourceAssembly.GetSpecialType(SpecialType.System_Object));
        }
示例#5
0
 internal PENetModuleBuilder(
     SourceModuleSymbol sourceModule,
     EmitOptions emitOptions,
     Cci.ModulePropertiesForSerialization serializationProperties,
     IEnumerable <ResourceDescription> manifestResources)
     : base(sourceModule, emitOptions, OutputKind.NetModule, serializationProperties, manifestResources)
 {
 }
示例#6
0
 public PEAssemblyBuilder(
     SourceAssemblySymbol sourceAssembly,
     EmitOptions emitOptions,
     OutputKind outputKind,
     Cci.ModulePropertiesForSerialization serializationProperties,
     IEnumerable <ResourceDescription> manifestResources)
     : base(sourceAssembly, emitOptions, outputKind, serializationProperties, manifestResources, ImmutableArray <NamedTypeSymbol> .Empty)
 {
 }
示例#7
0
        protected PEModuleBuilder(
            TCompilation compilation,
            TSourceModuleSymbol sourceModule,
            Cci.ModulePropertiesForSerialization serializationProperties,
            IEnumerable <ResourceDescription> manifestResources,
            OutputKind outputKind,
            EmitOptions emitOptions,
            TModuleCompilationState compilationState)
            : base(manifestResources, emitOptions, outputKind, serializationProperties, compilation)
        {
            Debug.Assert(sourceModule != null);
            Debug.Assert(serializationProperties != null);

            Compilation           = compilation;
            SourceModule          = sourceModule;
            this.CompilationState = compilationState;
        }
示例#8
0
        public CommonPEModuleBuilder(
            IEnumerable <ResourceDescription> manifestResources,
            EmitOptions emitOptions,
            OutputKind outputKind,
            Cci.ModulePropertiesForSerialization serializationProperties,
            Compilation compilation)
        {
            Debug.Assert(manifestResources != null);
            Debug.Assert(serializationProperties != null);
            Debug.Assert(compilation != null);

            ManifestResources       = manifestResources;
            DebugDocumentsBuilder   = new DebugDocumentsBuilder(compilation.Options.SourceReferenceResolver, compilation.IsCaseSensitive);
            OutputKind              = outputKind;
            SerializationProperties = serializationProperties;
            _methodBodyMap          = new ConcurrentDictionary <IMethodSymbol, Cci.IMethodBody>(ReferenceEqualityComparer.Instance);
            DebugInformationFormat  = emitOptions.DebugInformationFormat;
        }