Exemplo n.º 1
0
        private static IEnumerable <FunctionSymbol> GetAccessibleDecoratorFunctions(NamespaceType namespaceType, Symbol?enclosingDeclarationSymbol)
        {
            // Local function.
            IEnumerable <FunctionSymbol> GetAccessible(IEnumerable <FunctionSymbol> symbols, TypeSymbol targetType, FunctionFlags flags) =>
            symbols.Where(functionSymbol => functionSymbol.Overloads.Any(overload =>
                                                                         overload.Flags.HasFlag(flags) &&
                                                                         namespaceType.DecoratorResolver.TryGetDecorator(overload)?.CanAttachTo(targetType) == true));

            var knownDecoratorFunctions = namespaceType.DecoratorResolver.GetKnownDecoratorFunctions().Values;

            return(enclosingDeclarationSymbol switch
            {
                ParameterSymbol parameterSymbol => GetAccessible(knownDecoratorFunctions, parameterSymbol.Type, FunctionFlags.ParameterDecorator),
                VariableSymbol variableSymbol => GetAccessible(knownDecoratorFunctions, variableSymbol.Type, FunctionFlags.VariableDecorator),
                ResourceSymbol resourceSymbol => GetAccessible(knownDecoratorFunctions, resourceSymbol.Type, FunctionFlags.ResoureDecorator),
                ModuleSymbol moduleSymbol => GetAccessible(knownDecoratorFunctions, moduleSymbol.Type, FunctionFlags.ModuleDecorator),
                OutputSymbol outputSymbol => GetAccessible(knownDecoratorFunctions, outputSymbol.Type, FunctionFlags.OutputDecorator),

                /*
                 * The decorator is dangling if enclosingDeclarationSymbol is null. Return all decorator factory functions since
                 * we don't know which kind of declaration it will attach to.
                 */
                null => knownDecoratorFunctions,
                _ => Enumerable.Empty <FunctionSymbol>()
            });
Exemplo n.º 2
0
        private void EmitOutput(OutputSymbol outputSymbol)
        {
            writer.WriteStartObject();

            this.emitter.EmitProperty("type", outputSymbol.Type.Name);
            this.emitter.EmitProperty("value", outputSymbol.Value);

            writer.WriteEndObject();
        }