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; }
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; }
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; }
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; }