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>() });
private void EmitOutput(OutputSymbol outputSymbol) { writer.WriteStartObject(); this.emitter.EmitProperty("type", outputSymbol.Type.Name); this.emitter.EmitProperty("value", outputSymbol.Value); writer.WriteEndObject(); }