Ejemplo n.º 1
0
 internal static async Task TestAddConstructorAsync(
     string initial,
     string expected,
     string name = "C",
     Accessibility accessibility            = Accessibility.Public,
     Editing.DeclarationModifiers modifiers = default(Editing.DeclarationModifiers),
     ImmutableArray <Func <SemanticModel, IParameterSymbol> > parameters = default(ImmutableArray <Func <SemanticModel, IParameterSymbol> >),
     ImmutableArray <SyntaxNode> statements      = default(ImmutableArray <SyntaxNode>),
     ImmutableArray <SyntaxNode> baseArguments   = default(ImmutableArray <SyntaxNode>),
     ImmutableArray <SyntaxNode> thisArguments   = default(ImmutableArray <SyntaxNode>),
     CodeGenerationOptions codeGenerationOptions = default(CodeGenerationOptions),
     bool ignoreTrivia = true)
 {
     using (var context = await TestContext.CreateAsync(initial, expected, ignoreTrivia))
     {
         var parameterSymbols = GetParameterSymbols(parameters, context);
         var ctor             = CodeGenerationSymbolFactory.CreateConstructorSymbol(
             default(ImmutableArray <AttributeData>),
             accessibility,
             modifiers,
             name,
             parameterSymbols,
             statements,
             baseConstructorArguments: baseArguments,
             thisConstructorArguments: thisArguments);
         context.Result = await context.Service.AddMethodAsync(context.Solution, (INamedTypeSymbol)context.GetDestination(), ctor, codeGenerationOptions);
     }
 }
Ejemplo n.º 2
0
        internal static async Task TestAddEventAsync(
            string initial,
            string expected,
            string name = "E",
            ImmutableArray <AttributeData> attributes = default(ImmutableArray <AttributeData>),
            Accessibility accessibility            = Accessibility.Public,
            Editing.DeclarationModifiers modifiers = default(Editing.DeclarationModifiers),
            ImmutableArray <Func <SemanticModel, IParameterSymbol> > parameters = default(ImmutableArray <Func <SemanticModel, IParameterSymbol> >),
            Type type = null,
            Func <SemanticModel, ImmutableArray <IEventSymbol> > getExplicitInterfaceImplementations = null,
            IMethodSymbol addMethod    = null,
            IMethodSymbol removeMethod = null,
            IMethodSymbol raiseMethod  = null,
            CodeGenerationOptions codeGenerationOptions = default(CodeGenerationOptions),
            bool ignoreTrivia = true)
        {
            using (var context = await TestContext.CreateAsync(initial, expected, ignoreTrivia))
            {
                type = type ?? typeof(Action);

                var parameterSymbols = GetParameterSymbols(parameters, context);
                var typeSymbol       = GetTypeSymbol(type)(context.SemanticModel);
                var @event           = CodeGenerationSymbolFactory.CreateEventSymbol(
                    attributes,
                    accessibility,
                    modifiers,
                    typeSymbol,
                    getExplicitInterfaceImplementations?.Invoke(context.SemanticModel) ?? default,
                    name,
                    addMethod,
                    removeMethod,
                    raiseMethod);
                context.Result = await context.Service.AddEventAsync(context.Solution, (INamedTypeSymbol)context.GetDestination(), @event, codeGenerationOptions);
            }
        }
Ejemplo n.º 3
0
        internal static async Task TestAddConversionAsync(
            string initial,
            string expected,
            Type toType,
            Func <SemanticModel, IParameterSymbol> fromType,
            bool isImplicit                             = false,
            Accessibility accessibility                 = Accessibility.Public,
            Editing.DeclarationModifiers modifiers      = default(Editing.DeclarationModifiers),
            string statements                           = null,
            CodeGenerationOptions codeGenerationOptions = default(CodeGenerationOptions),
            bool ignoreTrivia                           = true)
        {
            if (statements != null)
            {
                expected = expected.Replace("$$", statements);
            }

            using (var context = await TestContext.CreateAsync(initial, expected, ignoreTrivia))
            {
                var parsedStatements = context.ParseStatements(statements);
                var method           = CodeGenerationSymbolFactory.CreateConversionSymbol(
                    default(ImmutableArray <AttributeData>),
                    accessibility,
                    modifiers,
                    GetTypeSymbol(toType)(context.SemanticModel),
                    fromType(context.SemanticModel),
                    isImplicit,
                    parsedStatements);

                context.Result = await context.Service.AddMethodAsync(context.Solution, (INamedTypeSymbol)context.GetDestination(), method, codeGenerationOptions);
            }
        }
Ejemplo n.º 4
0
 internal static async Task TestAddDelegateTypeAsync(
     string initial,
     string expected,
     string name = "D",
     Accessibility accessibility            = Accessibility.Public,
     Editing.DeclarationModifiers modifiers = default(Editing.DeclarationModifiers),
     Type returnType = null,
     ImmutableArray <ITypeParameterSymbol> typeParameters = default(ImmutableArray <ITypeParameterSymbol>),
     ImmutableArray <Func <SemanticModel, IParameterSymbol> > parameters = default(ImmutableArray <Func <SemanticModel, IParameterSymbol> >),
     CodeGenerationOptions codeGenerationOptions = default(CodeGenerationOptions),
     bool ignoreTrivia = true)
 {
     using (var context = await TestContext.CreateAsync(initial, expected, ignoreTrivia))
     {
         var parameterSymbols = GetParameterSymbols(parameters, context);
         var type             = CodeGenerationSymbolFactory.CreateDelegateTypeSymbol(
             default(ImmutableArray <AttributeData>),
             accessibility,
             modifiers,
             GetTypeSymbol(returnType)(context.SemanticModel),
             false,
             name,
             typeParameters,
             parameterSymbols);
         context.Result = await context.Service.AddNamedTypeAsync(context.Solution, (INamedTypeSymbol)context.GetDestination(), type, codeGenerationOptions);
     }
 }
Ejemplo n.º 5
0
 internal static async Task TestAddFieldAsync(
     string initial,
     string expected,
     Func<SemanticModel, ITypeSymbol> type = null,
     string name = "F",
     Accessibility accessibility = Accessibility.Public,
     Editing.DeclarationModifiers modifiers = default(Editing.DeclarationModifiers),
     CodeGenerationOptions codeGenerationOptions = null,
     bool hasConstantValue = false,
     object constantValue = null,
     bool addToCompilationUnit = false)
 {
     using (var context = await TestContext.CreateAsync(initial, expected))
     {
         var typeSymbol = type != null ? type(context.SemanticModel) : null;
         var field = CodeGenerationSymbolFactory.CreateFieldSymbol(
             default(ImmutableArray<AttributeData>),
             accessibility,
             modifiers,
             typeSymbol,
             name,
             hasConstantValue,
             constantValue);
         if (!addToCompilationUnit)
         {
             context.Result = await context.Service.AddFieldAsync(context.Solution, (INamedTypeSymbol)context.GetDestination(), field, codeGenerationOptions);
         }
         else
         {
             var newRoot = context.Service.AddField(await context.Document.GetSyntaxRootAsync(), field, codeGenerationOptions);
             context.Result = context.Document.WithSyntaxRoot(newRoot);
         }
     }
 }
Ejemplo n.º 6
0
        internal static async Task TestAddPropertyAsync(
            string initial,
            string expected,
            string name = "P",
            Accessibility defaultAccessibility     = Accessibility.Public,
            Accessibility setterAccessibility      = Accessibility.Public,
            Editing.DeclarationModifiers modifiers = default(Editing.DeclarationModifiers),
            string getStatements = null,
            string setStatements = null,
            Type type            = null,
            ImmutableArray <IPropertySymbol> explicitInterfaceImplementations   = default,
            ImmutableArray <Func <SemanticModel, IParameterSymbol> > parameters = default(ImmutableArray <Func <SemanticModel, IParameterSymbol> >),
            bool isIndexer = false,
            CodeGenerationOptions codeGenerationOptions = default(CodeGenerationOptions),
            bool ignoreTrivia = true,
            IDictionary <OptionKey, object> options = null)
        {
            // This assumes that tests will not use place holders for get/set statements at the same time
            if (getStatements != null)
            {
                expected = expected.Replace("$$", getStatements);
            }

            if (setStatements != null)
            {
                expected = expected.Replace("$$", setStatements);
            }

            using (var context = await TestContext.CreateAsync(initial, expected, ignoreTrivia))
            {
                if (options != null)
                {
                    foreach (var kvp in options)
                    {
                        context.Workspace.Options = context.Workspace.Options.WithChangedOption(kvp.Key, kvp.Value);
                    }
                }

                var typeSymbol          = GetTypeSymbol(type)(context.SemanticModel);
                var getParameterSymbols = GetParameterSymbols(parameters, context);
                var setParameterSymbols = getParameterSymbols == null
                    ? default(ImmutableArray <IParameterSymbol>)
                    : getParameterSymbols.Add(Parameter(type, "value")(context.SemanticModel));
                IMethodSymbol getAccessor = CodeGenerationSymbolFactory.CreateMethodSymbol(
                    default(ImmutableArray <AttributeData>),
                    defaultAccessibility,
                    new Editing.DeclarationModifiers(isAbstract: getStatements == null),
                    typeSymbol,
                    false,
Ejemplo n.º 7
0
 internal static async Task TestAddFieldAsync(
     string initial,
     string expected,
     Func<SemanticModel, ITypeSymbol> type = null,
     string name = "F",
     Accessibility accessibility = Accessibility.Public,
     Editing.DeclarationModifiers modifiers = default,
     CodeGenerationOptions codeGenerationOptions = null,
     bool hasConstantValue = false,
     object constantValue = null,
     bool addToCompilationUnit = false)
 {
     using var context = await TestContext.CreateAsync(initial, expected);
     var typeSymbol = type != null ? type(context.SemanticModel) : null;
     var field = CodeGenerationSymbolFactory.CreateFieldSymbol(
         attributes: default,
Ejemplo n.º 8
0
        internal static async Task TestAddUnsupportedOperatorAsync(
            string initial,
            CodeGenerationOperatorKind operatorKind,
            Accessibility accessibility            = Accessibility.Public,
            Editing.DeclarationModifiers modifiers = default(Editing.DeclarationModifiers),
            Type returnType = null,
            ImmutableArray <Func <SemanticModel, IParameterSymbol> > parameters = default(ImmutableArray <Func <SemanticModel, IParameterSymbol> >),
            string statements = null,
            CodeGenerationOptions codeGenerationOptions = default(CodeGenerationOptions),
            bool ignoreTrivia = true)
        {
            using (var context = await TestContext.CreateAsync(initial, initial, ignoreResult: true))
            {
                var parameterSymbols = GetParameterSymbols(parameters, context);
                var parsedStatements = context.ParseStatements(statements);

                var method = CodeGenerationSymbolFactory.CreateOperatorSymbol(
                    default(ImmutableArray <AttributeData>),
                    accessibility,
                    modifiers,
                    GetTypeSymbol(returnType)(context.SemanticModel),
                    operatorKind,
                    parameterSymbols,
                    parsedStatements);

                ArgumentException exception = null;
                try
                {
                    await context.Service.AddMethodAsync(context.Solution, (INamedTypeSymbol)context.GetDestination(), method, codeGenerationOptions);
                }
                catch (ArgumentException e)
                {
                    exception = e;
                }

                var expectedMessage = string.Format(WorkspacesResources.Cannot_generate_code_for_unsupported_operator_0, method.Name);
                Assert.True(exception != null && exception.Message.StartsWith(expectedMessage, StringComparison.Ordinal),
                            string.Format("\r\nExpected exception: {0}\r\nActual exception: {1}\r\n", expectedMessage, exception == null ? "no exception" : exception.Message));
            }
        }
Ejemplo n.º 9
0
        internal static async Task TestAddMethodAsync(
            string initial,
            string expected,
            string name = "M",
            Accessibility accessibility            = Accessibility.Public,
            Editing.DeclarationModifiers modifiers = default(Editing.DeclarationModifiers),
            Type returnType = null,
            Func <SemanticModel, ImmutableArray <IMethodSymbol> > getExplicitInterfaces = null,
            ImmutableArray <ITypeParameterSymbol> typeParameters = default(ImmutableArray <ITypeParameterSymbol>),
            ImmutableArray <Func <SemanticModel, IParameterSymbol> > parameters = default(ImmutableArray <Func <SemanticModel, IParameterSymbol> >),
            string statements = null,
            ImmutableArray <SyntaxNode> handlesExpressions = default(ImmutableArray <SyntaxNode>),
            CodeGenerationOptions codeGenerationOptions    = default(CodeGenerationOptions),
            bool ignoreTrivia = true)
        {
            if (statements != null)
            {
                expected = expected.Replace("$$", statements);
            }

            using (var context = await TestContext.CreateAsync(initial, expected, ignoreTrivia))
            {
                var parameterSymbols = GetParameterSymbols(parameters, context);
                var parsedStatements = context.ParseStatements(statements);
                var explicitInterfaceImplementations = GetMethodSymbols(getExplicitInterfaces, context);
                var method = CodeGenerationSymbolFactory.CreateMethodSymbol(
                    default(ImmutableArray <AttributeData>),
                    accessibility,
                    modifiers,
                    GetTypeSymbol(returnType)(context.SemanticModel),
                    false,
                    explicitInterfaceImplementations,
                    name,
                    typeParameters,
                    parameterSymbols,
                    parsedStatements,
                    handlesExpressions: handlesExpressions);
                context.Result = await context.Service.AddMethodAsync(context.Solution, (INamedTypeSymbol)context.GetDestination(), method, codeGenerationOptions);
            }
        }
Ejemplo n.º 10
0
        internal static async Task TestAddOperatorsAsync(
            string initial,
            string expected,
            CodeGenerationOperatorKind[] operatorKinds,
            Accessibility accessibility            = Accessibility.Public,
            Editing.DeclarationModifiers modifiers = default(Editing.DeclarationModifiers),
            Type returnType = null,
            ImmutableArray <Func <SemanticModel, IParameterSymbol> > parameters = default(ImmutableArray <Func <SemanticModel, IParameterSymbol> >),
            string statements = null,
            CodeGenerationOptions codeGenerationOptions = default(CodeGenerationOptions),
            bool ignoreTrivia = true)
        {
            if (statements != null)
            {
                while (expected.IndexOf("$$", StringComparison.Ordinal) != -1)
                {
                    expected = expected.Replace("$$", statements);
                }
            }

            using (var context = await TestContext.CreateAsync(initial, expected, ignoreTrivia))
            {
                var parameterSymbols = GetParameterSymbols(parameters, context);
                var parsedStatements = context.ParseStatements(statements);

                var methods = operatorKinds.Select(kind => CodeGenerationSymbolFactory.CreateOperatorSymbol(
                                                       default(ImmutableArray <AttributeData>),
                                                       accessibility,
                                                       modifiers,
                                                       GetTypeSymbol(returnType)(context.SemanticModel),
                                                       kind,
                                                       parameterSymbols,
                                                       parsedStatements));

                context.Result = await context.Service.AddMembersAsync(context.Solution, (INamedTypeSymbol)context.GetDestination(), methods.ToArray(), codeGenerationOptions);
            }
        }