Ejemplo n.º 1
0
        public static CodeTypeMember CreateEventWrapper(
            this INamedTypeSymbol typeToWrap,
            WrapsAttrNameChangeView eventNameChangeView,
            IList<string> namespaces
        )
        {
            IEventSymbol wrappedEventInfo =
                typeToWrap.GetMembers(eventNameChangeView.Name).FirstOrDefault() as IEventSymbol;

            const string eventImplTemplate =
            @"
            {
                add { replaceableValue += value; }
                remove { replaceableValue -= value; }
            }";

            string wrappedEventReferenceStr =
                typeToWrap.Name.GetWrappedObjectFieldName() + "." + eventNameChangeView.Name;

            string eventImplStr = eventImplTemplate.Replace("replaceableValue", wrappedEventReferenceStr);

            ITypeSymbol eventTypeSymbol = wrappedEventInfo.Type;

            CodeTypeReference eventTypeReference = eventTypeSymbol.GetTypeReference(namespaces);

            CodeMemberEvent codeEvent = new CodeMemberEvent
            {
                Name = eventNameChangeView.WrapperName + eventImplStr,
                Type = eventTypeReference
            };

            codeEvent.Attributes = wrappedEventInfo.GetFlags(eventNameChangeView.TheEncapsulationLevel);

            string codeEventStr = codeEvent.ToCode().Trim();

            int lastSemiColonIdx = codeEventStr.LastIndexOf(';');

            codeEventStr = "        " + codeEventStr.Remove(lastSemiColonIdx);

            CodeSnippetTypeMember codeSnippet = new CodeSnippetTypeMember
            {
                Text = codeEventStr
            };

            return codeSnippet;
        }
Ejemplo n.º 2
0
        public static CodeTypeMember CreateEventDefinition(
            this INamedTypeSymbol typeToWrap,
            WrapsAttrNameChangeView eventNameChangeView, 
            IList<string> namespaces    
        )
        {
            IEventSymbol wrappedEventInfo =
                typeToWrap.GetMembers(eventNameChangeView.Name).FirstOrDefault() as IEventSymbol;

            ITypeSymbol eventTypeSymbol = wrappedEventInfo.Type;

            CodeTypeReference eventTypeReference = eventTypeSymbol.GetTypeReference(namespaces);

            CodeMemberEvent codeEvent = new CodeMemberEvent
            {
                Name = eventNameChangeView.WrapperName,
                Type = eventTypeReference,
                Attributes = wrappedEventInfo.GetFlags(eventNameChangeView.TheEncapsulationLevel)
            };

            return codeEvent;
        }
Ejemplo n.º 3
0
        public static CodeTypeMember CreatePropertyWrapper(
            this INamedTypeSymbol typeToWrap,
            WrapsAttrNameChangeView propNameChangeView,
            IList<string> namespaceNames
        )
        {
            string typeToWrapName = typeToWrap.Name;

            string wrappedObjectFieldName = typeToWrapName.GetWrappedObjectFieldName();

            string propName = propNameChangeView.Name;
            string wrapperPropName = propNameChangeView.WrapperName;

            IPropertySymbol propSymbol = typeToWrap.GetMembers(propName).FirstOrDefault() as IPropertySymbol;

            ITypeSymbol propType = propSymbol.Type;

            CodeTypeMember prop = GetProperty(wrapperPropName, propType, propName, namespaceNames, wrappedObjectFieldName);

            prop.Attributes = propSymbol.GetFlags(propNameChangeView.TheEncapsulationLevel);

            return prop;
        }
Ejemplo n.º 4
0
        public static IEnumerable<CodeTypeMember> CreateMethodsWrapper(
            this INamedTypeSymbol typeToWrap,
            WrapsAttrNameChangeView methodToWrapNameChangeView,
            IList<string> namespaces
        )
        {
            // get all the methods of this name
            IEnumerable<IMethodSymbol> wrappedMethodsInfos =
                typeToWrap.GetInstanceMethodsOfName(methodToWrapNameChangeView.Name);

            List<CodeTypeMember> result = new List<CodeTypeMember>();

            foreach(IMethodSymbol methodSymbol in wrappedMethodsInfos)
            {
                CodeMemberMethod method = new CodeMemberMethod();

                method.Attributes = methodSymbol.GetFlags(methodToWrapNameChangeView.TheEncapsulationLevel);

                method.Name = methodToWrapNameChangeView.WrapperName;

                if (!methodSymbol.ReturnsVoid)
                {
                    ITypeSymbol returnType = methodSymbol.ReturnType;

                    method.ReturnType = returnType.GetTypeReference(namespaces);
                }

                List<CodeExpression> passedParameters =
                    method.SetMethodParams(methodSymbol, namespaces);

                string wrappedObjectName = typeToWrap.Name.GetWrappedObjectFieldName();
                // invoking the function
                CodeMethodInvokeExpression methodInvokeExpression =
                    new CodeMethodInvokeExpression
                    (
                        new CodeTypeReferenceExpression(wrappedObjectName),
                        methodToWrapNameChangeView.Name,
                        passedParameters.ToArray()
                     );

                if (!methodSymbol.ReturnsVoid)
                {
                    ITypeSymbol returnType = methodSymbol.ReturnType;
                    CodeVariableDeclarationStatement variableDeclarationStatement =
                        new CodeVariableDeclarationStatement
                    (
                        returnType.GetTypeReference(namespaces),
                        "result",
                        methodInvokeExpression
                    );

                    method.Statements.Add(variableDeclarationStatement);

                    CodeMethodReturnStatement returnStatement =
                        new CodeMethodReturnStatement(new CodeVariableReferenceExpression("result"));

                    method.Statements.Add(returnStatement);
                }
                else
                {
                    method.Statements.Add(methodInvokeExpression);
                }

                result.Add(method);
            }

            return result;
        }